Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(441)

Unified Diff: chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc

Issue 2930013005: [Tab Metrics] Measure FP, FCP and FMP for Foreground Tab during Session Restore (Closed)
Patch Set: Fix tab_manager null on Android. Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
index 4d5a1ca1253e4e2a14eefbe8af41a381ecaa1253..c7274e7319bf832e5e1ee4c318f6a603314babe4 100644
--- a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
+++ b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
@@ -11,16 +11,24 @@
#include "base/test/histogram_tester.h"
#include "base/threading/thread_restrictions.h"
#include "base/time/time.h"
+#include "build/build_config.h"
+#include "chrome/browser/lifetime/keep_alive_types.h"
+#include "chrome/browser/lifetime/scoped_keep_alive.h"
#include "chrome/browser/page_load_metrics/metrics_web_contents_observer.h"
#include "chrome/browser/page_load_metrics/observers/aborts_page_load_metrics_observer.h"
#include "chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.h"
#include "chrome/browser/page_load_metrics/observers/document_write_page_load_metrics_observer.h"
#include "chrome/browser/page_load_metrics/observers/no_state_prefetch_page_load_metrics_observer.h"
+#include "chrome/browser/page_load_metrics/observers/session_restore_page_load_metrics_observer.h"
#include "chrome/browser/page_load_metrics/page_load_tracker.h"
+#include "chrome/browser/prefs/session_startup_pref.h"
#include "chrome/browser/prerender/prerender_histograms.h"
#include "chrome/browser/prerender/prerender_origin.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/sessions/session_service_factory.h"
+#include "chrome/browser/sessions/session_service_test_helper.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_navigator_params.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/chrome_features.h"
@@ -32,8 +40,10 @@
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/render_view_host.h"
+#include "content/public/common/browser_side_navigation_policy.h"
#include "content/public/common/content_features.h"
#include "content/public/common/content_switches.h"
+#include "content/public/common/referrer.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/download_test_observer.h"
#include "net/base/net_errors.h"
@@ -1049,3 +1059,199 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest,
histogram_tester_.ExpectUniqueSample(internal::kHistogramTotalBytes, 0, 1);
}
+
+class SessionRestorePageLoadMetricsBrowserTest
+ : public PageLoadMetricsBrowserTest {
+ public:
+ SessionRestorePageLoadMetricsBrowserTest() {}
+
+ void SetUpOnMainThread() override {
+ PageLoadMetricsBrowserTest::SetUpOnMainThread();
+ SessionStartupPref::SetStartupPref(
+ browser()->profile(), SessionStartupPref(SessionStartupPref::LAST));
+ ASSERT_TRUE(embedded_test_server()->Start());
+#if defined(OS_CHROMEOS)
+ SessionServiceTestHelper helper(
+ SessionServiceFactory::GetForProfile(browser()->profile()));
+ helper.SetForceBrowserNotAliveWithNoWindows(true);
+ helper.ReleaseService();
+#endif
+ }
+
+ Browser* QuitBrowserAndRestore(Browser* browser) {
+ Profile* profile = browser->profile();
+
+ // Close the browser.
+ std::unique_ptr<ScopedKeepAlive> keep_alive(new ScopedKeepAlive(
+ KeepAliveOrigin::SESSION_RESTORE, KeepAliveRestartOption::DISABLED));
+ CloseBrowserSynchronously(browser);
+
+ // Create a new window, which should trigger session restore.
+ chrome::NewEmptyWindow(profile);
+ ui_test_utils::BrowserAddedObserver window_observer;
+ return window_observer.WaitForSingleNewBrowser();
+ }
+
+ std::unique_ptr<PageLoadMetricsWaiter> CreatePageLoadMetricsWaiter(
+ content::WebContents* web_contents) const {
+ return base::MakeUnique<PageLoadMetricsWaiter>(web_contents);
+ }
+
+ void WaitForFirstMeaningfulPaintOfActiveTab(Browser* browser) const {
+ auto waiter = CreatePageLoadMetricsWaiter(
+ browser->tab_strip_model()->GetActiveWebContents());
+ waiter->AddPageExpectation(TimingField::FIRST_MEANINGFUL_PAINT);
+ waiter->Wait();
+ }
+
+ void WaitForTabsToLoad(Browser* browser) {
+ for (int i = 0; i < browser->tab_strip_model()->count(); ++i) {
+ content::WebContents* contents =
+ browser->tab_strip_model()->GetWebContentsAt(i);
+ contents->GetController().LoadIfNecessary();
+ content::WaitForLoadStop(contents);
+ }
+ }
+
+ GURL GetTestURL() const {
+ return embedded_test_server()->GetURL(
+ "/page_load_metrics/page_with_css.html");
+ }
+
+ GURL GetTestURL2() const {
+ return embedded_test_server()->GetURL(
+ "/page_load_metrics/main_frame_with_iframe.html");
+ }
+
+ void ExpectFirstPaintMetricsTotalCount(int expected_total_count) const {
+ // SessionRestorePageLoadMetricsObserver is disabled when browser-side
+ // navigation is enabled
+ if (content::IsBrowserSideNavigationEnabled())
+ expected_total_count = 0;
+
+ histogram_tester_.ExpectTotalCount(
+ internal::kHistogramSessionRestoreForegroundTabFirstPaint,
+ expected_total_count);
+ histogram_tester_.ExpectTotalCount(
+ internal::kHistogramSessionRestoreForegroundTabFirstContentfulPaint,
+ expected_total_count);
+ histogram_tester_.ExpectTotalCount(
+ internal::kHistogramSessionRestoreForegroundTabFirstMeaningfulPaint,
+ expected_total_count);
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(SessionRestorePageLoadMetricsBrowserTest);
+};
+
+IN_PROC_BROWSER_TEST_F(SessionRestorePageLoadMetricsBrowserTest,
+ NoSessionRestore) {
+ ui_test_utils::NavigateToURL(browser(), GetTestURL());
+ // No metrics recorded because navigation is outside of session restore.
+ ExpectFirstPaintMetricsTotalCount(0);
+}
+
+IN_PROC_BROWSER_TEST_F(SessionRestorePageLoadMetricsBrowserTest,
+ SingleTabSessionRestore) {
+ ui_test_utils::NavigateToURL(browser(), GetTestURL());
+ Browser* new_browser = QuitBrowserAndRestore(browser());
+ WaitForFirstMeaningfulPaintOfActiveTab(new_browser);
+ ExpectFirstPaintMetricsTotalCount(1);
+}
+
+IN_PROC_BROWSER_TEST_F(SessionRestorePageLoadMetricsBrowserTest,
+ MultipleTabsSessionRestore) {
+ ui_test_utils::NavigateToURL(browser(), GetTestURL());
+ ui_test_utils::NavigateToURLWithDisposition(
+ browser(), GetTestURL(), WindowOpenDisposition::NEW_BACKGROUND_TAB,
+ ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+ Browser* new_browser = QuitBrowserAndRestore(browser());
+
+ TabStripModel* tab_strip = new_browser->tab_strip_model();
+ ASSERT_TRUE(tab_strip);
+ ASSERT_EQ(2, tab_strip->count());
+
+ // Wait for first paints on the initial foreground tab and all tabs loaded.
+ WaitForFirstMeaningfulPaintOfActiveTab(new_browser);
+ WaitForTabsToLoad(new_browser);
+
+ // Only metrics of the initial foreground tab are recorded.
+ ExpectFirstPaintMetricsTotalCount(1);
+}
+
+IN_PROC_BROWSER_TEST_F(SessionRestorePageLoadMetricsBrowserTest,
+ LoadingInForegroundTabInSessionRestore) {
+ ui_test_utils::NavigateToURL(browser(), GetTestURL());
+ ui_test_utils::NavigateToURLWithDisposition(
+ browser(), GetTestURL2(), WindowOpenDisposition::NEW_BACKGROUND_TAB,
+ ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+ Browser* new_browser = QuitBrowserAndRestore(browser());
+
+ // Load a new page in the foreground tab before it finishes loading.
+ chrome::NavigateParams params(new_browser, GetTestURL2(),
+ ui::PAGE_TRANSITION_LINK);
+ chrome::Navigate(&params);
+ // When PlzNavigate enabled, the waiter does not see first paints
+ if (!content::IsBrowserSideNavigationEnabled()) {
ducbui 2017/07/03 23:38:44 Somehow the PageLoadMetricsWaiter does not see the
Bryan McQuade 2017/07/03 23:42:24 Ah, I missed these browser-side navigation checks.
+ auto waiter =
+ base::MakeUnique<PageLoadMetricsWaiter>(params.target_contents);
+ waiter->AddPageExpectation(TimingField::FIRST_MEANINGFUL_PAINT);
+ waiter->Wait();
+ }
+
+ // Do not count the new page load in the initial foreground tab.
+ ExpectFirstPaintMetricsTotalCount(0);
+}
+
+IN_PROC_BROWSER_TEST_F(SessionRestorePageLoadMetricsBrowserTest,
+ LoadingAfterSessionRestore) {
+ ui_test_utils::NavigateToURL(browser(), GetTestURL());
+ Browser* new_browser = QuitBrowserAndRestore(browser());
+
+ // Wait for session restore to finish (i.e., the end of the only tab).
+ WaitForFirstMeaningfulPaintOfActiveTab(new_browser);
+ ExpectFirstPaintMetricsTotalCount(1);
+
+ // Load a new page after session restore.
+ auto waiter = CreatePageLoadMetricsWaiter(
+ new_browser->tab_strip_model()->GetActiveWebContents());
+ waiter->AddPageExpectation(TimingField::FIRST_MEANINGFUL_PAINT);
+ ui_test_utils::NavigateToURL(new_browser, GetTestURL2());
+ waiter->Wait();
+
+ // No more metrics because the navigation is after session restore.
+ ExpectFirstPaintMetricsTotalCount(1);
+}
+
+IN_PROC_BROWSER_TEST_F(SessionRestorePageLoadMetricsBrowserTest,
+ InitialForegroundTabChanged) {
+ ui_test_utils::NavigateToURL(browser(), GetTestURL());
+ ui_test_utils::NavigateToURLWithDisposition(
+ browser(), GetTestURL2(), WindowOpenDisposition::NEW_BACKGROUND_TAB,
+ ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+ Browser* new_browser = QuitBrowserAndRestore(browser());
+
+ // Change the foreground tab before the first meaningful paint.
+ TabStripModel* tab_strip = new_browser->tab_strip_model();
+ ASSERT_TRUE(tab_strip);
+ ASSERT_EQ(2, tab_strip->count());
+ ASSERT_EQ(0, tab_strip->active_index());
+ tab_strip->ActivateTabAt(1, true);
+
+ // Wait for the first meaningful paint of the current foreground tab.
+ WaitForFirstMeaningfulPaintOfActiveTab(new_browser);
+ ExpectFirstPaintMetricsTotalCount(0);
+}
+
+IN_PROC_BROWSER_TEST_F(SessionRestorePageLoadMetricsBrowserTest,
+ MultipleSessionRestores) {
+ ui_test_utils::NavigateToURL(browser(), GetTestURL());
+
+ Browser* current_browser = browser();
+ const int num_session_restores = 3;
+ for (int i = 1; i <= num_session_restores; ++i) {
+ current_browser = QuitBrowserAndRestore(current_browser);
+ WaitForFirstMeaningfulPaintOfActiveTab(current_browser);
+ ExpectFirstPaintMetricsTotalCount(i);
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698