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 |