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

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: Add browsertest for SessionRestorePageLoadMetricsObserver. Created 3 years, 6 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..1b8b1ca243df4ebc084adaa6f7bf2429ebdc5f42 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,21 @@
#include "base/test/histogram_tester.h"
#include "base/threading/thread_restrictions.h"
#include "base/time/time.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/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"
@@ -34,6 +39,7 @@
#include "content/public/browser/render_view_host.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 +1055,184 @@ IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest,
histogram_tester_.ExpectUniqueSample(internal::kHistogramTotalBytes, 0, 1);
}
+
+class SessionRestorePageLoadMetricsBrowserTest
Bryan McQuade 2017/06/30 20:04:38 thanks for all these tests! i just want to make su
ducbui 2017/06/30 22:03:51 Done.
+ : public PageLoadMetricsBrowserTest {
+ public:
+ SessionRestorePageLoadMetricsBrowserTest() {}
+
+ void SetUpOnMainThread() override {
+ PageLoadMetricsBrowserTest::SetUpOnMainThread();
+ SessionStartupPref pref(SessionStartupPref::LAST);
+ SessionStartupPref::SetStartupPref(browser()->profile(), pref);
+ ASSERT_TRUE(embedded_test_server()->Start());
+ }
+
+ Browser* QuitBrowserAndRestore(Browser* browser) {
+ // 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(browser->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();
Bryan McQuade 2017/06/30 20:04:38 i notice we call this here, but we don't end up in
ducbui 2017/06/30 22:03:51 WaitForTabsToLoad() is used only in the MultipleTa
+ 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 {
+ 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.
+ content::WebContents* active_web_contents =
+ new_browser->tab_strip_model()->GetActiveWebContents();
+ auto waiter = CreatePageLoadMetricsWaiter(active_web_contents);
+ waiter->AddPageExpectation(TimingField::FIRST_MEANINGFUL_PAINT);
+ active_web_contents->GetController().LoadURL(
+ GetTestURL2(), content::Referrer(), ui::PAGE_TRANSITION_TYPED,
+ std::string());
+ waiter->Wait();
+
+ // We also count the new page load in the initial foreground tab.
+ ExpectFirstPaintMetricsTotalCount(1);
Bryan McQuade 2017/06/30 20:04:38 interesting, is this the desired behavior? if i st
ducbui 2017/06/30 22:03:51 Done. I agree that it would better to filter out t
+}
+
+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