1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian 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
5513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/app/chrome_command_ids.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/bookmarks/bookmark_model.h"
74a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser_list.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/url_constants.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/browser_with_test_window_test.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/testing_profile.h"
11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/navigation_controller.h"
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/navigation_entry.h"
14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef BrowserWithTestWindowTest BrowserCommandsTest;
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests IDC_SELECT_TAB_0, IDC_SELECT_NEXT_TAB, IDC_SELECT_PREVIOUS_TAB and
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// IDC_SELECT_LAST_TAB.
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(BrowserCommandsTest, TabNavigationAccelerators) {
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL about_blank(chrome::kAboutBlankURL);
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create three tabs.
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AddTab(browser(), about_blank);
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AddTab(browser(), about_blank);
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AddTab(browser(), about_blank);
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Select the second tab.
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  browser()->ActivateTabAt(1, false);
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigate to the first tab using an accelerator.
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->ExecuteCommand(IDC_SELECT_TAB_0);
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(0, browser()->active_index());
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigate to the second tab using the next accelerators.
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->ExecuteCommand(IDC_SELECT_NEXT_TAB);
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(1, browser()->active_index());
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigate back to the first tab using the previous accelerators.
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->ExecuteCommand(IDC_SELECT_PREVIOUS_TAB);
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(0, browser()->active_index());
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigate to the last tab using the select last accelerator.
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->ExecuteCommand(IDC_SELECT_LAST_TAB);
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(2, browser()->active_index());
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests IDC_DUPLICATE_TAB.
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(BrowserCommandsTest, DuplicateTab) {
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url1("http://foo/1");
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url2("http://foo/2");
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url3("http://foo/3");
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigate to the three urls, then go back.
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AddTab(browser(), url1);
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigateAndCommitActiveTab(url2);
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigateAndCommitActiveTab(url3);
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  size_t initial_window_count = BrowserList::size();
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Duplicate the tab.
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->ExecuteCommand(IDC_DUPLICATE_TAB);
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The duplicated tab should not end up in a new window.
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  size_t window_count = BrowserList::size();
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(initial_window_count, window_count);
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // And we should have a newly duplicated tab.
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(2, browser()->tab_count());
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Verify the stack of urls.
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigationController& controller =
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      browser()->GetTabContentsAt(1)->controller();
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(3, controller.entry_count());
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(2, controller.GetCurrentEntryIndex());
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(url1 == controller.GetEntryAtIndex(0)->url());
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(url2 == controller.GetEntryAtIndex(1)->url());
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(url3 == controller.GetEntryAtIndex(2)->url());
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(BrowserCommandsTest, BookmarkCurrentPage) {
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We use profile() here, since it's a TestingProfile.
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  profile()->CreateBookmarkModel(true);
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  profile()->BlockUntilBookmarkModelLoaded();
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigate to a url.
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url1("http://foo/1");
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AddTab(browser(), url1);
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->OpenURL(url1, GURL(), CURRENT_TAB, PageTransition::TYPED);
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(beng): remove this once we can use TabContentses directly in testing
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //             instead of the TestTabContents which causes this command not to
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //             be enabled when the tab is added (and selected).
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->command_updater()->UpdateCommandEnabled(IDC_BOOKMARK_PAGE, true);
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Star it.
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->ExecuteCommand(IDC_BOOKMARK_PAGE);
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // It should now be bookmarked in the bookmark model.
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(profile(), browser()->profile());
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(browser()->profile()->GetBookmarkModel()->IsBookmarked(url1));
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests back/forward in new tab (Control + Back/Forward button in the UI).
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(BrowserCommandsTest, BackForwardInNewTab) {
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url1("http://foo/1");
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url2("http://foo/2");
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make a tab with the two pages navigated in it.
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AddTab(browser(), url1);
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigateAndCommitActiveTab(url2);
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Go back in a new background tab.
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->GoBack(NEW_BACKGROUND_TAB);
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(0, browser()->active_index());
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(2, browser()->tab_count());
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The original tab should be unchanged.
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabContents* zeroth = browser()->GetTabContentsAt(0);
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(url2, zeroth->GetURL());
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(zeroth->controller().CanGoBack());
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(zeroth->controller().CanGoForward());
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The new tab should be like the first one but navigated back.
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabContents* first = browser()->GetTabContentsAt(1);
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(url1, browser()->GetTabContentsAt(1)->GetURL());
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(first->controller().CanGoBack());
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(first->controller().CanGoForward());
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Select the second tab and make it go forward in a new background tab.
131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  browser()->ActivateTabAt(1, true);
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(brettw) bug 11055: It should not be necessary to commit the load here,
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // but because of this bug, it will assert later if we don't. When the bug is
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // fixed, one of the three commits here related to this bug should be removed
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // (to test both codepaths).
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CommitPendingLoad(&first->controller());
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(1, browser()->active_index());
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->GoForward(NEW_BACKGROUND_TAB);
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The previous tab should be unchanged and still in the foreground.
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(url1, first->GetURL());
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(first->controller().CanGoBack());
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(first->controller().CanGoForward());
144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(1, browser()->active_index());
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // There should be a new tab navigated forward.
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(3, browser()->tab_count());
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabContents* second = browser()->GetTabContentsAt(2);
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(url2, second->GetURL());
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(second->controller().CanGoBack());
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(second->controller().CanGoForward());
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now do back in a new foreground tab. Don't bother re-checking every sngle
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // thing above, just validate that it's opening properly.
155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  browser()->ActivateTabAt(2, true);
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(brettw) bug 11055: see the comment above about why we need this.
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CommitPendingLoad(&second->controller());
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->GoBack(NEW_FOREGROUND_TAB);
159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(3, browser()->active_index());
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(url1, browser()->GetSelectedTabContents()->GetURL());
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Same thing again for forward.
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(brettw) bug 11055: see the comment above about why we need this.
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CommitPendingLoad(&browser()->GetSelectedTabContents()->controller());
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->GoForward(NEW_FOREGROUND_TAB);
166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(4, browser()->active_index());
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(url2, browser()->GetSelectedTabContents()->GetURL());
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
169