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