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

Side by Side 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: Address Bryan comments Created 3 years, 4 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <memory>
6 #include <string>
7 #include <unordered_set>
8 #include <utility>
9 #include <vector>
10
5 #include "base/command_line.h" 11 #include "base/command_line.h"
6 #include "base/files/scoped_temp_dir.h" 12 #include "base/files/scoped_temp_dir.h"
7 #include "base/logging.h" 13 #include "base/logging.h"
8 #include "base/macros.h" 14 #include "base/macros.h"
15 #include "base/memory/ptr_util.h"
9 #include "base/memory/weak_ptr.h" 16 #include "base/memory/weak_ptr.h"
10 #include "base/run_loop.h" 17 #include "base/run_loop.h"
11 #include "base/test/histogram_tester.h" 18 #include "base/test/histogram_tester.h"
12 #include "base/threading/thread_restrictions.h" 19 #include "base/threading/thread_restrictions.h"
13 #include "base/time/time.h" 20 #include "base/time/time.h"
14 #include "build/build_config.h" 21 #include "build/build_config.h"
15 #include "chrome/browser/lifetime/keep_alive_types.h" 22 #include "chrome/browser/lifetime/keep_alive_types.h"
16 #include "chrome/browser/lifetime/scoped_keep_alive.h" 23 #include "chrome/browser/lifetime/scoped_keep_alive.h"
17 #include "chrome/browser/page_load_metrics/metrics_web_contents_observer.h" 24 #include "chrome/browser/page_load_metrics/metrics_web_contents_observer.h"
18 #include "chrome/browser/page_load_metrics/observers/aborts_page_load_metrics_ob server.h" 25 #include "chrome/browser/page_load_metrics/observers/aborts_page_load_metrics_ob server.h"
19 #include "chrome/browser/page_load_metrics/observers/core_page_load_metrics_obse rver.h" 26 #include "chrome/browser/page_load_metrics/observers/core_page_load_metrics_obse rver.h"
20 #include "chrome/browser/page_load_metrics/observers/document_write_page_load_me trics_observer.h" 27 #include "chrome/browser/page_load_metrics/observers/document_write_page_load_me trics_observer.h"
21 #include "chrome/browser/page_load_metrics/observers/no_state_prefetch_page_load _metrics_observer.h" 28 #include "chrome/browser/page_load_metrics/observers/no_state_prefetch_page_load _metrics_observer.h"
29 #include "chrome/browser/page_load_metrics/observers/session_restore_page_load_m etrics_observer.h"
22 #include "chrome/browser/page_load_metrics/observers/use_counter_page_load_metri cs_observer.h" 30 #include "chrome/browser/page_load_metrics/observers/use_counter_page_load_metri cs_observer.h"
31 #include "chrome/browser/page_load_metrics/page_load_metrics_initialize.h"
23 #include "chrome/browser/page_load_metrics/page_load_tracker.h" 32 #include "chrome/browser/page_load_metrics/page_load_tracker.h"
24 #include "chrome/browser/prefs/session_startup_pref.h" 33 #include "chrome/browser/prefs/session_startup_pref.h"
25 #include "chrome/browser/prerender/prerender_histograms.h" 34 #include "chrome/browser/prerender/prerender_histograms.h"
26 #include "chrome/browser/prerender/prerender_origin.h" 35 #include "chrome/browser/prerender/prerender_origin.h"
27 #include "chrome/browser/profiles/profile.h" 36 #include "chrome/browser/profiles/profile.h"
37 #include "chrome/browser/sessions/session_restore.h"
38 #include "chrome/browser/sessions/session_restore_test_helper.h"
28 #include "chrome/browser/sessions/session_service_factory.h" 39 #include "chrome/browser/sessions/session_service_factory.h"
29 #include "chrome/browser/sessions/session_service_test_helper.h" 40 #include "chrome/browser/sessions/session_service_test_helper.h"
30 #include "chrome/browser/ui/browser.h" 41 #include "chrome/browser/ui/browser.h"
31 #include "chrome/browser/ui/browser_commands.h" 42 #include "chrome/browser/ui/browser_commands.h"
32 #include "chrome/browser/ui/browser_navigator_params.h" 43 #include "chrome/browser/ui/browser_navigator_params.h"
33 #include "chrome/browser/ui/tabs/tab_strip_model.h" 44 #include "chrome/browser/ui/tabs/tab_strip_model.h"
34 #include "chrome/common/chrome_features.h" 45 #include "chrome/common/chrome_features.h"
35 #include "chrome/common/pref_names.h" 46 #include "chrome/common/pref_names.h"
36 #include "chrome/common/url_constants.h" 47 #include "chrome/common/url_constants.h"
37 #include "chrome/test/base/in_process_browser_test.h" 48 #include "chrome/test/base/in_process_browser_test.h"
38 #include "chrome/test/base/ui_test_utils.h" 49 #include "chrome/test/base/ui_test_utils.h"
39 #include "components/prefs/pref_service.h" 50 #include "components/prefs/pref_service.h"
51 #include "components/sessions/core/serialized_navigation_entry.h"
52 #include "components/sessions/core/serialized_navigation_entry_test_helper.h"
40 #include "content/public/browser/browser_thread.h" 53 #include "content/public/browser/browser_thread.h"
41 #include "content/public/browser/render_process_host.h" 54 #include "content/public/browser/render_process_host.h"
42 #include "content/public/browser/render_view_host.h" 55 #include "content/public/browser/render_view_host.h"
43 #include "content/public/common/content_features.h" 56 #include "content/public/common/content_features.h"
44 #include "content/public/common/content_switches.h" 57 #include "content/public/common/content_switches.h"
58 #include "content/public/common/referrer.h"
45 #include "content/public/test/browser_test_utils.h" 59 #include "content/public/test/browser_test_utils.h"
46 #include "content/public/test/download_test_observer.h" 60 #include "content/public/test/download_test_observer.h"
47 #include "net/base/net_errors.h" 61 #include "net/base/net_errors.h"
48 #include "net/dns/mock_host_resolver.h" 62 #include "net/dns/mock_host_resolver.h"
49 #include "net/http/failing_http_transaction_factory.h" 63 #include "net/http/failing_http_transaction_factory.h"
50 #include "net/http/http_cache.h" 64 #include "net/http/http_cache.h"
51 #include "net/test/embedded_test_server/embedded_test_server.h" 65 #include "net/test/embedded_test_server/embedded_test_server.h"
52 #include "net/test/url_request/url_request_failed_job.h" 66 #include "net/test/url_request/url_request_failed_job.h"
53 #include "net/url_request/url_request_context.h" 67 #include "net/url_request/url_request_context.h"
54 #include "net/url_request/url_request_context_getter.h" 68 #include "net/url_request/url_request_context_getter.h"
55 #include "third_party/WebKit/public/platform/web_feature.mojom.h" 69 #include "third_party/WebKit/public/platform/web_feature.mojom.h"
70 #include "url/gurl.h"
56 71
57 namespace { 72 namespace {
58 73
59 void FailAllNetworkTransactions(net::URLRequestContextGetter* getter) { 74 void FailAllNetworkTransactions(net::URLRequestContextGetter* getter) {
60 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 75 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
61 net::HttpCache* cache( 76 net::HttpCache* cache(
62 getter->GetURLRequestContext()->http_transaction_factory()->GetCache()); 77 getter->GetURLRequestContext()->http_transaction_factory()->GetCache());
63 DCHECK(cache); 78 DCHECK(cache);
64 std::unique_ptr<net::FailingHttpTransactionFactory> factory = 79 std::unique_ptr<net::FailingHttpTransactionFactory> factory =
65 base::MakeUnique<net::FailingHttpTransactionFactory>(cache->GetSession(), 80 base::MakeUnique<net::FailingHttpTransactionFactory>(cache->GetSession(),
(...skipping 1045 matching lines...) Expand 10 before | Expand all | Expand 10 after
1111 } 1126 }
1112 1127
1113 class SessionRestorePageLoadMetricsBrowserTest 1128 class SessionRestorePageLoadMetricsBrowserTest
1114 : public PageLoadMetricsBrowserTest { 1129 : public PageLoadMetricsBrowserTest {
1115 public: 1130 public:
1116 SessionRestorePageLoadMetricsBrowserTest() {} 1131 SessionRestorePageLoadMetricsBrowserTest() {}
1117 1132
1118 // PageLoadMetricsBrowserTest: 1133 // PageLoadMetricsBrowserTest:
1119 void SetUpOnMainThread() override { 1134 void SetUpOnMainThread() override {
1120 PageLoadMetricsBrowserTest::SetUpOnMainThread(); 1135 PageLoadMetricsBrowserTest::SetUpOnMainThread();
1121 SessionStartupPref::SetStartupPref(
1122 browser()->profile(), SessionStartupPref(SessionStartupPref::LAST));
1123 ASSERT_TRUE(embedded_test_server()->Start()); 1136 ASSERT_TRUE(embedded_test_server()->Start());
1124 #if defined(OS_CHROMEOS)
1125 SessionServiceTestHelper helper(
1126 SessionServiceFactory::GetForProfile(browser()->profile()));
1127 helper.SetForceBrowserNotAliveWithNoWindows(true);
1128 helper.ReleaseService();
1129 #endif
1130 } 1137 }
1131 1138
1132 Browser* QuitBrowserAndRestore(Browser* browser) { 1139 Browser* QuitBrowserAndRestore(Browser* browser) {
1133 Profile* profile = browser->profile(); 1140 Profile* profile = browser->profile();
1134 1141
1142 SessionStartupPref::SetStartupPref(
1143 profile, SessionStartupPref(SessionStartupPref::LAST));
1144 #if defined(OS_CHROMEOS)
1145 SessionServiceTestHelper helper(
1146 SessionServiceFactory::GetForProfile(profile));
1147 helper.SetForceBrowserNotAliveWithNoWindows(true);
1148 helper.ReleaseService();
1149 #endif
1150
1135 std::unique_ptr<ScopedKeepAlive> keep_alive(new ScopedKeepAlive( 1151 std::unique_ptr<ScopedKeepAlive> keep_alive(new ScopedKeepAlive(
1136 KeepAliveOrigin::SESSION_RESTORE, KeepAliveRestartOption::DISABLED)); 1152 KeepAliveOrigin::SESSION_RESTORE, KeepAliveRestartOption::DISABLED));
1137 CloseBrowserSynchronously(browser); 1153 CloseBrowserSynchronously(browser);
1138 1154
1139 // Create a new window, which should trigger session restore. 1155 // Create a new window, which should trigger session restore.
1140 chrome::NewEmptyWindow(profile); 1156 chrome::NewEmptyWindow(profile);
1141 ui_test_utils::BrowserAddedObserver window_observer; 1157 ui_test_utils::BrowserAddedObserver window_observer;
1142 return window_observer.WaitForSingleNewBrowser(); 1158 SessionRestoreTestHelper restore_observer;
1159
1160 Browser* new_browser = window_observer.WaitForSingleNewBrowser();
1161 restore_observer.Wait();
1162 return new_browser;
1143 } 1163 }
1144 1164
1145 void WaitForTabsToLoad(Browser* browser) { 1165 void WaitForTabsToLoad(Browser* browser) {
1146 for (int i = 0; i < browser->tab_strip_model()->count(); ++i) { 1166 for (int i = 0; i < browser->tab_strip_model()->count(); ++i) {
1147 content::WebContents* contents = 1167 content::WebContents* contents =
1148 browser->tab_strip_model()->GetWebContentsAt(i); 1168 browser->tab_strip_model()->GetWebContentsAt(i);
1149 contents->GetController().LoadIfNecessary(); 1169 contents->GetController().LoadIfNecessary();
1150 content::WaitForLoadStop(contents); 1170 ASSERT_TRUE(content::WaitForLoadStop(contents));
1151 } 1171 }
1152 } 1172 }
1153 1173
1174 // The PageLoadMetricsWaiter can observe first meaningful paints on these test
1175 // pages while not on other simple pages such as /title1.html.
1154 GURL GetTestURL() const { 1176 GURL GetTestURL() const {
1155 return embedded_test_server()->GetURL("/title1.html"); 1177 return embedded_test_server()->GetURL(
1178 "/page_load_metrics/main_frame_with_iframe.html");
1179 }
1180
1181 GURL GetTestURL2() const {
1182 return embedded_test_server()->GetURL("/title2.html");
1183 }
1184
1185 void ExpectFirstPaintMetricsTotalCount(int expected_total_count) const {
1186 histogram_tester_.ExpectTotalCount(
1187 internal::kHistogramSessionRestoreForegroundTabFirstPaint,
1188 expected_total_count);
1189 histogram_tester_.ExpectTotalCount(
1190 internal::kHistogramSessionRestoreForegroundTabFirstContentfulPaint,
1191 expected_total_count);
1192 histogram_tester_.ExpectTotalCount(
1193 internal::kHistogramSessionRestoreForegroundTabFirstMeaningfulPaint,
1194 expected_total_count);
1156 } 1195 }
1157 1196
1158 private: 1197 private:
1159 DISALLOW_COPY_AND_ASSIGN(SessionRestorePageLoadMetricsBrowserTest); 1198 DISALLOW_COPY_AND_ASSIGN(SessionRestorePageLoadMetricsBrowserTest);
1160 }; 1199 };
1161 1200
1201 class SessionRestorePaintWaiter : public SessionRestoreObserver {
1202 public:
1203 SessionRestorePaintWaiter() { SessionRestore::AddObserver(this); }
1204 ~SessionRestorePaintWaiter() { SessionRestore::RemoveObserver(this); }
1205
1206 // SessionRestoreObserver implementation:
1207 void OnWillRestoreTab(content::WebContents* contents) override {
1208 chrome::InitializePageLoadMetricsForWebContents(contents);
1209 auto waiter = base::MakeUnique<PageLoadMetricsWaiter>(contents);
1210 waiter->AddPageExpectation(TimingField::FIRST_PAINT);
1211 waiter->AddPageExpectation(TimingField::FIRST_CONTENTFUL_PAINT);
1212 waiter->AddPageExpectation(TimingField::FIRST_MEANINGFUL_PAINT);
1213 waiters_[contents] = std::move(waiter);
1214 }
1215
1216 // First meaningful paints occur only on foreground tabs.
1217 void WaitForForegroundTabs(size_t num_expected_foreground_tabs) {
1218 size_t num_actual_foreground_tabs = 0;
1219 for (auto iter = waiters_.begin(); iter != waiters_.end(); ++iter) {
1220 if (!iter->first->IsVisible())
1221 continue;
1222 iter->second->Wait();
1223 ++num_actual_foreground_tabs;
1224 }
1225 EXPECT_EQ(num_expected_foreground_tabs, num_actual_foreground_tabs);
1226 }
1227
1228 private:
1229 std::unordered_map<content::WebContents*,
1230 std::unique_ptr<PageLoadMetricsWaiter>>
1231 waiters_;
1232
1233 DISALLOW_COPY_AND_ASSIGN(SessionRestorePaintWaiter);
1234 };
1235
1162 IN_PROC_BROWSER_TEST_F(SessionRestorePageLoadMetricsBrowserTest, 1236 IN_PROC_BROWSER_TEST_F(SessionRestorePageLoadMetricsBrowserTest,
1163 InitialVisibilityOfSingleRestoredTab) { 1237 InitialVisibilityOfSingleRestoredTab) {
1164 ui_test_utils::NavigateToURL(browser(), GetTestURL()); 1238 ui_test_utils::NavigateToURL(browser(), GetTestURL());
1165 histogram_tester_.ExpectTotalCount( 1239 histogram_tester_.ExpectTotalCount(
1166 page_load_metrics::internal::kPageLoadStartedInForeground, 1); 1240 page_load_metrics::internal::kPageLoadStartedInForeground, 1);
1167 histogram_tester_.ExpectBucketCount( 1241 histogram_tester_.ExpectBucketCount(
1168 page_load_metrics::internal::kPageLoadStartedInForeground, true, 1); 1242 page_load_metrics::internal::kPageLoadStartedInForeground, true, 1);
1169 1243
1170 Browser* new_browser = QuitBrowserAndRestore(browser()); 1244 Browser* new_browser = QuitBrowserAndRestore(browser());
1171 WaitForTabsToLoad(new_browser); 1245 ASSERT_NO_FATAL_FAILURE(WaitForTabsToLoad(new_browser));
1172 1246
1173 histogram_tester_.ExpectTotalCount( 1247 histogram_tester_.ExpectTotalCount(
1174 page_load_metrics::internal::kPageLoadStartedInForeground, 2); 1248 page_load_metrics::internal::kPageLoadStartedInForeground, 2);
1175 histogram_tester_.ExpectBucketCount( 1249 histogram_tester_.ExpectBucketCount(
1176 page_load_metrics::internal::kPageLoadStartedInForeground, true, 2); 1250 page_load_metrics::internal::kPageLoadStartedInForeground, true, 2);
1177 } 1251 }
1178 1252
1179 IN_PROC_BROWSER_TEST_F(SessionRestorePageLoadMetricsBrowserTest, 1253 IN_PROC_BROWSER_TEST_F(SessionRestorePageLoadMetricsBrowserTest,
1180 InitialVisibilityOfMultipleRestoredTabs) { 1254 InitialVisibilityOfMultipleRestoredTabs) {
1181 ui_test_utils::NavigateToURL(browser(), GetTestURL()); 1255 ui_test_utils::NavigateToURL(browser(), GetTestURL());
1182 ui_test_utils::NavigateToURLWithDisposition( 1256 ui_test_utils::NavigateToURLWithDisposition(
1183 browser(), GetTestURL(), WindowOpenDisposition::NEW_BACKGROUND_TAB, 1257 browser(), GetTestURL(), WindowOpenDisposition::NEW_BACKGROUND_TAB,
1184 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 1258 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
1185 histogram_tester_.ExpectTotalCount( 1259 histogram_tester_.ExpectTotalCount(
1186 page_load_metrics::internal::kPageLoadStartedInForeground, 2); 1260 page_load_metrics::internal::kPageLoadStartedInForeground, 2);
1187 histogram_tester_.ExpectBucketCount( 1261 histogram_tester_.ExpectBucketCount(
1188 page_load_metrics::internal::kPageLoadStartedInForeground, false, 1); 1262 page_load_metrics::internal::kPageLoadStartedInForeground, false, 1);
1189 1263
1190 Browser* new_browser = QuitBrowserAndRestore(browser()); 1264 Browser* new_browser = QuitBrowserAndRestore(browser());
1191 WaitForTabsToLoad(new_browser); 1265 ASSERT_NO_FATAL_FAILURE(WaitForTabsToLoad(new_browser));
1192 1266
1193 TabStripModel* tab_strip = new_browser->tab_strip_model(); 1267 TabStripModel* tab_strip = new_browser->tab_strip_model();
1194 ASSERT_TRUE(tab_strip); 1268 ASSERT_TRUE(tab_strip);
1195 ASSERT_EQ(2, tab_strip->count()); 1269 ASSERT_EQ(2, tab_strip->count());
1196 1270
1197 histogram_tester_.ExpectTotalCount( 1271 histogram_tester_.ExpectTotalCount(
1198 page_load_metrics::internal::kPageLoadStartedInForeground, 4); 1272 page_load_metrics::internal::kPageLoadStartedInForeground, 4);
1199 histogram_tester_.ExpectBucketCount( 1273 histogram_tester_.ExpectBucketCount(
1200 page_load_metrics::internal::kPageLoadStartedInForeground, true, 2); 1274 page_load_metrics::internal::kPageLoadStartedInForeground, true, 2);
1201 histogram_tester_.ExpectBucketCount( 1275 histogram_tester_.ExpectBucketCount(
1202 page_load_metrics::internal::kPageLoadStartedInForeground, false, 2); 1276 page_load_metrics::internal::kPageLoadStartedInForeground, false, 2);
1203 } 1277 }
1278
1279 IN_PROC_BROWSER_TEST_F(SessionRestorePageLoadMetricsBrowserTest,
1280 NoSessionRestore) {
1281 ui_test_utils::NavigateToURL(browser(), GetTestURL());
1282 ExpectFirstPaintMetricsTotalCount(0);
1283 }
1284
1285 IN_PROC_BROWSER_TEST_F(SessionRestorePageLoadMetricsBrowserTest,
1286 SingleTabSessionRestore) {
1287 ui_test_utils::NavigateToURL(browser(), GetTestURL());
1288
1289 SessionRestorePaintWaiter session_restore_paint_waiter;
1290 QuitBrowserAndRestore(browser());
1291
1292 session_restore_paint_waiter.WaitForForegroundTabs(1);
1293 ExpectFirstPaintMetricsTotalCount(1);
1294 }
1295
1296 IN_PROC_BROWSER_TEST_F(SessionRestorePageLoadMetricsBrowserTest,
1297 MultipleTabsSessionRestore) {
1298 ui_test_utils::NavigateToURL(browser(), GetTestURL());
1299 ui_test_utils::NavigateToURLWithDisposition(
1300 browser(), GetTestURL(), WindowOpenDisposition::NEW_BACKGROUND_TAB,
1301 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
1302
1303 SessionRestorePaintWaiter session_restore_paint_waiter;
1304 Browser* new_browser = QuitBrowserAndRestore(browser());
1305
1306 TabStripModel* tab_strip = new_browser->tab_strip_model();
1307 ASSERT_TRUE(tab_strip);
1308 ASSERT_EQ(2, tab_strip->count());
1309
1310 // Only metrics of the initial foreground tab are recorded.
1311 session_restore_paint_waiter.WaitForForegroundTabs(1);
1312 ExpectFirstPaintMetricsTotalCount(1);
1313 }
1314
1315 IN_PROC_BROWSER_TEST_F(SessionRestorePageLoadMetricsBrowserTest,
1316 NavigationDuringSessionRestore) {
1317 NavigateToUntrackedUrl();
1318 Browser* new_browser = QuitBrowserAndRestore(browser());
1319
1320 auto waiter = base::MakeUnique<PageLoadMetricsWaiter>(
1321 new_browser->tab_strip_model()->GetActiveWebContents());
1322 waiter->AddPageExpectation(TimingField::FIRST_MEANINGFUL_PAINT);
1323 ui_test_utils::NavigateToURL(new_browser, GetTestURL());
1324 waiter->Wait();
1325
1326 // No metrics recorded for the second navigation because the tab navigated
1327 // away during session restore.
1328 ExpectFirstPaintMetricsTotalCount(0);
1329 }
1330
1331 IN_PROC_BROWSER_TEST_F(SessionRestorePageLoadMetricsBrowserTest,
1332 LoadingAfterSessionRestore) {
1333 ui_test_utils::NavigateToURL(browser(), GetTestURL());
1334
1335 Browser* new_browser = nullptr;
1336 {
1337 SessionRestorePaintWaiter session_restore_paint_waiter;
1338 new_browser = QuitBrowserAndRestore(browser());
1339
1340 session_restore_paint_waiter.WaitForForegroundTabs(1);
1341 ExpectFirstPaintMetricsTotalCount(1);
1342 }
1343
1344 // Load a new page after session restore.
1345 auto waiter = base::MakeUnique<PageLoadMetricsWaiter>(
1346 new_browser->tab_strip_model()->GetActiveWebContents());
1347 waiter->AddPageExpectation(TimingField::FIRST_MEANINGFUL_PAINT);
1348 ui_test_utils::NavigateToURL(new_browser, GetTestURL());
1349 waiter->Wait();
1350
1351 // No more metrics because the navigation is after session restore.
1352 ExpectFirstPaintMetricsTotalCount(1);
1353 }
1354
1355 IN_PROC_BROWSER_TEST_F(SessionRestorePageLoadMetricsBrowserTest,
1356 InitialForegroundTabChanged) {
1357 ui_test_utils::NavigateToURL(browser(), GetTestURL());
1358 ui_test_utils::NavigateToURLWithDisposition(
1359 browser(), GetTestURL(), WindowOpenDisposition::NEW_BACKGROUND_TAB,
1360 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
1361
1362 SessionRestorePaintWaiter session_restore_paint_waiter;
1363 Browser* new_browser = QuitBrowserAndRestore(browser());
1364
1365 // Change the foreground tab before the first meaningful paint.
1366 TabStripModel* tab_strip = new_browser->tab_strip_model();
1367 ASSERT_TRUE(tab_strip);
1368 ASSERT_EQ(2, tab_strip->count());
1369 ASSERT_EQ(0, tab_strip->active_index());
1370 tab_strip->ActivateTabAt(1, true);
1371
1372 session_restore_paint_waiter.WaitForForegroundTabs(1);
1373
1374 // No metrics were recorded because initial foreground tab was switched away.
1375 ExpectFirstPaintMetricsTotalCount(0);
1376 }
1377
1378 IN_PROC_BROWSER_TEST_F(SessionRestorePageLoadMetricsBrowserTest,
1379 MultipleSessionRestores) {
1380 ui_test_utils::NavigateToURL(browser(), GetTestURL());
1381
1382 Browser* current_browser = browser();
1383 const int num_session_restores = 3;
1384 for (int i = 1; i <= num_session_restores; ++i) {
1385 SessionRestorePaintWaiter session_restore_paint_waiter;
1386 current_browser = QuitBrowserAndRestore(current_browser);
1387 session_restore_paint_waiter.WaitForForegroundTabs(1);
1388 ExpectFirstPaintMetricsTotalCount(i);
1389 }
1390 }
1391
1392 IN_PROC_BROWSER_TEST_F(SessionRestorePageLoadMetricsBrowserTest,
1393 RestoreForeignTab) {
1394 sessions::SerializedNavigationEntry nav =
1395 sessions::SerializedNavigationEntryTestHelper::CreateNavigation(
1396 GetTestURL().spec(), "one");
1397
1398 // Set up the restore data.
1399 sync_pb::SessionTab sync_data;
1400 sync_data.set_tab_visual_index(0);
1401 sync_data.set_current_navigation_index(1);
1402 sync_data.set_pinned(false);
1403 sync_data.add_navigation()->CopyFrom(nav.ToSyncData());
1404
1405 sessions::SessionTab tab;
1406 tab.SetFromSyncData(sync_data, base::Time::Now());
1407 ASSERT_EQ(1, browser()->tab_strip_model()->count());
1408
1409 // Restore in the current tab.
1410 content::WebContents* tab_contents = nullptr;
1411 {
1412 SessionRestorePaintWaiter session_restore_paint_waiter;
1413 tab_contents = SessionRestore::RestoreForeignSessionTab(
1414 browser()->tab_strip_model()->GetActiveWebContents(), tab,
1415 WindowOpenDisposition::CURRENT_TAB);
1416 ASSERT_EQ(1, browser()->tab_strip_model()->count());
1417 ASSERT_TRUE(tab_contents);
1418 ASSERT_EQ(GetTestURL(), tab_contents->GetURL());
1419
1420 session_restore_paint_waiter.WaitForForegroundTabs(1);
1421 ExpectFirstPaintMetricsTotalCount(1);
1422 }
1423
1424 // Restore in a new foreground tab.
1425 {
1426 SessionRestorePaintWaiter session_restore_paint_waiter;
1427 tab_contents = SessionRestore::RestoreForeignSessionTab(
1428 browser()->tab_strip_model()->GetActiveWebContents(), tab,
1429 WindowOpenDisposition::NEW_FOREGROUND_TAB);
1430 ASSERT_EQ(2, browser()->tab_strip_model()->count());
1431 ASSERT_EQ(1, browser()->tab_strip_model()->active_index());
1432 ASSERT_TRUE(tab_contents);
1433 ASSERT_EQ(GetTestURL(), tab_contents->GetURL());
1434
1435 session_restore_paint_waiter.WaitForForegroundTabs(1);
1436 ExpectFirstPaintMetricsTotalCount(2);
1437 }
1438
1439 // Restore in a new background tab.
1440 {
1441 tab_contents = SessionRestore::RestoreForeignSessionTab(
1442 browser()->tab_strip_model()->GetActiveWebContents(), tab,
1443 WindowOpenDisposition::NEW_BACKGROUND_TAB);
1444 ASSERT_EQ(3, browser()->tab_strip_model()->count());
1445 ASSERT_EQ(1, browser()->tab_strip_model()->active_index());
1446 ASSERT_TRUE(tab_contents);
1447 ASSERT_EQ(GetTestURL(), tab_contents->GetURL());
1448 ASSERT_NO_FATAL_FAILURE(WaitForTabsToLoad(browser()));
1449
1450 // Do not record timings of initially background tabs.
1451 ExpectFirstPaintMetricsTotalCount(2);
1452 }
1453 }
1454
1455 IN_PROC_BROWSER_TEST_F(SessionRestorePageLoadMetricsBrowserTest,
1456 RestoreForeignSession) {
1457 Profile* profile = browser()->profile();
1458
1459 sessions::SerializedNavigationEntry nav1 =
1460 sessions::SerializedNavigationEntryTestHelper::CreateNavigation(
1461 GetTestURL().spec(), "one");
1462 sessions::SerializedNavigationEntry nav2 =
1463 sessions::SerializedNavigationEntryTestHelper::CreateNavigation(
1464 GetTestURL2().spec(), "two");
1465
1466 // Set up the restore data: one window with two tabs.
1467 std::vector<const sessions::SessionWindow*> session;
1468 sessions::SessionWindow window;
1469 auto tab1 = base::MakeUnique<sessions::SessionTab>();
1470 {
1471 sync_pb::SessionTab sync_data;
1472 sync_data.set_tab_visual_index(0);
1473 sync_data.set_current_navigation_index(0);
1474 sync_data.set_pinned(true);
1475 sync_data.add_navigation()->CopyFrom(nav1.ToSyncData());
1476 tab1->SetFromSyncData(sync_data, base::Time::Now());
1477 }
1478 window.tabs.push_back(std::move(tab1));
1479
1480 auto tab2 = base::MakeUnique<sessions::SessionTab>();
1481 {
1482 sync_pb::SessionTab sync_data;
1483 sync_data.set_tab_visual_index(1);
1484 sync_data.set_current_navigation_index(0);
1485 sync_data.set_pinned(false);
1486 sync_data.add_navigation()->CopyFrom(nav2.ToSyncData());
1487 tab2->SetFromSyncData(sync_data, base::Time::Now());
1488 }
1489 window.tabs.push_back(std::move(tab2));
1490
1491 // Restore the session window with 2 tabs.
1492 session.push_back(static_cast<const sessions::SessionWindow*>(&window));
1493 ui_test_utils::BrowserAddedObserver window_observer;
1494 SessionRestorePaintWaiter session_restore_paint_waiter;
1495 SessionRestore::RestoreForeignSessionWindows(profile, session.begin(),
1496 session.end());
1497 Browser* new_browser = window_observer.WaitForSingleNewBrowser();
1498 ASSERT_TRUE(new_browser);
1499 ASSERT_EQ(2, new_browser->tab_strip_model()->count());
1500
1501 session_restore_paint_waiter.WaitForForegroundTabs(1);
1502 ExpectFirstPaintMetricsTotalCount(1);
1503 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698