Index: content/browser/frame_host/navigation_controller_impl_browsertest.cc |
diff --git a/content/browser/frame_host/navigation_controller_impl_browsertest.cc b/content/browser/frame_host/navigation_controller_impl_browsertest.cc |
index e88f507f5769faa5bf3ec34f341fde320a2ffb90..158bc455412bdf5de3b95b9703d27d45c133cf4a 100644 |
--- a/content/browser/frame_host/navigation_controller_impl_browsertest.cc |
+++ b/content/browser/frame_host/navigation_controller_impl_browsertest.cc |
@@ -12,6 +12,7 @@ |
#include "base/macros.h" |
#include "base/strings/stringprintf.h" |
#include "base/strings/utf_string_conversions.h" |
+#include "base/test/histogram_tester.h" |
#include "content/browser/frame_host/frame_navigation_entry.h" |
#include "content/browser/frame_host/frame_tree.h" |
#include "content/browser/frame_host/navigation_entry_impl.h" |
@@ -6234,4 +6235,116 @@ IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest, |
// test will fail. |
} |
+namespace { |
+ |
+// Execute JavaScript without the user gesture flag set, and wait for the |
+// triggered load finished. |
+void ExecuteJavaScriptAndWaitForLoadStop(WebContents* web_contents, |
+ const std::string script) { |
+ // WaitForLoadStop() does not work to wait for loading that is triggered by |
+ // JavaScript asynchronously. |
+ TestNavigationObserver observer(web_contents); |
+ |
+ // ExecuteScript() sets a user gesture flag internally for testing, but we |
+ // want to run JavaScript without the flag. Call ExecuteJavaScriptForTests |
+ // directory. |
+ static_cast<WebContentsImpl*>(web_contents) |
+ ->GetMainFrame() |
+ ->ExecuteJavaScriptForTests(base::UTF8ToUTF16(script)); |
+ |
+ observer.Wait(); |
+} |
+ |
+} // namespace |
+ |
+// Check if consecutive reloads can be correctly captured by metrics. |
+IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest, |
+ ConsecutiveReloadMetrics) { |
+ base::HistogramTester histogram; |
+ |
+ const char kReloadToReloadMetricName[] = |
+ "Navigation.Reload.ReloadToReloadDuration"; |
+ const char kReloadMainResourceToReloadMetricName[] = |
+ "Navigation.Reload.ReloadMainResourceToReloadDuration"; |
+ |
+ // Navigate to a page, and check if metrics are initialized correctly. |
+ NavigateToURL(shell(), embedded_test_server()->GetURL( |
+ "/navigation_controller/page_with_links.html")); |
+ histogram.ExpectTotalCount(kReloadToReloadMetricName, 0); |
+ histogram.ExpectTotalCount(kReloadMainResourceToReloadMetricName, 0); |
+ |
+ NavigationControllerImpl& controller = static_cast<NavigationControllerImpl&>( |
+ shell()->web_contents()->GetController()); |
+ |
+ // ReloadToRefreshContent triggers a reload of ReloadType::MAIN_RESOURCE. The |
+ // first reload should not be counted. |
+ controller.ReloadToRefreshContent(false); |
+ EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); |
+ histogram.ExpectTotalCount(kReloadToReloadMetricName, 0); |
+ histogram.ExpectTotalCount(kReloadMainResourceToReloadMetricName, 0); |
+ |
+ // ReloadBypassingCache triggers a reload of ReloadType::BYPASSING_CACHE. |
+ // Both metrics should count the consecutive reloads. |
+ controller.ReloadBypassingCache(false); |
+ EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); |
+ histogram.ExpectTotalCount(kReloadToReloadMetricName, 1); |
+ histogram.ExpectTotalCount(kReloadMainResourceToReloadMetricName, 1); |
+ |
+ // Triggers another reload of ReloadType::BYPASSING_CACHE. |
+ // ReloadMainResourceToReload should not be counted here. |
+ controller.ReloadBypassingCache(false); |
+ EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); |
+ histogram.ExpectTotalCount(kReloadToReloadMetricName, 2); |
+ histogram.ExpectTotalCount(kReloadMainResourceToReloadMetricName, 1); |
+ |
+ // A browser-initiated navigation should reset the reload tracking |
+ // information. |
+ NavigateToURL(shell(), embedded_test_server()->GetURL( |
+ "/navigation_controller/simple_page_1.html")); |
+ histogram.ExpectTotalCount(kReloadToReloadMetricName, 2); |
+ histogram.ExpectTotalCount(kReloadMainResourceToReloadMetricName, 1); |
+ |
+ // Then, the next reload should be assumed as the first reload. Metrics |
+ // should not be changed for the first reload. |
+ controller.ReloadToRefreshContent(false); |
+ EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); |
+ histogram.ExpectTotalCount(kReloadToReloadMetricName, 2); |
+ histogram.ExpectTotalCount(kReloadMainResourceToReloadMetricName, 1); |
+ |
+ // Another reload of ReloadType::MAIN_RESOURCE should be counted by both |
+ // metrics again. |
+ controller.ReloadToRefreshContent(false); |
+ EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); |
+ histogram.ExpectTotalCount(kReloadToReloadMetricName, 3); |
+ histogram.ExpectTotalCount(kReloadMainResourceToReloadMetricName, 2); |
+ |
+ // A renderer-initiated navigations with no user gesture don't reset reload |
+ // tracking information, and the following reload will be counted by metrics. |
+ ExecuteJavaScriptAndWaitForLoadStop( |
+ shell()->web_contents(), |
+ "history.pushState({}, 'page 1', 'simple_page_1.html')"); |
+ histogram.ExpectTotalCount(kReloadToReloadMetricName, 3); |
+ histogram.ExpectTotalCount(kReloadMainResourceToReloadMetricName, 2); |
+ ExecuteJavaScriptAndWaitForLoadStop(shell()->web_contents(), |
+ "location.href='simple_page_2.html'"); |
+ histogram.ExpectTotalCount(kReloadToReloadMetricName, 3); |
+ histogram.ExpectTotalCount(kReloadMainResourceToReloadMetricName, 2); |
+ |
+ controller.ReloadToRefreshContent(false); |
+ EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); |
+ histogram.ExpectTotalCount(kReloadToReloadMetricName, 4); |
+ histogram.ExpectTotalCount(kReloadMainResourceToReloadMetricName, 3); |
+ |
+ // Go back to the first page. Reload tracking information should be reset. |
+ shell()->web_contents()->GetController().GoBack(); |
+ EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); |
+ histogram.ExpectTotalCount(kReloadToReloadMetricName, 4); |
+ histogram.ExpectTotalCount(kReloadMainResourceToReloadMetricName, 3); |
+ |
+ controller.ReloadToRefreshContent(false); |
+ EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); |
+ histogram.ExpectTotalCount(kReloadToReloadMetricName, 4); |
+ histogram.ExpectTotalCount(kReloadMainResourceToReloadMetricName, 3); |
+} |
+ |
} // namespace content |