0

[ios] Fix recording of "Session.*" metrics

With recent change to Multi-Window, the metrics were recorded per
window instead of being recorded per BrowserState. Moreover, only
the currently displayed window's metrics were sent when the app
was backgrounded.

To fix this, add a new base::SupportsUserData::Data object that is
attached to the ChromeBrowserState. This object, SessionMetrics,
stores the session metrics which are updated from events happening
in all of the windows.

In preparation of adding metrics that are only recorded for the
off-the-record ChromeBrowserState, pass a set of flags to the
method recording the session metrics to choose exactly which one
should be recorded.

Add a call to SessionMetrics::RecordAndClearSessionMetrics() for
both the main and off-the-record ChromeBrowserState on application
background event, and when the off-the-record ChromeBrowserState is
destroyed.

Bug: none
Change-Id: Idee8ef1a1fb0be7153d4ceb78d0a795d589a9848
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2450052
Commit-Queue: Sylvain Defresne <sdefresne@chromium.org>
Reviewed-by: Mark Cogan <marq@chromium.org>
Auto-Submit: Sylvain Defresne <sdefresne@chromium.org>
Cr-Commit-Position: refs/heads/master@{#814730}
This commit is contained in:
Sylvain Defresne
2020-10-07 17:04:14 +00:00
committed by Commit Bot
parent c06d0a1a23
commit a1e355fa5a
12 changed files with 379 additions and 43 deletions

@ -210,6 +210,7 @@ source_set("application_delegate_internal") {
"//ios/chrome/browser/web:tab_id_tab_helper",
"//ios/chrome/browser/web_state_list",
"//ios/chrome/browser/web_state_list:agents",
"//ios/chrome/browser/web_state_list:session_metrics",
"//ios/chrome/common/app_group:main_app",
"//ios/net",
"//ios/public/provider/chrome/browser",

@ -54,6 +54,7 @@
#import "ios/chrome/browser/ui/scoped_ui_blocker/scoped_ui_blocker.h"
#import "ios/chrome/browser/ui/util/multi_window_support.h"
#include "ios/chrome/browser/ui/util/ui_util.h"
#include "ios/chrome/browser/web_state_list/session_metrics.h"
#import "ios/chrome/browser/web_state_list/web_state_list_metrics_browser_agent.h"
#include "ios/net/cookies/cookie_store_ios.h"
#include "ios/net/cookies/system_cookie_util.h"
@ -486,10 +487,26 @@ initWithBrowserLauncher:(id<BrowserLauncher>)browserLauncher
base::TimeDelta::FromMilliseconds(1),
base::TimeDelta::FromHours(24), 50);
WebStateListMetricsBrowserAgent* webStateListMetrics =
WebStateListMetricsBrowserAgent::FromBrowser(currentInterface.browser);
if (webStateListMetrics)
webStateListMetrics->RecordSessionMetrics();
// Record session metrics (currentInterface.browserState may be null during
// tests).
if (currentInterface.browserState) {
ChromeBrowserState* mainChromeBrowserState =
currentInterface.browserState->GetOriginalChromeBrowserState();
SessionMetrics::FromBrowserState(mainChromeBrowserState)
->RecordAndClearSessionMetrics(
MetricsToRecordFlags::kOpenedTabCount |
MetricsToRecordFlags::kClosedTabCount |
MetricsToRecordFlags::kActivatedTabCount);
if (mainChromeBrowserState->HasOffTheRecordChromeBrowserState()) {
ChromeBrowserState* otrChromeBrowserState =
mainChromeBrowserState->GetOffTheRecordChromeBrowserState();
SessionMetrics::FromBrowserState(otrChromeBrowserState)
->RecordAndClearSessionMetrics(MetricsToRecordFlags::kNoMetrics);
}
}
if (currentInterface.browserState) {
IOSProfileSessionDurationsService* psdService =

@ -62,6 +62,7 @@ source_set("main") {
"//ios/chrome/browser/web:tab_id_tab_helper",
"//ios/chrome/browser/web_state_list",
"//ios/chrome/browser/web_state_list:agents",
"//ios/chrome/browser/web_state_list:session_metrics",
"//ios/chrome/browser/web_state_list/web_usage_enabler",
"//ios/public/provider/chrome/browser",
]

@ -21,6 +21,7 @@
#include "ios/chrome/browser/tabs/synced_window_delegate_browser_agent.h"
#import "ios/chrome/browser/url_loading/url_loading_browser_agent.h"
#import "ios/chrome/browser/url_loading/url_loading_notifier_browser_agent.h"
#include "ios/chrome/browser/web_state_list/session_metrics.h"
#import "ios/chrome/browser/web_state_list/tab_insertion_browser_agent.h"
#import "ios/chrome/browser/web_state_list/web_state_list_metrics_browser_agent.h"
#import "ios/chrome/browser/web_state_list/web_usage_enabler/web_usage_enabler_browser_agent.h"
@ -60,7 +61,9 @@ void AttachBrowserAgents(Browser* browser) {
// TabUsageRecorderBrowserAgent and WebStateListMetricsBrowserAgent observe
// the SessionRestorationBrowserAgent, so they should be created after the the
// SessionRestorationBrowserAgent is created.
WebStateListMetricsBrowserAgent::CreateForBrowser(browser);
WebStateListMetricsBrowserAgent::CreateForBrowser(
browser, SessionMetrics::FromBrowserState(browser->GetBrowserState()));
// Normal browser states are the only ones to get tab usage recorder.
if (!browser->GetBrowserState()->IsOffTheRecord())
TabUsageRecorderBrowserAgent::CreateForBrowser(browser);

@ -109,6 +109,7 @@ source_set("scene") {
"//ios/chrome/browser/url_loading",
"//ios/chrome/browser/web_state_list",
"//ios/chrome/browser/web_state_list:agents",
"//ios/chrome/browser/web_state_list:session_metrics",
"//ios/chrome/browser/window_activities",
"//ios/chrome/common/ui/util",
"//ios/public/provider/chrome/browser",

@ -78,6 +78,7 @@
#import "ios/chrome/browser/url_loading/scene_url_loading_service.h"
#import "ios/chrome/browser/url_loading/url_loading_browser_agent.h"
#import "ios/chrome/browser/url_loading/url_loading_params.h"
#include "ios/chrome/browser/web_state_list/session_metrics.h"
#import "ios/chrome/browser/web_state_list/tab_insertion_browser_agent.h"
#import "ios/chrome/browser/web_state_list/web_state_list.h"
#import "ios/chrome/browser/web_state_list/web_state_list_observer_bridge.h"
@ -2355,6 +2356,15 @@ const char kMultiWindowOpenInNewWindowHistogram[] =
mainBrowserState->GetOffTheRecordChromeBrowserState()));
}
// Record off-the-record metrics before detroying the BrowserState.
if (mainBrowserState->HasOffTheRecordChromeBrowserState()) {
ChromeBrowserState* otrBrowserState =
mainBrowserState->GetOffTheRecordChromeBrowserState();
SessionMetrics::FromBrowserState(otrBrowserState)
->RecordAndClearSessionMetrics(MetricsToRecordFlags::kNoMetrics);
}
// Destroy and recreate the off-the-record BrowserState.
mainBrowserState->DestroyOffTheRecordChromeBrowserState();
mainBrowserState->GetOffTheRecordChromeBrowserState();

@ -2,6 +2,18 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
source_set("session_metrics") {
sources = [
"session_metrics.cc",
"session_metrics.h",
]
deps = [
"//base",
"//ios/chrome/browser/browser_state:browser_state",
]
configs += [ "//build/config/compiler:enable_arc" ]
}
source_set("web_state_list") {
sources = [
"active_web_state_observation_forwarder.h",
@ -46,6 +58,7 @@ source_set("agents") {
"web_state_list_metrics_browser_agent.mm",
]
deps = [
":session_metrics",
":web_state_list",
"//components/navigation_metrics",
"//components/profile_metrics",
@ -80,6 +93,7 @@ source_set("unit_tests") {
sources = [
"active_web_state_observation_forwarder_unittest.mm",
"all_web_state_observation_forwarder_unittest.mm",
"session_metrics_unittest.cc",
"tab_insertion_browser_agent_unittest.mm",
"web_state_list_favicon_driver_observer_unittest.mm",
"web_state_list_order_controller_unittest.mm",
@ -89,9 +103,11 @@ source_set("unit_tests") {
]
deps = [
":agents",
":session_metrics",
":test_support",
":web_state_list",
"//base",
"//base/test:test_support",
"//components/favicon/ios",
"//ios/chrome/browser/browser_state",
"//ios/chrome/browser/browser_state:test_support",

@ -0,0 +1,92 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ios/chrome/browser/web_state_list/session_metrics.h"
#include "base/check.h"
#include "base/metrics/histogram_macros.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
namespace {
// Global whose address is used as a unique key to find the
// SessionMetrics associated to a particular ChromeBrowserState.
const int kSessionMetricsKey = 0;
} // namespace
bool operator&(MetricsToRecordFlagSet set, MetricsToRecordFlags flag) {
return static_cast<unsigned int>(set) & static_cast<unsigned int>(flag);
}
MetricsToRecordFlagSet operator|(MetricsToRecordFlagSet set,
MetricsToRecordFlags flag) {
return static_cast<MetricsToRecordFlagSet>(static_cast<unsigned int>(set) |
static_cast<unsigned int>(flag));
}
MetricsToRecordFlagSet operator|(MetricsToRecordFlags lhs,
MetricsToRecordFlags rhs) {
return static_cast<MetricsToRecordFlagSet>(static_cast<unsigned int>(lhs) |
static_cast<unsigned int>(rhs));
}
SessionMetrics::SessionMetrics() = default;
SessionMetrics::~SessionMetrics() = default;
// static
SessionMetrics* SessionMetrics::FromBrowserState(
ChromeBrowserState* browser_state) {
SessionMetrics* session_metrics = static_cast<SessionMetrics*>(
browser_state->GetUserData(&kSessionMetricsKey));
if (!session_metrics) {
browser_state->SetUserData(&kSessionMetricsKey,
std::make_unique<SessionMetrics>());
session_metrics = static_cast<SessionMetrics*>(
browser_state->GetUserData(&kSessionMetricsKey));
}
DCHECK(session_metrics);
return session_metrics;
}
void SessionMetrics::RecordAndClearSessionMetrics(
MetricsToRecordFlagSet flag_set) {
if (flag_set & MetricsToRecordFlags::kOpenedTabCount) {
UMA_HISTOGRAM_CUSTOM_COUNTS("Session.NewTabCounts",
inserted_web_state_counter_, 1, 200, 50);
}
if (flag_set & MetricsToRecordFlags::kClosedTabCount) {
UMA_HISTOGRAM_CUSTOM_COUNTS("Session.ClosedTabCounts",
detached_web_state_counter_, 1, 200, 50);
}
if (flag_set & MetricsToRecordFlags::kActivatedTabCount) {
UMA_HISTOGRAM_CUSTOM_COUNTS("Session.OpenedTabCounts",
activated_web_state_counter_, 1, 200, 50);
}
ResetSessionMetrics();
}
void SessionMetrics::RecordAndClearSessionMetrics(MetricsToRecordFlags flag) {
RecordAndClearSessionMetrics(static_cast<MetricsToRecordFlagSet>(flag));
}
void SessionMetrics::OnWebStateInserted() {
inserted_web_state_counter_++;
}
void SessionMetrics::OnWebStateDetached() {
detached_web_state_counter_++;
}
void SessionMetrics::OnWebStateActivated() {
activated_web_state_counter_++;
}
void SessionMetrics::ResetSessionMetrics() {
inserted_web_state_counter_ = 0;
detached_web_state_counter_ = 0;
activated_web_state_counter_ = 0;
}

@ -0,0 +1,68 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_CHROME_BROWSER_WEB_STATE_LIST_SESSION_METRICS_H_
#define IOS_CHROME_BROWSER_WEB_STATE_LIST_SESSION_METRICS_H_
#include "base/supports_user_data.h"
class ChromeBrowserState;
// Flags used to control which metrics are recorded by RecordSessionMetrics.
// They can be combined with bitwise "or" operator to record multiple metrics
// at the same time.
enum class MetricsToRecordFlags : unsigned int {
kNoMetrics = 0,
kClosedTabCount = 1 << 0,
kOpenedTabCount = 1 << 1,
kActivatedTabCount = 1 << 2,
};
// This enum allow for type safety when create a set of MetricsToRecordFlags.
enum class MetricsToRecordFlagSet : unsigned int {};
// Combines flags into a value that can be passed to RecordSessionMetrics.
MetricsToRecordFlagSet operator|(MetricsToRecordFlagSet set,
MetricsToRecordFlags flag);
MetricsToRecordFlagSet operator|(MetricsToRecordFlags lhs,
MetricsToRecordFlags rhs);
// Class used to hold sessions specific metrics (count of tab
// open, closed, ...).
class SessionMetrics : public base::SupportsUserData::Data {
public:
// Retrieves the instance of SessionMetrics that is attached
// to the specified ChromeBrowserState.
static SessionMetrics* FromBrowserState(ChromeBrowserState* browser_state);
// Constructable by tests.
SessionMetrics();
~SessionMetrics() override;
SessionMetrics(const SessionMetrics&) = delete;
SessionMetrics& operator=(const SessionMetrics&) = delete;
// Record metrics counters specified by |metrics_to_record| which is a
// bitwise "or" combination of MetricsToRecordFlags. All other metrics
// are cleared.
void RecordAndClearSessionMetrics(MetricsToRecordFlagSet flag_set);
void RecordAndClearSessionMetrics(MetricsToRecordFlags flag);
// Called when the corresponding event is triggered so that
// the appropriate metric is incremented.
void OnWebStateInserted();
void OnWebStateDetached();
void OnWebStateActivated();
private:
// Reset metrics counters.
void ResetSessionMetrics();
// Counters for metrics.
unsigned int inserted_web_state_counter_ = 0;
unsigned int detached_web_state_counter_ = 0;
unsigned int activated_web_state_counter_ = 0;
};
#endif // IOS_CHROME_BROWSER_WEB_STATE_LIST_SESSION_METRICS_H_

@ -0,0 +1,132 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ios/chrome/browser/web_state_list/session_metrics.h"
#include "base/test/metrics/histogram_tester.h"
#include "testing/platform_test.h"
namespace {
using SessionMetricsTest = PlatformTest;
TEST_F(SessionMetricsTest, RecordMetrics) {
base::HistogramTester histogram_tester;
SessionMetrics session_metrics;
session_metrics.OnWebStateInserted();
session_metrics.OnWebStateInserted();
session_metrics.OnWebStateDetached();
session_metrics.OnWebStateDetached();
session_metrics.OnWebStateActivated();
session_metrics.OnWebStateActivated();
session_metrics.RecordAndClearSessionMetrics(
MetricsToRecordFlags::kOpenedTabCount |
MetricsToRecordFlags::kClosedTabCount |
MetricsToRecordFlags::kActivatedTabCount);
histogram_tester.ExpectUniqueSample("Session.NewTabCounts", 2, 1);
histogram_tester.ExpectUniqueSample("Session.ClosedTabCounts", 2, 1);
histogram_tester.ExpectUniqueSample("Session.OpenedTabCounts", 2, 1);
}
TEST_F(SessionMetricsTest, RecordWebStateInsertedMetric) {
base::HistogramTester histogram_tester;
SessionMetrics session_metrics;
session_metrics.OnWebStateInserted();
session_metrics.OnWebStateInserted();
session_metrics.OnWebStateDetached();
session_metrics.OnWebStateDetached();
session_metrics.OnWebStateActivated();
session_metrics.OnWebStateActivated();
session_metrics.RecordAndClearSessionMetrics(
MetricsToRecordFlags::kOpenedTabCount);
histogram_tester.ExpectUniqueSample("Session.NewTabCounts", 2, 1);
histogram_tester.ExpectUniqueSample("Session.ClosedTabCounts", 0, 0);
histogram_tester.ExpectUniqueSample("Session.OpenedTabCounts", 0, 0);
}
TEST_F(SessionMetricsTest, RecordWebStateDetachedMetric) {
base::HistogramTester histogram_tester;
SessionMetrics session_metrics;
session_metrics.OnWebStateInserted();
session_metrics.OnWebStateInserted();
session_metrics.OnWebStateDetached();
session_metrics.OnWebStateDetached();
session_metrics.OnWebStateActivated();
session_metrics.OnWebStateActivated();
session_metrics.RecordAndClearSessionMetrics(
MetricsToRecordFlags::kClosedTabCount);
histogram_tester.ExpectUniqueSample("Session.NewTabCounts", 0, 0);
histogram_tester.ExpectUniqueSample("Session.ClosedTabCounts", 2, 1);
histogram_tester.ExpectUniqueSample("Session.OpenedTabCounts", 0, 0);
}
TEST_F(SessionMetricsTest, RecordWebStateActivatedMetric) {
base::HistogramTester histogram_tester;
SessionMetrics session_metrics;
session_metrics.OnWebStateInserted();
session_metrics.OnWebStateInserted();
session_metrics.OnWebStateDetached();
session_metrics.OnWebStateDetached();
session_metrics.OnWebStateActivated();
session_metrics.OnWebStateActivated();
session_metrics.RecordAndClearSessionMetrics(
MetricsToRecordFlags::kActivatedTabCount);
histogram_tester.ExpectUniqueSample("Session.NewTabCounts", 0, 0);
histogram_tester.ExpectUniqueSample("Session.ClosedTabCounts", 0, 0);
histogram_tester.ExpectUniqueSample("Session.OpenedTabCounts", 2, 1);
}
TEST_F(SessionMetricsTest, RecordNoMetric) {
base::HistogramTester histogram_tester;
SessionMetrics session_metrics;
session_metrics.OnWebStateInserted();
session_metrics.OnWebStateInserted();
session_metrics.OnWebStateDetached();
session_metrics.OnWebStateDetached();
session_metrics.OnWebStateActivated();
session_metrics.OnWebStateActivated();
session_metrics.RecordAndClearSessionMetrics(
MetricsToRecordFlags::kNoMetrics);
histogram_tester.ExpectUniqueSample("Session.NewTabCounts", 0, 0);
histogram_tester.ExpectUniqueSample("Session.ClosedTabCounts", 0, 0);
histogram_tester.ExpectUniqueSample("Session.OpenedTabCounts", 0, 0);
}
TEST_F(SessionMetricsTest, RecordClearMetrics) {
base::HistogramTester histogram_tester;
SessionMetrics session_metrics;
session_metrics.OnWebStateInserted();
session_metrics.OnWebStateInserted();
session_metrics.OnWebStateDetached();
session_metrics.OnWebStateDetached();
session_metrics.OnWebStateActivated();
session_metrics.OnWebStateActivated();
session_metrics.RecordAndClearSessionMetrics(
MetricsToRecordFlags::kNoMetrics);
histogram_tester.ExpectUniqueSample("Session.NewTabCounts", 0, 0);
histogram_tester.ExpectUniqueSample("Session.ClosedTabCounts", 0, 0);
histogram_tester.ExpectUniqueSample("Session.OpenedTabCounts", 0, 0);
session_metrics.RecordAndClearSessionMetrics(
MetricsToRecordFlags::kOpenedTabCount |
MetricsToRecordFlags::kClosedTabCount |
MetricsToRecordFlags::kActivatedTabCount);
histogram_tester.ExpectUniqueSample("Session.NewTabCounts", 0, 1);
histogram_tester.ExpectUniqueSample("Session.ClosedTabCounts", 0, 1);
histogram_tester.ExpectUniqueSample("Session.OpenedTabCounts", 0, 1);
}
} // namespace

@ -12,6 +12,8 @@
#import "ios/chrome/browser/web_state_list/web_state_list_observer.h"
#import "ios/web/public/web_state_observer.h"
class SessionMetrics;
class WebStateListMetricsBrowserAgent
: BrowserObserver,
public WebStateListObserver,
@ -19,10 +21,11 @@ class WebStateListMetricsBrowserAgent
public web::WebStateObserver,
public BrowserUserData<WebStateListMetricsBrowserAgent> {
public:
WebStateListMetricsBrowserAgent();
~WebStateListMetricsBrowserAgent() override;
void RecordSessionMetrics();
// Creates the WebStateListMetricsBrowserAgent associating it with |browser|.
static void CreateForBrowser(Browser* browser,
SessionMetrics* session_metrics);
// WebStateListObserver implementation.
void WebStateInsertedAt(WebStateList* web_state_list,
@ -39,16 +42,14 @@ class WebStateListMetricsBrowserAgent
ActiveWebStateChangeReason reason) override;
private:
explicit WebStateListMetricsBrowserAgent(Browser* browser);
WebStateListMetricsBrowserAgent(Browser* browser,
SessionMetrics* session_metrics);
friend class BrowserUserData<WebStateListMetricsBrowserAgent>;
BROWSER_USER_DATA_KEY_DECL();
// BrowserObserver methods
void BrowserDestroyed(Browser* browser) override;
// Reset metrics counters.
void ResetSessionMetrics();
// SessionRestorationObserver implementation.
void WillStartSessionRestoration() override;
void SessionRestorationFinished(
@ -64,12 +65,12 @@ class WebStateListMetricsBrowserAgent
web::PageLoadCompletionStatus load_completion_status) override;
// The WebStateList containing all the monitored tabs.
WebStateList* web_state_list_; // weak
WebStateList* web_state_list_ = nullptr;
// Counters for metrics.
int inserted_web_state_counter_ = 0;
int detached_web_state_counter_ = 0;
int activated_web_state_counter_ = 0;
// The object storing the metrics.
SessionMetrics* session_metrics_ = nullptr;
// Whether metric recording is paused (for session restoration).
bool metric_collection_paused_ = false;
DISALLOW_COPY_AND_ASSIGN(WebStateListMetricsBrowserAgent);

@ -14,6 +14,7 @@
#include "ios/chrome/browser/chrome_url_constants.h"
#include "ios/chrome/browser/crash_report/crash_loop_detection_util.h"
#import "ios/chrome/browser/sessions/session_restoration_browser_agent.h"
#include "ios/chrome/browser/web_state_list/session_metrics.h"
#import "ios/chrome/browser/web_state_list/web_state_list.h"
#include "ios/web/public/browser_state.h"
#include "ios/web/public/navigation/navigation_context.h"
@ -27,11 +28,25 @@
BROWSER_USER_DATA_KEY_IMPL(WebStateListMetricsBrowserAgent)
// static
void WebStateListMetricsBrowserAgent::CreateForBrowser(
Browser* browser,
SessionMetrics* session_metrics) {
if (!FromBrowser(browser)) {
browser->SetUserData(UserDataKey(),
base::WrapUnique(new WebStateListMetricsBrowserAgent(
browser, session_metrics)));
}
}
WebStateListMetricsBrowserAgent::WebStateListMetricsBrowserAgent(
Browser* browser)
: web_state_list_(browser->GetWebStateList()) {
browser->AddObserver(this);
Browser* browser,
SessionMetrics* session_metrics)
: web_state_list_(browser->GetWebStateList()),
session_metrics_(session_metrics) {
DCHECK(web_state_list_);
DCHECK(session_metrics_);
browser->AddObserver(this);
web_state_list_->AddObserver(this);
SessionRestorationBrowserAgent* restoration_agent =
SessionRestorationBrowserAgent::FromBrowser(browser);
@ -39,22 +54,8 @@ WebStateListMetricsBrowserAgent::WebStateListMetricsBrowserAgent(
restoration_agent->AddObserver(this);
}
WebStateListMetricsBrowserAgent::WebStateListMetricsBrowserAgent() {
ResetSessionMetrics();
}
WebStateListMetricsBrowserAgent::~WebStateListMetricsBrowserAgent() = default;
void WebStateListMetricsBrowserAgent::RecordSessionMetrics() {
UMA_HISTOGRAM_CUSTOM_COUNTS("Session.ClosedTabCounts",
detached_web_state_counter_, 1, 200, 50);
UMA_HISTOGRAM_CUSTOM_COUNTS("Session.OpenedTabCounts",
activated_web_state_counter_, 1, 200, 50);
UMA_HISTOGRAM_CUSTOM_COUNTS("Session.NewTabCounts",
inserted_web_state_counter_, 1, 200, 50);
ResetSessionMetrics();
}
void WebStateListMetricsBrowserAgent::WillStartSessionRestoration() {
metric_collection_paused_ = true;
}
@ -72,7 +73,7 @@ void WebStateListMetricsBrowserAgent::WebStateInsertedAt(
if (metric_collection_paused_)
return;
base::RecordAction(base::UserMetricsAction("MobileNewTabOpened"));
++inserted_web_state_counter_;
session_metrics_->OnWebStateInserted();
}
void WebStateListMetricsBrowserAgent::WebStateDetachedAt(
@ -82,7 +83,7 @@ void WebStateListMetricsBrowserAgent::WebStateDetachedAt(
if (metric_collection_paused_)
return;
base::RecordAction(base::UserMetricsAction("MobileTabClosed"));
++detached_web_state_counter_;
session_metrics_->OnWebStateDetached();
}
void WebStateListMetricsBrowserAgent::WebStateActivatedAt(
@ -93,20 +94,13 @@ void WebStateListMetricsBrowserAgent::WebStateActivatedAt(
ActiveWebStateChangeReason reason) {
if (metric_collection_paused_)
return;
++activated_web_state_counter_;
session_metrics_->OnWebStateActivated();
if (reason == ActiveWebStateChangeReason::Replaced)
return;
base::RecordAction(base::UserMetricsAction("MobileTabSwitched"));
}
void WebStateListMetricsBrowserAgent::ResetSessionMetrics() {
inserted_web_state_counter_ = 0;
detached_web_state_counter_ = 0;
activated_web_state_counter_ = 0;
metric_collection_paused_ = false;
}
// web::WebStateObserver
void WebStateListMetricsBrowserAgent::DidStartNavigation(
web::WebState* web_state,