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

Side by Side Diff: chrome/browser/sessions/session_restore_browsertest.cc

Issue 1131373003: [Session restore] Add MRU logic to loading of background pages. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove unnecessary change in tab_restore_service.h Created 5 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 unified diff | Download patch
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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 <vector> 5 #include <vector>
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/files/file_path.h" 8 #include "base/files/file_path.h"
9 #include "base/memory/memory_pressure_listener.h" 9 #include "base/memory/memory_pressure_listener.h"
10 #include "base/process/launch.h" 10 #include "base/process/launch.h"
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 } 205 }
206 } 206 }
207 207
208 GURL url1_; 208 GURL url1_;
209 GURL url2_; 209 GURL url2_;
210 GURL url3_; 210 GURL url3_;
211 211
212 const BrowserList* active_browser_list_; 212 const BrowserList* active_browser_list_;
213 }; 213 };
214 214
215 // Activates the smart restore behaviour and can track the loading of tabs. 215 // Activates the smart restore behaviour in "simple" mode and tracks the loading
216 class SmartSessionRestoreTest : public SessionRestoreTest, 216 // of tabs.
217 public content::NotificationObserver { 217 class SmartSessionRestoreSimpleTest : public SessionRestoreTest,
218 public content::NotificationObserver {
218 public: 219 public:
219 SmartSessionRestoreTest() {} 220 SmartSessionRestoreSimpleTest() {}
220 void StartObserving(int num_tabs) { 221 void StartObserving(int num_tabs) {
222 // Start by clearing everything so it can be reused in the same test.
223 web_contents_.clear();
224 registrar_.RemoveAll();
221 num_tabs_ = num_tabs; 225 num_tabs_ = num_tabs;
222 registrar_.Add(this, content::NOTIFICATION_LOAD_START, 226 registrar_.Add(this, content::NOTIFICATION_LOAD_START,
223 content::NotificationService::AllSources()); 227 content::NotificationService::AllSources());
224 } 228 }
225 void Observe(int type, 229 void Observe(int type,
226 const content::NotificationSource& source, 230 const content::NotificationSource& source,
227 const content::NotificationDetails& details) override { 231 const content::NotificationDetails& details) override {
228 switch (type) { 232 switch (type) {
229 case content::NOTIFICATION_LOAD_START: { 233 case content::NOTIFICATION_LOAD_START: {
230 content::NavigationController* controller = 234 content::NavigationController* controller =
(...skipping 23 matching lines...) Expand all
254 "IntelligentSessionRestore.TestGroup:PrioritizeTabs/simple"); 258 "IntelligentSessionRestore.TestGroup:PrioritizeTabs/simple");
255 } 259 }
256 260
257 private: 261 private:
258 content::NotificationRegistrar registrar_; 262 content::NotificationRegistrar registrar_;
259 // Ordered by load start order. 263 // Ordered by load start order.
260 std::vector<content::WebContents*> web_contents_; 264 std::vector<content::WebContents*> web_contents_;
261 scoped_refptr<content::MessageLoopRunner> message_loop_runner_; 265 scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
262 int num_tabs_; 266 int num_tabs_;
263 267
264 DISALLOW_COPY_AND_ASSIGN(SmartSessionRestoreTest); 268 DISALLOW_COPY_AND_ASSIGN(SmartSessionRestoreSimpleTest);
269 };
270
271 class SmartSessionRestoreMRUTest : public SmartSessionRestoreSimpleTest {
272 public:
273 SmartSessionRestoreMRUTest() {}
274
275 protected:
276 void SetUpCommandLine(base::CommandLine* command_line) override {
277 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
278 switches::kForceFieldTrials, "IntelligentSessionRestore/TestGroup/");
279 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
280 switches::kForceFieldTrialParams,
281 "IntelligentSessionRestore.TestGroup:PrioritizeTabs/mru");
282 }
283
284 private:
285 DISALLOW_COPY_AND_ASSIGN(SmartSessionRestoreMRUTest);
265 }; 286 };
266 287
267 // Verifies that restored tabs have a root window. This is important 288 // Verifies that restored tabs have a root window. This is important
268 // otherwise the wrong information is communicated to the renderer. 289 // otherwise the wrong information is communicated to the renderer.
269 // (http://crbug.com/342672). 290 // (http://crbug.com/342672).
270 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, RestoredTabsShouldHaveWindow) { 291 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, RestoredTabsShouldHaveWindow) {
271 // Create tabs. 292 // Create tabs.
272 ui_test_utils::NavigateToURLWithDisposition( 293 ui_test_utils::NavigateToURLWithDisposition(
273 browser(), 294 browser(),
274 GURL(url::kAboutBlankURL), 295 GURL(url::kAboutBlankURL),
(...skipping 1051 matching lines...) Expand 10 before | Expand all | Expand 10 after
1326 &browser()->tab_strip_model()->GetActiveWebContents()->GetController(); 1347 &browser()->tab_strip_model()->GetActiveWebContents()->GetController();
1327 EXPECT_TRUE( 1348 EXPECT_TRUE(
1328 controller->GetDefaultSessionStorageNamespace()->should_persist()); 1349 controller->GetDefaultSessionStorageNamespace()->should_persist());
1329 1350
1330 // Quit and restore. Check that no extra tabs were created. 1351 // Quit and restore. Check that no extra tabs were created.
1331 Browser* new_browser = QuitBrowserAndRestore(browser(), 1); 1352 Browser* new_browser = QuitBrowserAndRestore(browser(), 1);
1332 ASSERT_EQ(1u, active_browser_list_->size()); 1353 ASSERT_EQ(1u, active_browser_list_->size());
1333 EXPECT_EQ(1, new_browser->tab_strip_model()->count()); 1354 EXPECT_EQ(1, new_browser->tab_strip_model()->count());
1334 } 1355 }
1335 1356
1336 IN_PROC_BROWSER_TEST_F(SmartSessionRestoreTest, CorrectLoadingOrder) { 1357 IN_PROC_BROWSER_TEST_F(SmartSessionRestoreSimpleTest, CorrectLoadingOrder) {
1337 ASSERT_EQ(SessionRestore::SMART_RESTORE_MODE_SIMPLE, 1358 ASSERT_EQ(SessionRestore::SMART_RESTORE_MODE_SIMPLE,
1338 SessionRestore::GetSmartRestoreMode()); 1359 SessionRestore::GetSmartRestoreMode());
1339 1360
1340 const int NumTabs = 6; 1361 const int num_tabs = 6;
1341 1362
1342 // Start observing the loading of tabs, to make sure the order is correct. 1363 // Start observing the loading of tabs, to make sure the order is correct.
1343 StartObserving(NumTabs); 1364 StartObserving(num_tabs);
1344 1365
1345 struct TabInfo { 1366 struct TabInfo {
1346 GURL url; 1367 GURL url;
1347 bool pinned; 1368 bool pinned;
1348 int expected_load_order; 1369 int expected_load_order;
1349 }; 1370 };
1350 1371
1351 TabInfo tab_info[NumTabs] = { 1372 TabInfo tab_info[num_tabs] = {
1352 // This will be the foreground tab and will always load first. 1373 // This will be the foreground tab and will always load first.
1353 {GURL("http://google.com/1"), false, 1}, 1374 {GURL("http://google.com/1"), false, 1},
1354 {GURL("http://google.com/2"), false, 3}, 1375 {GURL("http://google.com/2"), false, 3},
1355 // Internal page, should load last. 1376 // Internal page, should load last.
1356 {GURL(chrome::kChromeUINewTabURL), false, 6}, 1377 {GURL(chrome::kChromeUINewTabURL), false, 6},
1357 {GURL("http://google.com/4"), false, 4}, 1378 {GURL("http://google.com/4"), false, 4},
1358 {GURL("http://google.com/5"), true, 2}, // Pinned, should load second. 1379 {GURL("http://google.com/5"), true, 2}, // Pinned, should load second.
1359 {GURL("http://google.com/6"), false, 5}, 1380 {GURL("http://google.com/6"), false, 5},
1360 }; 1381 };
1361 1382
1362 // Set up the restore data. 1383 // Set up the restore data.
1363 std::vector<const sessions::SessionWindow*> session; 1384 std::vector<const sessions::SessionWindow*> session;
1364 sessions::SessionWindow window; 1385 sessions::SessionWindow window;
1365 sessions::SessionTab tab[NumTabs]; 1386 sessions::SessionTab tab[num_tabs];
1366 1387
1367 for (int i = 0; i < NumTabs; i++) { 1388 for (int i = 0; i < num_tabs; i++) {
1368 SerializedNavigationEntry nav = 1389 SerializedNavigationEntry nav =
1369 SerializedNavigationEntryTestHelper::CreateNavigation( 1390 SerializedNavigationEntryTestHelper::CreateNavigation(
1370 tab_info[i].url.spec(), tab_info[i].url.spec().c_str()); 1391 tab_info[i].url.spec(), tab_info[i].url.spec().c_str());
1371 sync_pb::SessionTab sync_data; 1392 sync_pb::SessionTab sync_data;
1372 sync_data.set_tab_visual_index(0); 1393 sync_data.set_tab_visual_index(0);
1373 sync_data.set_current_navigation_index(0); 1394 sync_data.set_current_navigation_index(0);
1374 sync_data.add_navigation()->CopyFrom(nav.ToSyncData()); 1395 sync_data.add_navigation()->CopyFrom(nav.ToSyncData());
1375 sync_data.set_pinned(tab_info[i].pinned); 1396 sync_data.set_pinned(tab_info[i].pinned);
1376 tab[i].SetFromSyncData(sync_data, base::Time::Now()); 1397 tab[i].SetFromSyncData(sync_data, base::Time::Now());
1377 window.tabs.push_back(tab + i); 1398 window.tabs.push_back(tab + i);
1378 } 1399 }
1379 1400
1380 session.push_back(&window); 1401 session.push_back(&window);
1381 Profile* profile = browser()->profile(); 1402 Profile* profile = browser()->profile();
1382 ui_test_utils::BrowserAddedObserver window_observer;
1383 std::vector<Browser*> browsers = SessionRestore::RestoreForeignSessionWindows( 1403 std::vector<Browser*> browsers = SessionRestore::RestoreForeignSessionWindows(
1384 profile, browser()->host_desktop_type(), session.begin(), session.end()); 1404 profile, browser()->host_desktop_type(), session.begin(), session.end());
1385 1405
1386 ASSERT_EQ(1u, browsers.size()); 1406 ASSERT_EQ(1u, browsers.size());
1387 ASSERT_TRUE(browsers[0]); 1407 ASSERT_TRUE(browsers[0]);
1388 ASSERT_EQ(NumTabs, browsers[0]->tab_strip_model()->count()); 1408 ASSERT_EQ(num_tabs, browsers[0]->tab_strip_model()->count());
1389 1409
1390 WaitForAllTabsToStartLoading(); 1410 WaitForAllTabsToStartLoading();
1391 1411
1392 ASSERT_EQ(static_cast<size_t>(NumTabs), web_contents().size()); 1412 ASSERT_EQ(static_cast<size_t>(num_tabs), web_contents().size());
1393 1413
1394 // Make sure that contents are loaded in the correct order, ie. each tab rank 1414 // Make sure that contents are loaded in the correct order, ie. each tab rank
1395 // is higher that its preceding one. 1415 // is higher that its preceding one.
1396 std::map<GURL, int> ranks; 1416 std::map<GURL, int> ranks;
1397 for (auto t : tab_info) 1417 for (auto t : tab_info)
1398 ranks[t.url] = t.expected_load_order; 1418 ranks[t.url] = t.expected_load_order;
1399 for (size_t i = 1; i < web_contents().size(); i++) { 1419 for (size_t i = 1; i < web_contents().size(); i++) {
1400 int current_rank = ranks[web_contents()[i]->GetLastCommittedURL()]; 1420 int current_rank = ranks[web_contents()[i]->GetLastCommittedURL()];
1401 int previous_rank = ranks[web_contents()[i - 1]->GetLastCommittedURL()]; 1421 int previous_rank = ranks[web_contents()[i - 1]->GetLastCommittedURL()];
1402 ASSERT_LT(previous_rank, current_rank); 1422 ASSERT_LT(previous_rank, current_rank);
1403 } 1423 }
1404 1424
1405 // The SessionWindow destructor deletes the tabs, so we have to clear them 1425 // The SessionWindow destructor deletes the tabs, so we have to clear them
1406 // here to avoid a crash. 1426 // here to avoid a crash.
1407 window.tabs.clear(); 1427 window.tabs.clear();
1408 } 1428 }
1429
1430 IN_PROC_BROWSER_TEST_F(SmartSessionRestoreMRUTest, CorrectLoadingOrder) {
1431 const int num_tabs = 6;
1432
1433 GURL urls[] = {GURL("http://google.com/1"),
1434 GURL("http://google.com/2"),
1435 GURL("http://google.com/3"),
1436 GURL("http://google.com/4"),
1437 GURL("http://google.com/5"),
1438 GURL("http://google.com/6")};
1439
1440 int activation_order[] = {4, 2, 1, 5, 0, 3};
1441
1442 // Replace the first tab and add the other tabs.
1443 ui_test_utils::NavigateToURL(browser(), urls[0]);
1444 for (int i = 1; i < num_tabs; i++) {
1445 ui_test_utils::NavigateToURLWithDisposition(
1446 browser(), urls[i], NEW_FOREGROUND_TAB,
1447 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
1448 }
1449
1450 ASSERT_EQ(num_tabs, browser()->tab_strip_model()->count());
1451
1452 // Activate the tabs one by one following the random activation order.
1453 for (auto i : activation_order)
1454 browser()->tab_strip_model()->ActivateTabAt(i, true);
1455
1456 // Close the browser.
1457 g_browser_process->AddRefModule();
1458 CloseBrowserSynchronously(browser());
1459
1460 StartObserving(num_tabs);
1461
1462 // Create a new window, which should trigger session restore.
1463 ui_test_utils::BrowserAddedObserver window_observer;
1464 chrome::NewEmptyWindow(browser()->profile(),
1465 chrome::HOST_DESKTOP_TYPE_NATIVE);
1466 Browser* new_browser = window_observer.WaitForSingleNewBrowser();
1467 ASSERT_TRUE(new_browser != NULL);
1468 WaitForAllTabsToStartLoading();
1469 g_browser_process->ReleaseModule();
1470
1471 ASSERT_EQ(static_cast<size_t>(num_tabs), web_contents().size());
1472 // Test that we have observed the tabs being loaded in the inverse order of
1473 // their activation (MRU).
1474 for (size_t i = 0; i < web_contents().size(); i++) {
1475 GURL expected_url = urls[activation_order[num_tabs - i - 1]];
1476 ASSERT_EQ(expected_url, web_contents()[i]->GetLastCommittedURL());
1477 }
1478
1479 // Close the browser and open it again, to trigger another session restore.
1480 // The goal is to ensure that activation time is persisted between session
1481 // restores.
1482
1483 // Close the browser.
1484 g_browser_process->AddRefModule();
1485 CloseBrowserSynchronously(new_browser);
1486
1487 StartObserving(num_tabs);
1488
1489 // Create a new window, which should trigger session restore.
1490 ui_test_utils::BrowserAddedObserver window_observer2;
1491 chrome::NewEmptyWindow(new_browser->profile(),
1492 chrome::HOST_DESKTOP_TYPE_NATIVE);
1493 Browser* new_browser2 = window_observer2.WaitForSingleNewBrowser();
1494 ASSERT_TRUE(new_browser2 != NULL);
1495 WaitForAllTabsToStartLoading();
1496 g_browser_process->ReleaseModule();
1497
1498 ASSERT_EQ(static_cast<size_t>(num_tabs), web_contents().size());
1499 // Test that we have observed the tabs being loaded in the inverse order of
1500 // their activation (MRU).
1501 for (size_t i = 0; i < web_contents().size(); i++) {
1502 GURL expected_url = urls[activation_order[num_tabs - i - 1]];
1503 ASSERT_EQ(expected_url, web_contents()[i]->GetLastCommittedURL());
1504 }
1505 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698