172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/command_line.h"
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_path.h"
872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/test/test_timeouts.h"
9513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/app/chrome_command_ids.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_paths.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/url_constants.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/automation/tab_proxy.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/automation/browser_proxy.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/automation/window_proxy.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/ui/ui_test.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_util.h"
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/test/test_server.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// http://code.google.com/p/chromium/issues/detail?id=14774
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if (defined(OS_WIN) || defined(OS_CHROMEOS)) && !defined(NDEBUG)
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define MAYBE_BasicRestoreFromClosedWindow DISABLED_BasicRestoreFromClosedWindow
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define MAYBE_BasicRestoreFromClosedWindow BasicRestoreFromClosedWindow
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TabRestoreUITest : public UITest {
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabRestoreUITest() : UITest() {
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FilePath path_prefix(test_data_directory_);
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    path_prefix = path_prefix.AppendASCII("session_history");
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    url1_ = net::FilePathToFileURL(path_prefix.AppendASCII("bot1.html"));
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    url2_ = net::FilePathToFileURL(path_prefix.AppendASCII("bot2.html"));
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Uses the undo-close-tab accelerator to undo a close-tab or close-window
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // operation. The newly restored tab is expected to appear in the
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // window at index |expected_window_index|, at the |expected_tabstrip_index|,
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // and to be active. If |expected_window_index| is equal to the number of
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // current windows, the restored tab is expected to be created in a new
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // window (since the index is 0-based).
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void RestoreTab(int expected_window_index,
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  int expected_tabstrip_index) {
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int tab_count = 0;
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int window_count = 0;
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(automation()->GetBrowserWindowCount(&window_count));
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_GT(window_count, 0);
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool expect_new_window = (expected_window_index == window_count);
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    scoped_refptr<BrowserProxy> browser_proxy;
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (expect_new_window) {
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      browser_proxy = automation()->GetBrowserWindow(0);
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else {
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ASSERT_GT(window_count, expected_window_index);
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      browser_proxy = automation()->GetBrowserWindow(expected_window_index);
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(browser_proxy.get());
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(browser_proxy->GetTabCount(&tab_count));
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_GT(tab_count, 0);
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Restore the tab.
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(browser_proxy->RunCommand(IDC_RESTORE_TAB));
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (expect_new_window) {
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int new_window_count = 0;
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ASSERT_TRUE(automation()->GetBrowserWindowCount(&new_window_count));
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      EXPECT_EQ(++window_count, new_window_count);
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      browser_proxy = automation()->GetBrowserWindow(expected_window_index);
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ASSERT_TRUE(browser_proxy.get());
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else {
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int new_tab_count = 0;
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ASSERT_TRUE(browser_proxy->GetTabCount(&new_tab_count));
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      EXPECT_EQ(++tab_count, new_tab_count);
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Get a handle to the restored tab.
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(browser_proxy->GetTabCount(&tab_count));
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_GT(tab_count, expected_tabstrip_index);
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    scoped_refptr<TabProxy> restored_tab_proxy(
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        browser_proxy->GetTab(expected_tabstrip_index));
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(restored_tab_proxy.get());
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Wait for the restored tab to finish loading.
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(restored_tab_proxy->WaitForTabToBeRestored(
8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        TestTimeouts::action_max_timeout_ms()));
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Ensure that the tab and window are active.
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CheckActiveWindow(browser_proxy.get());
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(expected_tabstrip_index,
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        GetActiveTabIndex(expected_window_index));
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Adds tabs to the given browser, all navigated to url1_. Returns
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the final number of tabs.
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int AddSomeTabs(BrowserProxy* browser, int how_many) {
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int starting_tab_count = -1;
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_TRUE(browser->GetTabCount(&starting_tab_count));
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (int i = 0; i < how_many; ++i) {
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      EXPECT_TRUE(browser->AppendTab(url1_));
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int tab_count;
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_TRUE(browser->GetTabCount(&tab_count));
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(starting_tab_count + how_many, tab_count);
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return tab_count;
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Ensure that the given browser occupies the currently active window.
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void CheckActiveWindow(const BrowserProxy* browser) {
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // This entire check is disabled because even the IsActive() call
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // sporadically fails to complete successfully. See http://crbug.com/10916.
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // TODO(pamg): Investigate and re-enable. Also find a way to have the
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // calling location reported in the gtest error, by inlining this again if
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // nothing else.
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool is_active = false;
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    scoped_refptr<WindowProxy> window_proxy(browser->GetWindow());
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(window_proxy.get());
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(window_proxy->IsActive(&is_active));
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // The check for is_active may fail if other apps are active while running
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // the tests, because Chromium won't be the foremost application at all.
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // So we'll have it log an error, but not report one through gtest, to
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // keep the test result deterministic and the buildbots happy.
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!is_active)
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      LOG(ERROR) << "WARNING: is_active was false, expected true. (This may "
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    "be simply because Chromium isn't the front application.)";
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url1_;
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url2_;
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(TabRestoreUITest);
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Close the end tab in the current window, then restore it. The tab should be
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// in its original position, and active.
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TabRestoreUITest, Basic) {
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BrowserProxy> browser_proxy(automation()->GetBrowserWindow(0));
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy.get());
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int starting_tab_count;
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->GetTabCount(&starting_tab_count));
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int tab_count = AddSomeTabs(browser_proxy.get(), 1);
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int closed_tab_index = tab_count - 1;
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> new_tab(browser_proxy->GetTab(closed_tab_index));
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(new_tab.get());
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure we're at url.
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(AUTOMATION_MSG_NAVIGATION_SUCCESS, new_tab->NavigateToURL(url1_));
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the tab.
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(new_tab->Close(true));
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  new_tab = NULL;
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->GetTabCount(&tab_count));
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(starting_tab_count, tab_count);
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RestoreTab(0, closed_tab_index);
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // And make sure everything looks right.
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->GetTabCount(&tab_count));
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(starting_tab_count + 1, tab_count);
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(closed_tab_index, GetActiveTabIndex());
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(url1_, GetActiveTabURL());
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Close a tab not at the end of the current window, then restore it. The tab
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// should be in its original position, and active.
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TabRestoreUITest, MiddleTab) {
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BrowserProxy> browser_proxy(automation()->GetBrowserWindow(0));
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy.get());
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int starting_tab_count;
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->GetTabCount(&starting_tab_count));
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int tab_count = AddSomeTabs(browser_proxy.get(), 3);
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close one in the middle
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int closed_tab_index = starting_tab_count + 1;
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> new_tab(browser_proxy->GetTab(closed_tab_index));
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(new_tab.get());
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure we're at url.
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(AUTOMATION_MSG_NAVIGATION_SUCCESS, new_tab->NavigateToURL(url1_));
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the tab.
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(new_tab->Close(true));
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  new_tab = NULL;
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->GetTabCount(&tab_count));
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(starting_tab_count + 2, tab_count);
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RestoreTab(0, closed_tab_index);
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // And make sure everything looks right.
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->GetTabCount(&tab_count));
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(starting_tab_count + 3, tab_count);
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(closed_tab_index, GetActiveTabIndex());
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(url1_, GetActiveTabURL());
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Close a tab, switch windows, then restore the tab. The tab should be in its
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// original window and position, and active.
201dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(TabRestoreUITest, RestoreToDifferentWindow) {
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BrowserProxy> browser_proxy(automation()->GetBrowserWindow(0));
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy.get());
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This call is virtually guaranteed to pass, assuming that Chromium is the
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // active application, which will establish a baseline for later calls to
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // CheckActiveWindow(). See comments in that function.
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckActiveWindow(browser_proxy.get());
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int starting_tab_count;
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->GetTabCount(&starting_tab_count));
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int tab_count = AddSomeTabs(browser_proxy.get(), 3);
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close one in the middle
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int closed_tab_index = starting_tab_count + 1;
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> new_tab(browser_proxy->GetTab(closed_tab_index));
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(new_tab.get());
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure we're at url.
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(AUTOMATION_MSG_NAVIGATION_SUCCESS, new_tab->NavigateToURL(url1_));
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the tab.
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(new_tab->Close(true));
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  new_tab = NULL;
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->GetTabCount(&tab_count));
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(starting_tab_count + 2, tab_count);
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a new browser.
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(automation()->OpenNewBrowserWindow(Browser::TYPE_NORMAL, false));
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int window_count;
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(automation()->GetBrowserWindowCount(&window_count));
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, window_count);
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckActiveWindow(automation()->GetBrowserWindow(1));
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Restore tab into original browser.
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RestoreTab(0, closed_tab_index);
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // And make sure everything looks right.
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckActiveWindow(browser_proxy.get());
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->GetTabCount(&tab_count));
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(starting_tab_count + 3, tab_count);
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(closed_tab_index, GetActiveTabIndex(0));
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(url1_, GetActiveTabURL(0));
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Close a tab, open a new window, close the first window, then restore the
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// tab. It should be in a new window.
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TabRestoreUITest, MAYBE_BasicRestoreFromClosedWindow) {
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BrowserProxy> browser_proxy(automation()->GetBrowserWindow(0));
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy.get());
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckActiveWindow(browser_proxy.get());
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int tab_count;
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->GetTabCount(&tab_count));
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close tabs until we only have one open.
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  while (tab_count > 1) {
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    scoped_refptr<TabProxy> tab_to_close(browser_proxy->GetTab(0));
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(tab_to_close.get());
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(tab_to_close->Close(true));
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(browser_proxy->GetTabCount(&tab_count));
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigate to url1 then url2.
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> tab_proxy(browser_proxy->GetTab(0));
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab_proxy.get());
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(AUTOMATION_MSG_NAVIGATION_SUCCESS, tab_proxy->NavigateToURL(url1_));
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(AUTOMATION_MSG_NAVIGATION_SUCCESS, tab_proxy->NavigateToURL(url2_));
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a new browser.
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(automation()->OpenNewBrowserWindow(Browser::TYPE_NORMAL, false));
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int window_count;
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(automation()->GetBrowserWindowCount(&window_count));
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, window_count);
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckActiveWindow(automation()->GetBrowserWindow(1));
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the final tab in the first browser.
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(tab_proxy->Close(true));
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(automation()->WaitForWindowCountToBecome(1));
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Tab and browser are no longer valid.
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab_proxy = NULL;
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser_proxy = NULL;
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RestoreTab(1, 0);
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Tab should be in a new window.
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser_proxy = automation()->GetBrowserWindow(1);
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy.get());
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckActiveWindow(browser_proxy.get());
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab_proxy = browser_proxy->GetActiveTab();
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab_proxy.get());
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // And make sure the URLs matches.
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(url2_, GetActiveTabURL(1));
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(tab_proxy->GoBack());
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(url1_, GetActiveTabURL(1));
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Restore a tab then make sure it doesn't restore again.
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TabRestoreUITest, DontLoadRestoredTab) {
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BrowserProxy> browser_proxy(automation()->GetBrowserWindow(0));
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy.get());
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckActiveWindow(browser_proxy.get());
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add two tabs
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int starting_tab_count = 0;
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->GetTabCount(&starting_tab_count));
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AddSomeTabs(browser_proxy.get(), 2);
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int current_tab_count = 0;
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->GetTabCount(&current_tab_count));
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(current_tab_count, starting_tab_count + 2);
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close one of them.
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> tab_to_close(browser_proxy->GetTab(0));
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab_to_close.get());
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab_to_close->Close(true));
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->GetTabCount(&current_tab_count));
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(current_tab_count, starting_tab_count + 1);
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Restore it.
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RestoreTab(0, 0);
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->GetTabCount(&current_tab_count));
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(current_tab_count, starting_tab_count + 2);
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure that there's nothing else to restore.
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool enabled;
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->IsMenuCommandEnabled(IDC_RESTORE_TAB, &enabled));
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(enabled);
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Open a window with multiple tabs, close a tab, then close the window.
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Restore both and make sure the tab goes back into the window.
332dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(TabRestoreUITest, RestoreWindowAndTab) {
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BrowserProxy> browser_proxy(automation()->GetBrowserWindow(0));
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy.get());
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckActiveWindow(browser_proxy.get());
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int starting_tab_count;
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->GetTabCount(&starting_tab_count));
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int tab_count = AddSomeTabs(browser_proxy.get(), 3);
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close one in the middle
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int closed_tab_index = starting_tab_count + 1;
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> new_tab(browser_proxy->GetTab(closed_tab_index));
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(new_tab.get());
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure we're at url.
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(AUTOMATION_MSG_NAVIGATION_SUCCESS, new_tab->NavigateToURL(url1_));
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the tab.
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(new_tab->Close(true));
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  new_tab = NULL;
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->GetTabCount(&tab_count));
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(starting_tab_count + 2, tab_count);
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a new browser.
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(automation()->OpenNewBrowserWindow(Browser::TYPE_NORMAL, false));
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int window_count;
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(automation()->GetBrowserWindowCount(&window_count));
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, window_count);
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckActiveWindow(automation()->GetBrowserWindow(1));
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the first browser.
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool application_closing;
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(CloseBrowser(browser_proxy.get(), &application_closing));
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(application_closing);
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(automation()->GetBrowserWindowCount(&window_count));
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, window_count);
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Browser is no longer valid.
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser_proxy = NULL;
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Restore the first window. The expected_tabstrip_index (second argument)
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // indicates the expected active tab.
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RestoreTab(1, starting_tab_count + 1);
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser_proxy = automation()->GetBrowserWindow(1);
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy.get());
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckActiveWindow(browser_proxy.get());
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->GetTabCount(&tab_count));
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(starting_tab_count + 2, tab_count);
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Restore the closed tab.
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RestoreTab(1, closed_tab_index);
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckActiveWindow(browser_proxy.get());
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->GetTabCount(&tab_count));
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(starting_tab_count + 3, tab_count);
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(url1_, GetActiveTabURL(1));
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Open a window with two tabs, close both (closing the window), then restore
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// both. Make sure both restored tabs are in the same window.
389dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(TabRestoreUITest, RestoreIntoSameWindow) {
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BrowserProxy> browser_proxy(automation()->GetBrowserWindow(0));
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy.get());
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckActiveWindow(browser_proxy.get());
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int starting_tab_count;
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->GetTabCount(&starting_tab_count));
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int tab_count = AddSomeTabs(browser_proxy.get(), 2);
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigate the rightmost one to url2_ for easier identification.
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> tab_proxy(browser_proxy->GetTab(tab_count - 1));
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab_proxy.get());
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(AUTOMATION_MSG_NAVIGATION_SUCCESS, tab_proxy->NavigateToURL(url2_));
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a new browser.
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(automation()->OpenNewBrowserWindow(Browser::TYPE_NORMAL, false));
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int window_count;
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(automation()->GetBrowserWindowCount(&window_count));
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, window_count);
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckActiveWindow(automation()->GetBrowserWindow(1));
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close all but one tab in the first browser, left to right.
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  while (tab_count > 1) {
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    scoped_refptr<TabProxy> tab_to_close(browser_proxy->GetTab(0));
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(tab_to_close.get());
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(tab_to_close->Close(true));
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(browser_proxy->GetTabCount(&tab_count));
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the last tab, closing the browser.
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab_proxy = browser_proxy->GetTab(0);
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab_proxy.get());
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(tab_proxy->Close(true));
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(automation()->WaitForWindowCountToBecome(1));
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser_proxy = NULL;
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab_proxy = NULL;
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Restore the last-closed tab into a new window.
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RestoreTab(1, 0);
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser_proxy = automation()->GetBrowserWindow(1);
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy.get());
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckActiveWindow(browser_proxy.get());
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->GetTabCount(&tab_count));
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, tab_count);
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(url2_, GetActiveTabURL(1));
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Restore the next-to-last-closed tab into the same window.
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RestoreTab(1, 0);
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckActiveWindow(browser_proxy.get());
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->GetTabCount(&tab_count));
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, tab_count);
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(url1_, GetActiveTabURL(1));
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that a duplicate history entry is not created when we restore a page
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// to an existing SiteInstance.  (Bug 1230446)
445731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(TabRestoreUITest, RestoreWithExistingSiteInstance) {
4463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  net::TestServer test_server(net::TestServer::TYPE_HTTP,
4473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                              FilePath(FILE_PATH_LITERAL("chrome/test/data")));
4483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server.Start());
4493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL http_url1(test_server.GetURL("files/title1.html"));
4513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL http_url2(test_server.GetURL("files/title2.html"));
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BrowserProxy> browser_proxy(automation()->GetBrowserWindow(0));
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy.get());
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int tab_count;
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->GetTabCount(&tab_count));
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add a tab
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->AppendTab(http_url1));
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int new_tab_count;
461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->GetTabCount(&new_tab_count));
462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(++tab_count, new_tab_count);
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> tab(browser_proxy->GetTab(tab_count - 1));
464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab.get());
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigate to another same-site URL.
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(AUTOMATION_MSG_NAVIGATION_SUCCESS, tab->NavigateToURL(http_url2));
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the tab.
470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab->Close(true));
471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab = NULL;
472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a new tab to the original site.  Assuming process-per-site is
474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // enabled, this will ensure that the SiteInstance used by the restored tab
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // will already exist when the restore happens.
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->AppendTab(http_url2));
477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Restore the closed tab.
479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RestoreTab(0, tab_count - 1);
480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab = browser_proxy->GetActiveTab();
481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab.get());
482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // And make sure the URLs match.
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(http_url2, GetActiveTabURL());
485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(tab->GoBack());
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(http_url1, GetActiveTabURL());
487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that the SiteInstances used for entries in a restored tab's history
490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// are given appropriate max page IDs, even if the renderer for the entry
491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// already exists.  (Bug 1204135)
492731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(TabRestoreUITest, RestoreCrossSiteWithExistingSiteInstance) {
4933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  net::TestServer test_server(net::TestServer::TYPE_HTTP,
4943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                              FilePath(FILE_PATH_LITERAL("chrome/test/data")));
4953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server.Start());
4963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL http_url1(test_server.GetURL("files/title1.html"));
4983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL http_url2(test_server.GetURL("files/title2.html"));
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BrowserProxy> browser_proxy(automation()->GetBrowserWindow(0));
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy.get());
502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int tab_count;
503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->GetTabCount(&tab_count));
504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add a tab
506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->AppendTab(http_url1));
507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int new_tab_count;
508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->GetTabCount(&new_tab_count));
509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(++tab_count, new_tab_count);
510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> tab(browser_proxy->GetTab(tab_count - 1));
511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab.get());
512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigate to more URLs, then a cross-site URL.
514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(AUTOMATION_MSG_NAVIGATION_SUCCESS, tab->NavigateToURL(http_url2));
515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(AUTOMATION_MSG_NAVIGATION_SUCCESS, tab->NavigateToURL(http_url1));
516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(AUTOMATION_MSG_NAVIGATION_SUCCESS, tab->NavigateToURL(url1_));
517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the tab.
519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab->Close(true));
520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab = NULL;
521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a new tab to the original site.  Assuming process-per-site is
523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // enabled, this will ensure that the SiteInstance will already exist when
524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the user clicks Back in the restored tab.
525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->AppendTab(http_url2));
526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Restore the closed tab.
528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RestoreTab(0, tab_count - 1);
529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab = browser_proxy->GetActiveTab();
530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab.get());
531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // And make sure the URLs match.
533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(url1_, GetActiveTabURL());
534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(tab->GoBack());
535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(http_url1, GetActiveTabURL());
536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigating to a new URL should clear the forward list, because the max
538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // page ID of the renderer should have been updated when we restored the tab.
539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(AUTOMATION_MSG_NAVIGATION_SUCCESS, tab->NavigateToURL(http_url2));
540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(tab->GoForward());
541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(http_url2, GetActiveTabURL());
542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
544dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(TabRestoreUITest, RestoreWindow) {
545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a new window.
546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int window_count;
547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(automation()->GetBrowserWindowCount(&window_count));
548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(automation()->OpenNewBrowserWindow(Browser::TYPE_NORMAL, false));
549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int new_window_count = 0;
550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(automation()->GetBrowserWindowCount(&new_window_count));
551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(++window_count, new_window_count);
552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create two more tabs, one with url1, the other url2.
554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BrowserProxy> browser_proxy(automation()->GetBrowserWindow(0));
555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy.get());
556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int initial_tab_count;
557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->GetTabCount(&initial_tab_count));
558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->AppendTab(url1_));
5593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(browser_proxy->WaitForTabCountToBecome(initial_tab_count + 1));
560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> new_tab(browser_proxy->GetTab(initial_tab_count));
561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(new_tab.get());
562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(AUTOMATION_MSG_NAVIGATION_SUCCESS, new_tab->NavigateToURL(url1_));
563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->AppendTab(url2_));
5643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(browser_proxy->WaitForTabCountToBecome(initial_tab_count + 2));
565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  new_tab = browser_proxy->GetTab(initial_tab_count + 1);
566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(new_tab.get());
567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(AUTOMATION_MSG_NAVIGATION_SUCCESS, new_tab->NavigateToURL(url2_));
568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the window.
570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->RunCommand(IDC_CLOSE_WINDOW));
571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser_proxy = NULL;
572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  new_tab = NULL;
573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(automation()->GetBrowserWindowCount(&new_window_count));
574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(window_count - 1, new_window_count);
575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Restore the window.
577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser_proxy = automation()->GetBrowserWindow(0);
578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy.get());
579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser_proxy->RunCommand(IDC_RESTORE_TAB));
580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(automation()->GetBrowserWindowCount(&new_window_count));
581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(window_count, new_window_count);
582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser_proxy = automation()->GetBrowserWindow(1);
584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int tab_count;
585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(browser_proxy->GetTabCount(&tab_count));
586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(initial_tab_count + 2, tab_count);
587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> restored_tab_proxy(
589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        browser_proxy->GetTab(initial_tab_count));
590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(restored_tab_proxy.get());
59172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(restored_tab_proxy->WaitForTabToBeRestored(
59272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      TestTimeouts::action_timeout_ms()));
593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url;
594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(restored_tab_proxy->GetCurrentURL(&url));
595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(url == url1_);
596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
597c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  restored_tab_proxy = browser_proxy->GetTab(initial_tab_count + 1);
598c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(restored_tab_proxy.get());
59972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(restored_tab_proxy->WaitForTabToBeRestored(
60072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      TestTimeouts::action_timeout_ms()));
601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(restored_tab_proxy->GetCurrentURL(&url));
602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(url == url2_);
603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Restore tab with special URL about:credits and make sure the page loads
606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// properly after restore. See http://crbug.com/31905.
607c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TabRestoreUITest, RestoreTabWithSpecialURL) {
608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BrowserProxy> browser(automation()->GetBrowserWindow(0));
609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser.get());
610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckActiveWindow(browser.get());
611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigate new tab to a special URL.
613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const GURL special_url(chrome::kAboutCreditsURL);
614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser->AppendTab(special_url));
615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> tab(browser->GetActiveTab());
616c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab.get());
617c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the tab.
619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab->Close(true));
620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Restore the closed tab.
622c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RestoreTab(0, 1);
623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab = browser->GetTab(1);
624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab.get());
62572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(tab->WaitForTabToBeRestored(TestTimeouts::action_timeout_ms()));
626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // See if content is as expected.
628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(tab->FindInPage(std::wstring(L"webkit"), FWD, IGNORE_CASE, false,
629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              NULL));
630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Restore tab with special URL in its navigation history, go back to that
633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// entry and see that it loads properly. See http://crbug.com/31905
634c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TabRestoreUITest, RestoreTabWithSpecialURLOnBack) {
6353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  net::TestServer test_server(net::TestServer::TYPE_HTTP,
6363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                              FilePath(FILE_PATH_LITERAL("chrome/test/data")));
6373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server.Start());
6383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const GURL http_url(test_server.GetURL("files/title1.html"));
640c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BrowserProxy> browser(automation()->GetBrowserWindow(0));
642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser.get());
643c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckActiveWindow(browser.get());
644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
645c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigate new tab to a special URL.
646c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const GURL special_url(chrome::kAboutCreditsURL);
647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser->AppendTab(special_url));
648c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> tab(browser->GetActiveTab());
649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab.get());
650c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
651c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Then navigate to a normal URL.
652c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab->NavigateToURL(http_url));
653c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
654c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the tab.
655c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab->Close(true));
656c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
657c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Restore the closed tab.
658c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RestoreTab(0, 1);
659c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab = browser->GetTab(1);
660c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab.get());
66172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(tab->WaitForTabToBeRestored(TestTimeouts::action_timeout_ms()));
662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url;
663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab->GetCurrentURL(&url));
664c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(http_url, url);
665c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Go back, and see if content is as expected.
667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab->GoBack());
668c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(tab->FindInPage(std::wstring(L"webkit"), FWD, IGNORE_CASE, false,
669c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              NULL));
670c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
671