blob: 99393ed440f1f683378603e1003b3746e3c34a33 [file] [log] [blame]
[email protected]7dddebc32012-01-11 22:01:031// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]2e3b5202010-03-23 06:52:412// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <vector>
6
[email protected]ea1a3f62012-11-16 20:34:237#include "base/files/scoped_temp_dir.h"
[email protected]2e3b5202010-03-23 06:52:418#include "base/json/json_reader.h"
[email protected]3b63f8f42011-03-28 01:54:159#include "base/memory/scoped_vector.h"
[email protected]3fc40c142011-12-01 13:09:0410#include "base/message_loop.h"
[email protected]2e3b5202010-03-23 06:52:4111#include "base/path_service.h"
[email protected]3853a4c2013-02-11 17:15:5712#include "base/prefs/pref_service.h"
[email protected]944b4212010-12-14 00:00:3313#include "base/utf_string_conversions.h"
[email protected]2e3b5202010-03-23 06:52:4114#include "base/values.h"
[email protected]5a38dfd2012-07-23 23:22:1015#include "chrome/browser/extensions/event_names.h"
16#include "chrome/browser/extensions/event_router.h"
[email protected]9e5be1f92012-10-29 19:01:4517#include "chrome/browser/extensions/extension_system_factory.h"
[email protected]5aeeae12012-07-05 19:13:1118#include "chrome/browser/extensions/menu_manager.h"
[email protected]052c92702010-06-25 07:25:5219#include "chrome/browser/extensions/test_extension_prefs.h"
[email protected]9e5be1f92012-10-29 19:01:4520#include "chrome/browser/extensions/test_extension_system.h"
[email protected]c753f142013-02-10 13:14:0421#include "chrome/browser/prefs/pref_service_syncable.h"
[email protected]432115822011-07-10 15:52:2722#include "chrome/common/chrome_notification_types.h"
[email protected]2e3b5202010-03-23 06:52:4123#include "chrome/common/chrome_paths.h"
24#include "chrome/common/extensions/extension.h"
25#include "chrome/common/extensions/extension_constants.h"
[email protected]a4ff9eae2011-08-01 19:58:1626#include "chrome/test/base/testing_profile.h"
[email protected]ad50def52011-10-19 23:17:0727#include "content/public/browser/notification_service.h"
[email protected]35be7ec2012-02-12 20:42:5128#include "content/public/common/context_menu_params.h"
[email protected]e97882f2012-06-04 02:23:1729#include "content/public/test/test_browser_thread.h"
[email protected]2e3b5202010-03-23 06:52:4130#include "testing/gmock/include/gmock/gmock.h"
[email protected]f20d7332011-03-08 21:11:5331#include "testing/gtest/include/gtest/gtest.h"
[email protected]2e3b5202010-03-23 06:52:4132
[email protected]631bb742011-11-02 11:29:3933using content::BrowserThread;
[email protected]2e3b5202010-03-23 06:52:4134using testing::_;
35using testing::AtLeast;
[email protected]c9bd90f2012-08-07 23:58:1536using testing::DeleteArg;
[email protected]bc4ae152012-06-01 22:23:3437using testing::InSequence;
[email protected]2e3b5202010-03-23 06:52:4138using testing::Return;
39using testing::SaveArg;
40
[email protected]5aeeae12012-07-05 19:13:1141namespace extensions {
42
[email protected]2e3b5202010-03-23 06:52:4143// Base class for tests.
[email protected]5aeeae12012-07-05 19:13:1144class MenuManagerTest : public testing::Test {
[email protected]2e3b5202010-03-23 06:52:4145 public:
[email protected]5aeeae12012-07-05 19:13:1146 MenuManagerTest() : ui_thread_(BrowserThread::UI, &message_loop_),
47 file_thread_(BrowserThread::FILE, &message_loop_),
48 manager_(&profile_),
[email protected]0de615a2012-11-08 04:40:5949 prefs_(message_loop_.message_loop_proxy()),
[email protected]5aeeae12012-07-05 19:13:1150 next_id_(1) {
[email protected]6cad5bf2011-03-10 21:21:5551 }
[email protected]2e3b5202010-03-23 06:52:4152
[email protected]0de615a2012-11-08 04:40:5953 virtual void TearDown() OVERRIDE {
54 prefs_.pref_service()->CommitPendingWrite();
55 message_loop_.RunUntilIdle();
56 }
57
[email protected]052c92702010-06-25 07:25:5258 // Returns a test item.
[email protected]63503462012-10-30 22:14:3159 MenuItem* CreateTestItem(Extension* extension, bool incognito = false) {
[email protected]5aeeae12012-07-05 19:13:1160 MenuItem::Type type = MenuItem::NORMAL;
61 MenuItem::ContextList contexts(MenuItem::ALL);
[email protected]63503462012-10-30 22:14:3162 MenuItem::Id id(incognito, extension->id());
[email protected]619c5dba2012-05-16 00:44:4863 id.uid = next_id_++;
[email protected]5aeeae12012-07-05 19:13:1164 return new MenuItem(id, "test", false, true, type, contexts);
[email protected]619c5dba2012-05-16 00:44:4865 }
66
67 // Returns a test item with the given string ID.
[email protected]5aeeae12012-07-05 19:13:1168 MenuItem* CreateTestItemWithID(Extension* extension,
69 const std::string& string_id) {
70 MenuItem::Type type = MenuItem::NORMAL;
71 MenuItem::ContextList contexts(MenuItem::ALL);
72 MenuItem::Id id(false, extension->id());
[email protected]619c5dba2012-05-16 00:44:4873 id.string_uid = string_id;
[email protected]5aeeae12012-07-05 19:13:1174 return new MenuItem(id, "test", false, true, type, contexts);
[email protected]06a0c94e2010-06-24 23:20:1575 }
76
[email protected]052c92702010-06-25 07:25:5277 // Creates and returns a test Extension. The caller does *not* own the return
78 // value.
79 Extension* AddExtension(std::string name) {
[email protected]66e4eb32010-10-27 20:37:4180 scoped_refptr<Extension> extension = prefs_.AddExtension(name);
[email protected]819faeb02010-06-25 21:16:2281 extensions_.push_back(extension);
[email protected]dc24976f2013-06-02 21:15:0982 return extension.get();
[email protected]052c92702010-06-25 07:25:5283 }
84
[email protected]2e3b5202010-03-23 06:52:4185 protected:
[email protected]8b280302011-10-13 22:22:2386 TestingProfile profile_;
[email protected]b3a25092013-05-28 22:08:1687 base::MessageLoopForUI message_loop_;
[email protected]c38831a12011-10-28 12:44:4988 content::TestBrowserThread ui_thread_;
89 content::TestBrowserThread file_thread_;
[email protected]6cad5bf2011-03-10 21:21:5590
[email protected]5aeeae12012-07-05 19:13:1191 MenuManager manager_;
92 ExtensionList extensions_;
[email protected]052c92702010-06-25 07:25:5293 TestExtensionPrefs prefs_;
[email protected]f4f04592010-07-14 20:40:1394 int next_id_;
[email protected]2e3b5202010-03-23 06:52:4195
96 private:
[email protected]5aeeae12012-07-05 19:13:1197 DISALLOW_COPY_AND_ASSIGN(MenuManagerTest);
[email protected]2e3b5202010-03-23 06:52:4198};
99
100// Tests adding, getting, and removing items.
[email protected]5aeeae12012-07-05 19:13:11101TEST_F(MenuManagerTest, AddGetRemoveItems) {
[email protected]052c92702010-06-25 07:25:52102 Extension* extension = AddExtension("test");
103
[email protected]2e3b5202010-03-23 06:52:41104 // Add a new item, make sure you can get it back.
[email protected]5aeeae12012-07-05 19:13:11105 MenuItem* item1 = CreateTestItem(extension);
[email protected]2e3b5202010-03-23 06:52:41106 ASSERT_TRUE(item1 != NULL);
[email protected]f4f04592010-07-14 20:40:13107 ASSERT_TRUE(manager_.AddContextItem(extension, item1));
108 ASSERT_EQ(item1, manager_.GetItemById(item1->id()));
[email protected]5aeeae12012-07-05 19:13:11109 const MenuItem::List* items = manager_.MenuItems(item1->extension_id());
[email protected]63a414b52010-06-03 23:20:49110 ASSERT_EQ(1u, items->size());
111 ASSERT_EQ(item1, items->at(0));
[email protected]2e3b5202010-03-23 06:52:41112
113 // Add a second item, make sure it comes back too.
[email protected]5aeeae12012-07-05 19:13:11114 MenuItem* item2 = CreateTestItemWithID(extension, "id2");
[email protected]f4f04592010-07-14 20:40:13115 ASSERT_TRUE(manager_.AddContextItem(extension, item2));
116 ASSERT_EQ(item2, manager_.GetItemById(item2->id()));
[email protected]2e3b5202010-03-23 06:52:41117 items = manager_.MenuItems(item2->extension_id());
[email protected]63a414b52010-06-03 23:20:49118 ASSERT_EQ(2u, items->size());
119 ASSERT_EQ(item1, items->at(0));
120 ASSERT_EQ(item2, items->at(1));
[email protected]2e3b5202010-03-23 06:52:41121
122 // Try adding item 3, then removing it.
[email protected]5aeeae12012-07-05 19:13:11123 MenuItem* item3 = CreateTestItem(extension);
124 MenuItem::Id id3 = item3->id();
[email protected]2e3b5202010-03-23 06:52:41125 std::string extension_id = item3->extension_id();
[email protected]f4f04592010-07-14 20:40:13126 ASSERT_TRUE(manager_.AddContextItem(extension, item3));
[email protected]2e3b5202010-03-23 06:52:41127 ASSERT_EQ(item3, manager_.GetItemById(id3));
[email protected]63a414b52010-06-03 23:20:49128 ASSERT_EQ(3u, manager_.MenuItems(extension_id)->size());
[email protected]2e3b5202010-03-23 06:52:41129 ASSERT_TRUE(manager_.RemoveContextMenuItem(id3));
130 ASSERT_EQ(NULL, manager_.GetItemById(id3));
[email protected]63a414b52010-06-03 23:20:49131 ASSERT_EQ(2u, manager_.MenuItems(extension_id)->size());
[email protected]2e3b5202010-03-23 06:52:41132
133 // Make sure removing a non-existent item returns false.
[email protected]5aeeae12012-07-05 19:13:11134 MenuItem::Id id(false, extension->id());
[email protected]619c5dba2012-05-16 00:44:48135 id.uid = id3.uid + 50;
[email protected]f4f04592010-07-14 20:40:13136 ASSERT_FALSE(manager_.RemoveContextMenuItem(id));
[email protected]619c5dba2012-05-16 00:44:48137
138 // Make sure adding an item with the same string ID returns false.
[email protected]5aeeae12012-07-05 19:13:11139 scoped_ptr<MenuItem> item2too(CreateTestItemWithID(extension, "id2"));
[email protected]619c5dba2012-05-16 00:44:48140 ASSERT_FALSE(manager_.AddContextItem(extension, item2too.get()));
141
142 // But the same string ID should not collide with another extension.
143 Extension* extension2 = AddExtension("test2");
[email protected]5aeeae12012-07-05 19:13:11144 MenuItem* item2other = CreateTestItemWithID(extension2, "id2");
[email protected]619c5dba2012-05-16 00:44:48145 ASSERT_TRUE(manager_.AddContextItem(extension2, item2other));
[email protected]2e3b5202010-03-23 06:52:41146}
147
148// Test adding/removing child items.
[email protected]5aeeae12012-07-05 19:13:11149TEST_F(MenuManagerTest, ChildFunctions) {
[email protected]052c92702010-06-25 07:25:52150 Extension* extension1 = AddExtension("1111");
151 Extension* extension2 = AddExtension("2222");
152 Extension* extension3 = AddExtension("3333");
[email protected]2e3b5202010-03-23 06:52:41153
[email protected]5aeeae12012-07-05 19:13:11154 MenuItem* item1 = CreateTestItem(extension1);
155 MenuItem* item2 = CreateTestItem(extension2);
156 MenuItem* item2_child = CreateTestItemWithID(extension2, "2child");
157 MenuItem* item2_grandchild = CreateTestItem(extension2);
[email protected]2e3b5202010-03-23 06:52:41158
159 // This third item we expect to fail inserting, so we use a scoped_ptr to make
160 // sure it gets deleted.
[email protected]5aeeae12012-07-05 19:13:11161 scoped_ptr<MenuItem> item3(CreateTestItem(extension3));
[email protected]2e3b5202010-03-23 06:52:41162
163 // Add in the first two items.
[email protected]f4f04592010-07-14 20:40:13164 ASSERT_TRUE(manager_.AddContextItem(extension1, item1));
165 ASSERT_TRUE(manager_.AddContextItem(extension2, item2));
[email protected]2e3b5202010-03-23 06:52:41166
[email protected]5aeeae12012-07-05 19:13:11167 MenuItem::Id id1 = item1->id();
168 MenuItem::Id id2 = item2->id();
[email protected]2e3b5202010-03-23 06:52:41169
170 // Try adding item3 as a child of item2 - this should fail because item3 has
171 // a different extension id.
[email protected]f4f04592010-07-14 20:40:13172 ASSERT_FALSE(manager_.AddChildItem(id2, item3.get()));
[email protected]2e3b5202010-03-23 06:52:41173
174 // Add item2_child as a child of item2.
[email protected]5aeeae12012-07-05 19:13:11175 MenuItem::Id id2_child = item2_child->id();
[email protected]f4f04592010-07-14 20:40:13176 ASSERT_TRUE(manager_.AddChildItem(id2, item2_child));
[email protected]2e3b5202010-03-23 06:52:41177 ASSERT_EQ(1, item2->child_count());
178 ASSERT_EQ(0, item1->child_count());
179 ASSERT_EQ(item2_child, manager_.GetItemById(id2_child));
180
[email protected]63a414b52010-06-03 23:20:49181 ASSERT_EQ(1u, manager_.MenuItems(item1->extension_id())->size());
182 ASSERT_EQ(item1, manager_.MenuItems(item1->extension_id())->at(0));
[email protected]2e3b5202010-03-23 06:52:41183
184 // Add item2_grandchild as a child of item2_child, then remove it.
[email protected]5aeeae12012-07-05 19:13:11185 MenuItem::Id id2_grandchild = item2_grandchild->id();
[email protected]f4f04592010-07-14 20:40:13186 ASSERT_TRUE(manager_.AddChildItem(id2_child, item2_grandchild));
[email protected]2e3b5202010-03-23 06:52:41187 ASSERT_EQ(1, item2->child_count());
188 ASSERT_EQ(1, item2_child->child_count());
189 ASSERT_TRUE(manager_.RemoveContextMenuItem(id2_grandchild));
190
191 // We should only get 1 thing back when asking for item2's extension id, since
192 // it has a child item.
[email protected]63a414b52010-06-03 23:20:49193 ASSERT_EQ(1u, manager_.MenuItems(item2->extension_id())->size());
194 ASSERT_EQ(item2, manager_.MenuItems(item2->extension_id())->at(0));
[email protected]2e3b5202010-03-23 06:52:41195
196 // Remove child2_item.
197 ASSERT_TRUE(manager_.RemoveContextMenuItem(id2_child));
[email protected]63a414b52010-06-03 23:20:49198 ASSERT_EQ(1u, manager_.MenuItems(item2->extension_id())->size());
199 ASSERT_EQ(item2, manager_.MenuItems(item2->extension_id())->at(0));
[email protected]2e3b5202010-03-23 06:52:41200 ASSERT_EQ(0, item2->child_count());
201}
202
[email protected]8af81c02012-08-14 23:06:15203TEST_F(MenuManagerTest, PopulateFromValue) {
204 Extension* extension = AddExtension("test");
205
206 bool incognito = true;
207 int type = MenuItem::CHECKBOX;
208 std::string title("TITLE");
209 bool checked = true;
210 bool enabled = true;
211 MenuItem::ContextList contexts;
212 contexts.Add(MenuItem::PAGE);
213 contexts.Add(MenuItem::SELECTION);
214 int contexts_value = 0;
215 ASSERT_TRUE(contexts.ToValue()->GetAsInteger(&contexts_value));
216
217 ListValue* document_url_patterns(new ListValue());
218 document_url_patterns->Append(
219 Value::CreateStringValue("http://www.google.com/*"));
220 document_url_patterns->Append(
221 Value::CreateStringValue("http://www.reddit.com/*"));
222
223 ListValue* target_url_patterns(new ListValue());
224 target_url_patterns->Append(
225 Value::CreateStringValue("http://www.yahoo.com/*"));
226 target_url_patterns->Append(
227 Value::CreateStringValue("http://www.facebook.com/*"));
228
229 base::DictionaryValue value;
230 value.SetBoolean("incognito", incognito);
231 value.SetString("string_uid", std::string());
232 value.SetInteger("type", type);
233 value.SetString("title", title);
234 value.SetBoolean("checked", checked);
235 value.SetBoolean("enabled", enabled);
236 value.SetInteger("contexts", contexts_value);
237 value.Set("document_url_patterns", document_url_patterns);
238 value.Set("target_url_patterns", target_url_patterns);
239
240 std::string error;
241 scoped_ptr<MenuItem> item(MenuItem::Populate(extension->id(), value, &error));
242 ASSERT_TRUE(item.get());
243
244 EXPECT_EQ(extension->id(), item->extension_id());
245 EXPECT_EQ(incognito, item->incognito());
246 EXPECT_EQ(title, item->title());
247 EXPECT_EQ(checked, item->checked());
248 EXPECT_EQ(item->checked(), item->checked());
249 EXPECT_EQ(enabled, item->enabled());
250 EXPECT_EQ(contexts, item->contexts());
251
252 URLPatternSet document_url_pattern_set;
253 document_url_pattern_set.Populate(*document_url_patterns,
254 URLPattern::SCHEME_ALL,
255 true,
256 &error);
257 EXPECT_EQ(document_url_pattern_set, item->document_url_patterns());
258
259 URLPatternSet target_url_pattern_set;
260 target_url_pattern_set.Populate(*target_url_patterns,
261 URLPattern::SCHEME_ALL,
262 true,
263 &error);
264 EXPECT_EQ(target_url_pattern_set, item->target_url_patterns());
265}
266
[email protected]2b07c93f2010-08-02 23:13:04267// Tests that deleting a parent properly removes descendants.
[email protected]5aeeae12012-07-05 19:13:11268TEST_F(MenuManagerTest, DeleteParent) {
[email protected]2b07c93f2010-08-02 23:13:04269 Extension* extension = AddExtension("1111");
270
271 // Set up 5 items to add.
[email protected]5aeeae12012-07-05 19:13:11272 MenuItem* item1 = CreateTestItem(extension);
273 MenuItem* item2 = CreateTestItem(extension);
274 MenuItem* item3 = CreateTestItemWithID(extension, "id3");
275 MenuItem* item4 = CreateTestItemWithID(extension, "id4");
276 MenuItem* item5 = CreateTestItem(extension);
277 MenuItem* item6 = CreateTestItem(extension);
278 MenuItem::Id item1_id = item1->id();
279 MenuItem::Id item2_id = item2->id();
280 MenuItem::Id item3_id = item3->id();
281 MenuItem::Id item4_id = item4->id();
282 MenuItem::Id item5_id = item5->id();
283 MenuItem::Id item6_id = item6->id();
[email protected]2b07c93f2010-08-02 23:13:04284
285 // Add the items in the hierarchy
286 // item1 -> item2 -> item3 -> item4 -> item5 -> item6.
287 ASSERT_TRUE(manager_.AddContextItem(extension, item1));
288 ASSERT_TRUE(manager_.AddChildItem(item1_id, item2));
289 ASSERT_TRUE(manager_.AddChildItem(item2_id, item3));
290 ASSERT_TRUE(manager_.AddChildItem(item3_id, item4));
291 ASSERT_TRUE(manager_.AddChildItem(item4_id, item5));
292 ASSERT_TRUE(manager_.AddChildItem(item5_id, item6));
293 ASSERT_EQ(item1, manager_.GetItemById(item1_id));
294 ASSERT_EQ(item2, manager_.GetItemById(item2_id));
295 ASSERT_EQ(item3, manager_.GetItemById(item3_id));
296 ASSERT_EQ(item4, manager_.GetItemById(item4_id));
297 ASSERT_EQ(item5, manager_.GetItemById(item5_id));
298 ASSERT_EQ(item6, manager_.GetItemById(item6_id));
299 ASSERT_EQ(1u, manager_.MenuItems(extension->id())->size());
300 ASSERT_EQ(6u, manager_.items_by_id_.size());
301
302 // Remove item6 (a leaf node).
303 ASSERT_TRUE(manager_.RemoveContextMenuItem(item6_id));
304 ASSERT_EQ(item1, manager_.GetItemById(item1_id));
305 ASSERT_EQ(item2, manager_.GetItemById(item2_id));
306 ASSERT_EQ(item3, manager_.GetItemById(item3_id));
307 ASSERT_EQ(item4, manager_.GetItemById(item4_id));
308 ASSERT_EQ(item5, manager_.GetItemById(item5_id));
309 ASSERT_EQ(NULL, manager_.GetItemById(item6_id));
310 ASSERT_EQ(1u, manager_.MenuItems(extension->id())->size());
311 ASSERT_EQ(5u, manager_.items_by_id_.size());
312
313 // Remove item4 and make sure item5 is gone as well.
314 ASSERT_TRUE(manager_.RemoveContextMenuItem(item4_id));
315 ASSERT_EQ(item1, manager_.GetItemById(item1_id));
316 ASSERT_EQ(item2, manager_.GetItemById(item2_id));
317 ASSERT_EQ(item3, manager_.GetItemById(item3_id));
318 ASSERT_EQ(NULL, manager_.GetItemById(item4_id));
319 ASSERT_EQ(NULL, manager_.GetItemById(item5_id));
320 ASSERT_EQ(1u, manager_.MenuItems(extension->id())->size());
321 ASSERT_EQ(3u, manager_.items_by_id_.size());
322
323 // Now remove item1 and make sure item2 and item3 are gone as well.
324 ASSERT_TRUE(manager_.RemoveContextMenuItem(item1_id));
[email protected]f50da8592010-10-28 23:39:32325 ASSERT_EQ(NULL, manager_.MenuItems(extension->id()));
[email protected]2b07c93f2010-08-02 23:13:04326 ASSERT_EQ(0u, manager_.items_by_id_.size());
327 ASSERT_EQ(NULL, manager_.GetItemById(item1_id));
328 ASSERT_EQ(NULL, manager_.GetItemById(item2_id));
329 ASSERT_EQ(NULL, manager_.GetItemById(item3_id));
330}
331
[email protected]66dbfb2c2010-05-12 20:20:15332// Tests changing parents.
[email protected]5aeeae12012-07-05 19:13:11333TEST_F(MenuManagerTest, ChangeParent) {
[email protected]052c92702010-06-25 07:25:52334 Extension* extension1 = AddExtension("1111");
[email protected]06a0c94e2010-06-24 23:20:15335
[email protected]052c92702010-06-25 07:25:52336 // First create two items and add them both to the manager.
[email protected]5aeeae12012-07-05 19:13:11337 MenuItem* item1 = CreateTestItem(extension1);
338 MenuItem* item2 = CreateTestItem(extension1);
[email protected]052c92702010-06-25 07:25:52339
[email protected]f4f04592010-07-14 20:40:13340 ASSERT_TRUE(manager_.AddContextItem(extension1, item1));
341 ASSERT_TRUE(manager_.AddContextItem(extension1, item2));
[email protected]66dbfb2c2010-05-12 20:20:15342
[email protected]5aeeae12012-07-05 19:13:11343 const MenuItem::List* items = manager_.MenuItems(item1->extension_id());
[email protected]63a414b52010-06-03 23:20:49344 ASSERT_EQ(2u, items->size());
345 ASSERT_EQ(item1, items->at(0));
346 ASSERT_EQ(item2, items->at(1));
[email protected]66dbfb2c2010-05-12 20:20:15347
348 // Now create a third item, initially add it as a child of item1, then move
349 // it to be a child of item2.
[email protected]5aeeae12012-07-05 19:13:11350 MenuItem* item3 = CreateTestItem(extension1);
[email protected]66dbfb2c2010-05-12 20:20:15351
[email protected]f4f04592010-07-14 20:40:13352 ASSERT_TRUE(manager_.AddChildItem(item1->id(), item3));
[email protected]66dbfb2c2010-05-12 20:20:15353 ASSERT_EQ(1, item1->child_count());
[email protected]63a414b52010-06-03 23:20:49354 ASSERT_EQ(item3, item1->children()[0]);
[email protected]66dbfb2c2010-05-12 20:20:15355
[email protected]f4f04592010-07-14 20:40:13356 ASSERT_TRUE(manager_.ChangeParent(item3->id(), &item2->id()));
[email protected]66dbfb2c2010-05-12 20:20:15357 ASSERT_EQ(0, item1->child_count());
358 ASSERT_EQ(1, item2->child_count());
[email protected]63a414b52010-06-03 23:20:49359 ASSERT_EQ(item3, item2->children()[0]);
[email protected]66dbfb2c2010-05-12 20:20:15360
361 // Move item2 to be a child of item1.
[email protected]f4f04592010-07-14 20:40:13362 ASSERT_TRUE(manager_.ChangeParent(item2->id(), &item1->id()));
[email protected]66dbfb2c2010-05-12 20:20:15363 ASSERT_EQ(1, item1->child_count());
[email protected]63a414b52010-06-03 23:20:49364 ASSERT_EQ(item2, item1->children()[0]);
[email protected]66dbfb2c2010-05-12 20:20:15365 ASSERT_EQ(1, item2->child_count());
[email protected]63a414b52010-06-03 23:20:49366 ASSERT_EQ(item3, item2->children()[0]);
[email protected]66dbfb2c2010-05-12 20:20:15367
368 // Since item2 was a top-level item but is no longer, we should only have 1
369 // top-level item.
370 items = manager_.MenuItems(item1->extension_id());
[email protected]63a414b52010-06-03 23:20:49371 ASSERT_EQ(1u, items->size());
372 ASSERT_EQ(item1, items->at(0));
[email protected]66dbfb2c2010-05-12 20:20:15373
374 // Move item3 back to being a child of item1, so it's now a sibling of item2.
[email protected]f4f04592010-07-14 20:40:13375 ASSERT_TRUE(manager_.ChangeParent(item3->id(), &item1->id()));
[email protected]66dbfb2c2010-05-12 20:20:15376 ASSERT_EQ(2, item1->child_count());
[email protected]63a414b52010-06-03 23:20:49377 ASSERT_EQ(item2, item1->children()[0]);
378 ASSERT_EQ(item3, item1->children()[1]);
[email protected]66dbfb2c2010-05-12 20:20:15379
380 // Try switching item3 to be the parent of item1 - this should fail.
[email protected]f4f04592010-07-14 20:40:13381 ASSERT_FALSE(manager_.ChangeParent(item1->id(), &item3->id()));
[email protected]66dbfb2c2010-05-12 20:20:15382 ASSERT_EQ(0, item3->child_count());
383 ASSERT_EQ(2, item1->child_count());
[email protected]63a414b52010-06-03 23:20:49384 ASSERT_EQ(item2, item1->children()[0]);
385 ASSERT_EQ(item3, item1->children()[1]);
[email protected]66dbfb2c2010-05-12 20:20:15386 items = manager_.MenuItems(item1->extension_id());
[email protected]63a414b52010-06-03 23:20:49387 ASSERT_EQ(1u, items->size());
388 ASSERT_EQ(item1, items->at(0));
[email protected]66dbfb2c2010-05-12 20:20:15389
390 // Move item2 to be a top-level item.
[email protected]f4f04592010-07-14 20:40:13391 ASSERT_TRUE(manager_.ChangeParent(item2->id(), NULL));
[email protected]66dbfb2c2010-05-12 20:20:15392 items = manager_.MenuItems(item1->extension_id());
[email protected]63a414b52010-06-03 23:20:49393 ASSERT_EQ(2u, items->size());
394 ASSERT_EQ(item1, items->at(0));
395 ASSERT_EQ(item2, items->at(1));
[email protected]66dbfb2c2010-05-12 20:20:15396 ASSERT_EQ(1, item1->child_count());
[email protected]63a414b52010-06-03 23:20:49397 ASSERT_EQ(item3, item1->children()[0]);
[email protected]66dbfb2c2010-05-12 20:20:15398
399 // Make sure you can't move a node to be a child of another extension's item.
[email protected]052c92702010-06-25 07:25:52400 Extension* extension2 = AddExtension("2222");
[email protected]5aeeae12012-07-05 19:13:11401 MenuItem* item4 = CreateTestItem(extension2);
[email protected]f4f04592010-07-14 20:40:13402 ASSERT_TRUE(manager_.AddContextItem(extension2, item4));
403 ASSERT_FALSE(manager_.ChangeParent(item4->id(), &item1->id()));
404 ASSERT_FALSE(manager_.ChangeParent(item1->id(), &item4->id()));
[email protected]66dbfb2c2010-05-12 20:20:15405
406 // Make sure you can't make an item be it's own parent.
[email protected]f4f04592010-07-14 20:40:13407 ASSERT_FALSE(manager_.ChangeParent(item1->id(), &item1->id()));
[email protected]66dbfb2c2010-05-12 20:20:15408}
409
[email protected]2e3b5202010-03-23 06:52:41410// Tests that we properly remove an extension's menu item when that extension is
411// unloaded.
[email protected]5aeeae12012-07-05 19:13:11412TEST_F(MenuManagerTest, ExtensionUnloadRemovesMenuItems) {
[email protected]ad50def52011-10-19 23:17:07413 content::NotificationService* notifier =
414 content::NotificationService::current();
[email protected]2e3b5202010-03-23 06:52:41415 ASSERT_TRUE(notifier != NULL);
416
417 // Create a test extension.
[email protected]052c92702010-06-25 07:25:52418 Extension* extension1 = AddExtension("1111");
[email protected]2e3b5202010-03-23 06:52:41419
[email protected]5aeeae12012-07-05 19:13:11420 // Create an MenuItem and put it into the manager.
421 MenuItem* item1 = CreateTestItem(extension1);
422 MenuItem::Id id1 = item1->id();
[email protected]052c92702010-06-25 07:25:52423 ASSERT_EQ(extension1->id(), item1->extension_id());
[email protected]f4f04592010-07-14 20:40:13424 ASSERT_TRUE(manager_.AddContextItem(extension1, item1));
[email protected]052c92702010-06-25 07:25:52425 ASSERT_EQ(1u, manager_.MenuItems(extension1->id())->size());
[email protected]2e3b5202010-03-23 06:52:41426
427 // Create a menu item with a different extension id and add it to the manager.
[email protected]052c92702010-06-25 07:25:52428 Extension* extension2 = AddExtension("2222");
[email protected]5aeeae12012-07-05 19:13:11429 MenuItem* item2 = CreateTestItem(extension2);
[email protected]2e3b5202010-03-23 06:52:41430 ASSERT_NE(item1->extension_id(), item2->extension_id());
[email protected]f4f04592010-07-14 20:40:13431 ASSERT_TRUE(manager_.AddContextItem(extension2, item2));
[email protected]2e3b5202010-03-23 06:52:41432
433 // Notify that the extension was unloaded, and make sure the right item is
434 // gone.
[email protected]5aeeae12012-07-05 19:13:11435 UnloadedExtensionInfo details(
[email protected]814a7bf0f2011-08-13 05:30:59436 extension1, extension_misc::UNLOAD_REASON_DISABLE);
[email protected]432115822011-07-10 15:52:27437 notifier->Notify(chrome::NOTIFICATION_EXTENSION_UNLOADED,
[email protected]6c2381d2011-10-19 02:52:53438 content::Source<Profile>(&profile_),
[email protected]5aeeae12012-07-05 19:13:11439 content::Details<UnloadedExtensionInfo>(
[email protected]1c321ee2012-05-21 03:02:34440 &details));
[email protected]052c92702010-06-25 07:25:52441 ASSERT_EQ(NULL, manager_.MenuItems(extension1->id()));
442 ASSERT_EQ(1u, manager_.MenuItems(extension2->id())->size());
[email protected]2e3b5202010-03-23 06:52:41443 ASSERT_TRUE(manager_.GetItemById(id1) == NULL);
[email protected]f4f04592010-07-14 20:40:13444 ASSERT_TRUE(manager_.GetItemById(item2->id()) != NULL);
[email protected]2e3b5202010-03-23 06:52:41445}
446
[email protected]5aeeae12012-07-05 19:13:11447// A mock message service for tests of MenuManager::ExecuteCommand.
[email protected]5a38dfd2012-07-23 23:22:10448class MockEventRouter : public EventRouter {
[email protected]2e3b5202010-03-23 06:52:41449 public:
[email protected]79cb81bb2012-09-20 02:23:31450 explicit MockEventRouter(Profile* profile) : EventRouter(profile, NULL) {}
[email protected]2e3b5202010-03-23 06:52:41451
[email protected]c9bd90f2012-08-07 23:58:15452 MOCK_METHOD6(DispatchEventToExtensionMock,
[email protected]b085856f2012-03-02 04:37:25453 void(const std::string& extension_id,
454 const std::string& event_name,
[email protected]c9bd90f2012-08-07 23:58:15455 base::ListValue* event_args,
[email protected]b085856f2012-03-02 04:37:25456 Profile* source_profile,
457 const GURL& event_url,
[email protected]5a38dfd2012-07-23 23:22:10458 EventRouter::UserGestureState state));
[email protected]f72d0c62011-08-31 16:27:44459
[email protected]c9bd90f2012-08-07 23:58:15460 virtual void DispatchEventToExtension(const std::string& extension_id,
[email protected]01f7a8042012-12-07 07:48:02461 scoped_ptr<Event> event) {
462 DispatchEventToExtensionMock(extension_id,
463 event->event_name,
464 event->event_args.release(),
465 event->restrict_to_profile,
466 event->event_url,
467 event->user_gesture);
[email protected]c9bd90f2012-08-07 23:58:15468 }
[email protected]2e3b5202010-03-23 06:52:41469
470 private:
[email protected]5a38dfd2012-07-23 23:22:10471 DISALLOW_COPY_AND_ASSIGN(MockEventRouter);
[email protected]2e3b5202010-03-23 06:52:41472};
473
[email protected]9e5be1f92012-10-29 19:01:45474// A mock ExtensionSystem to serve our MockEventRouter.
475class MockExtensionSystem : public TestExtensionSystem {
[email protected]2e3b5202010-03-23 06:52:41476 public:
[email protected]9e5be1f92012-10-29 19:01:45477 explicit MockExtensionSystem(Profile* profile)
478 : TestExtensionSystem(profile) {}
479
[email protected]49aeab62013-02-07 02:53:11480 virtual EventRouter* event_router() OVERRIDE {
[email protected]3eeddd892013-04-17 17:00:11481 if (!mock_event_router_)
[email protected]9e5be1f92012-10-29 19:01:45482 mock_event_router_.reset(new MockEventRouter(profile_));
483 return mock_event_router_.get();
484 }
[email protected]2e3b5202010-03-23 06:52:41485
486 private:
[email protected]9e5be1f92012-10-29 19:01:45487 scoped_ptr<MockEventRouter> mock_event_router_;
488
489 DISALLOW_COPY_AND_ASSIGN(MockExtensionSystem);
[email protected]2e3b5202010-03-23 06:52:41490};
491
[email protected]f1484c52013-05-22 23:25:44492BrowserContextKeyedService* BuildMockExtensionSystem(
[email protected]c7fa4362013-04-26 18:09:02493 content::BrowserContext* profile) {
494 return new MockExtensionSystem(static_cast<Profile*>(profile));
[email protected]9e5be1f92012-10-29 19:01:45495}
496
[email protected]66dbfb2c2010-05-12 20:20:15497// Tests the RemoveAll functionality.
[email protected]5aeeae12012-07-05 19:13:11498TEST_F(MenuManagerTest, RemoveAll) {
[email protected]66dbfb2c2010-05-12 20:20:15499 // Try removing all items for an extension id that doesn't have any items.
500 manager_.RemoveAllContextItems("CCCC");
501
[email protected]052c92702010-06-25 07:25:52502 // Add 2 top-level and one child item for extension 1.
503 Extension* extension1 = AddExtension("1111");
[email protected]5aeeae12012-07-05 19:13:11504 MenuItem* item1 = CreateTestItem(extension1);
505 MenuItem* item2 = CreateTestItem(extension1);
506 MenuItem* item3 = CreateTestItem(extension1);
[email protected]f4f04592010-07-14 20:40:13507 ASSERT_TRUE(manager_.AddContextItem(extension1, item1));
508 ASSERT_TRUE(manager_.AddContextItem(extension1, item2));
509 ASSERT_TRUE(manager_.AddChildItem(item1->id(), item3));
[email protected]66dbfb2c2010-05-12 20:20:15510
[email protected]052c92702010-06-25 07:25:52511 // Add one top-level item for extension 2.
512 Extension* extension2 = AddExtension("2222");
[email protected]5aeeae12012-07-05 19:13:11513 MenuItem* item4 = CreateTestItem(extension2);
[email protected]f4f04592010-07-14 20:40:13514 ASSERT_TRUE(manager_.AddContextItem(extension2, item4));
[email protected]66dbfb2c2010-05-12 20:20:15515
[email protected]052c92702010-06-25 07:25:52516 EXPECT_EQ(2u, manager_.MenuItems(extension1->id())->size());
517 EXPECT_EQ(1u, manager_.MenuItems(extension2->id())->size());
[email protected]66dbfb2c2010-05-12 20:20:15518
[email protected]052c92702010-06-25 07:25:52519 // Remove extension2's item.
520 manager_.RemoveAllContextItems(extension2->id());
521 EXPECT_EQ(2u, manager_.MenuItems(extension1->id())->size());
522 EXPECT_EQ(NULL, manager_.MenuItems(extension2->id()));
[email protected]66dbfb2c2010-05-12 20:20:15523
[email protected]052c92702010-06-25 07:25:52524 // Remove extension1's items.
525 manager_.RemoveAllContextItems(extension1->id());
526 EXPECT_EQ(NULL, manager_.MenuItems(extension1->id()));
[email protected]66dbfb2c2010-05-12 20:20:15527}
528
[email protected]f50da8592010-10-28 23:39:32529// Tests that removing all items one-by-one doesn't leave an entry around.
[email protected]5aeeae12012-07-05 19:13:11530TEST_F(MenuManagerTest, RemoveOneByOne) {
[email protected]f50da8592010-10-28 23:39:32531 // Add 2 test items.
532 Extension* extension1 = AddExtension("1111");
[email protected]5aeeae12012-07-05 19:13:11533 MenuItem* item1 = CreateTestItem(extension1);
534 MenuItem* item2 = CreateTestItem(extension1);
535 MenuItem* item3 = CreateTestItemWithID(extension1, "id3");
[email protected]f50da8592010-10-28 23:39:32536 ASSERT_TRUE(manager_.AddContextItem(extension1, item1));
537 ASSERT_TRUE(manager_.AddContextItem(extension1, item2));
[email protected]619c5dba2012-05-16 00:44:48538 ASSERT_TRUE(manager_.AddContextItem(extension1, item3));
[email protected]f50da8592010-10-28 23:39:32539
540 ASSERT_FALSE(manager_.context_items_.empty());
541
[email protected]619c5dba2012-05-16 00:44:48542 manager_.RemoveContextMenuItem(item3->id());
[email protected]f50da8592010-10-28 23:39:32543 manager_.RemoveContextMenuItem(item1->id());
544 manager_.RemoveContextMenuItem(item2->id());
545
546 ASSERT_TRUE(manager_.context_items_.empty());
547}
548
[email protected]5aeeae12012-07-05 19:13:11549TEST_F(MenuManagerTest, ExecuteCommand) {
[email protected]9e5be1f92012-10-29 19:01:45550 TestingProfile profile;
[email protected]2e3b5202010-03-23 06:52:41551
[email protected]9e5be1f92012-10-29 19:01:45552 MockExtensionSystem* mock_extension_system =
553 static_cast<MockExtensionSystem*>(ExtensionSystemFactory::GetInstance()->
554 SetTestingFactoryAndUse(&profile, &BuildMockExtensionSystem));
555 MockEventRouter* mock_event_router =
556 static_cast<MockEventRouter*>(mock_extension_system->event_router());
[email protected]2e3b5202010-03-23 06:52:41557
[email protected]35be7ec2012-02-12 20:42:51558 content::ContextMenuParams params;
[email protected]2e3b5202010-03-23 06:52:41559 params.media_type = WebKit::WebContextMenuData::MediaTypeImage;
560 params.src_url = GURL("http://foo.bar/image.png");
561 params.page_url = GURL("http://foo.bar");
[email protected]944b4212010-12-14 00:00:33562 params.selection_text = ASCIIToUTF16("Hello World");
[email protected]2e3b5202010-03-23 06:52:41563 params.is_editable = false;
564
[email protected]052c92702010-06-25 07:25:52565 Extension* extension = AddExtension("test");
[email protected]504bf9c2012-12-13 01:51:20566 MenuItem* parent = CreateTestItem(extension);
[email protected]5aeeae12012-07-05 19:13:11567 MenuItem* item = CreateTestItem(extension);
[email protected]504bf9c2012-12-13 01:51:20568 MenuItem::Id parent_id = parent->id();
[email protected]5aeeae12012-07-05 19:13:11569 MenuItem::Id id = item->id();
[email protected]504bf9c2012-12-13 01:51:20570 ASSERT_TRUE(manager_.AddContextItem(extension, parent));
571 ASSERT_TRUE(manager_.AddChildItem(parent->id(), item));
[email protected]2e3b5202010-03-23 06:52:41572
[email protected]2e3b5202010-03-23 06:52:41573 // Use the magic of googlemock to save a parameter to our mock's
[email protected]0a184b52011-06-23 00:41:13574 // DispatchEventToExtension method into event_args.
[email protected]c9bd90f2012-08-07 23:58:15575 base::ListValue* list = NULL;
[email protected]bc4ae152012-06-01 22:23:34576 {
577 InSequence s;
[email protected]9e5be1f92012-10-29 19:01:45578 EXPECT_CALL(*mock_event_router,
[email protected]c9bd90f2012-08-07 23:58:15579 DispatchEventToExtensionMock(
[email protected]bc4ae152012-06-01 22:23:34580 item->extension_id(),
[email protected]c9bd90f2012-08-07 23:58:15581 extensions::event_names::kOnContextMenus,
582 _,
583 &profile,
584 GURL(),
585 EventRouter::USER_GESTURE_ENABLED))
[email protected]2e3b5202010-03-23 06:52:41586 .Times(1)
[email protected]c9bd90f2012-08-07 23:58:15587 .WillOnce(SaveArg<2>(&list));
[email protected]9e5be1f92012-10-29 19:01:45588 EXPECT_CALL(*mock_event_router,
[email protected]c9bd90f2012-08-07 23:58:15589 DispatchEventToExtensionMock(
[email protected]bc4ae152012-06-01 22:23:34590 item->extension_id(),
[email protected]5a38dfd2012-07-23 23:22:10591 extensions::event_names::kOnContextMenuClicked,
[email protected]bc4ae152012-06-01 22:23:34592 _,
593 &profile,
594 GURL(),
[email protected]5a38dfd2012-07-23 23:22:10595 EventRouter::USER_GESTURE_ENABLED))
[email protected]c9bd90f2012-08-07 23:58:15596 .Times(1)
597 .WillOnce(DeleteArg<2>());
[email protected]bc4ae152012-06-01 22:23:34598 }
[email protected]9531f742012-12-11 22:02:40599 manager_.ExecuteCommand(&profile, NULL /* web_contents */, params, id);
[email protected]2e3b5202010-03-23 06:52:41600
[email protected]2e3b5202010-03-23 06:52:41601 ASSERT_EQ(2u, list->GetSize());
602
603 DictionaryValue* info;
604 ASSERT_TRUE(list->GetDictionary(0, &info));
605
606 int tmp_id = 0;
[email protected]88dc0692010-08-14 16:29:42607 ASSERT_TRUE(info->GetInteger("menuItemId", &tmp_id));
[email protected]5a7b5eaf2010-11-02 20:52:19608 ASSERT_EQ(id.uid, tmp_id);
[email protected]504bf9c2012-12-13 01:51:20609 ASSERT_TRUE(info->GetInteger("parentMenuItemId", &tmp_id));
610 ASSERT_EQ(parent_id.uid, tmp_id);
[email protected]2e3b5202010-03-23 06:52:41611
612 std::string tmp;
[email protected]88dc0692010-08-14 16:29:42613 ASSERT_TRUE(info->GetString("mediaType", &tmp));
[email protected]1741b972010-08-04 23:47:41614 ASSERT_EQ("image", tmp);
[email protected]88dc0692010-08-14 16:29:42615 ASSERT_TRUE(info->GetString("srcUrl", &tmp));
[email protected]2e3b5202010-03-23 06:52:41616 ASSERT_EQ(params.src_url.spec(), tmp);
[email protected]88dc0692010-08-14 16:29:42617 ASSERT_TRUE(info->GetString("pageUrl", &tmp));
[email protected]2e3b5202010-03-23 06:52:41618 ASSERT_EQ(params.page_url.spec(), tmp);
619
[email protected]944b4212010-12-14 00:00:33620 string16 tmp16;
621 ASSERT_TRUE(info->GetString("selectionText", &tmp16));
622 ASSERT_EQ(params.selection_text, tmp16);
[email protected]2e3b5202010-03-23 06:52:41623
624 bool bool_tmp = true;
[email protected]88dc0692010-08-14 16:29:42625 ASSERT_TRUE(info->GetBoolean("editable", &bool_tmp));
[email protected]2e3b5202010-03-23 06:52:41626 ASSERT_EQ(params.is_editable, bool_tmp);
[email protected]c9bd90f2012-08-07 23:58:15627
628 delete list;
[email protected]2e3b5202010-03-23 06:52:41629}
[email protected]7dddebc32012-01-11 22:01:03630
631// Test that there is always only one radio item selected.
[email protected]5aeeae12012-07-05 19:13:11632TEST_F(MenuManagerTest, SanitizeRadioButtons) {
[email protected]7dddebc32012-01-11 22:01:03633 Extension* extension = AddExtension("test");
634
635 // A single unchecked item should get checked
[email protected]5aeeae12012-07-05 19:13:11636 MenuItem* item1 = CreateTestItem(extension);
[email protected]7dddebc32012-01-11 22:01:03637
[email protected]5aeeae12012-07-05 19:13:11638 item1->set_type(MenuItem::RADIO);
[email protected]7dddebc32012-01-11 22:01:03639 item1->SetChecked(false);
640 ASSERT_FALSE(item1->checked());
641 manager_.AddContextItem(extension, item1);
642 ASSERT_TRUE(item1->checked());
643
644 // In a run of two unchecked items, the first should get selected.
645 item1->SetChecked(false);
[email protected]5aeeae12012-07-05 19:13:11646 MenuItem* item2 = CreateTestItem(extension);
647 item2->set_type(MenuItem::RADIO);
[email protected]7dddebc32012-01-11 22:01:03648 item2->SetChecked(false);
649 ASSERT_FALSE(item1->checked());
650 ASSERT_FALSE(item2->checked());
651 manager_.AddContextItem(extension, item2);
652 ASSERT_TRUE(item1->checked());
653 ASSERT_FALSE(item2->checked());
654
655 // If multiple items are checked, only the last item should get checked.
656 item1->SetChecked(true);
657 item2->SetChecked(true);
658 ASSERT_TRUE(item1->checked());
659 ASSERT_TRUE(item2->checked());
660 manager_.ItemUpdated(item1->id());
661 ASSERT_FALSE(item1->checked());
662 ASSERT_TRUE(item2->checked());
663
664 // If the checked item is removed, the new first item should get checked.
665 item1->SetChecked(false);
666 item2->SetChecked(true);
667 ASSERT_FALSE(item1->checked());
668 ASSERT_TRUE(item2->checked());
669 manager_.RemoveContextMenuItem(item2->id());
670 item2 = NULL;
671 ASSERT_TRUE(item1->checked());
672
673 // If a checked item is added to a run that already has a checked item,
674 // then the new item should get checked.
675 item1->SetChecked(true);
[email protected]5aeeae12012-07-05 19:13:11676 MenuItem* new_item = CreateTestItem(extension);
677 new_item->set_type(MenuItem::RADIO);
[email protected]7dddebc32012-01-11 22:01:03678 new_item->SetChecked(true);
679 ASSERT_TRUE(item1->checked());
680 ASSERT_TRUE(new_item->checked());
681 manager_.AddContextItem(extension, new_item);
682 ASSERT_FALSE(item1->checked());
683 ASSERT_TRUE(new_item->checked());
684 // Make sure that children are checked as well.
[email protected]5aeeae12012-07-05 19:13:11685 MenuItem* parent = CreateTestItem(extension);
[email protected]7dddebc32012-01-11 22:01:03686 manager_.AddContextItem(extension, parent);
[email protected]5aeeae12012-07-05 19:13:11687 MenuItem* child1 = CreateTestItem(extension);
688 child1->set_type(MenuItem::RADIO);
[email protected]7dddebc32012-01-11 22:01:03689 child1->SetChecked(false);
[email protected]5aeeae12012-07-05 19:13:11690 MenuItem* child2 = CreateTestItem(extension);
691 child2->set_type(MenuItem::RADIO);
[email protected]7dddebc32012-01-11 22:01:03692 child2->SetChecked(true);
693 ASSERT_FALSE(child1->checked());
694 ASSERT_TRUE(child2->checked());
695
696 manager_.AddChildItem(parent->id(), child1);
697 ASSERT_TRUE(child1->checked());
698
699 manager_.AddChildItem(parent->id(), child2);
700 ASSERT_FALSE(child1->checked());
701 ASSERT_TRUE(child2->checked());
702
703 // Removing the checked item from the children should cause the
704 // remaining child to be checked.
705 manager_.RemoveContextMenuItem(child2->id());
706 child2 = NULL;
707 ASSERT_TRUE(child1->checked());
708
709 // This should NOT cause |new_item| to be deseleted because
710 // |parent| will be seperating the two runs of radio items.
711 manager_.ChangeParent(child1->id(), NULL);
712 ASSERT_TRUE(new_item->checked());
713 ASSERT_TRUE(child1->checked());
714
715 // Removing |parent| should cause only |child1| to be selected.
716 manager_.RemoveContextMenuItem(parent->id());
717 parent = NULL;
718 ASSERT_FALSE(new_item->checked());
719 ASSERT_TRUE(child1->checked());
720}
[email protected]5aeeae12012-07-05 19:13:11721
[email protected]63503462012-10-30 22:14:31722// Tests the RemoveAllIncognitoContextItems functionality.
723TEST_F(MenuManagerTest, RemoveAllIncognito) {
724 Extension* extension1 = AddExtension("1111");
725 // Add 2 top-level and one child item for extension 1
726 // with incognito 'true'.
727 MenuItem* item1 = CreateTestItem(extension1, true);
728 MenuItem* item2 = CreateTestItem(extension1, true);
729 MenuItem* item3 = CreateTestItem(extension1, true);
730 ASSERT_TRUE(manager_.AddContextItem(extension1, item1));
731 ASSERT_TRUE(manager_.AddContextItem(extension1, item2));
732 ASSERT_TRUE(manager_.AddChildItem(item1->id(), item3));
733
734 // Add 2 top-level and one child item for extension 1
735 // with incognito 'false'.
736 MenuItem* item4 = CreateTestItem(extension1);
737 MenuItem* item5 = CreateTestItem(extension1);
738 MenuItem* item6 = CreateTestItem(extension1);
739 ASSERT_TRUE(manager_.AddContextItem(extension1, item4));
740 ASSERT_TRUE(manager_.AddContextItem(extension1, item5));
741 ASSERT_TRUE(manager_.AddChildItem(item4->id(), item6));
742
743 // Add one top-level item for extension 2.
744 Extension* extension2 = AddExtension("2222");
745 MenuItem* item7 = CreateTestItem(extension2);
746 ASSERT_TRUE(manager_.AddContextItem(extension2, item7));
747
748 EXPECT_EQ(4u, manager_.MenuItems(extension1->id())->size());
749 EXPECT_EQ(1u, manager_.MenuItems(extension2->id())->size());
750
751 // Remove all context menu items with incognito true.
752 manager_.RemoveAllIncognitoContextItems();
753 EXPECT_EQ(2u, manager_.MenuItems(extension1->id())->size());
754 EXPECT_EQ(1u, manager_.MenuItems(extension2->id())->size());
755}
756
[email protected]5aeeae12012-07-05 19:13:11757} // namespace extensions