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