15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved.
25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Use of this source code is governed by a BSD-style license that can be
35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// found in the LICENSE file.
45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
55c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/chrome_notification_types.h"
65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/sessions/tab_restore_service.h"
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/sessions/tab_restore_service_delegate.h"
85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/sessions/tab_restore_service_factory.h"
95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/ui/browser.h"
105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/ui/browser_commands.h"
115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/ui/browser_list.h"
125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/ui/tabs/tab_strip_model.h"
135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.h"
145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/test/base/in_process_browser_test.h"
155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/test/base/interactive_test_utils.h"
165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/browser/web_contents.h"
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/common/url_constants.h"
185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/test/browser_test_utils.h"
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liutypedef InProcessBrowserTest BrowserTabRestoreTest;
215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid AwaitTabsReady(content::DOMMessageQueue* message_queue, int tabs) {
235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  for (int i = 0; i < tabs; ++i) {
245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    std::string message;
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_TRUE(message_queue->WaitForMessage(&message));
265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_EQ("\"READY\"", message);
275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid CheckVisbility(TabStripModel* tab_strip_model, int visible_index) {
315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  for (int i = 0; i < tab_strip_model->count(); ++i) {
325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    content::WebContents* contents = tab_strip_model->GetWebContentsAt(i);
335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    std::string document_visibility_state;
345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const char kGetStateJS[] = "window.domAutomationController.send("
355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        "window.document.visibilityState);";
365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_TRUE(content::ExecuteScriptAndExtractString(
375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        contents, kGetStateJS, &document_visibility_state));
385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (i == visible_index) {
395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      EXPECT_EQ("visible", document_visibility_state);
405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    } else {
415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      EXPECT_EQ("hidden", document_visibility_state);
425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    }
435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid CreateTestTabs(Browser* browser) {
475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GURL test_page(ui_test_utils::GetTestUrl(base::FilePath(),
485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      base::FilePath(FILE_PATH_LITERAL("tab-restore-visibilty.html"))));
495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ui_test_utils::NavigateToURLWithDisposition(
505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      browser, test_page, NEW_FOREGROUND_TAB,
515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ui_test_utils::NavigateToURLWithDisposition(
535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      browser, test_page, NEW_BACKGROUND_TAB,
545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid CloseBrowser(Browser* browser) {
585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  content::WindowedNotificationObserver close_observer(
595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      chrome::NOTIFICATION_BROWSER_CLOSED,
605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      content::Source<Browser>(browser));
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  chrome::CloseWindow(browser);
625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  close_observer.Wait();
635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuIN_PROC_BROWSER_TEST_F(BrowserTabRestoreTest, RecentTabsMenuTabDisposition) {
665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Create tabs.
675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CreateTestTabs(browser());
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(3, browser()->tab_strip_model()->count());
695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Create a new browser.
715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ui_test_utils::NavigateToURLWithDisposition(
72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      browser(),
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      GURL(url::kAboutBlankURL),
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      NEW_WINDOW,
755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER);
765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  BrowserList* active_browser_list =
775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      BrowserList::GetInstance(browser()->host_desktop_type());
785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(2u, active_browser_list->size());
795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Close the first browser.
815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CloseBrowser(browser());
825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(1u, active_browser_list->size());
835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Restore tabs using the browser's recent tabs menu.
855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  content::DOMMessageQueue queue;
865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  Browser* browser = active_browser_list->get(0);
875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  RecentTabsSubMenuModel menu(NULL, browser, NULL);
885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  menu.ExecuteCommand(
895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      RecentTabsSubMenuModel::GetFirstRecentTabsCommandId(), 0);
905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  AwaitTabsReady(&queue, 2);
915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // There should be 3 restored tabs in the new browser.
935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(2u, active_browser_list->size());
945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  browser = active_browser_list->get(1);
955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(3, browser->tab_strip_model()->count());
965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // The middle tab only should have visible disposition.
985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CheckVisbility(browser->tab_strip_model(), 1);
995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuIN_PROC_BROWSER_TEST_F(BrowserTabRestoreTest, DelegateRestoreTabDisposition) {
1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Create tabs.
1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CreateTestTabs(browser());
1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(3, browser()->tab_strip_model()->count());
1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Create a new browser.
1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ui_test_utils::NavigateToURLWithDisposition(
108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      browser(),
109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      GURL(url::kAboutBlankURL),
110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      NEW_WINDOW,
1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER);
1125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  BrowserList* active_browser_list =
1135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      BrowserList::GetInstance(browser()->host_desktop_type());
1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(2u, active_browser_list->size());
1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Close the first browser.
1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CloseBrowser(browser());
1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(1u, active_browser_list->size());
1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Check the browser has a delegated restore service.
1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  Browser* browser = active_browser_list->get(0);
1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  TabRestoreService* service =
1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      TabRestoreServiceFactory::GetForProfile(browser->profile());
1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  bool has_tab_restore_service = !!service;
1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(has_tab_restore_service);
1265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  TabRestoreServiceDelegate* delegate =
1275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      TabRestoreServiceDelegate::FindDelegateForWebContents(
1285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          browser->tab_strip_model()->GetActiveWebContents());
1295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  bool has_tab_restore_delegate = !!delegate;
1305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(has_tab_restore_delegate);
1315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Restore tabs using that delegated restore service.
1335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  content::DOMMessageQueue queue;
1345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  service->RestoreMostRecentEntry(
1355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      delegate, browser->host_desktop_type());
1365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  AwaitTabsReady(&queue, 2);
1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // There should be 3 restored tabs in the new browser.
1395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(2u, active_browser_list->size());
1405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  browser = active_browser_list->get(1);
1415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(3, browser->tab_strip_model()->count());
1425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // The middle tab only should have visible disposition.
1445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CheckVisbility(browser->tab_strip_model(), 1);
1455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
146