[go: up one dir, main page]

[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 -->