15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/run_loop.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_timeouts.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h" 127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/sessions/tab_restore_service.h" 146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/sessions/tab_restore_service_factory.h" 156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/sessions/tab_restore_service_observer.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_list.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/find_bar/find_notification_details.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/page_navigator.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "content/public/test/browser_test_utils.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h" 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/test/embedded_test_server/embedded_test_server.h" 367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFindOptions.h" 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Class used to run a message loop waiting for the TabRestoreService to finish 406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// loading. Does nothing if the TabRestoreService was already loaded. 416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class WaitForLoadObserver : public TabRestoreServiceObserver { 426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public: 436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) explicit WaitForLoadObserver(Browser* browser) 446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) : tab_restore_service_( 456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) TabRestoreServiceFactory::GetForProfile(browser->profile())), 466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) do_wait_(!tab_restore_service_->IsLoaded()) { 476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (do_wait_) 486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) tab_restore_service_->AddObserver(this); 496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual ~WaitForLoadObserver() { 526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (do_wait_) 536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) tab_restore_service_->RemoveObserver(this); 546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) void Wait() { 576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (do_wait_) 586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) run_loop_.Run(); 596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) private: 626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Overridden from TabRestoreServiceObserver: 636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void TabRestoreServiceChanged(TabRestoreService* service) OVERRIDE {} 646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void TabRestoreServiceDestroyed(TabRestoreService* service) OVERRIDE { 656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void TabRestoreServiceLoaded(TabRestoreService* service) OVERRIDE { 676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK(do_wait_); 686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) run_loop_.Quit(); 696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) TabRestoreService* tab_restore_service_; 726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const bool do_wait_; 736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::RunLoop run_loop_; 746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WaitForLoadObserver); 766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}; 776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TabRestoreTest : public InProcessBrowserTest { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TabRestoreTest() : active_browser_list_(NULL) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url1_ = ui_test_utils::GetTestUrl( 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath().AppendASCII("session_history"), 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath().AppendASCII("bot1.html")); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url2_ = ui_test_utils::GetTestUrl( 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath().AppendASCII("session_history"), 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath().AppendASCII("bot2.html")); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void SetUpOnMainThread() OVERRIDE { 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch active_browser_list_ = BrowserList::GetInstance(chrome::GetActiveDesktop()); 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch InProcessBrowserTest::SetUpOnMainThread(); 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* GetBrowser(int index) { 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CHECK(static_cast<int>(active_browser_list_->size()) > index); 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return active_browser_list_->get(index); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds tabs to the given browser, all navigated to url1_. Returns 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the final number of tabs. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int AddSomeTabs(Browser* browser, int how_many) { 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int starting_tab_count = browser->tab_strip_model()->count(); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < how_many; ++i) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser, url1_, NEW_FOREGROUND_TAB, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int tab_count = browser->tab_strip_model()->count(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(starting_tab_count + how_many, tab_count); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return tab_count; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CloseTab(int index) { 1168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) content::WebContentsDestroyedWatcher destroyed_watcher( 1178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) browser()->tab_strip_model()->GetWebContentsAt(index)); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->CloseWebContentsAt( 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) index, TabStripModel::CLOSE_CREATE_HISTORICAL_TAB); 1208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) destroyed_watcher.Wait(); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Uses the undo-close-tab accelerator to undo a close-tab or close-window 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // operation. The newly restored tab is expected to appear in the 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window at index |expected_window_index|, at the |expected_tabstrip_index|, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and to be active. If |expected_window_index| is equal to the number of 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // current windows, the restored tab is expected to be created in a new 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window (since the index is 0-based). 1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) void RestoreTab(int expected_window_index, int expected_tabstrip_index) { 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int window_count = static_cast<int>(active_browser_list_->size()); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_GT(window_count, 0); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool expect_new_window = (expected_window_index == window_count); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expect_new_window) { 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch browser = active_browser_list_->get(0); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser = GetBrowser(expected_window_index); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int tab_count = browser->tab_strip_model()->count(); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_GT(tab_count, 0); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restore the tab. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver tab_added_observer( 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_TAB_PARENTED, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver tab_loaded_observer( 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 1516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) { 1526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WaitForLoadObserver waiter(browser); 1536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) chrome::RestoreTab(browser); 1546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) waiter.Wait(); 1556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_added_observer.Wait(); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_loaded_observer.Wait(); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expect_new_window) { 160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int new_window_count = static_cast<int>(active_browser_list_->size()); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(++window_count, new_window_count); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser = GetBrowser(expected_window_index); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(++tab_count, browser->tab_strip_model()->count()); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get a handle to the restored tab. 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_GT(browser->tab_strip_model()->count(), expected_tabstrip_index); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that the tab and window are active. 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_tabstrip_index, 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser->tab_strip_model()->active_index()); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GoBack(Browser* browser) { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver observer( 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::GoBack(browser, CURRENT_TAB); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.Wait(); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void EnsureTabFinishedRestoring(content::WebContents* tab) { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NavigationController* controller = &tab->GetController(); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!controller->NeedsReload() && !controller->GetPendingEntry() && 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !controller->GetWebContents()->IsLoading()) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver observer( 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<content::NavigationController>(controller)); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.Wait(); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url1_; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url2_; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const BrowserList* active_browser_list_; 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TabRestoreTest); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Close the end tab in the current window, then restore it. The tab should be 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in its original position, and active. 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TabRestoreTest, Basic) { 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int starting_tab_count = browser()->tab_strip_model()->count(); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tab_count = AddSomeTabs(browser(), 1); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int closed_tab_index = tab_count - 1; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseTab(closed_tab_index); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(starting_tab_count, browser()->tab_strip_model()->count()); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(RestoreTab(0, closed_tab_index)); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And make sure everything looks right. 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(starting_tab_count + 1, browser()->tab_strip_model()->count()); 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(closed_tab_index, browser()->tab_strip_model()->active_index()); 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(url1_, 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Close a tab not at the end of the current window, then restore it. The tab 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// should be in its original position, and active. 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TabRestoreTest, MiddleTab) { 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int starting_tab_count = browser()->tab_strip_model()->count(); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddSomeTabs(browser(), 3); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close one in the middle 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int closed_tab_index = starting_tab_count + 1; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseTab(closed_tab_index); 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(starting_tab_count + 2, browser()->tab_strip_model()->count()); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(RestoreTab(0, closed_tab_index)); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And make sure everything looks right. 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(starting_tab_count + 3, browser()->tab_strip_model()->count()); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(closed_tab_index, browser()->tab_strip_model()->active_index()); 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(url1_, 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Close a tab, switch windows, then restore the tab. The tab should be in its 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// original window and position, and active. 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TabRestoreTest, RestoreToDifferentWindow) { 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int starting_tab_count = browser()->tab_strip_model()->count(); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddSomeTabs(browser(), 3); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close one in the middle 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int closed_tab_index = starting_tab_count + 1; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseTab(closed_tab_index); 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(starting_tab_count + 2, browser()->tab_strip_model()->count()); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a new browser. 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), GURL(chrome::kChromeUINewTabURL), NEW_WINDOW, 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER); 258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(2u, active_browser_list_->size()); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restore tab into original browser. 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(RestoreTab(0, closed_tab_index)); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And make sure everything looks right. 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(starting_tab_count + 3, browser()->tab_strip_model()->count()); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(closed_tab_index, browser()->tab_strip_model()->active_index()); 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(url1_, 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Close a tab, open a new window, close the first window, then restore the 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tab. It should be in a new window. 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If this becomes flaky, use http://crbug.com/14774 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(TabRestoreTest, DISABLED_BasicRestoreFromClosedWindow) { 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to url1 then url2. 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), url1_); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), url2_); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a new browser. 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), GURL(chrome::kChromeUINewTabURL), NEW_WINDOW, 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER); 282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(2u, active_browser_list_->size()); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the final tab in the first browser. 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver window_observer( 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_BROWSER_CLOSED, 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseTab(0); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_observer.Wait(); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(RestoreTab(1, 0)); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tab should be in a new window. 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser = GetBrowser(1); 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* web_contents = 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser->tab_strip_model()->GetActiveWebContents(); 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // And make sure the URLs match. 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(url2_, web_contents->GetURL()); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBack(browser); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(url1_, web_contents->GetURL()); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Flakily times out: http://crbug.com/171503 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DontLoadRestoredTab DISABLED_DontLoadRestoredTab 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DontLoadRestoredTab DontLoadRestoredTab 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Restore a tab then make sure it doesn't restore again. 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(TabRestoreTest, MAYBE_DontLoadRestoredTab) { 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add two tabs 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int starting_tab_count = browser()->tab_strip_model()->count(); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddSomeTabs(browser(), 2); 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(browser()->tab_strip_model()->count(), starting_tab_count + 2); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close one of them. 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseTab(0); 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(browser()->tab_strip_model()->count(), starting_tab_count + 1); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restore it. 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(RestoreTab(0, 0)); 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(browser()->tab_strip_model()->count(), starting_tab_count + 2); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure that there's nothing else to restore. 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(chrome::GetRestoreTabType(browser()), 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TabStripModelDelegate::RESTORE_NONE); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Open a window with multiple tabs, close a tab, then close the window. 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Restore both and make sure the tab goes back into the window. 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TabRestoreTest, RestoreWindowAndTab) { 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int starting_tab_count = browser()->tab_strip_model()->count(); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddSomeTabs(browser(), 3); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close one in the middle 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int closed_tab_index = starting_tab_count + 1; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseTab(closed_tab_index); 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(starting_tab_count + 2, browser()->tab_strip_model()->count()); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a new browser. 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), GURL(chrome::kChromeUINewTabURL), NEW_WINDOW, 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER); 345eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(2u, active_browser_list_->size()); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the first browser. 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver observer( 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_BROWSER_CLOSED, 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::CloseWindow(browser()); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.Wait(); 353eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1u, active_browser_list_->size()); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restore the first window. The expected_tabstrip_index (second argument) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // indicates the expected active tab. 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(RestoreTab(1, starting_tab_count + 1)); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser = GetBrowser(1); 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(starting_tab_count + 2, browser->tab_strip_model()->count()); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restore the closed tab. 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(RestoreTab(1, closed_tab_index)); 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(starting_tab_count + 3, browser->tab_strip_model()->count()); 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(url1_, 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser->tab_strip_model()->GetActiveWebContents()->GetURL()); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Open a window with two tabs, close both (closing the window), then restore 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// both. Make sure both restored tabs are in the same window. 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TabRestoreTest, RestoreIntoSameWindow) { 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), url1_, NEW_FOREGROUND_TAB, 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate the rightmost one to url2_ for easier identification. 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), url2_, NEW_FOREGROUND_TAB, 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a new browser. 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), GURL(chrome::kChromeUINewTabURL), NEW_WINDOW, 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER); 383eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(2u, active_browser_list_->size()); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close all but one tab in the first browser, left to right. 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (browser()->tab_strip_model()->count() > 1) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseTab(0); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the last tab, closing the browser. 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver observer( 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_BROWSER_CLOSED, 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseTab(0); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.Wait(); 395eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1u, active_browser_list_->size()); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restore the last-closed tab into a new window. 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(RestoreTab(1, 0)); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser = GetBrowser(1); 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, browser->tab_strip_model()->count()); 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(url2_, 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser->tab_strip_model()->GetActiveWebContents()->GetURL()); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restore the next-to-last-closed tab into the same window. 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(RestoreTab(1, 0)); 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, browser->tab_strip_model()->count()); 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(url1_, 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser->tab_strip_model()->GetActiveWebContents()->GetURL()); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that a duplicate history entry is not created when we restore a page 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to an existing SiteInstance. (Bug 1230446) 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TabRestoreTest, RestoreWithExistingSiteInstance) { 414eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 416eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GURL http_url1(embedded_test_server()->GetURL("/title1.html")); 417eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GURL http_url2(embedded_test_server()->GetURL("/title2.html")); 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int tab_count = browser()->tab_strip_model()->count(); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a tab 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), http_url1, NEW_FOREGROUND_TAB, 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(++tab_count, browser()->tab_strip_model()->count()); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to another same-site URL. 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* tab = 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetWebContentsAt(tab_count - 1); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver observer( 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<content::WebContentsDelegate*>(browser())->OpenURLFromTab( 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab, 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::OpenURLParams(http_url2, content::Referrer(), CURRENT_TAB, 4351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_TYPED, false)); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.Wait(); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the tab. 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseTab(1); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a new tab to the original site. Assuming process-per-site is 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // enabled, this will ensure that the SiteInstance used by the restored tab 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will already exist when the restore happens. 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), http_url2, NEW_FOREGROUND_TAB, 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restore the closed tab. 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(RestoreTab(0, tab_count - 1)); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And make sure the URLs match. 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(http_url2, 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBack(browser()); 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(http_url1, 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// See crbug.com/248574 4607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_WIN) 4617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define MAYBE_RestoreCrossSiteWithExistingSiteInstance DISABLED_RestoreCrossSiteWithExistingSiteInstance 4627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#else 4637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define MAYBE_RestoreCrossSiteWithExistingSiteInstance RestoreCrossSiteWithExistingSiteInstance 4647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 4657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the SiteInstances used for entries in a restored tab's history 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are given appropriate max page IDs, even if the renderer for the entry 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// already exists. (Bug 1204135) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TabRestoreTest, 4707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MAYBE_RestoreCrossSiteWithExistingSiteInstance) { 471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 473eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GURL http_url1(embedded_test_server()->GetURL("/title1.html")); 474eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GURL http_url2(embedded_test_server()->GetURL("/title2.html")); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int tab_count = browser()->tab_strip_model()->count(); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a tab 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), http_url1, NEW_FOREGROUND_TAB, 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(++tab_count, browser()->tab_strip_model()->count()); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to more URLs, then a cross-site URL. 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), http_url2, CURRENT_TAB, 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), http_url1, CURRENT_TAB, 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), url1_, CURRENT_TAB, 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the tab. 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseTab(1); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a new tab to the original site. Assuming process-per-site is 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // enabled, this will ensure that the SiteInstance will already exist when 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the user clicks Back in the restored tab. 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), http_url2, NEW_FOREGROUND_TAB, 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restore the closed tab. 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(RestoreTab(0, tab_count - 1)); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And make sure the URLs match. 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(url1_, 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBack(browser()); 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(http_url1, 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigating to a new URL should clear the forward list, because the max 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page ID of the renderer should have been updated when we restored the tab. 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), http_url2, CURRENT_TAB, 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(chrome::CanGoForward(browser())); 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(http_url2, 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TabRestoreTest, RestoreWindow) { 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a new window. 527eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t window_count = active_browser_list_->size(); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), GURL(chrome::kChromeUINewTabURL), NEW_WINDOW, 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER); 531eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(++window_count, active_browser_list_->size()); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create two more tabs, one with url1, the other url2. 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int initial_tab_count = browser()->tab_strip_model()->count(); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), url1_, NEW_FOREGROUND_TAB, 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), url2_, NEW_FOREGROUND_TAB, 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the window. 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver close_window_observer( 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_BROWSER_CLOSED, 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::CloseWindow(browser()); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) close_window_observer.Wait(); 548eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(window_count - 1, active_browser_list_->size()); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restore the window. 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver open_window_observer( 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_BROWSER_OPENED, 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver load_stop_observer( 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 557eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch chrome::RestoreTab(active_browser_list_->get(0)); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) open_window_observer.Wait(); 559eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(window_count, active_browser_list_->size()); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser = GetBrowser(1); 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(initial_tab_count + 2, browser->tab_strip_model()->count()); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_stop_observer.Wait(); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* restored_tab = 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser->tab_strip_model()->GetWebContentsAt(initial_tab_count); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnsureTabFinishedRestoring(restored_tab); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(url1_, restored_tab->GetURL()); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) restored_tab = 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser->tab_strip_model()->GetWebContentsAt(initial_tab_count + 1); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnsureTabFinishedRestoring(restored_tab); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(url2_, restored_tab->GetURL()); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Restore tab with special URL chrome://credits/ and make sure the page loads 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// properly after restore. See http://crbug.com/31905. 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TabRestoreTest, RestoreTabWithSpecialURL) { 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate new tab to a special URL. 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), GURL(chrome::kChromeUICreditsURL), NEW_FOREGROUND_TAB, 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the tab. 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseTab(1); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restore the closed tab. 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(RestoreTab(0, 1)); 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* tab = browser()->tab_strip_model()->GetWebContentsAt(1); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnsureTabFinishedRestoring(tab); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See if content is as expected. 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT( 5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::FindInPage(tab, base::ASCIIToUTF16("webkit"), true, false, 5955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NULL, NULL), 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Restore tab with special URL in its navigation history, go back to that 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// entry and see that it loads properly. See http://crbug.com/31905 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TabRestoreTest, RestoreTabWithSpecialURLOnBack) { 602eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 604eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const GURL http_url(embedded_test_server()->GetURL("/title1.html")); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate new tab to a special URL. 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURLWithDisposition( 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), GURL(chrome::kChromeUICreditsURL), NEW_FOREGROUND_TAB, 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Then navigate to a normal URL. 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), http_url); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the tab. 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseTab(1); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restore the closed tab. 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(RestoreTab(0, 1)); 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* tab = browser()->tab_strip_model()->GetWebContentsAt(1); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnsureTabFinishedRestoring(tab); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(http_url, tab->GetURL()); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Go back, and see if content is as expected. 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoBack(browser()); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT( 6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_test_utils::FindInPage(tab, base::ASCIIToUTF16("webkit"), true, false, 6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NULL, NULL), 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 6316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TabRestoreTest, PRE_RestoreOnStartup) { 6326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // This results in a new tab at the end with url1. 6336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) AddSomeTabs(browser(), 1); 6346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 6356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) while (browser()->tab_strip_model()->count()) 6366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) CloseTab(0); 6376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 6386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 6396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Verifies restoring a tab works on startup. 6406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TabRestoreTest, RestoreOnStartup) { 6416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(RestoreTab(0, 1)); 6426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(url1_, 6436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) browser()->tab_strip_model()->GetWebContentsAt(1)->GetURL()); 6446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 645