MPArch: Ensure that Prerendering doesn't flush UKM metrics

All uses of IsInMainFrame have converted to IsInPrimaryMainFrame
for MPArch (Refer to crbug.com/1218946). As one of ensuring that
the conversion is correct, this CL adds a test to ensure
IsInPrimaryMainFrame use of LiteVideoObserver::DidFinishNavigation
works correctly on prerendering via LiteVideo's entry recorded number.

Bug: 1231382, 1218946
Change-Id: Ia5669b8bc23c2b7eeb19c36579c957e170222c8d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3043066
Reviewed-by: Ryan Sturm <ryansturm@chromium.org>
Reviewed-by: Kevin McNee <mcnee@chromium.org>
Commit-Queue: Gyuyoung Kim <gyuyoung@igalia.com>
Cr-Commit-Position: refs/heads/master@{#904546}
diff --git a/chrome/browser/lite_video/lite_video_keyed_service_browsertest.cc b/chrome/browser/lite_video/lite_video_keyed_service_browsertest.cc
index cd448c12..b185cae5 100644
--- a/chrome/browser/lite_video/lite_video_keyed_service_browsertest.cc
+++ b/chrome/browser/lite_video/lite_video_keyed_service_browsertest.cc
@@ -34,6 +34,8 @@
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/network_connection_change_simulator.h"
+#include "content/public/test/prerender_test_util.h"
+#include "net/dns/mock_host_resolver.h"
 #include "net/nqe/effective_connection_type.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
 #include "services/metrics/public/cpp/ukm_source.h"
@@ -863,3 +865,71 @@
   histogram_tester()->ExpectTotalCount(
       "LiteVideo.CanApplyLiteVideo.UserBlocklist.SubFrame", 0);
 }
+
+class LiteVideoKeyedServicePrerenderBrowserTest
+    : public LiteVideoKeyedServiceBrowserTest {
+ public:
+  LiteVideoKeyedServicePrerenderBrowserTest() = default;
+  ~LiteVideoKeyedServicePrerenderBrowserTest() override = default;
+  LiteVideoKeyedServicePrerenderBrowserTest(
+      const LiteVideoKeyedServicePrerenderBrowserTest&) = delete;
+
+  LiteVideoKeyedServicePrerenderBrowserTest& operator=(
+      const LiteVideoKeyedServicePrerenderBrowserTest&) = delete;
+
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    prerender_helper_ = std::make_unique<content::test::PrerenderTestHelper>(
+        base::BindRepeating(
+            &LiteVideoKeyedServicePrerenderBrowserTest::GetWebContents,
+            base::Unretained(this)));
+    LiteVideoKeyedServiceBrowserTest::SetUpCommandLine(command_line);
+  }
+
+  void SetUpOnMainThread() override {
+    prerender_helper_->SetUpOnMainThread(embedded_test_server());
+    host_resolver()->AddRule("*", "127.0.0.1");
+    ASSERT_TRUE(embedded_test_server()->Start());
+  }
+
+  content::test::PrerenderTestHelper& prerender_test_helper() {
+    return *prerender_helper_;
+  }
+
+  content::WebContents* GetWebContents() {
+    return browser()->tab_strip_model()->GetActiveWebContents();
+  }
+
+ private:
+  std::unique_ptr<content::test::PrerenderTestHelper> prerender_helper_;
+};
+
+INSTANTIATE_TEST_SUITE_P(UsingOptGuide,
+                         LiteVideoKeyedServicePrerenderBrowserTest,
+                         ::testing::Bool(),
+                         ::testing::PrintToStringParamName());
+
+IN_PROC_BROWSER_TEST_P(LiteVideoKeyedServicePrerenderBrowserTest,
+                       PrerenderingDontFlushUKMMetrics) {
+  GURL initial_url = embedded_test_server()->GetURL("/empty.html");
+  GURL prerender_url = embedded_test_server()->GetURL("/title1.html");
+  ASSERT_NE(ui_test_utils::NavigateToURL(browser(), initial_url), nullptr);
+
+  ukm::TestAutoSetUkmRecorder ukm_recorder;
+  // Load a test page in the prerender.
+  const int host_id = prerender_test_helper().AddPrerender(prerender_url);
+  content::RenderFrameHost* prerendered_render_frame_host =
+      prerender_test_helper().GetPrerenderedMainFrameHost(host_id);
+  ASSERT_TRUE(prerendered_render_frame_host);
+  auto entries =
+      ukm_recorder.GetEntriesByName(ukm::builders::LiteVideo::kEntryName);
+  // The number of the entry should be 0 since FlushUKMMetrics is not called by
+  // the lite video observer in prerendering.
+  EXPECT_EQ(0u, entries.size());
+
+  // Activate the prerendered page.
+  prerender_test_helper().NavigatePrimaryPage(prerender_url);
+  entries = ukm_recorder.GetEntriesByName(ukm::builders::LiteVideo::kEntryName);
+  // The number of the entry should be 1 since FlushUKMMetrics is called by
+  // the lite video observer after activating.
+  EXPECT_EQ(1u, entries.size());
+}
diff --git a/chrome/browser/lite_video/lite_video_observer.cc b/chrome/browser/lite_video/lite_video_observer.cc
index 0f95514..8e71770 100644
--- a/chrome/browser/lite_video/lite_video_observer.cc
+++ b/chrome/browser/lite_video/lite_video_observer.cc
@@ -92,9 +92,6 @@
   lite_video::LiteVideoBlocklistReason blocklist_reason =
       lite_video::LiteVideoBlocklistReason::kUnknown;
 
-  // TODO(https://crbug.com/1218946): With MPArch there may be multiple main
-  // frames. This caller was converted automatically to the primary main frame
-  // to preserve its semantics. Follow up to confirm correctness.
   if (navigation_handle->IsInPrimaryMainFrame()) {
     FlushUKMMetrics();
     routing_ids_to_notify_.clear();