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
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/json/json_reader.h"
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_temp_dir.h"
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_vector.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/path_service.h"
1121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/utf_string_conversions.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/values.h"
13731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/extensions/extension_event_router.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_menu_manager.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/test_extension_prefs.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_paths.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension_constants.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/testing_profile.h"
20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h"
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gmock/include/gmock/gmock.h"
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "testing/gtest/include/gtest/gtest.h"
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/glue/context_menu.h"
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::_;
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::AtLeast;
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::Return;
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::SaveArg;
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Base class for tests.
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ExtensionMenuManagerTest : public testing::Test {
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ExtensionMenuManagerTest()
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      : ui_thread_(BrowserThread::UI, &message_loop_),
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        file_thread_(BrowserThread::FILE, &message_loop_),
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        next_id_(1) {
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns a test item.
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuItem* CreateTestItem(Extension* extension) {
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ExtensionMenuItem::Type type = ExtensionMenuItem::NORMAL;
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ExtensionMenuItem::ContextList contexts(ExtensionMenuItem::ALL);
44513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ExtensionMenuItem::Id id(NULL, extension->id(), next_id_++);
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return new ExtensionMenuItem(id, "test", false, type, contexts);
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates and returns a test Extension. The caller does *not* own the return
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // value.
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Extension* AddExtension(std::string name) {
51513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    scoped_refptr<Extension> extension = prefs_.AddExtension(name);
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    extensions_.push_back(extension);
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return extension;
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MessageLoopForUI message_loop_;
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  BrowserThread ui_thread_;
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  BrowserThread file_thread_;
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuManager manager_;
62513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ExtensionList extensions_;
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestExtensionPrefs prefs_;
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int next_id_;
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ExtensionMenuManagerTest);
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests adding, getting, and removing items.
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(ExtensionMenuManagerTest, AddGetRemoveItems) {
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Extension* extension = AddExtension("test");
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add a new item, make sure you can get it back.
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuItem* item1 = CreateTestItem(extension);
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(item1 != NULL);
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.AddContextItem(extension, item1));
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(item1, manager_.GetItemById(item1->id()));
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const ExtensionMenuItem::List* items =
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      manager_.MenuItems(item1->extension_id());
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1u, items->size());
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(item1, items->at(0));
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add a second item, make sure it comes back too.
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuItem* item2 = CreateTestItem(extension);
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.AddContextItem(extension, item2));
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(item2, manager_.GetItemById(item2->id()));
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  items = manager_.MenuItems(item2->extension_id());
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(2u, items->size());
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(item1, items->at(0));
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(item2, items->at(1));
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Try adding item 3, then removing it.
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuItem* item3 = CreateTestItem(extension);
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuItem::Id id3 = item3->id();
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string extension_id = item3->extension_id();
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.AddContextItem(extension, item3));
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(item3, manager_.GetItemById(id3));
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(3u, manager_.MenuItems(extension_id)->size());
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.RemoveContextMenuItem(id3));
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(NULL, manager_.GetItemById(id3));
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(2u, manager_.MenuItems(extension_id)->size());
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure removing a non-existent item returns false.
105513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ExtensionMenuItem::Id id(NULL, extension->id(), id3.uid + 50);
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_FALSE(manager_.RemoveContextMenuItem(id));
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test adding/removing child items.
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(ExtensionMenuManagerTest, ChildFunctions) {
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Extension* extension1 = AddExtension("1111");
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Extension* extension2 = AddExtension("2222");
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Extension* extension3 = AddExtension("3333");
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuItem* item1 = CreateTestItem(extension1);
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuItem* item2 = CreateTestItem(extension2);
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuItem* item2_child = CreateTestItem(extension2);
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuItem* item2_grandchild = CreateTestItem(extension2);
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This third item we expect to fail inserting, so we use a scoped_ptr to make
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // sure it gets deleted.
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<ExtensionMenuItem> item3(CreateTestItem(extension3));
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add in the first two items.
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.AddContextItem(extension1, item1));
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.AddContextItem(extension2, item2));
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuItem::Id id1 = item1->id();
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuItem::Id id2 = item2->id();
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Try adding item3 as a child of item2 - this should fail because item3 has
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // a different extension id.
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_FALSE(manager_.AddChildItem(id2, item3.get()));
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add item2_child as a child of item2.
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuItem::Id id2_child = item2_child->id();
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.AddChildItem(id2, item2_child));
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1, item2->child_count());
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(0, item1->child_count());
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(item2_child, manager_.GetItemById(id2_child));
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1u, manager_.MenuItems(item1->extension_id())->size());
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(item1, manager_.MenuItems(item1->extension_id())->at(0));
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add item2_grandchild as a child of item2_child, then remove it.
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuItem::Id id2_grandchild = item2_grandchild->id();
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.AddChildItem(id2_child, item2_grandchild));
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1, item2->child_count());
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1, item2_child->child_count());
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.RemoveContextMenuItem(id2_grandchild));
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We should only get 1 thing back when asking for item2's extension id, since
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // it has a child item.
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1u, manager_.MenuItems(item2->extension_id())->size());
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(item2, manager_.MenuItems(item2->extension_id())->at(0));
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Remove child2_item.
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.RemoveContextMenuItem(id2_child));
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1u, manager_.MenuItems(item2->extension_id())->size());
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(item2, manager_.MenuItems(item2->extension_id())->at(0));
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(0, item2->child_count());
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Tests that deleting a parent properly removes descendants.
1653345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(ExtensionMenuManagerTest, DeleteParent) {
1663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Extension* extension = AddExtension("1111");
1673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Set up 5 items to add.
1693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ExtensionMenuItem* item1 = CreateTestItem(extension);
1703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ExtensionMenuItem* item2 = CreateTestItem(extension);
1713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ExtensionMenuItem* item3 = CreateTestItem(extension);
1723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ExtensionMenuItem* item4 = CreateTestItem(extension);
1733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ExtensionMenuItem* item5 = CreateTestItem(extension);
1743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ExtensionMenuItem* item6 = CreateTestItem(extension);
1753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ExtensionMenuItem::Id item1_id = item1->id();
1763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ExtensionMenuItem::Id item2_id = item2->id();
1773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ExtensionMenuItem::Id item3_id = item3->id();
1783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ExtensionMenuItem::Id item4_id = item4->id();
1793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ExtensionMenuItem::Id item5_id = item5->id();
1803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ExtensionMenuItem::Id item6_id = item6->id();
1813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Add the items in the hierarchy
1833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // item1 -> item2 -> item3 -> item4 -> item5 -> item6.
1843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(manager_.AddContextItem(extension, item1));
1853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(manager_.AddChildItem(item1_id, item2));
1863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(manager_.AddChildItem(item2_id, item3));
1873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(manager_.AddChildItem(item3_id, item4));
1883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(manager_.AddChildItem(item4_id, item5));
1893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(manager_.AddChildItem(item5_id, item6));
1903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(item1, manager_.GetItemById(item1_id));
1913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(item2, manager_.GetItemById(item2_id));
1923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(item3, manager_.GetItemById(item3_id));
1933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(item4, manager_.GetItemById(item4_id));
1943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(item5, manager_.GetItemById(item5_id));
1953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(item6, manager_.GetItemById(item6_id));
1963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(1u, manager_.MenuItems(extension->id())->size());
1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(6u, manager_.items_by_id_.size());
1983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Remove item6 (a leaf node).
2003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(manager_.RemoveContextMenuItem(item6_id));
2013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(item1, manager_.GetItemById(item1_id));
2023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(item2, manager_.GetItemById(item2_id));
2033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(item3, manager_.GetItemById(item3_id));
2043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(item4, manager_.GetItemById(item4_id));
2053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(item5, manager_.GetItemById(item5_id));
2063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(NULL, manager_.GetItemById(item6_id));
2073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(1u, manager_.MenuItems(extension->id())->size());
2083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(5u, manager_.items_by_id_.size());
2093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Remove item4 and make sure item5 is gone as well.
2113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(manager_.RemoveContextMenuItem(item4_id));
2123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(item1, manager_.GetItemById(item1_id));
2133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(item2, manager_.GetItemById(item2_id));
2143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(item3, manager_.GetItemById(item3_id));
2153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(NULL, manager_.GetItemById(item4_id));
2163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(NULL, manager_.GetItemById(item5_id));
2173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(1u, manager_.MenuItems(extension->id())->size());
2183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(3u, manager_.items_by_id_.size());
2193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Now remove item1 and make sure item2 and item3 are gone as well.
2213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(manager_.RemoveContextMenuItem(item1_id));
222513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_EQ(NULL, manager_.MenuItems(extension->id()));
2233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(0u, manager_.items_by_id_.size());
2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(NULL, manager_.GetItemById(item1_id));
2253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(NULL, manager_.GetItemById(item2_id));
2263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(NULL, manager_.GetItemById(item3_id));
2273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests changing parents.
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(ExtensionMenuManagerTest, ChangeParent) {
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Extension* extension1 = AddExtension("1111");
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First create two items and add them both to the manager.
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuItem* item1 = CreateTestItem(extension1);
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuItem* item2 = CreateTestItem(extension1);
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.AddContextItem(extension1, item1));
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.AddContextItem(extension1, item2));
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const ExtensionMenuItem::List* items =
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      manager_.MenuItems(item1->extension_id());
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(2u, items->size());
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(item1, items->at(0));
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(item2, items->at(1));
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now create a third item, initially add it as a child of item1, then move
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // it to be a child of item2.
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuItem* item3 = CreateTestItem(extension1);
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.AddChildItem(item1->id(), item3));
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1, item1->child_count());
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(item3, item1->children()[0]);
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.ChangeParent(item3->id(), &item2->id()));
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(0, item1->child_count());
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1, item2->child_count());
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(item3, item2->children()[0]);
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Move item2 to be a child of item1.
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.ChangeParent(item2->id(), &item1->id()));
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1, item1->child_count());
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(item2, item1->children()[0]);
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1, item2->child_count());
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(item3, item2->children()[0]);
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Since item2 was a top-level item but is no longer, we should only have 1
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // top-level item.
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  items = manager_.MenuItems(item1->extension_id());
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1u, items->size());
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(item1, items->at(0));
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Move item3 back to being a child of item1, so it's now a sibling of item2.
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.ChangeParent(item3->id(), &item1->id()));
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(2, item1->child_count());
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(item2, item1->children()[0]);
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(item3, item1->children()[1]);
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Try switching item3 to be the parent of item1 - this should fail.
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_FALSE(manager_.ChangeParent(item1->id(), &item3->id()));
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(0, item3->child_count());
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(2, item1->child_count());
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(item2, item1->children()[0]);
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(item3, item1->children()[1]);
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  items = manager_.MenuItems(item1->extension_id());
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1u, items->size());
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(item1, items->at(0));
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Move item2 to be a top-level item.
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.ChangeParent(item2->id(), NULL));
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  items = manager_.MenuItems(item1->extension_id());
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(2u, items->size());
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(item1, items->at(0));
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(item2, items->at(1));
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1, item1->child_count());
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(item3, item1->children()[0]);
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure you can't move a node to be a child of another extension's item.
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Extension* extension2 = AddExtension("2222");
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuItem* item4 = CreateTestItem(extension2);
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.AddContextItem(extension2, item4));
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_FALSE(manager_.ChangeParent(item4->id(), &item1->id()));
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_FALSE(manager_.ChangeParent(item1->id(), &item4->id()));
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure you can't make an item be it's own parent.
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_FALSE(manager_.ChangeParent(item1->id(), &item1->id()));
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that we properly remove an extension's menu item when that extension is
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// unloaded.
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(ExtensionMenuManagerTest, ExtensionUnloadRemovesMenuItems) {
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationService* notifier = NotificationService::current();
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(notifier != NULL);
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a test extension.
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Extension* extension1 = AddExtension("1111");
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create an ExtensionMenuItem and put it into the manager.
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuItem* item1 = CreateTestItem(extension1);
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuItem::Id id1 = item1->id();
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(extension1->id(), item1->extension_id());
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.AddContextItem(extension1, item1));
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1u, manager_.MenuItems(extension1->id())->size());
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a menu item with a different extension id and add it to the manager.
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Extension* extension2 = AddExtension("2222");
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuItem* item2 = CreateTestItem(extension2);
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_NE(item1->extension_id(), item2->extension_id());
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.AddContextItem(extension2, item2));
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Notify that the extension was unloaded, and make sure the right item is
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // gone.
33221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  UnloadedExtensionInfo details(extension1, UnloadedExtensionInfo::DISABLE);
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  notifier->Notify(NotificationType::EXTENSION_UNLOADED,
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   Source<Profile>(NULL),
33521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                   Details<UnloadedExtensionInfo>(&details));
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(NULL, manager_.MenuItems(extension1->id()));
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1u, manager_.MenuItems(extension2->id())->size());
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.GetItemById(id1) == NULL);
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.GetItemById(item2->id()) != NULL);
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A mock message service for tests of ExtensionMenuManager::ExecuteCommand.
343731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass MockExtensionEventRouter : public ExtensionEventRouter {
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
345731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  explicit MockExtensionEventRouter(Profile* profile) :
346731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      ExtensionEventRouter(profile) {}
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
348731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MOCK_METHOD5(DispatchEventImpl, void(const std::string& extension_id,
349731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                       const std::string& event_name,
350731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                       const std::string& event_args,
351731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                       Profile* source_profile,
352731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                       const GURL& event_url));
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
355731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DISALLOW_COPY_AND_ASSIGN(MockExtensionEventRouter);
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A mock profile for tests of ExtensionMenuManager::ExecuteCommand.
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MockTestingProfile : public TestingProfile {
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockTestingProfile() {}
362731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MOCK_METHOD0(GetExtensionEventRouter, ExtensionEventRouter*());
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD0(IsOffTheRecord, bool());
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(MockTestingProfile);
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests the RemoveAll functionality.
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(ExtensionMenuManagerTest, RemoveAll) {
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Try removing all items for an extension id that doesn't have any items.
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  manager_.RemoveAllContextItems("CCCC");
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add 2 top-level and one child item for extension 1.
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Extension* extension1 = AddExtension("1111");
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuItem* item1 = CreateTestItem(extension1);
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuItem* item2 = CreateTestItem(extension1);
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuItem* item3 = CreateTestItem(extension1);
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.AddContextItem(extension1, item1));
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.AddContextItem(extension1, item2));
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.AddChildItem(item1->id(), item3));
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add one top-level item for extension 2.
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Extension* extension2 = AddExtension("2222");
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuItem* item4 = CreateTestItem(extension2);
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.AddContextItem(extension2, item4));
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2u, manager_.MenuItems(extension1->id())->size());
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1u, manager_.MenuItems(extension2->id())->size());
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Remove extension2's item.
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  manager_.RemoveAllContextItems(extension2->id());
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2u, manager_.MenuItems(extension1->id())->size());
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(NULL, manager_.MenuItems(extension2->id()));
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Remove extension1's items.
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  manager_.RemoveAllContextItems(extension1->id());
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(NULL, manager_.MenuItems(extension1->id()));
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
401513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Tests that removing all items one-by-one doesn't leave an entry around.
402513209b27ff55e2841eac0e4120199c23acce758Ben MurdochTEST_F(ExtensionMenuManagerTest, RemoveOneByOne) {
403513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Add 2 test items.
404513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  Extension* extension1 = AddExtension("1111");
405513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ExtensionMenuItem* item1 = CreateTestItem(extension1);
406513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ExtensionMenuItem* item2 = CreateTestItem(extension1);
407513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_TRUE(manager_.AddContextItem(extension1, item1));
408513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_TRUE(manager_.AddContextItem(extension1, item2));
409513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
410513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_FALSE(manager_.context_items_.empty());
411513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
412513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  manager_.RemoveContextMenuItem(item1->id());
413513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  manager_.RemoveContextMenuItem(item2->id());
414513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
415513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_TRUE(manager_.context_items_.empty());
416513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
417513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(ExtensionMenuManagerTest, ExecuteCommand) {
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockTestingProfile profile;
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
421731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  scoped_ptr<MockExtensionEventRouter> mock_event_router(
422731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      new MockExtensionEventRouter(&profile));
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ContextMenuParams params;
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  params.media_type = WebKit::WebContextMenuData::MediaTypeImage;
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  params.src_url = GURL("http://foo.bar/image.png");
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  params.page_url = GURL("http://foo.bar");
42821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  params.selection_text = ASCIIToUTF16("Hello World");
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  params.is_editable = false;
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Extension* extension = AddExtension("test");
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuItem* item = CreateTestItem(extension);
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionMenuItem::Id id = item->id();
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(manager_.AddContextItem(extension, item));
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
436731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_CALL(profile, GetExtensionEventRouter())
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .Times(1)
438731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      .WillOnce(Return(mock_event_router.get()));
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Use the magic of googlemock to save a parameter to our mock's
441731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // DispatchEventImpl method into event_args.
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string event_args;
443731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string expected_event_name = "contextMenus";
444731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_CALL(*mock_event_router.get(),
445731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick              DispatchEventImpl(item->extension_id(),
446731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                expected_event_name,
447731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                _,
448731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                &profile,
449731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                GURL()))
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .Times(1)
451731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      .WillOnce(SaveArg<2>(&event_args));
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  manager_.ExecuteCommand(&profile, NULL /* tab_contents */, params, id);
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Parse the json event_args, which should turn into a 2-element list where
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the first element is a dictionary we want to inspect for the correct
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // values.
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<Value> result(base::JSONReader::Read(event_args, true));
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Value* value = result.get();
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(result.get() != NULL);
461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(Value::TYPE_LIST, value->GetType());
462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ListValue* list = static_cast<ListValue*>(value);
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(2u, list->GetSize());
464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DictionaryValue* info;
466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(list->GetDictionary(0, &info));
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int tmp_id = 0;
4693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(info->GetInteger("menuItemId", &tmp_id));
470513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_EQ(id.uid, tmp_id);
471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string tmp;
4733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(info->GetString("mediaType", &tmp));
4743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ("image", tmp);
4753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(info->GetString("srcUrl", &tmp));
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(params.src_url.spec(), tmp);
4773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(info->GetString("pageUrl", &tmp));
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(params.page_url.spec(), tmp);
479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  string16 tmp16;
48121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_TRUE(info->GetString("selectionText", &tmp16));
48221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_EQ(params.selection_text, tmp16);
483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool bool_tmp = true;
4853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(info->GetBoolean("editable", &bool_tmp));
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(params.is_editable, bool_tmp);
487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
488