bookmark_context_menu_test.cc revision dc0f95d653279beabeb9817299e2902918ba123e
1// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include <string> 6#include <vector> 7 8#include "base/scoped_ptr.h" 9#include "base/utf_string_conversions.h" 10#include "chrome/app/chrome_command_ids.h" 11#include "chrome/browser/bookmarks/bookmark_model.h" 12#include "chrome/browser/bookmarks/bookmark_utils.h" 13#include "chrome/browser/profiles/profile.h" 14#include "chrome/browser/ui/views/bookmarks/bookmark_context_menu.h" 15#include "chrome/test/testing_profile.h" 16#include "content/browser/browser_thread.h" 17#include "content/browser/tab_contents/page_navigator.h" 18#include "grit/generated_resources.h" 19#include "testing/gtest/include/gtest/gtest.h" 20 21#if defined(OS_WIN) 22#include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h" 23#endif 24 25namespace { 26 27// PageNavigator implementation that records the URL. 28class TestingPageNavigator : public PageNavigator { 29 public: 30 virtual void OpenURL(const GURL& url, 31 const GURL& referrer, 32 WindowOpenDisposition disposition, 33 PageTransition::Type transition) { 34 urls_.push_back(url); 35 } 36 37 std::vector<GURL> urls_; 38}; 39 40} // namespace 41 42class BookmarkContextMenuTest : public testing::Test { 43 public: 44 BookmarkContextMenuTest() 45 : ui_thread_(BrowserThread::UI, &message_loop_), 46 file_thread_(BrowserThread::FILE, &message_loop_), 47 model_(NULL) { 48 } 49 50 virtual void SetUp() { 51#if defined(OS_WIN) 52 BookmarkBarView::testing_ = true; 53#endif 54 55 profile_.reset(new TestingProfile()); 56 profile_->set_has_history_service(true); 57 profile_->CreateBookmarkModel(true); 58 profile_->BlockUntilBookmarkModelLoaded(); 59 60 model_ = profile_->GetBookmarkModel(); 61 62 AddTestData(); 63 } 64 65 virtual void TearDown() { 66#if defined(OS_WIN) 67 BookmarkBarView::testing_ = false; 68#endif 69 70 // Flush the message loop to make Purify happy. 71 message_loop_.RunAllPending(); 72 } 73 74 protected: 75 MessageLoopForUI message_loop_; 76 BrowserThread ui_thread_; 77 BrowserThread file_thread_; 78 scoped_ptr<TestingProfile> profile_; 79 BookmarkModel* model_; 80 TestingPageNavigator navigator_; 81 82 private: 83 // Creates the following structure: 84 // a 85 // F1 86 // f1a 87 // F11 88 // f11a 89 // F2 90 // F3 91 // F4 92 // f4a 93 void AddTestData() { 94 std::string test_base = "file:///c:/tmp/"; 95 96 model_->AddURL(model_->GetBookmarkBarNode(), 0, ASCIIToUTF16("a"), 97 GURL(test_base + "a")); 98 const BookmarkNode* f1 = 99 model_->AddGroup(model_->GetBookmarkBarNode(), 1, ASCIIToUTF16("F1")); 100 model_->AddURL(f1, 0, ASCIIToUTF16("f1a"), GURL(test_base + "f1a")); 101 const BookmarkNode* f11 = model_->AddGroup(f1, 1, ASCIIToUTF16("F11")); 102 model_->AddURL(f11, 0, ASCIIToUTF16("f11a"), GURL(test_base + "f11a")); 103 model_->AddGroup(model_->GetBookmarkBarNode(), 2, ASCIIToUTF16("F2")); 104 model_->AddGroup(model_->GetBookmarkBarNode(), 3, ASCIIToUTF16("F3")); 105 const BookmarkNode* f4 = 106 model_->AddGroup(model_->GetBookmarkBarNode(), 4, ASCIIToUTF16("F4")); 107 model_->AddURL(f4, 0, ASCIIToUTF16("f4a"), GURL(test_base + "f4a")); 108 } 109}; 110 111// Tests Deleting from the menu. 112TEST_F(BookmarkContextMenuTest, DeleteURL) { 113 std::vector<const BookmarkNode*> nodes; 114 nodes.push_back(model_->GetBookmarkBarNode()->GetChild(0)); 115 BookmarkContextMenu controller( 116 NULL, profile_.get(), NULL, nodes[0]->GetParent(), nodes); 117 GURL url = model_->GetBookmarkBarNode()->GetChild(0)->GetURL(); 118 ASSERT_TRUE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_REMOVE)); 119 // Delete the URL. 120 controller.ExecuteCommand(IDC_BOOKMARK_BAR_REMOVE); 121 // Model shouldn't have URL anymore. 122 ASSERT_FALSE(model_->IsBookmarked(url)); 123} 124 125// Tests open all on a folder with a couple of bookmarks. 126TEST_F(BookmarkContextMenuTest, OpenAll) { 127 const BookmarkNode* folder = model_->GetBookmarkBarNode()->GetChild(1); 128 bookmark_utils::OpenAll( 129 NULL, profile_.get(), &navigator_, folder, NEW_FOREGROUND_TAB); 130 131 // Should have navigated to F1's children. 132 ASSERT_EQ(static_cast<size_t>(2), navigator_.urls_.size()); 133 ASSERT_TRUE(folder->GetChild(0)->GetURL() == navigator_.urls_[0]); 134 ASSERT_TRUE(folder->GetChild(1)->GetChild(0)->GetURL() == 135 navigator_.urls_[1]); 136} 137 138// Tests the enabled state of the menus when supplied an empty vector. 139TEST_F(BookmarkContextMenuTest, EmptyNodes) { 140 BookmarkContextMenu controller( 141 NULL, profile_.get(), NULL, model_->other_node(), 142 std::vector<const BookmarkNode*>()); 143 EXPECT_FALSE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL)); 144 EXPECT_FALSE( 145 controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW)); 146 EXPECT_FALSE( 147 controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO)); 148 EXPECT_FALSE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_REMOVE)); 149 EXPECT_TRUE( 150 controller.IsCommandEnabled(IDC_BOOKMARK_BAR_ADD_NEW_BOOKMARK)); 151 EXPECT_TRUE( 152 controller.IsCommandEnabled(IDC_BOOKMARK_BAR_NEW_FOLDER)); 153} 154 155// Tests the enabled state of the menus when supplied a vector with a single 156// url. 157TEST_F(BookmarkContextMenuTest, SingleURL) { 158 std::vector<const BookmarkNode*> nodes; 159 nodes.push_back(model_->GetBookmarkBarNode()->GetChild(0)); 160 BookmarkContextMenu controller( 161 NULL, profile_.get(), NULL, nodes[0]->GetParent(), nodes); 162 EXPECT_TRUE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL)); 163 EXPECT_TRUE( 164 controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW)); 165 EXPECT_TRUE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO)); 166 EXPECT_TRUE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_REMOVE)); 167 EXPECT_TRUE( 168 controller.IsCommandEnabled(IDC_BOOKMARK_BAR_ADD_NEW_BOOKMARK)); 169 EXPECT_TRUE( 170 controller.IsCommandEnabled(IDC_BOOKMARK_BAR_NEW_FOLDER)); 171} 172 173// Tests the enabled state of the menus when supplied a vector with multiple 174// urls. 175TEST_F(BookmarkContextMenuTest, MultipleURLs) { 176 std::vector<const BookmarkNode*> nodes; 177 nodes.push_back(model_->GetBookmarkBarNode()->GetChild(0)); 178 nodes.push_back(model_->GetBookmarkBarNode()->GetChild(1)->GetChild(0)); 179 BookmarkContextMenu controller( 180 NULL, profile_.get(), NULL, nodes[0]->GetParent(), nodes); 181 EXPECT_TRUE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL)); 182 EXPECT_TRUE( 183 controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW)); 184 EXPECT_TRUE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO)); 185 EXPECT_TRUE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_REMOVE)); 186 EXPECT_TRUE( 187 controller.IsCommandEnabled(IDC_BOOKMARK_BAR_ADD_NEW_BOOKMARK)); 188 EXPECT_TRUE( 189 controller.IsCommandEnabled(IDC_BOOKMARK_BAR_NEW_FOLDER)); 190} 191 192// Tests the enabled state of the menus when supplied an vector with a single 193// folder. 194TEST_F(BookmarkContextMenuTest, SingleFolder) { 195 std::vector<const BookmarkNode*> nodes; 196 nodes.push_back(model_->GetBookmarkBarNode()->GetChild(2)); 197 BookmarkContextMenu controller( 198 NULL, profile_.get(), NULL, nodes[0]->GetParent(), nodes); 199 EXPECT_FALSE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL)); 200 EXPECT_FALSE( 201 controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW)); 202 EXPECT_FALSE( 203 controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO)); 204 EXPECT_TRUE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_REMOVE)); 205 EXPECT_TRUE( 206 controller.IsCommandEnabled(IDC_BOOKMARK_BAR_ADD_NEW_BOOKMARK)); 207 EXPECT_TRUE( 208 controller.IsCommandEnabled(IDC_BOOKMARK_BAR_NEW_FOLDER)); 209} 210 211// Tests the enabled state of the menus when supplied a vector with multiple 212// folders, all of which are empty. 213TEST_F(BookmarkContextMenuTest, MultipleEmptyFolders) { 214 std::vector<const BookmarkNode*> nodes; 215 nodes.push_back(model_->GetBookmarkBarNode()->GetChild(2)); 216 nodes.push_back(model_->GetBookmarkBarNode()->GetChild(3)); 217 BookmarkContextMenu controller( 218 NULL, profile_.get(), NULL, nodes[0]->GetParent(), nodes); 219 EXPECT_FALSE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL)); 220 EXPECT_FALSE( 221 controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW)); 222 EXPECT_FALSE( 223 controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO)); 224 EXPECT_TRUE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_REMOVE)); 225 EXPECT_TRUE( 226 controller.IsCommandEnabled(IDC_BOOKMARK_BAR_ADD_NEW_BOOKMARK)); 227 EXPECT_TRUE( 228 controller.IsCommandEnabled(IDC_BOOKMARK_BAR_NEW_FOLDER)); 229} 230 231// Tests the enabled state of the menus when supplied a vector with multiple 232// folders, some of which contain URLs. 233TEST_F(BookmarkContextMenuTest, MultipleFoldersWithURLs) { 234 std::vector<const BookmarkNode*> nodes; 235 nodes.push_back(model_->GetBookmarkBarNode()->GetChild(3)); 236 nodes.push_back(model_->GetBookmarkBarNode()->GetChild(4)); 237 BookmarkContextMenu controller( 238 NULL, profile_.get(), NULL, nodes[0]->GetParent(), nodes); 239 EXPECT_TRUE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL)); 240 EXPECT_TRUE( 241 controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW)); 242 EXPECT_TRUE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO)); 243 EXPECT_TRUE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_REMOVE)); 244 EXPECT_TRUE( 245 controller.IsCommandEnabled(IDC_BOOKMARK_BAR_ADD_NEW_BOOKMARK)); 246 EXPECT_TRUE( 247 controller.IsCommandEnabled(IDC_BOOKMARK_BAR_NEW_FOLDER)); 248} 249 250// Tests the enabled state of open incognito. 251TEST_F(BookmarkContextMenuTest, DisableIncognito) { 252 std::vector<const BookmarkNode*> nodes; 253 nodes.push_back(model_->GetBookmarkBarNode()->GetChild(0)); 254 BookmarkContextMenu controller( 255 NULL, profile_.get(), NULL, nodes[0]->GetParent(), nodes); 256 profile_->set_off_the_record(true); 257 EXPECT_FALSE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_INCOGNITO)); 258 EXPECT_FALSE( 259 controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO)); 260} 261 262// Tests that you can't remove/edit when showing the other node. 263TEST_F(BookmarkContextMenuTest, DisabledItemsWithOtherNode) { 264 std::vector<const BookmarkNode*> nodes; 265 nodes.push_back(model_->other_node()); 266 BookmarkContextMenu controller( 267 NULL, profile_.get(), NULL, nodes[0], nodes); 268 EXPECT_FALSE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_EDIT)); 269 EXPECT_FALSE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_REMOVE)); 270} 271 272// Tests the enabled state of the menus when supplied an empty vector and null 273// parent. 274TEST_F(BookmarkContextMenuTest, EmptyNodesNullParent) { 275 BookmarkContextMenu controller( 276 NULL, profile_.get(), NULL, NULL, std::vector<const BookmarkNode*>()); 277 EXPECT_FALSE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL)); 278 EXPECT_FALSE( 279 controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW)); 280 EXPECT_FALSE( 281 controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO)); 282 EXPECT_FALSE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_REMOVE)); 283 EXPECT_FALSE( 284 controller.IsCommandEnabled(IDC_BOOKMARK_BAR_ADD_NEW_BOOKMARK)); 285 EXPECT_FALSE( 286 controller.IsCommandEnabled(IDC_BOOKMARK_BAR_NEW_FOLDER)); 287} 288 289TEST_F(BookmarkContextMenuTest, CutCopyPasteNode) { 290 std::vector<const BookmarkNode*> nodes; 291 nodes.push_back(model_->GetBookmarkBarNode()->GetChild(0)); 292 scoped_ptr<BookmarkContextMenu> controller(new BookmarkContextMenu( 293 NULL, profile_.get(), NULL, nodes[0]->GetParent(), nodes)); 294 EXPECT_TRUE(controller->IsCommandEnabled(IDC_COPY)); 295 EXPECT_TRUE(controller->IsCommandEnabled(IDC_CUT)); 296 297 // Copy the URL. 298 controller->ExecuteCommand(IDC_COPY); 299 300 controller.reset(new BookmarkContextMenu( 301 NULL, profile_.get(), NULL, nodes[0]->GetParent(), nodes)); 302 int old_count = model_->GetBookmarkBarNode()->GetChildCount(); 303 controller->ExecuteCommand(IDC_PASTE); 304 305 ASSERT_TRUE(model_->GetBookmarkBarNode()->GetChild(1)->is_url()); 306 ASSERT_EQ(old_count + 1, model_->GetBookmarkBarNode()->GetChildCount()); 307 ASSERT_EQ(model_->GetBookmarkBarNode()->GetChild(0)->GetURL(), 308 model_->GetBookmarkBarNode()->GetChild(1)->GetURL()); 309 310 controller.reset(new BookmarkContextMenu( 311 NULL, profile_.get(), NULL, nodes[0]->GetParent(), nodes)); 312 // Cut the URL. 313 controller->ExecuteCommand(IDC_CUT); 314 ASSERT_TRUE(model_->GetBookmarkBarNode()->GetChild(0)->is_url()); 315 ASSERT_TRUE(model_->GetBookmarkBarNode()->GetChild(1)->is_folder()); 316 ASSERT_EQ(old_count, model_->GetBookmarkBarNode()->GetChildCount()); 317} 318