[ios] Add live NTP count metric on resume
(cherry picked from commit ea0528b66f3f790b9fd555f071fdca114161e7dd)
Change-Id: I6e13b6357772a410ddcbbd1f66fd4d6cc712cf7f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3278664
Reviewed-by: Jesse Doherty <jwd@chromium.org>
Reviewed-by: Ali Juma <ajuma@chromium.org>
Reviewed-by: Sergio Collazos <sczs@chromium.org>
Commit-Queue: Chris Lu <thegreenfrog@chromium.org>
Cr-Original-Commit-Position: refs/heads/main@{#942186}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3286304
Commit-Queue: Sergio Collazos <sczs@chromium.org>
Cr-Commit-Position: refs/branch-heads/4664@{#1079}
Cr-Branched-From: 24dc4ee75e01a29d390d43c9c264372a169273a7-refs/heads/main@{#929512}
diff --git a/ios/chrome/app/application_delegate/BUILD.gn b/ios/chrome/app/application_delegate/BUILD.gn
index 11a9fcb..fa0657f 100644
--- a/ios/chrome/app/application_delegate/BUILD.gn
+++ b/ios/chrome/app/application_delegate/BUILD.gn
@@ -227,6 +227,7 @@
"//ios/chrome/browser/tabs",
"//ios/chrome/browser/u2f",
"//ios/chrome/browser/ui/authentication",
+ "//ios/chrome/browser/ui/browser_view",
"//ios/chrome/browser/ui/commands",
"//ios/chrome/browser/ui/content_suggestions:feature_flags",
"//ios/chrome/browser/ui/default_promo:utils",
diff --git a/ios/chrome/app/application_delegate/metrics_mediator.mm b/ios/chrome/app/application_delegate/metrics_mediator.mm
index f595a24b..1173c813 100644
--- a/ios/chrome/app/application_delegate/metrics_mediator.mm
+++ b/ios/chrome/app/application_delegate/metrics_mediator.mm
@@ -30,6 +30,7 @@
#import "ios/chrome/browser/net/connection_type_observer_bridge.h"
#include "ios/chrome/browser/pref_names.h"
#include "ios/chrome/browser/system_flags.h"
+#import "ios/chrome/browser/ui/browser_view/browser_view_controller.h"
#import "ios/chrome/browser/ui/default_promo/default_browser_utils.h"
#import "ios/chrome/browser/ui/main/browser_interface_provider.h"
#import "ios/chrome/browser/ui/main/connection_information.h"
@@ -222,6 +223,9 @@
+ (void)recordNumNTPTabAtStartup:(int)numTabs;
// Logs the number of NTP tabs with UMAHistogramCount100 and allows testing.
+ (void)recordNumNTPTabAtResume:(int)numTabs;
+// Logs the number of live NTP tabs with UMAHistogramCount100 and allows
+// testing.
++ (void)recordNumLiveNTPTabAtResume:(int)numTabs;
@end
@@ -285,6 +289,7 @@
int numTabs = 0;
int numNTPTabs = 0;
+ int numLiveNTPTabs = 0;
for (SceneState* scene in scenes) {
if (!scene.interfaceProvider) {
// The scene might not yet be initiated.
@@ -301,6 +306,8 @@
numNTPTabs++;
}
}
+ BrowserViewController* bvc = scene.interfaceProvider.currentInterface.bvc;
+ numLiveNTPTabs += [bvc liveNTPCount];
}
if (startupInformation.isColdStart) {
@@ -309,6 +316,8 @@
} else {
[self recordNumTabAtResume:numTabs];
[self recordNumNTPTabAtResume:numNTPTabs];
+ // Only log at resume since there are likely no live NTPs on startup.
+ [self recordNumLiveNTPTabAtResume:numLiveNTPTabs];
}
if (UIAccessibilityIsVoiceOverRunning()) {
@@ -562,6 +571,10 @@
base::UmaHistogramCounts100("Tabs.NTPCountAtResume", numTabs);
}
++ (void)recordNumLiveNTPTabAtResume:(int)numTabs {
+ base::UmaHistogramCounts100("Tabs.LiveNTPCountAtResume", numTabs);
+}
+
- (void)setBreakpadUploadingEnabled:(BOOL)enableUploading {
crash_helper::SetUploadingEnabled(enableUploading);
}
diff --git a/ios/chrome/app/application_delegate/metrics_mediator_testing.h b/ios/chrome/app/application_delegate/metrics_mediator_testing.h
index 5fad2be6..6e3df526 100644
--- a/ios/chrome/app/application_delegate/metrics_mediator_testing.h
+++ b/ios/chrome/app/application_delegate/metrics_mediator_testing.h
@@ -17,6 +17,7 @@
+ (void)recordNumTabAtResume:(int)numTabs;
+ (void)recordNumNTPTabAtStartup:(int)numTabs;
+ (void)recordNumNTPTabAtResume:(int)numTabs;
++ (void)recordNumLiveNTPTabAtResume:(int)numTabs;
@end
#endif // IOS_CHROME_APP_APPLICATION_DELEGATE_METRICS_MEDIATOR_TESTING_H_
diff --git a/ios/chrome/app/application_delegate/metrics_mediator_unittest.mm b/ios/chrome/app/application_delegate/metrics_mediator_unittest.mm
index 94d5c603..9a8ab6ee 100644
--- a/ios/chrome/app/application_delegate/metrics_mediator_unittest.mm
+++ b/ios/chrome/app/application_delegate/metrics_mediator_unittest.mm
@@ -176,7 +176,8 @@
protected:
MetricsMediatorLogLaunchTest()
: num_tabs_has_been_called_(FALSE),
- num_ntp_tabs_has_been_called_(FALSE) {}
+ num_ntp_tabs_has_been_called_(FALSE),
+ num_live_ntp_tabs_has_been_called_(FALSE) {}
void initiateMetricsMediator(BOOL coldStart, int tabCount) {
num_tabs_swizzle_block_ = [^(id self, int numTab) {
@@ -189,6 +190,9 @@
// Tests.
EXPECT_EQ(tabCount, numTab);
} copy];
+ num_live_ntp_tabs_swizzle_block_ = [^(id self, int numTab) {
+ num_live_ntp_tabs_has_been_called_ = YES;
+ } copy];
if (coldStart) {
tabs_uma_histogram_swizzler_.reset(new ScopedBlockSwizzler(
[MetricsMediator class], @selector(recordNumTabAtStartup:),
@@ -203,6 +207,9 @@
ntp_tabs_uma_histogram_swizzler_.reset(new ScopedBlockSwizzler(
[MetricsMediator class], @selector(recordNumNTPTabAtResume:),
num_ntp_tabs_swizzle_block_));
+ live_ntp_tabs_uma_histogram_swizzler_.reset(new ScopedBlockSwizzler(
+ [MetricsMediator class], @selector(recordNumLiveNTPTabAtResume:),
+ num_live_ntp_tabs_swizzle_block_));
}
}
@@ -215,10 +222,13 @@
NSArray<FakeSceneState*>* connected_scenes_;
__block BOOL num_tabs_has_been_called_;
__block BOOL num_ntp_tabs_has_been_called_;
+ __block BOOL num_live_ntp_tabs_has_been_called_;
LogLaunchMetricsBlock num_tabs_swizzle_block_;
LogLaunchMetricsBlock num_ntp_tabs_swizzle_block_;
+ LogLaunchMetricsBlock num_live_ntp_tabs_swizzle_block_;
std::unique_ptr<ScopedBlockSwizzler> tabs_uma_histogram_swizzler_;
std::unique_ptr<ScopedBlockSwizzler> ntp_tabs_uma_histogram_swizzler_;
+ std::unique_ptr<ScopedBlockSwizzler> live_ntp_tabs_uma_histogram_swizzler_;
std::set<std::unique_ptr<TestBrowser>> browsers_;
};
@@ -293,6 +303,7 @@
connectedScenes:connected_scenes_];
// Tests.
verifySwizzleHasBeenCalled();
+ EXPECT_TRUE(num_live_ntp_tabs_has_been_called_);
}
using MetricsMediatorNoFixtureTest = PlatformTest;
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.h b/ios/chrome/browser/ui/browser_view/browser_view_controller.h
index 564523b3..f10215f 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller.h
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.h
@@ -123,6 +123,9 @@
// Shows the voice search UI.
- (void)startVoiceSearch;
+// Returns the number of tabs with the NTP open.
+- (int)liveNTPCount;
+
@end
#endif // IOS_CHROME_BROWSER_UI_BROWSER_VIEW_BROWSER_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
index af00341..776dba1 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -1148,6 +1148,19 @@
[self.omniboxHandler cancelOmniboxEdit];
}
+- (int)liveNTPCount {
+ NSUInteger count = 0;
+ WebStateList* webStateList = self.browser->GetWebStateList();
+ for (int i = 0; i < webStateList->count(); i++) {
+ web::WebState* webState = webStateList->GetWebStateAt(i);
+ auto found = _ntpCoordinatorsForWebStates.find(webState);
+ if (found != _ntpCoordinatorsForWebStates.end()) {
+ count++;
+ }
+ }
+ return count;
+}
+
#pragma mark - browser_view_controller+private.h
- (void)setActive:(BOOL)active {
diff --git a/tools/metrics/histograms/metadata/tab/histograms.xml b/tools/metrics/histograms/metadata/tab/histograms.xml
index c518c26..40acf70 100644
--- a/tools/metrics/histograms/metadata/tab/histograms.xml
+++ b/tools/metrics/histograms/metadata/tab/histograms.xml
@@ -1560,6 +1560,16 @@
</summary>
</histogram>
+<histogram name="Tabs.LiveNTPCountAtResume" units="tabs"
+ expires_after="2022-04-10">
+ <owner>thegreenfrog@chromium.org</owner>
+ <owner>bling-team@google.com</owner>
+ <summary>
+ [iOS] The number of live allocated NTP tabs when the app comes out of a
+ background state. A live NTP is one whose UI classes are initialized.
+ </summary>
+</histogram>
+
<histogram name="Tabs.MaxTabsInADay{BatteryState}" units="tabs"
expires_after="never">
<!-- expires-never: https://crbug.com/966137 -->