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/context_menu_matcher.h" | |
7 #include "chrome/browser/extensions/extension_service.h" | 8 #include "chrome/browser/extensions/extension_service.h" |
8 #include "chrome/browser/extensions/extension_service_test_base.h" | 9 #include "chrome/browser/extensions/extension_service_test_base.h" |
10 #include "chrome/browser/extensions/menu_manager.h" | |
11 #include "chrome/browser/extensions/menu_manager_factory.h" | |
9 #include "chrome/browser/ui/browser.h" | 12 #include "chrome/browser/ui/browser.h" |
10 #include "chrome/browser/ui/host_desktop.h" | 13 #include "chrome/browser/ui/host_desktop.h" |
11 #include "chrome/test/base/test_browser_window.h" | 14 #include "chrome/test/base/test_browser_window.h" |
12 #include "chrome/test/base/testing_profile.h" | 15 #include "chrome/test/base/testing_profile.h" |
13 #include "extensions/browser/extension_system.h" | 16 #include "extensions/browser/extension_system.h" |
14 #include "extensions/browser/test_management_policy.h" | 17 #include "extensions/browser/test_management_policy.h" |
15 #include "extensions/common/extension_builder.h" | 18 #include "extensions/common/extension_builder.h" |
16 #include "extensions/common/value_builder.h" | 19 #include "extensions/common/value_builder.h" |
17 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
18 | 21 |
19 namespace extensions { | 22 namespace extensions { |
20 namespace { | 23 namespace api { |
24 namespace context_menus { | |
25 | |
26 extern const int ACTION_MENU_TOP_LEVEL_LIMIT; | |
27 | |
28 } // namespace context_menus | |
29 } // namespace api | |
21 | 30 |
22 class ExtensionContextMenuModelTest : public ExtensionServiceTestBase { | 31 class ExtensionContextMenuModelTest : public ExtensionServiceTestBase { |
32 public: | |
33 // Build an extension to pass to the menu constructor. It needs an | |
34 // ExtensionAction. | |
35 scoped_refptr<Extension> BuildExtension(std::string action_type) { | |
36 return ExtensionBuilder() | |
37 .SetManifest( | |
38 DictionaryBuilder() | |
39 .Set("name", "Page Action Extension") | |
40 .Set("version", "1") | |
41 .Set("manifest_version", 2) | |
42 .Set(action_type, | |
43 DictionaryBuilder().Set("default_title", "Hello"))) | |
44 .Build(); | |
45 } | |
46 | |
47 // Creates an extension menu item for |extension| with the given |context| | |
48 // and adds it to |manager|. | |
49 void AddContextItem(MenuManager* manager, | |
50 Extension* extension, | |
51 MenuItem::Context context) { | |
52 MenuItem::Type type = MenuItem::NORMAL; | |
53 MenuItem::ContextList contexts(context); | |
54 const MenuItem::ExtensionKey key(extension->id()); | |
55 MenuItem::Id id(false, key); | |
56 id.uid = ++cur_id; | |
57 manager->AddContextItem( | |
58 extension, new MenuItem(id, "test", false, true, type, contexts)); | |
59 } | |
60 | |
61 // Reinitializes the given |model|. | |
62 void ResetMenu(ExtensionContextMenuModel* model) { | |
Yoyo Zhou
2014/07/22 00:44:32
"Reset" has kind of ambiguous connotations. Maybe
gpdavis
2014/07/22 18:52:53
Done.
| |
63 model->InitMenu(model->GetExtension()); | |
64 } | |
65 | |
66 // Returns the number of extension menu items that show up in |model|. | |
67 int DetectExtensionItems(ExtensionContextMenuModel* model) { | |
Yoyo Zhou
2014/07/22 00:44:32
nit: CountExtensionItems?
gpdavis
2014/07/22 18:52:52
Done.
| |
68 return model->extension_items_count_; | |
69 } | |
70 | |
71 int cur_id = 0; | |
23 }; | 72 }; |
24 | 73 |
74 namespace { | |
75 | |
25 // Tests that applicable menu items are disabled when a ManagementPolicy | 76 // Tests that applicable menu items are disabled when a ManagementPolicy |
26 // prohibits them. | 77 // prohibits them. |
27 TEST_F(ExtensionContextMenuModelTest, PolicyDisablesItems) { | 78 TEST_F(ExtensionContextMenuModelTest, PolicyDisablesItems) { |
28 InitializeEmptyExtensionService(); | 79 InitializeEmptyExtensionService(); |
29 // Build an extension to pass to the menu constructor. It needs an | 80 scoped_refptr<Extension> extension = BuildExtension("page_action"); |
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(); | |
39 ASSERT_TRUE(extension.get()); | 81 ASSERT_TRUE(extension.get()); |
40 service_->AddExtension(extension.get()); | 82 service_->AddExtension(extension.get()); |
41 | 83 |
42 // Create a Browser for the ExtensionContextMenuModel to use. | 84 // Create a Browser for the ExtensionContextMenuModel to use. |
43 Browser::CreateParams params(profile_.get(), chrome::GetActiveDesktop()); | 85 Browser::CreateParams params(profile_.get(), chrome::GetActiveDesktop()); |
44 TestBrowserWindow test_window; | 86 TestBrowserWindow test_window; |
45 params.window = &test_window; | 87 params.window = &test_window; |
46 Browser browser(params); | 88 Browser browser(params); |
47 | 89 |
48 scoped_refptr<ExtensionContextMenuModel> menu( | 90 scoped_refptr<ExtensionContextMenuModel> menu( |
(...skipping 10 matching lines...) Expand all Loading... | |
59 extensions::TestManagementPolicyProvider::PROHIBIT_MODIFY_STATUS); | 101 extensions::TestManagementPolicyProvider::PROHIBIT_MODIFY_STATUS); |
60 system->management_policy()->RegisterProvider(&policy_provider); | 102 system->management_policy()->RegisterProvider(&policy_provider); |
61 | 103 |
62 // Now the actions are disabled. | 104 // Now the actions are disabled. |
63 ASSERT_FALSE(menu->IsCommandIdEnabled(ExtensionContextMenuModel::UNINSTALL)); | 105 ASSERT_FALSE(menu->IsCommandIdEnabled(ExtensionContextMenuModel::UNINSTALL)); |
64 | 106 |
65 // Don't leave |policy_provider| dangling. | 107 // Don't leave |policy_provider| dangling. |
66 system->management_policy()->UnregisterAllProviders(); | 108 system->management_policy()->UnregisterAllProviders(); |
67 } | 109 } |
68 | 110 |
111 TEST_F(ExtensionContextMenuModelTest, ExtensionItemTest) { | |
112 InitializeEmptyExtensionService(); | |
113 scoped_refptr<Extension> extension = BuildExtension("page_action"); | |
114 ASSERT_TRUE(extension.get()); | |
115 service_->AddExtension(extension.get()); | |
116 | |
117 // Create a Browser for the ExtensionContextMenuModel to use. | |
118 Browser::CreateParams params(profile_.get(), chrome::GetActiveDesktop()); | |
119 TestBrowserWindow test_window; | |
120 params.window = &test_window; | |
121 Browser browser(params); | |
122 | |
123 // Create a MenuManager for adding context items. | |
124 MenuManager* manager = static_cast<MenuManager*>( | |
125 (MenuManagerFactory::GetInstance()->SetTestingFactoryAndUse( | |
Yoyo Zhou
2014/07/22 00:44:32
I don't understand what's going on here. It looks
gpdavis
2014/07/22 18:52:53
Calling GetForProfile returned NULL, so I needed t
| |
126 profile_.get(), &MenuManagerFactory::BuildInstanceFor))); | |
127 ASSERT_TRUE(manager); | |
128 | |
129 scoped_refptr<ExtensionContextMenuModel> menu( | |
130 new ExtensionContextMenuModel(extension.get(), &browser, NULL)); | |
131 | |
132 // There should be no extension items yet. | |
133 ASSERT_TRUE(DetectExtensionItems(menu) == 0); | |
134 | |
135 // Add a browser action menu item for |extension| to |manager|. | |
136 AddContextItem(manager, extension.get(), MenuItem::BROWSER_ACTION); | |
137 ResetMenu(menu); | |
138 | |
139 // Since |extension| has a page action, the browser action menu item should | |
140 // not be detected. | |
Yoyo Zhou
2014/07/22 00:44:32
'detected' is kind of odd. Say 'present'.
gpdavis
2014/07/22 18:52:52
Done.
| |
141 ASSERT_TRUE(DetectExtensionItems(menu) == 0); | |
142 | |
143 // Add a page action menu item and reset the context menu. | |
144 AddContextItem(manager, extension.get(), MenuItem::PAGE_ACTION); | |
145 ResetMenu(menu); | |
146 | |
147 // The page action item should be detected because |extension| has a page | |
Yoyo Zhou
2014/07/22 00:44:32
ditto
gpdavis
2014/07/22 18:52:52
Done.
| |
148 // action. | |
149 ASSERT_TRUE(DetectExtensionItems(menu) == 1); | |
150 | |
151 // Create six more page action items to test top level menu item limitations. | |
152 AddContextItem(manager, extension.get(), MenuItem::PAGE_ACTION); | |
153 AddContextItem(manager, extension.get(), MenuItem::PAGE_ACTION); | |
154 AddContextItem(manager, extension.get(), MenuItem::PAGE_ACTION); | |
155 AddContextItem(manager, extension.get(), MenuItem::PAGE_ACTION); | |
156 AddContextItem(manager, extension.get(), MenuItem::PAGE_ACTION); | |
157 AddContextItem(manager, extension.get(), MenuItem::PAGE_ACTION); | |
158 ResetMenu(menu); | |
159 | |
160 // The menu should only have six extension items, since they are all top level | |
161 // items, and we limit the number of top level extension items to six. | |
Yoyo Zhou
2014/07/22 00:44:32
Ok. By the way, do we count separators as top-leve
gpdavis
2014/07/22 18:52:52
User added separators (via create calls in the ext
Yoyo Zhou
2014/07/22 21:35:42
So additional top-level items beyond the 6th are j
not at google - send to devlin
2014/07/22 22:58:07
it would be better if it set an error, if possible
| |
162 ASSERT_TRUE(DetectExtensionItems(menu) == | |
163 api::context_menus::ACTION_MENU_TOP_LEVEL_LIMIT); | |
164 | |
165 AddContextItem(manager, extension.get(), MenuItem::PAGE_ACTION); | |
166 ResetMenu(menu); | |
167 | |
168 // Adding another top level item should not increase the count. | |
169 ASSERT_TRUE(DetectExtensionItems(menu) == | |
170 api::context_menus::ACTION_MENU_TOP_LEVEL_LIMIT); | |
171 } | |
172 | |
69 } // namespace | 173 } // namespace |
70 } // namespace extensions | 174 } // namespace extensions |
OLD | NEW |