| Index: chrome/browser/sessions/session_restore_browsertest.cc
|
| diff --git a/chrome/browser/sessions/session_restore_browsertest.cc b/chrome/browser/sessions/session_restore_browsertest.cc
|
| index 14966d7bc49640176a7daf4bbf1a9593fef1cdb6..647e499a0c9b64aac339c5953acd07816a3b9de9 100644
|
| --- a/chrome/browser/sessions/session_restore_browsertest.cc
|
| +++ b/chrome/browser/sessions/session_restore_browsertest.cc
|
| @@ -212,12 +212,16 @@ class SessionRestoreTest : public InProcessBrowserTest {
|
| const BrowserList* active_browser_list_;
|
| };
|
|
|
| -// Activates the smart restore behaviour and can track the loading of tabs.
|
| -class SmartSessionRestoreTest : public SessionRestoreTest,
|
| - public content::NotificationObserver {
|
| +// Activates the smart restore behaviour in "simple" mode and tracks the loading
|
| +// of tabs.
|
| +class SmartSessionRestoreSimpleTest : public SessionRestoreTest,
|
| + public content::NotificationObserver {
|
| public:
|
| - SmartSessionRestoreTest() {}
|
| + SmartSessionRestoreSimpleTest() {}
|
| void StartObserving(int num_tabs) {
|
| + // Start by clearing everything so it can be reused in the same test.
|
| + web_contents_.clear();
|
| + registrar_.RemoveAll();
|
| num_tabs_ = num_tabs;
|
| registrar_.Add(this, content::NOTIFICATION_LOAD_START,
|
| content::NotificationService::AllSources());
|
| @@ -261,7 +265,24 @@ class SmartSessionRestoreTest : public SessionRestoreTest,
|
| scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
|
| int num_tabs_;
|
|
|
| - DISALLOW_COPY_AND_ASSIGN(SmartSessionRestoreTest);
|
| + DISALLOW_COPY_AND_ASSIGN(SmartSessionRestoreSimpleTest);
|
| +};
|
| +
|
| +class SmartSessionRestoreMRUTest : public SmartSessionRestoreSimpleTest {
|
| + public:
|
| + SmartSessionRestoreMRUTest() {}
|
| +
|
| + protected:
|
| + void SetUpCommandLine(base::CommandLine* command_line) override {
|
| + base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
|
| + switches::kForceFieldTrials, "IntelligentSessionRestore/TestGroup/");
|
| + base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
|
| + switches::kForceFieldTrialParams,
|
| + "IntelligentSessionRestore.TestGroup:PrioritizeTabs/mru");
|
| + }
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(SmartSessionRestoreMRUTest);
|
| };
|
|
|
| // Verifies that restored tabs have a root window. This is important
|
| @@ -1333,14 +1354,14 @@ IN_PROC_BROWSER_TEST_F(SessionRestoreTest, SessionStorageAfterTabReplace) {
|
| EXPECT_EQ(1, new_browser->tab_strip_model()->count());
|
| }
|
|
|
| -IN_PROC_BROWSER_TEST_F(SmartSessionRestoreTest, CorrectLoadingOrder) {
|
| +IN_PROC_BROWSER_TEST_F(SmartSessionRestoreSimpleTest, CorrectLoadingOrder) {
|
| ASSERT_EQ(SessionRestore::SMART_RESTORE_MODE_SIMPLE,
|
| SessionRestore::GetSmartRestoreMode());
|
|
|
| - const int NumTabs = 6;
|
| + const int num_tabs = 6;
|
|
|
| // Start observing the loading of tabs, to make sure the order is correct.
|
| - StartObserving(NumTabs);
|
| + StartObserving(num_tabs);
|
|
|
| struct TabInfo {
|
| GURL url;
|
| @@ -1348,7 +1369,7 @@ IN_PROC_BROWSER_TEST_F(SmartSessionRestoreTest, CorrectLoadingOrder) {
|
| int expected_load_order;
|
| };
|
|
|
| - TabInfo tab_info[NumTabs] = {
|
| + TabInfo tab_info[num_tabs] = {
|
| // This will be the foreground tab and will always load first.
|
| {GURL("http://google.com/1"), false, 1},
|
| {GURL("http://google.com/2"), false, 3},
|
| @@ -1362,9 +1383,9 @@ IN_PROC_BROWSER_TEST_F(SmartSessionRestoreTest, CorrectLoadingOrder) {
|
| // Set up the restore data.
|
| std::vector<const sessions::SessionWindow*> session;
|
| sessions::SessionWindow window;
|
| - sessions::SessionTab tab[NumTabs];
|
| + sessions::SessionTab tab[num_tabs];
|
|
|
| - for (int i = 0; i < NumTabs; i++) {
|
| + for (int i = 0; i < num_tabs; i++) {
|
| SerializedNavigationEntry nav =
|
| SerializedNavigationEntryTestHelper::CreateNavigation(
|
| tab_info[i].url.spec(), tab_info[i].url.spec().c_str());
|
| @@ -1379,17 +1400,16 @@ IN_PROC_BROWSER_TEST_F(SmartSessionRestoreTest, CorrectLoadingOrder) {
|
|
|
| session.push_back(&window);
|
| Profile* profile = browser()->profile();
|
| - ui_test_utils::BrowserAddedObserver window_observer;
|
| std::vector<Browser*> browsers = SessionRestore::RestoreForeignSessionWindows(
|
| profile, browser()->host_desktop_type(), session.begin(), session.end());
|
|
|
| ASSERT_EQ(1u, browsers.size());
|
| ASSERT_TRUE(browsers[0]);
|
| - ASSERT_EQ(NumTabs, browsers[0]->tab_strip_model()->count());
|
| + ASSERT_EQ(num_tabs, browsers[0]->tab_strip_model()->count());
|
|
|
| WaitForAllTabsToStartLoading();
|
|
|
| - ASSERT_EQ(static_cast<size_t>(NumTabs), web_contents().size());
|
| + ASSERT_EQ(static_cast<size_t>(num_tabs), web_contents().size());
|
|
|
| // Make sure that contents are loaded in the correct order, ie. each tab rank
|
| // is higher that its preceding one.
|
| @@ -1406,3 +1426,94 @@ IN_PROC_BROWSER_TEST_F(SmartSessionRestoreTest, CorrectLoadingOrder) {
|
| // here to avoid a crash.
|
| window.tabs.clear();
|
| }
|
| +
|
| +IN_PROC_BROWSER_TEST_F(SmartSessionRestoreMRUTest, CorrectLoadingOrder) {
|
| + const int num_tabs = 6;
|
| +
|
| + Profile* profile = browser()->profile();
|
| +
|
| + GURL urls[] = {GURL("http://google.com/1"),
|
| + GURL("http://google.com/2"),
|
| + GURL("http://google.com/3"),
|
| + GURL("http://google.com/4"),
|
| + GURL("http://google.com/5"),
|
| + GURL("http://google.com/6")};
|
| +
|
| + int activation_order[] = {4, 2, 1, 5, 0, 3};
|
| + int activation_order2[] = {4, 2, 5, 0, 3, 1};
|
| +
|
| + // Replace the first tab and add the other tabs.
|
| + ui_test_utils::NavigateToURL(browser(), urls[0]);
|
| + for (int i = 1; i < num_tabs; i++) {
|
| + ui_test_utils::NavigateToURLWithDisposition(
|
| + browser(), urls[i], NEW_FOREGROUND_TAB,
|
| + ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
|
| + }
|
| +
|
| + ASSERT_EQ(num_tabs, browser()->tab_strip_model()->count());
|
| +
|
| + // Activate the tabs one by one following the random activation order.
|
| + for (auto i : activation_order)
|
| + browser()->tab_strip_model()->ActivateTabAt(i, true);
|
| +
|
| + // Close the browser.
|
| + g_browser_process->AddRefModule();
|
| + CloseBrowserSynchronously(browser());
|
| +
|
| + StartObserving(num_tabs);
|
| +
|
| + // Create a new window, which should trigger session restore.
|
| + ui_test_utils::BrowserAddedObserver window_observer;
|
| + chrome::NewEmptyWindow(profile, chrome::HOST_DESKTOP_TYPE_NATIVE);
|
| + Browser* new_browser = window_observer.WaitForSingleNewBrowser();
|
| + ASSERT_TRUE(new_browser != NULL);
|
| + WaitForAllTabsToStartLoading();
|
| + g_browser_process->ReleaseModule();
|
| +
|
| + ASSERT_EQ(static_cast<size_t>(num_tabs), web_contents().size());
|
| + // Test that we have observed the tabs being loaded in the inverse order of
|
| + // their activation (MRU). Also validate that their last active time is in the
|
| + // correct order.
|
| + for (size_t i = 0; i < web_contents().size(); i++) {
|
| + GURL expected_url = urls[activation_order[num_tabs - i - 1]];
|
| + ASSERT_EQ(expected_url, web_contents()[i]->GetLastCommittedURL());
|
| + if (i > 0) {
|
| + ASSERT_GT(web_contents()[i - 1]->GetLastActiveTime(),
|
| + web_contents()[i]->GetLastActiveTime());
|
| + }
|
| + }
|
| +
|
| + // Activate the 2nd tab then close the browser and open it again, to trigger
|
| + // another session restore. The goal is to ensure that activation time is
|
| + // persisted between session restores.
|
| +
|
| + new_browser->tab_strip_model()->ActivateTabAt(1, true);
|
| +
|
| + // Close the browser.
|
| + g_browser_process->AddRefModule();
|
| + CloseBrowserSynchronously(new_browser);
|
| +
|
| + StartObserving(num_tabs);
|
| +
|
| + // Create a new window, which should trigger session restore.
|
| + ui_test_utils::BrowserAddedObserver window_observer2;
|
| + chrome::NewEmptyWindow(profile, chrome::HOST_DESKTOP_TYPE_NATIVE);
|
| + Browser* new_browser2 = window_observer2.WaitForSingleNewBrowser();
|
| + ASSERT_TRUE(new_browser2 != NULL);
|
| + WaitForAllTabsToStartLoading();
|
| + g_browser_process->ReleaseModule();
|
| +
|
| + ASSERT_EQ(static_cast<size_t>(num_tabs), web_contents().size());
|
| +
|
| + // Test that we have observed the tabs being loaded in the inverse order of
|
| + // their activation (MRU). Also validate that their last active time is in the
|
| + // correct order.
|
| + for (size_t i = 0; i < web_contents().size(); i++) {
|
| + GURL expected_url = urls[activation_order2[num_tabs - i - 1]];
|
| + ASSERT_EQ(expected_url, web_contents()[i]->GetLastCommittedURL());
|
| + if (i > 0) {
|
| + ASSERT_GT(web_contents()[i - 1]->GetLastActiveTime(),
|
| + web_contents()[i]->GetLastActiveTime());
|
| + }
|
| + }
|
| +}
|
|
|