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

Unified Diff: chrome/browser/page_load_metrics/observers/https_engagement_page_load_metrics_observer_browsertest.cc

Issue 1913693002: Histogram the amount of time spent on HTTP(S) page loads (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Equality operations are hard, let's go trybotting Created 4 years, 7 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/observers/https_engagement_page_load_metrics_observer_browsertest.cc
diff --git a/chrome/browser/page_load_metrics/observers/https_engagement_page_load_metrics_observer_browsertest.cc b/chrome/browser/page_load_metrics/observers/https_engagement_page_load_metrics_observer_browsertest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..78d4c11b0138d7720af6a4bb7c977bede33e3476
--- /dev/null
+++ b/chrome/browser/page_load_metrics/observers/https_engagement_page_load_metrics_observer_browsertest.cc
@@ -0,0 +1,320 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/page_load_metrics/observers/https_engagement_page_load_metrics_observer.h"
+
+#include "base/macros.h"
+#include "base/memory/ptr_util.h"
+#include "base/test/histogram_tester.h"
+#include "base/threading/platform_thread.h"
+#include "base/time/time.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/common/url_constants.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/test/test_utils.h"
+#include "net/ssl/client_cert_store.h"
+#include "net/ssl/ssl_server_config.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
+#include "url/gurl.h"
+
+class HttpsEngagementPageLoadMetricsBrowserTest : public InProcessBrowserTest {
+ public:
+ HttpsEngagementPageLoadMetricsBrowserTest() {}
+ ~HttpsEngagementPageLoadMetricsBrowserTest() override {}
+
+ void StartHttpsServer(bool cert_error) {
+ https_test_server_.reset(
+ new net::EmbeddedTestServer(net::EmbeddedTestServer::TYPE_HTTPS));
+ https_test_server_->SetSSLConfig(cert_error
+ ? net::EmbeddedTestServer::CERT_EXPIRED
+ : net::EmbeddedTestServer::CERT_OK);
+ https_test_server_->ServeFilesFromSourceDirectory("chrome/test/data");
+ ASSERT_TRUE(https_test_server_->Start());
+ }
+
+ void StartHttpServer() {
+ http_test_server_.reset(
+ new net::EmbeddedTestServer(net::EmbeddedTestServer::TYPE_HTTP));
+ http_test_server_->ServeFilesFromSourceDirectory("chrome/test/data");
+ ASSERT_TRUE(http_test_server_->Start());
+ }
+
+ // Navigate to a URL in a foreground tab, and close it. Return the upper bound
+ // for how long the URL was open in the foreground.
+ base::TimeDelta NavigateInForegroundAndCloseWithTiming(GURL target_url) {
+ base::TimeTicks start = base::TimeTicks::Now();
+ ui_test_utils::NavigateToURL(browser(), target_url);
+
+ TabStripModel* tab_strip_model = browser()->tab_strip_model();
+ content::WebContentsDestroyedWatcher destroyed_watcher(
+ tab_strip_model->GetActiveWebContents());
+ tab_strip_model->CloseAllTabs();
+ destroyed_watcher.Wait();
+ return (base::TimeTicks::Now() - start);
+ }
+
+ // Navigate to two URLs in the same foreground tab, and close it.
+ void NavigateTwiceInTabAndClose(GURL first_url, GURL second_url) {
+ ui_test_utils::NavigateToURL(browser(), first_url);
+ ui_test_utils::NavigateToURL(browser(), second_url);
+
+ TabStripModel* tab_strip_model = browser()->tab_strip_model();
+ EXPECT_EQ(1, tab_strip_model->count());
+ content::WebContentsDestroyedWatcher destroyed_watcher(
+ tab_strip_model->GetActiveWebContents());
+ tab_strip_model->CloseAllTabs();
+ destroyed_watcher.Wait();
+ }
+
+ // Navigate to a URL in a foreground tab, move it to the background, then
+ // close it. Return the upper bound for how long the URL was open in the
+ // foreground.
+ base::TimeDelta NavigateInForegroundAndCloseInBackgroundWithTiming(GURL url) {
+ base::TimeTicks start = base::TimeTicks::Now();
+ ui_test_utils::NavigateToURL(browser(), url);
+ ui_test_utils::NavigateToURLWithDisposition(
+ browser(), GURL(chrome::kChromeUIVersionURL), NEW_FOREGROUND_TAB,
+ ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+ base::TimeDelta upper_bound_delta = base::TimeTicks::Now() - start;
+
+ // Make sure the correct tab is in the foreground.
+ TabStripModel* tab_strip_model = browser()->tab_strip_model();
+ EXPECT_EQ(2, tab_strip_model->count());
+ EXPECT_EQ(url, tab_strip_model->GetWebContentsAt(0)->GetURL());
+ EXPECT_NE(url, tab_strip_model->GetActiveWebContents()->GetURL());
+
+ content::WebContentsDestroyedWatcher destroyed_watcher(
+ tab_strip_model->GetWebContentsAt(0));
+ EXPECT_TRUE(tab_strip_model->CloseWebContentsAt(0, 0));
+ destroyed_watcher.Wait();
+ EXPECT_EQ(1, tab_strip_model->count());
+
+ return upper_bound_delta;
+ }
+
+ // Open and close a tab without ever bringing it to the foreground.
+ void NavigateInBackgroundAndClose(GURL url) {
+ ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIVersionURL));
+ ui_test_utils::NavigateToURLWithDisposition(
+ browser(), url, NEW_BACKGROUND_TAB,
+ ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+
+ // Make sure the correct tab is in the foreground.
+ TabStripModel* tab_strip_model = browser()->tab_strip_model();
+ EXPECT_EQ(2, tab_strip_model->count());
+ EXPECT_EQ(url, tab_strip_model->GetWebContentsAt(1)->GetURL());
+ EXPECT_NE(url, tab_strip_model->GetActiveWebContents()->GetURL());
+
+ content::WebContentsDestroyedWatcher destroyed_watcher(
+ tab_strip_model->GetWebContentsAt(1));
+ EXPECT_TRUE(tab_strip_model->CloseWebContentsAt(1, 0));
+ destroyed_watcher.Wait();
+ EXPECT_EQ(1, tab_strip_model->count());
+ }
+
+ // Open a tab in the background, then bring it to the foreground. Return the
+ // upper bound for how long the URL was open in the foreground.
+ base::TimeDelta NavigateInBackgroundAndCloseInForegroundWithTiming(GURL url) {
+ ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIVersionURL));
+ ui_test_utils::NavigateToURLWithDisposition(
+ browser(), url, NEW_BACKGROUND_TAB,
+ ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+
+ // Make sure the correct tab is in the foreground.
+ TabStripModel* tab_strip_model = browser()->tab_strip_model();
+ EXPECT_EQ(2, tab_strip_model->count());
+ EXPECT_EQ(url, tab_strip_model->GetWebContentsAt(1)->GetURL());
+ EXPECT_NE(url, tab_strip_model->GetActiveWebContents()->GetURL());
+
+ // Close the foreground tab.
+ base::TimeTicks start = base::TimeTicks::Now();
+ content::WebContentsDestroyedWatcher destroyed_watcher(
+ tab_strip_model->GetWebContentsAt(0));
+ EXPECT_TRUE(tab_strip_model->CloseWebContentsAt(0, 0));
+ destroyed_watcher.Wait();
+
+ // Now the background tab should have moved to the foreground.
+ EXPECT_EQ(1, tab_strip_model->count());
+ EXPECT_EQ(url, tab_strip_model->GetActiveWebContents()->GetURL());
+
+ content::WebContentsDestroyedWatcher second_watcher(
+ tab_strip_model->GetActiveWebContents());
+ tab_strip_model->CloseAllTabs();
+ second_watcher.Wait();
+
+ return (base::TimeTicks::Now() - start);
+ }
+
+ protected:
+ base::HistogramTester histogram_tester_;
+ std::unique_ptr<net::EmbeddedTestServer> https_test_server_;
+ std::unique_ptr<net::EmbeddedTestServer> http_test_server_;
+
+ DISALLOW_COPY_AND_ASSIGN(HttpsEngagementPageLoadMetricsBrowserTest);
+};
+
+IN_PROC_BROWSER_TEST_F(HttpsEngagementPageLoadMetricsBrowserTest,
+ Simple_Https) {
+ StartHttpsServer(false);
+ base::TimeDelta upper_bound =
+ NavigateInForegroundAndCloseWithTiming(https_test_server_->GetURL("/"));
+ histogram_tester_.ExpectTotalCount(internal::kHttpEngagementHistogram, 0);
+ histogram_tester_.ExpectTotalCount(internal::kHttpsEngagementHistogram, 1);
+ int32_t bucket_min =
+ histogram_tester_.GetAllSamples(internal::kHttpsEngagementHistogram)[0]
+ .min;
+ EXPECT_GE(upper_bound.InMilliseconds(), bucket_min);
+ EXPECT_LT(0, bucket_min);
+}
+
+IN_PROC_BROWSER_TEST_F(HttpsEngagementPageLoadMetricsBrowserTest, Simple_Http) {
+ StartHttpServer();
+ base::TimeDelta upper_bound =
+ NavigateInForegroundAndCloseWithTiming(http_test_server_->GetURL("/"));
+ histogram_tester_.ExpectTotalCount(internal::kHttpEngagementHistogram, 1);
+ histogram_tester_.ExpectTotalCount(internal::kHttpsEngagementHistogram, 0);
+ int32_t bucket_min =
+ histogram_tester_.GetAllSamples(internal::kHttpEngagementHistogram)[0]
+ .min;
+ EXPECT_GE(upper_bound.InMilliseconds(), bucket_min);
+ EXPECT_LT(0, bucket_min);
+}
+
+IN_PROC_BROWSER_TEST_F(HttpsEngagementPageLoadMetricsBrowserTest, OtherScheme) {
+ NavigateInForegroundAndCloseWithTiming(GURL(chrome::kChromeUIVersionURL));
+ histogram_tester_.ExpectTotalCount(internal::kHttpEngagementHistogram, 0);
+ histogram_tester_.ExpectTotalCount(internal::kHttpsEngagementHistogram, 0);
+}
+
+IN_PROC_BROWSER_TEST_F(HttpsEngagementPageLoadMetricsBrowserTest,
+ SameOrigin_Https) {
+ StartHttpsServer(false);
+ NavigateTwiceInTabAndClose(https_test_server_->GetURL("/simple.html"),
+ https_test_server_->GetURL("/empty.html"));
+ histogram_tester_.ExpectTotalCount(internal::kHttpEngagementHistogram, 0);
+ histogram_tester_.ExpectTotalCount(internal::kHttpsEngagementHistogram, 2);
+}
+
+IN_PROC_BROWSER_TEST_F(HttpsEngagementPageLoadMetricsBrowserTest,
+ SameOrigin_Http) {
+ StartHttpServer();
+ NavigateTwiceInTabAndClose(http_test_server_->GetURL("/simple.html"),
+ http_test_server_->GetURL("/empty.html"));
+ histogram_tester_.ExpectTotalCount(internal::kHttpEngagementHistogram, 2);
+ histogram_tester_.ExpectTotalCount(internal::kHttpsEngagementHistogram, 0);
+}
+
+IN_PROC_BROWSER_TEST_F(HttpsEngagementPageLoadMetricsBrowserTest,
+ UncommittedLoadWithError) {
+ StartHttpsServer(true);
+ TabStripModel* tab_strip_model = browser()->tab_strip_model();
+ ui_test_utils::NavigateToURL(browser(), https_test_server_->GetURL("/"));
+ content::WebContentsDestroyedWatcher destroyed_watcher(
+ tab_strip_model->GetActiveWebContents());
+ EXPECT_TRUE(
+ tab_strip_model->CloseWebContentsAt(tab_strip_model->active_index(), 0));
+ destroyed_watcher.Wait();
+ histogram_tester_.ExpectTotalCount(internal::kHttpEngagementHistogram, 0);
+ histogram_tester_.ExpectTotalCount(internal::kHttpsEngagementHistogram, 0);
+}
+
+IN_PROC_BROWSER_TEST_F(HttpsEngagementPageLoadMetricsBrowserTest,
+ Navigate_Https) {
+ StartHttpsServer(false);
+ NavigateTwiceInTabAndClose(https_test_server_->GetURL("/"),
+ GURL(chrome::kChromeUIVersionURL));
+ histogram_tester_.ExpectTotalCount(internal::kHttpEngagementHistogram, 0);
+ histogram_tester_.ExpectTotalCount(internal::kHttpsEngagementHistogram, 1);
+}
+
+IN_PROC_BROWSER_TEST_F(HttpsEngagementPageLoadMetricsBrowserTest,
+ Navigate_Http) {
+ StartHttpServer();
+ NavigateTwiceInTabAndClose(http_test_server_->GetURL("/"),
+ GURL(chrome::kChromeUIVersionURL));
+ histogram_tester_.ExpectTotalCount(internal::kHttpEngagementHistogram, 1);
+ histogram_tester_.ExpectTotalCount(internal::kHttpsEngagementHistogram, 0);
+}
+
+IN_PROC_BROWSER_TEST_F(HttpsEngagementPageLoadMetricsBrowserTest,
+ Navigate_Both) {
+ StartHttpServer();
+ StartHttpsServer(false);
+ NavigateTwiceInTabAndClose(http_test_server_->GetURL("/"),
+ https_test_server_->GetURL("/"));
+ histogram_tester_.ExpectTotalCount(internal::kHttpEngagementHistogram, 1);
+ histogram_tester_.ExpectTotalCount(internal::kHttpsEngagementHistogram, 1);
+}
+
+IN_PROC_BROWSER_TEST_F(HttpsEngagementPageLoadMetricsBrowserTest,
+ ClosedWhileHidden_Https) {
+ StartHttpsServer(false);
+ base::TimeDelta upper_bound =
+ NavigateInForegroundAndCloseInBackgroundWithTiming(
+ https_test_server_->GetURL("/"));
+ histogram_tester_.ExpectTotalCount(internal::kHttpEngagementHistogram, 0);
+ histogram_tester_.ExpectTotalCount(internal::kHttpsEngagementHistogram, 1);
+ int32_t bucket_min =
+ histogram_tester_.GetAllSamples(internal::kHttpsEngagementHistogram)[0]
+ .min;
+ EXPECT_GE(upper_bound.InMilliseconds(), bucket_min);
+ EXPECT_LT(0, bucket_min);
+}
+
+IN_PROC_BROWSER_TEST_F(HttpsEngagementPageLoadMetricsBrowserTest,
+ ClosedWhileHidden_Http) {
+ StartHttpServer();
+ base::TimeDelta upper_bound =
+ NavigateInForegroundAndCloseInBackgroundWithTiming(
+ http_test_server_->GetURL("/"));
+ histogram_tester_.ExpectTotalCount(internal::kHttpEngagementHistogram, 1);
+ histogram_tester_.ExpectTotalCount(internal::kHttpsEngagementHistogram, 0);
+ int32_t bucket_min =
+ histogram_tester_.GetAllSamples(internal::kHttpEngagementHistogram)[0]
+ .min;
+ EXPECT_GE(upper_bound.InMilliseconds(), bucket_min);
+ EXPECT_LT(0, bucket_min);
+}
+
+IN_PROC_BROWSER_TEST_F(HttpsEngagementPageLoadMetricsBrowserTest,
+ BackgroundThenForeground_Https) {
+ StartHttpsServer(false);
+ base::TimeDelta upper_bound =
+ NavigateInBackgroundAndCloseInForegroundWithTiming(
+ https_test_server_->GetURL("/"));
+ histogram_tester_.ExpectTotalCount(internal::kHttpEngagementHistogram, 0);
+ histogram_tester_.ExpectTotalCount(internal::kHttpsEngagementHistogram, 1);
+ int32_t bucket_min =
+ histogram_tester_.GetAllSamples(internal::kHttpsEngagementHistogram)[0]
+ .min;
+ EXPECT_GE(upper_bound.InMilliseconds(), bucket_min);
+ EXPECT_LT(0, bucket_min);
+}
+
+IN_PROC_BROWSER_TEST_F(HttpsEngagementPageLoadMetricsBrowserTest,
+ BackgroundThenForeground_Http) {
+ StartHttpServer();
+ base::TimeDelta upper_bound =
+ NavigateInBackgroundAndCloseInForegroundWithTiming(
+ http_test_server_->GetURL("/"));
+ histogram_tester_.ExpectTotalCount(internal::kHttpEngagementHistogram, 1);
+ histogram_tester_.ExpectTotalCount(internal::kHttpsEngagementHistogram, 0);
+ int32_t bucket_min =
+ histogram_tester_.GetAllSamples(internal::kHttpEngagementHistogram)[0]
+ .min;
+ EXPECT_GE(upper_bound.InMilliseconds(), bucket_min);
+ EXPECT_LT(0, bucket_min);
+}
+
+IN_PROC_BROWSER_TEST_F(HttpsEngagementPageLoadMetricsBrowserTest,
+ AlwaysInBackground) {
+ StartHttpsServer(false);
+ StartHttpServer();
+ NavigateInBackgroundAndClose(https_test_server_->GetURL("/"));
+ NavigateInBackgroundAndClose(http_test_server_->GetURL("/"));
+ histogram_tester_.ExpectTotalCount(internal::kHttpEngagementHistogram, 0);
+ histogram_tester_.ExpectTotalCount(internal::kHttpsEngagementHistogram, 0);
+}

Powered by Google App Engine
This is Rietveld 408576698