Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / sessions / tab_restore_browsertest.cc
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/basictypes.h"
6 #include "base/command_line.h"
7 #include "base/files/file_path.h"
8 #include "base/run_loop.h"
9 #include "base/strings/utf_string_conversions.h"
10 #include "base/test/test_timeouts.h"
11 #include "chrome/app/chrome_command_ids.h"
12 #include "chrome/browser/chrome_notification_types.h"
13 #include "chrome/browser/sessions/tab_restore_service.h"
14 #include "chrome/browser/sessions/tab_restore_service_factory.h"
15 #include "chrome/browser/sessions/tab_restore_service_observer.h"
16 #include "chrome/browser/ui/browser.h"
17 #include "chrome/browser/ui/browser_commands.h"
18 #include "chrome/browser/ui/browser_list.h"
19 #include "chrome/browser/ui/browser_tabstrip.h"
20 #include "chrome/browser/ui/find_bar/find_notification_details.h"
21 #include "chrome/browser/ui/tabs/tab_strip_model.h"
22 #include "chrome/common/chrome_paths.h"
23 #include "chrome/common/url_constants.h"
24 #include "chrome/test/base/in_process_browser_test.h"
25 #include "chrome/test/base/ui_test_utils.h"
26 #include "content/public/browser/navigation_controller.h"
27 #include "content/public/browser/notification_service.h"
28 #include "content/public/browser/notification_source.h"
29 #include "content/public/browser/notification_types.h"
30 #include "content/public/browser/page_navigator.h"
31 #include "content/public/browser/render_view_host.h"
32 #include "content/public/browser/web_contents.h"
33 #include "content/public/test/browser_test_utils.h"
34 #include "net/base/net_util.h"
35 #include "net/test/embedded_test_server/embedded_test_server.h"
36 #include "third_party/WebKit/public/web/WebFindOptions.h"
37 #include "url/gurl.h"
38
39 // Class used to run a message loop waiting for the TabRestoreService to finish
40 // loading. Does nothing if the TabRestoreService was already loaded.
41 class WaitForLoadObserver : public TabRestoreServiceObserver {
42  public:
43   explicit WaitForLoadObserver(Browser* browser)
44       : tab_restore_service_(
45           TabRestoreServiceFactory::GetForProfile(browser->profile())),
46         do_wait_(!tab_restore_service_->IsLoaded()) {
47     if (do_wait_)
48       tab_restore_service_->AddObserver(this);
49   }
50
51   virtual ~WaitForLoadObserver() {
52     if (do_wait_)
53       tab_restore_service_->RemoveObserver(this);
54   }
55
56   void Wait() {
57     if (do_wait_)
58       run_loop_.Run();
59   }
60
61  private:
62   // Overridden from TabRestoreServiceObserver:
63   virtual void TabRestoreServiceChanged(TabRestoreService* service) OVERRIDE {}
64   virtual void TabRestoreServiceDestroyed(TabRestoreService* service) OVERRIDE {
65   }
66   virtual void TabRestoreServiceLoaded(TabRestoreService* service) OVERRIDE {
67     DCHECK(do_wait_);
68     run_loop_.Quit();
69   }
70
71   TabRestoreService* tab_restore_service_;
72   const bool do_wait_;
73   base::RunLoop run_loop_;
74
75   DISALLOW_COPY_AND_ASSIGN(WaitForLoadObserver);
76 };
77
78 class TabRestoreTest : public InProcessBrowserTest {
79  public:
80   TabRestoreTest() : active_browser_list_(NULL) {
81     url1_ = ui_test_utils::GetTestUrl(
82         base::FilePath().AppendASCII("session_history"),
83         base::FilePath().AppendASCII("bot1.html"));
84     url2_ = ui_test_utils::GetTestUrl(
85         base::FilePath().AppendASCII("session_history"),
86         base::FilePath().AppendASCII("bot2.html"));
87   }
88
89  protected:
90   virtual void SetUpOnMainThread() OVERRIDE {
91     active_browser_list_ = BrowserList::GetInstance(chrome::GetActiveDesktop());
92     InProcessBrowserTest::SetUpOnMainThread();
93   }
94
95   Browser* GetBrowser(int index) {
96     CHECK(static_cast<int>(active_browser_list_->size()) > index);
97     return active_browser_list_->get(index);
98   }
99
100   // Adds tabs to the given browser, all navigated to url1_. Returns
101   // the final number of tabs.
102   int AddSomeTabs(Browser* browser, int how_many) {
103     int starting_tab_count = browser->tab_strip_model()->count();
104
105     for (int i = 0; i < how_many; ++i) {
106       ui_test_utils::NavigateToURLWithDisposition(
107           browser, url1_, NEW_FOREGROUND_TAB,
108           ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
109     }
110     int tab_count = browser->tab_strip_model()->count();
111     EXPECT_EQ(starting_tab_count + how_many, tab_count);
112     return tab_count;
113   }
114
115   void CloseTab(int index) {
116     content::WebContentsDestroyedWatcher destroyed_watcher(
117         browser()->tab_strip_model()->GetWebContentsAt(index));
118     browser()->tab_strip_model()->CloseWebContentsAt(
119         index, TabStripModel::CLOSE_CREATE_HISTORICAL_TAB);
120     destroyed_watcher.Wait();
121   }
122
123   // Uses the undo-close-tab accelerator to undo a close-tab or close-window
124   // operation. The newly restored tab is expected to appear in the
125   // window at index |expected_window_index|, at the |expected_tabstrip_index|,
126   // and to be active. If |expected_window_index| is equal to the number of
127   // current windows, the restored tab is expected to be created in a new
128   // window (since the index is 0-based).
129   void RestoreTab(int expected_window_index, int expected_tabstrip_index) {
130     int window_count = static_cast<int>(active_browser_list_->size());
131     ASSERT_GT(window_count, 0);
132
133     bool expect_new_window = (expected_window_index == window_count);
134
135     Browser* browser;
136     if (expect_new_window) {
137       browser = active_browser_list_->get(0);
138     } else {
139       browser = GetBrowser(expected_window_index);
140     }
141     int tab_count = browser->tab_strip_model()->count();
142     ASSERT_GT(tab_count, 0);
143
144     // Restore the tab.
145     content::WindowedNotificationObserver tab_added_observer(
146         chrome::NOTIFICATION_TAB_PARENTED,
147         content::NotificationService::AllSources());
148     content::WindowedNotificationObserver tab_loaded_observer(
149         content::NOTIFICATION_LOAD_STOP,
150         content::NotificationService::AllSources());
151     {
152       WaitForLoadObserver waiter(browser);
153       chrome::RestoreTab(browser);
154       waiter.Wait();
155     }
156     tab_added_observer.Wait();
157     tab_loaded_observer.Wait();
158
159     if (expect_new_window) {
160       int new_window_count = static_cast<int>(active_browser_list_->size());
161       EXPECT_EQ(++window_count, new_window_count);
162       browser = GetBrowser(expected_window_index);
163     } else {
164       EXPECT_EQ(++tab_count, browser->tab_strip_model()->count());
165     }
166
167     // Get a handle to the restored tab.
168     ASSERT_GT(browser->tab_strip_model()->count(), expected_tabstrip_index);
169
170     // Ensure that the tab and window are active.
171     EXPECT_EQ(expected_tabstrip_index,
172               browser->tab_strip_model()->active_index());
173   }
174
175   void GoBack(Browser* browser) {
176     content::WindowedNotificationObserver observer(
177         content::NOTIFICATION_LOAD_STOP,
178         content::NotificationService::AllSources());
179     chrome::GoBack(browser, CURRENT_TAB);
180     observer.Wait();
181   }
182
183   void EnsureTabFinishedRestoring(content::WebContents* tab) {
184     content::NavigationController* controller = &tab->GetController();
185     if (!controller->NeedsReload() && !controller->GetPendingEntry() &&
186         !controller->GetWebContents()->IsLoading())
187       return;
188
189     content::WindowedNotificationObserver observer(
190         content::NOTIFICATION_LOAD_STOP,
191         content::Source<content::NavigationController>(controller));
192     observer.Wait();
193   }
194
195   GURL url1_;
196   GURL url2_;
197
198   const BrowserList* active_browser_list_;
199
200  private:
201   DISALLOW_COPY_AND_ASSIGN(TabRestoreTest);
202 };
203
204 // Close the end tab in the current window, then restore it. The tab should be
205 // in its original position, and active.
206 IN_PROC_BROWSER_TEST_F(TabRestoreTest, Basic) {
207   int starting_tab_count = browser()->tab_strip_model()->count();
208   int tab_count = AddSomeTabs(browser(), 1);
209
210   int closed_tab_index = tab_count - 1;
211   CloseTab(closed_tab_index);
212   EXPECT_EQ(starting_tab_count, browser()->tab_strip_model()->count());
213
214   ASSERT_NO_FATAL_FAILURE(RestoreTab(0, closed_tab_index));
215
216   // And make sure everything looks right.
217   EXPECT_EQ(starting_tab_count + 1, browser()->tab_strip_model()->count());
218   EXPECT_EQ(closed_tab_index, browser()->tab_strip_model()->active_index());
219   EXPECT_EQ(url1_,
220             browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
221 }
222
223 // Close a tab not at the end of the current window, then restore it. The tab
224 // should be in its original position, and active.
225 IN_PROC_BROWSER_TEST_F(TabRestoreTest, MiddleTab) {
226   int starting_tab_count = browser()->tab_strip_model()->count();
227   AddSomeTabs(browser(), 3);
228
229   // Close one in the middle
230   int closed_tab_index = starting_tab_count + 1;
231   CloseTab(closed_tab_index);
232   EXPECT_EQ(starting_tab_count + 2, browser()->tab_strip_model()->count());
233
234   ASSERT_NO_FATAL_FAILURE(RestoreTab(0, closed_tab_index));
235
236   // And make sure everything looks right.
237   EXPECT_EQ(starting_tab_count + 3, browser()->tab_strip_model()->count());
238   EXPECT_EQ(closed_tab_index, browser()->tab_strip_model()->active_index());
239   EXPECT_EQ(url1_,
240             browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
241 }
242
243 // Close a tab, switch windows, then restore the tab. The tab should be in its
244 // original window and position, and active.
245 IN_PROC_BROWSER_TEST_F(TabRestoreTest, RestoreToDifferentWindow) {
246   int starting_tab_count = browser()->tab_strip_model()->count();
247   AddSomeTabs(browser(), 3);
248
249   // Close one in the middle
250   int closed_tab_index = starting_tab_count + 1;
251   CloseTab(closed_tab_index);
252   EXPECT_EQ(starting_tab_count + 2, browser()->tab_strip_model()->count());
253
254   // Create a new browser.
255   ui_test_utils::NavigateToURLWithDisposition(
256       browser(), GURL(chrome::kChromeUINewTabURL), NEW_WINDOW,
257       ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER);
258   EXPECT_EQ(2u, active_browser_list_->size());
259
260   // Restore tab into original browser.
261   ASSERT_NO_FATAL_FAILURE(RestoreTab(0, closed_tab_index));
262
263   // And make sure everything looks right.
264   EXPECT_EQ(starting_tab_count + 3, browser()->tab_strip_model()->count());
265   EXPECT_EQ(closed_tab_index, browser()->tab_strip_model()->active_index());
266   EXPECT_EQ(url1_,
267             browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
268 }
269
270 // Close a tab, open a new window, close the first window, then restore the
271 // tab. It should be in a new window.
272 // If this becomes flaky, use http://crbug.com/14774
273 IN_PROC_BROWSER_TEST_F(TabRestoreTest, DISABLED_BasicRestoreFromClosedWindow) {
274   // Navigate to url1 then url2.
275   ui_test_utils::NavigateToURL(browser(), url1_);
276   ui_test_utils::NavigateToURL(browser(), url2_);
277
278   // Create a new browser.
279   ui_test_utils::NavigateToURLWithDisposition(
280       browser(), GURL(chrome::kChromeUINewTabURL), NEW_WINDOW,
281       ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER);
282   EXPECT_EQ(2u, active_browser_list_->size());
283
284   // Close the final tab in the first browser.
285   content::WindowedNotificationObserver window_observer(
286       chrome::NOTIFICATION_BROWSER_CLOSED,
287       content::NotificationService::AllSources());
288   CloseTab(0);
289   window_observer.Wait();
290
291   ASSERT_NO_FATAL_FAILURE(RestoreTab(1, 0));
292
293   // Tab should be in a new window.
294   Browser* browser = GetBrowser(1);
295   content::WebContents* web_contents =
296       browser->tab_strip_model()->GetActiveWebContents();
297   // And make sure the URLs match.
298   EXPECT_EQ(url2_, web_contents->GetURL());
299   GoBack(browser);
300   EXPECT_EQ(url1_, web_contents->GetURL());
301 }
302
303 #if defined(OS_WIN)
304 // Flakily times out: http://crbug.com/171503
305 #define MAYBE_DontLoadRestoredTab DISABLED_DontLoadRestoredTab
306 #else
307 #define MAYBE_DontLoadRestoredTab DontLoadRestoredTab
308 #endif
309
310 // Restore a tab then make sure it doesn't restore again.
311 IN_PROC_BROWSER_TEST_F(TabRestoreTest, MAYBE_DontLoadRestoredTab) {
312   // Add two tabs
313   int starting_tab_count = browser()->tab_strip_model()->count();
314   AddSomeTabs(browser(), 2);
315   ASSERT_EQ(browser()->tab_strip_model()->count(), starting_tab_count + 2);
316
317   // Close one of them.
318   CloseTab(0);
319   ASSERT_EQ(browser()->tab_strip_model()->count(), starting_tab_count + 1);
320
321   // Restore it.
322   ASSERT_NO_FATAL_FAILURE(RestoreTab(0, 0));
323   ASSERT_EQ(browser()->tab_strip_model()->count(), starting_tab_count + 2);
324
325   // Make sure that there's nothing else to restore.
326   ASSERT_EQ(chrome::GetRestoreTabType(browser()),
327             TabStripModelDelegate::RESTORE_NONE);
328 }
329
330 // Open a window with multiple tabs, close a tab, then close the window.
331 // Restore both and make sure the tab goes back into the window.
332 IN_PROC_BROWSER_TEST_F(TabRestoreTest, RestoreWindowAndTab) {
333   int starting_tab_count = browser()->tab_strip_model()->count();
334   AddSomeTabs(browser(), 3);
335
336   // Close one in the middle
337   int closed_tab_index = starting_tab_count + 1;
338   CloseTab(closed_tab_index);
339   EXPECT_EQ(starting_tab_count + 2, browser()->tab_strip_model()->count());
340
341   // Create a new browser.
342   ui_test_utils::NavigateToURLWithDisposition(
343       browser(), GURL(chrome::kChromeUINewTabURL), NEW_WINDOW,
344       ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER);
345   EXPECT_EQ(2u, active_browser_list_->size());
346
347   // Close the first browser.
348   content::WindowedNotificationObserver observer(
349       chrome::NOTIFICATION_BROWSER_CLOSED,
350       content::NotificationService::AllSources());
351   chrome::CloseWindow(browser());
352   observer.Wait();
353   EXPECT_EQ(1u, active_browser_list_->size());
354
355   // Restore the first window. The expected_tabstrip_index (second argument)
356   // indicates the expected active tab.
357   ASSERT_NO_FATAL_FAILURE(RestoreTab(1, starting_tab_count + 1));
358   Browser* browser = GetBrowser(1);
359   EXPECT_EQ(starting_tab_count + 2, browser->tab_strip_model()->count());
360
361   // Restore the closed tab.
362   ASSERT_NO_FATAL_FAILURE(RestoreTab(1, closed_tab_index));
363   EXPECT_EQ(starting_tab_count + 3, browser->tab_strip_model()->count());
364   EXPECT_EQ(url1_,
365             browser->tab_strip_model()->GetActiveWebContents()->GetURL());
366 }
367
368 // Open a window with two tabs, close both (closing the window), then restore
369 // both. Make sure both restored tabs are in the same window.
370 IN_PROC_BROWSER_TEST_F(TabRestoreTest, RestoreIntoSameWindow) {
371   ui_test_utils::NavigateToURLWithDisposition(
372       browser(), url1_, NEW_FOREGROUND_TAB,
373       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
374   // Navigate the rightmost one to url2_ for easier identification.
375   ui_test_utils::NavigateToURLWithDisposition(
376       browser(), url2_, NEW_FOREGROUND_TAB,
377       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
378
379   // Create a new browser.
380   ui_test_utils::NavigateToURLWithDisposition(
381       browser(), GURL(chrome::kChromeUINewTabURL), NEW_WINDOW,
382       ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER);
383   EXPECT_EQ(2u, active_browser_list_->size());
384
385   // Close all but one tab in the first browser, left to right.
386   while (browser()->tab_strip_model()->count() > 1)
387     CloseTab(0);
388
389   // Close the last tab, closing the browser.
390   content::WindowedNotificationObserver observer(
391       chrome::NOTIFICATION_BROWSER_CLOSED,
392       content::NotificationService::AllSources());
393   CloseTab(0);
394   observer.Wait();
395   EXPECT_EQ(1u, active_browser_list_->size());
396
397   // Restore the last-closed tab into a new window.
398   ASSERT_NO_FATAL_FAILURE(RestoreTab(1, 0));
399   Browser* browser = GetBrowser(1);
400   EXPECT_EQ(1, browser->tab_strip_model()->count());
401   EXPECT_EQ(url2_,
402             browser->tab_strip_model()->GetActiveWebContents()->GetURL());
403
404   // Restore the next-to-last-closed tab into the same window.
405   ASSERT_NO_FATAL_FAILURE(RestoreTab(1, 0));
406   EXPECT_EQ(2, browser->tab_strip_model()->count());
407   EXPECT_EQ(url1_,
408             browser->tab_strip_model()->GetActiveWebContents()->GetURL());
409 }
410
411 // Tests that a duplicate history entry is not created when we restore a page
412 // to an existing SiteInstance.  (Bug 1230446)
413 IN_PROC_BROWSER_TEST_F(TabRestoreTest, RestoreWithExistingSiteInstance) {
414   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
415
416   GURL http_url1(embedded_test_server()->GetURL("/title1.html"));
417   GURL http_url2(embedded_test_server()->GetURL("/title2.html"));
418   int tab_count = browser()->tab_strip_model()->count();
419
420   // Add a tab
421   ui_test_utils::NavigateToURLWithDisposition(
422       browser(), http_url1, NEW_FOREGROUND_TAB,
423       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
424   EXPECT_EQ(++tab_count, browser()->tab_strip_model()->count());
425
426   // Navigate to another same-site URL.
427   content::WebContents* tab =
428       browser()->tab_strip_model()->GetWebContentsAt(tab_count - 1);
429   content::WindowedNotificationObserver observer(
430       content::NOTIFICATION_LOAD_STOP,
431       content::NotificationService::AllSources());
432   static_cast<content::WebContentsDelegate*>(browser())->OpenURLFromTab(
433       tab,
434       content::OpenURLParams(http_url2, content::Referrer(), CURRENT_TAB,
435                              ui::PAGE_TRANSITION_TYPED, false));
436   observer.Wait();
437
438   // Close the tab.
439   CloseTab(1);
440
441   // Create a new tab to the original site.  Assuming process-per-site is
442   // enabled, this will ensure that the SiteInstance used by the restored tab
443   // will already exist when the restore happens.
444   ui_test_utils::NavigateToURLWithDisposition(
445       browser(), http_url2, NEW_FOREGROUND_TAB,
446       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
447
448   // Restore the closed tab.
449   ASSERT_NO_FATAL_FAILURE(RestoreTab(0, tab_count - 1));
450
451   // And make sure the URLs match.
452   EXPECT_EQ(http_url2,
453             browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
454   GoBack(browser());
455   EXPECT_EQ(http_url1,
456             browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
457 }
458
459 // See crbug.com/248574
460 #if defined(OS_WIN)
461 #define MAYBE_RestoreCrossSiteWithExistingSiteInstance DISABLED_RestoreCrossSiteWithExistingSiteInstance
462 #else
463 #define MAYBE_RestoreCrossSiteWithExistingSiteInstance RestoreCrossSiteWithExistingSiteInstance
464 #endif
465
466 // Tests that the SiteInstances used for entries in a restored tab's history
467 // are given appropriate max page IDs, even if the renderer for the entry
468 // already exists.  (Bug 1204135)
469 IN_PROC_BROWSER_TEST_F(TabRestoreTest,
470                        MAYBE_RestoreCrossSiteWithExistingSiteInstance) {
471   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
472
473   GURL http_url1(embedded_test_server()->GetURL("/title1.html"));
474   GURL http_url2(embedded_test_server()->GetURL("/title2.html"));
475
476   int tab_count = browser()->tab_strip_model()->count();
477
478   // Add a tab
479   ui_test_utils::NavigateToURLWithDisposition(
480       browser(), http_url1, NEW_FOREGROUND_TAB,
481       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
482   EXPECT_EQ(++tab_count, browser()->tab_strip_model()->count());
483
484   // Navigate to more URLs, then a cross-site URL.
485   ui_test_utils::NavigateToURLWithDisposition(
486       browser(), http_url2, CURRENT_TAB,
487       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
488   ui_test_utils::NavigateToURLWithDisposition(
489       browser(), http_url1, CURRENT_TAB,
490       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
491   ui_test_utils::NavigateToURLWithDisposition(
492       browser(), url1_, CURRENT_TAB,
493       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
494
495   // Close the tab.
496   CloseTab(1);
497
498   // Create a new tab to the original site.  Assuming process-per-site is
499   // enabled, this will ensure that the SiteInstance will already exist when
500   // the user clicks Back in the restored tab.
501   ui_test_utils::NavigateToURLWithDisposition(
502       browser(), http_url2, NEW_FOREGROUND_TAB,
503       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
504
505   // Restore the closed tab.
506   ASSERT_NO_FATAL_FAILURE(RestoreTab(0, tab_count - 1));
507
508   // And make sure the URLs match.
509   EXPECT_EQ(url1_,
510             browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
511   GoBack(browser());
512   EXPECT_EQ(http_url1,
513             browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
514
515   // Navigating to a new URL should clear the forward list, because the max
516   // page ID of the renderer should have been updated when we restored the tab.
517   ui_test_utils::NavigateToURLWithDisposition(
518       browser(), http_url2, CURRENT_TAB,
519       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
520   EXPECT_FALSE(chrome::CanGoForward(browser()));
521   EXPECT_EQ(http_url2,
522             browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
523 }
524
525 IN_PROC_BROWSER_TEST_F(TabRestoreTest, RestoreWindow) {
526   // Create a new window.
527   size_t window_count = active_browser_list_->size();
528   ui_test_utils::NavigateToURLWithDisposition(
529       browser(), GURL(chrome::kChromeUINewTabURL), NEW_WINDOW,
530       ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER);
531   EXPECT_EQ(++window_count, active_browser_list_->size());
532
533   // Create two more tabs, one with url1, the other url2.
534   int initial_tab_count = browser()->tab_strip_model()->count();
535   ui_test_utils::NavigateToURLWithDisposition(
536       browser(), url1_, NEW_FOREGROUND_TAB,
537       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
538   ui_test_utils::NavigateToURLWithDisposition(
539       browser(), url2_, NEW_FOREGROUND_TAB,
540       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
541
542   // Close the window.
543   content::WindowedNotificationObserver close_window_observer(
544       chrome::NOTIFICATION_BROWSER_CLOSED,
545       content::NotificationService::AllSources());
546   chrome::CloseWindow(browser());
547   close_window_observer.Wait();
548   EXPECT_EQ(window_count - 1, active_browser_list_->size());
549
550   // Restore the window.
551   content::WindowedNotificationObserver open_window_observer(
552       chrome::NOTIFICATION_BROWSER_OPENED,
553       content::NotificationService::AllSources());
554   content::WindowedNotificationObserver load_stop_observer(
555       content::NOTIFICATION_LOAD_STOP,
556       content::NotificationService::AllSources());
557   chrome::RestoreTab(active_browser_list_->get(0));
558   open_window_observer.Wait();
559   EXPECT_EQ(window_count, active_browser_list_->size());
560
561   Browser* browser = GetBrowser(1);
562   EXPECT_EQ(initial_tab_count + 2, browser->tab_strip_model()->count());
563   load_stop_observer.Wait();
564
565   content::WebContents* restored_tab =
566       browser->tab_strip_model()->GetWebContentsAt(initial_tab_count);
567   EnsureTabFinishedRestoring(restored_tab);
568   EXPECT_EQ(url1_, restored_tab->GetURL());
569
570   restored_tab =
571       browser->tab_strip_model()->GetWebContentsAt(initial_tab_count + 1);
572   EnsureTabFinishedRestoring(restored_tab);
573   EXPECT_EQ(url2_, restored_tab->GetURL());
574 }
575
576 // Restore tab with special URL chrome://credits/ and make sure the page loads
577 // properly after restore. See http://crbug.com/31905.
578 IN_PROC_BROWSER_TEST_F(TabRestoreTest, RestoreTabWithSpecialURL) {
579   // Navigate new tab to a special URL.
580   ui_test_utils::NavigateToURLWithDisposition(
581       browser(), GURL(chrome::kChromeUICreditsURL), NEW_FOREGROUND_TAB,
582       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
583
584   // Close the tab.
585   CloseTab(1);
586
587   // Restore the closed tab.
588   ASSERT_NO_FATAL_FAILURE(RestoreTab(0, 1));
589   content::WebContents* tab = browser()->tab_strip_model()->GetWebContentsAt(1);
590   EnsureTabFinishedRestoring(tab);
591
592   // See if content is as expected.
593   EXPECT_GT(
594       ui_test_utils::FindInPage(tab, base::ASCIIToUTF16("webkit"), true, false,
595                                 NULL, NULL),
596       0);
597 }
598
599 // Restore tab with special URL in its navigation history, go back to that
600 // entry and see that it loads properly. See http://crbug.com/31905
601 IN_PROC_BROWSER_TEST_F(TabRestoreTest, RestoreTabWithSpecialURLOnBack) {
602   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
603
604   const GURL http_url(embedded_test_server()->GetURL("/title1.html"));
605
606   // Navigate new tab to a special URL.
607   ui_test_utils::NavigateToURLWithDisposition(
608       browser(), GURL(chrome::kChromeUICreditsURL), NEW_FOREGROUND_TAB,
609       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
610
611   // Then navigate to a normal URL.
612   ui_test_utils::NavigateToURL(browser(), http_url);
613
614   // Close the tab.
615   CloseTab(1);
616
617   // Restore the closed tab.
618   ASSERT_NO_FATAL_FAILURE(RestoreTab(0, 1));
619   content::WebContents* tab = browser()->tab_strip_model()->GetWebContentsAt(1);
620   EnsureTabFinishedRestoring(tab);
621   ASSERT_EQ(http_url, tab->GetURL());
622
623   // Go back, and see if content is as expected.
624   GoBack(browser());
625   EXPECT_GT(
626       ui_test_utils::FindInPage(tab, base::ASCIIToUTF16("webkit"), true, false,
627                                 NULL, NULL),
628       0);
629 }
630
631 IN_PROC_BROWSER_TEST_F(TabRestoreTest, PRE_RestoreOnStartup) {
632   // This results in a new tab at the end with url1.
633   AddSomeTabs(browser(), 1);
634
635   while (browser()->tab_strip_model()->count())
636     CloseTab(0);
637 }
638
639 // Verifies restoring a tab works on startup.
640 IN_PROC_BROWSER_TEST_F(TabRestoreTest, RestoreOnStartup) {
641   ASSERT_NO_FATAL_FAILURE(RestoreTab(0, 1));
642   EXPECT_EQ(url1_,
643             browser()->tab_strip_model()->GetWebContentsAt(1)->GetURL());
644 }