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