| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/extensions/extension_context_menu_model.h" | 5 #include "chrome/browser/extensions/extension_context_menu_model.h" |
| 6 | 6 |
| 7 #include "chrome/browser/extensions/extension_service.h" | 7 #include "chrome/browser/extensions/extension_service.h" |
| 8 #include "chrome/browser/extensions/extension_service_test_base.h" | 8 #include "chrome/browser/extensions/extension_service_test_base.h" |
| 9 #include "chrome/browser/extensions/menu_manager.h" | |
| 10 #include "chrome/browser/extensions/menu_manager_factory.h" | |
| 11 #include "chrome/browser/ui/browser.h" | 9 #include "chrome/browser/ui/browser.h" |
| 12 #include "chrome/browser/ui/host_desktop.h" | 10 #include "chrome/browser/ui/host_desktop.h" |
| 13 #include "chrome/common/extensions/api/context_menus.h" | |
| 14 #include "chrome/test/base/test_browser_window.h" | 11 #include "chrome/test/base/test_browser_window.h" |
| 15 #include "chrome/test/base/testing_profile.h" | 12 #include "chrome/test/base/testing_profile.h" |
| 16 #include "extensions/browser/extension_system.h" | 13 #include "extensions/browser/extension_system.h" |
| 17 #include "extensions/browser/test_management_policy.h" | 14 #include "extensions/browser/test_management_policy.h" |
| 18 #include "extensions/common/extension_builder.h" | 15 #include "extensions/common/extension_builder.h" |
| 19 #include "extensions/common/value_builder.h" | 16 #include "extensions/common/value_builder.h" |
| 20 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
| 21 | 18 |
| 22 namespace extensions { | 19 namespace extensions { |
| 20 namespace { |
| 23 | 21 |
| 24 class ExtensionContextMenuModelTest : public ExtensionServiceTestBase { | 22 class ExtensionContextMenuModelTest : public ExtensionServiceTestBase { |
| 25 public: | |
| 26 ExtensionContextMenuModelTest(); | |
| 27 | |
| 28 // Build an extension to pass to the menu constructor. It needs an | |
| 29 // ExtensionAction. | |
| 30 scoped_refptr<Extension> BuildExtension(); | |
| 31 | |
| 32 // Creates an extension menu item for |extension| with the given |context| | |
| 33 // and adds it to |manager|. Refreshes |model| to show new item. | |
| 34 void AddContextItemAndRefreshModel(MenuManager* manager, | |
| 35 Extension* extension, | |
| 36 MenuItem::Context context, | |
| 37 ExtensionContextMenuModel* model); | |
| 38 | |
| 39 // Reinitializes the given |model|. | |
| 40 void RefreshMenu(ExtensionContextMenuModel* model); | |
| 41 | |
| 42 // Returns the number of extension menu items that show up in |model|. | |
| 43 int CountExtensionItems(ExtensionContextMenuModel* model); | |
| 44 | |
| 45 private: | |
| 46 int cur_id_; | |
| 47 }; | 23 }; |
| 48 | 24 |
| 49 ExtensionContextMenuModelTest::ExtensionContextMenuModelTest() | |
| 50 : cur_id_(0) {} | |
| 51 | |
| 52 scoped_refptr<Extension> ExtensionContextMenuModelTest::BuildExtension() { | |
| 53 return ExtensionBuilder() | |
| 54 .SetManifest( | |
| 55 DictionaryBuilder() | |
| 56 .Set("name", "Page Action Extension") | |
| 57 .Set("version", "1") | |
| 58 .Set("manifest_version", 2) | |
| 59 .Set("page_action", | |
| 60 DictionaryBuilder().Set("default_title", "Hello"))) | |
| 61 .Build(); | |
| 62 } | |
| 63 | |
| 64 void ExtensionContextMenuModelTest::AddContextItemAndRefreshModel( | |
| 65 MenuManager* manager, | |
| 66 Extension* extension, | |
| 67 MenuItem::Context context, | |
| 68 ExtensionContextMenuModel* model) { | |
| 69 MenuItem::Type type = MenuItem::NORMAL; | |
| 70 MenuItem::ContextList contexts(context); | |
| 71 const MenuItem::ExtensionKey key(extension->id()); | |
| 72 MenuItem::Id id(false, key); | |
| 73 id.uid = ++cur_id_; | |
| 74 manager->AddContextItem(extension, new MenuItem(id, | |
| 75 "test", | |
| 76 false, // checked | |
| 77 true, // enabled | |
| 78 type, | |
| 79 contexts)); | |
| 80 RefreshMenu(model); | |
| 81 } | |
| 82 | |
| 83 void ExtensionContextMenuModelTest::RefreshMenu( | |
| 84 ExtensionContextMenuModel* model) { | |
| 85 model->InitMenu(model->GetExtension()); | |
| 86 } | |
| 87 | |
| 88 int ExtensionContextMenuModelTest::CountExtensionItems( | |
| 89 ExtensionContextMenuModel* model) { | |
| 90 return model->extension_items_count_; | |
| 91 } | |
| 92 | |
| 93 namespace { | |
| 94 | |
| 95 // Tests that applicable menu items are disabled when a ManagementPolicy | 25 // Tests that applicable menu items are disabled when a ManagementPolicy |
| 96 // prohibits them. | 26 // prohibits them. |
| 97 TEST_F(ExtensionContextMenuModelTest, PolicyDisablesItems) { | 27 TEST_F(ExtensionContextMenuModelTest, PolicyDisablesItems) { |
| 98 InitializeEmptyExtensionService(); | 28 InitializeEmptyExtensionService(); |
| 99 scoped_refptr<Extension> extension = BuildExtension(); | 29 // Build an extension to pass to the menu constructor. It needs an |
| 30 // ExtensionAction. |
| 31 scoped_refptr<Extension> extension = ExtensionBuilder() |
| 32 .SetManifest(DictionaryBuilder() |
| 33 .Set("name", "Page Action Extension") |
| 34 .Set("version", "1") |
| 35 .Set("manifest_version", 2) |
| 36 .Set("page_action", DictionaryBuilder() |
| 37 .Set("default_title", "Hello"))) |
| 38 .Build(); |
| 100 ASSERT_TRUE(extension.get()); | 39 ASSERT_TRUE(extension.get()); |
| 101 service_->AddExtension(extension.get()); | 40 service_->AddExtension(extension.get()); |
| 102 | 41 |
| 103 // Create a Browser for the ExtensionContextMenuModel to use. | 42 // Create a Browser for the ExtensionContextMenuModel to use. |
| 104 Browser::CreateParams params(profile_.get(), chrome::GetActiveDesktop()); | 43 Browser::CreateParams params(profile_.get(), chrome::GetActiveDesktop()); |
| 105 TestBrowserWindow test_window; | 44 TestBrowserWindow test_window; |
| 106 params.window = &test_window; | 45 params.window = &test_window; |
| 107 Browser browser(params); | 46 Browser browser(params); |
| 108 | 47 |
| 109 scoped_refptr<ExtensionContextMenuModel> menu( | 48 scoped_refptr<ExtensionContextMenuModel> menu( |
| 110 new ExtensionContextMenuModel(extension.get(), &browser)); | 49 new ExtensionContextMenuModel(extension.get(), &browser, NULL)); |
| 111 | 50 |
| 112 extensions::ExtensionSystem* system = | 51 extensions::ExtensionSystem* system = |
| 113 extensions::ExtensionSystem::Get(profile_.get()); | 52 extensions::ExtensionSystem::Get(profile_.get()); |
| 114 system->management_policy()->UnregisterAllProviders(); | 53 system->management_policy()->UnregisterAllProviders(); |
| 115 | 54 |
| 116 // Actions should be enabled. | 55 // Actions should be enabled. |
| 117 ASSERT_TRUE(menu->IsCommandIdEnabled(ExtensionContextMenuModel::UNINSTALL)); | 56 ASSERT_TRUE(menu->IsCommandIdEnabled(ExtensionContextMenuModel::UNINSTALL)); |
| 118 | 57 |
| 119 extensions::TestManagementPolicyProvider policy_provider( | 58 extensions::TestManagementPolicyProvider policy_provider( |
| 120 extensions::TestManagementPolicyProvider::PROHIBIT_MODIFY_STATUS); | 59 extensions::TestManagementPolicyProvider::PROHIBIT_MODIFY_STATUS); |
| 121 system->management_policy()->RegisterProvider(&policy_provider); | 60 system->management_policy()->RegisterProvider(&policy_provider); |
| 122 | 61 |
| 123 // Now the actions are disabled. | 62 // Now the actions are disabled. |
| 124 ASSERT_FALSE(menu->IsCommandIdEnabled(ExtensionContextMenuModel::UNINSTALL)); | 63 ASSERT_FALSE(menu->IsCommandIdEnabled(ExtensionContextMenuModel::UNINSTALL)); |
| 125 | 64 |
| 126 // Don't leave |policy_provider| dangling. | 65 // Don't leave |policy_provider| dangling. |
| 127 system->management_policy()->UnregisterAllProviders(); | 66 system->management_policy()->UnregisterAllProviders(); |
| 128 } | 67 } |
| 129 | 68 |
| 130 TEST_F(ExtensionContextMenuModelTest, ExtensionItemTest) { | |
| 131 InitializeEmptyExtensionService(); | |
| 132 scoped_refptr<Extension> extension = BuildExtension(); | |
| 133 ASSERT_TRUE(extension.get()); | |
| 134 service_->AddExtension(extension.get()); | |
| 135 | |
| 136 // Create a Browser for the ExtensionContextMenuModel to use. | |
| 137 Browser::CreateParams params(profile_.get(), chrome::GetActiveDesktop()); | |
| 138 TestBrowserWindow test_window; | |
| 139 params.window = &test_window; | |
| 140 Browser browser(params); | |
| 141 | |
| 142 // Create a MenuManager for adding context items. | |
| 143 MenuManager* manager = static_cast<MenuManager*>( | |
| 144 (MenuManagerFactory::GetInstance()->SetTestingFactoryAndUse( | |
| 145 profile_.get(), &MenuManagerFactory::BuildServiceInstanceForTesting))); | |
| 146 ASSERT_TRUE(manager); | |
| 147 | |
| 148 scoped_refptr<ExtensionContextMenuModel> menu( | |
| 149 new ExtensionContextMenuModel(extension.get(), &browser)); | |
| 150 | |
| 151 // There should be no extension items yet. | |
| 152 EXPECT_EQ(0, CountExtensionItems(menu)); | |
| 153 | |
| 154 // Add a browser action menu item for |extension| to |manager|. | |
| 155 AddContextItemAndRefreshModel( | |
| 156 manager, extension.get(), MenuItem::BROWSER_ACTION, menu); | |
| 157 | |
| 158 // Since |extension| has a page action, the browser action menu item should | |
| 159 // not be present. | |
| 160 EXPECT_EQ(0, CountExtensionItems(menu)); | |
| 161 | |
| 162 // Add a page action menu item and reset the context menu. | |
| 163 AddContextItemAndRefreshModel( | |
| 164 manager, extension.get(), MenuItem::PAGE_ACTION, menu); | |
| 165 | |
| 166 // The page action item should be present because |extension| has a page | |
| 167 // action. | |
| 168 EXPECT_EQ(1, CountExtensionItems(menu)); | |
| 169 | |
| 170 // Create more page action items to test top level menu item limitations. | |
| 171 for (int i = 0; i < api::context_menus::ACTION_MENU_TOP_LEVEL_LIMIT; ++i) | |
| 172 AddContextItemAndRefreshModel( | |
| 173 manager, extension.get(), MenuItem::PAGE_ACTION, menu); | |
| 174 | |
| 175 // The menu should only have a limited number of extension items, since they | |
| 176 // are all top level items, and we limit the number of top level extension | |
| 177 // items. | |
| 178 EXPECT_EQ(api::context_menus::ACTION_MENU_TOP_LEVEL_LIMIT, | |
| 179 CountExtensionItems(menu)); | |
| 180 | |
| 181 AddContextItemAndRefreshModel( | |
| 182 manager, extension.get(), MenuItem::PAGE_ACTION, menu); | |
| 183 | |
| 184 // Adding another top level item should not increase the count. | |
| 185 EXPECT_EQ(api::context_menus::ACTION_MENU_TOP_LEVEL_LIMIT, | |
| 186 CountExtensionItems(menu)); | |
| 187 } | |
| 188 | |
| 189 } // namespace | 69 } // namespace |
| 190 } // namespace extensions | 70 } // namespace extensions |
| OLD | NEW |