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