Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(633)

Side by Side Diff: chrome/browser/extensions/extension_context_menu_model_unittest.cc

Issue 359493005: Extend contextMenus API to support browser/page actions (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Small fixes Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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;
Devlin 2014/07/24 21:51:28 why not just include the .h?
gpdavis 2014/07/28 21:08:22 Done.
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) {
Devlin 2014/07/24 21:51:27 If you take my suggestion on line 80, this should
Devlin 2014/07/24 21:51:27 even in tests, we *should* have the practice of no
gpdavis 2014/07/28 21:08:22 Sure thing! I wasn't sure if this was still proto
gpdavis 2014/07/28 21:08:22 Done (parameter change).
Yoyo Zhou 2014/07/28 23:23:25 You don't need a separate header file unless you n
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));
Devlin 2014/07/24 21:51:28 doc anon bools
gpdavis 2014/07/28 21:08:22 Done.
59 }
60
61 // Reinitializes the given |model|.
62 void RefreshMenu(ExtensionContextMenuModel* model) {
63 model->InitMenu(model->GetExtension());
64 }
65
66 // Returns the number of extension menu items that show up in |model|.
67 int CountExtensionItems(ExtensionContextMenuModel* model) {
68 return model->extension_items_count_;
69 }
70
71 int cur_id = 0;
Devlin 2014/07/24 21:51:28 Similarly, we should not have public class variabl
gpdavis 2014/07/28 21:08:22 Done.
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");
Devlin 2014/07/24 21:51:28 Why don't we define these as const char[]s kPageAc
gpdavis 2014/07/28 21:08:22 Done. I left out kBrowserAction for now, since it
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
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*>(
Yoyo Zhou 2014/07/24 22:21:03 What about creating a MenuManager without using th
gpdavis 2014/07/28 21:08:22 MenuManager::Get(profile_.get()) returns null if I
125 (MenuManagerFactory::GetInstance()->SetTestingFactoryAndUse(
126 profile_.get(), &MenuManagerFactory::BuildInstanceFor)));
127 ASSERT_TRUE(manager);
128
129 scoped_refptr<ExtensionContextMenuModel> menu(
130 new ExtensionContextMenuModel(extension.get(), &browser, NULL));
Devlin 2014/07/24 21:51:28 doc NULL
gpdavis 2014/07/28 21:08:22 I can actually just use the other constructor, whi
131
132 // There should be no extension items yet.
133 ASSERT_TRUE(CountExtensionItems(menu) == 0);
Devlin 2014/07/24 21:51:28 Some of these can be EXPECTs, and you should also
gpdavis 2014/07/28 21:08:22 Done.
134
135 // Add a browser action menu item for |extension| to |manager|.
136 AddContextItem(manager, extension.get(), MenuItem::BROWSER_ACTION);
137 RefreshMenu(menu);
138
139 // Since |extension| has a page action, the browser action menu item should
140 // not be present.
141 ASSERT_TRUE(CountExtensionItems(menu) == 0);
142
143 // Add a page action menu item and reset the context menu.
144 AddContextItem(manager, extension.get(), MenuItem::PAGE_ACTION);
145 RefreshMenu(menu);
146
147 // The page action item should be present because |extension| has a page
148 // action.
149 ASSERT_TRUE(CountExtensionItems(menu) == 1);
150
151 // Create more page action items to test top level menu item limitations.
152 for (int i = 0; i < api::context_menus::ACTION_MENU_TOP_LEVEL_LIMIT; ++i) {
Devlin 2014/07/24 21:51:28 nit: no brackets.
gpdavis 2014/07/28 21:08:22 Done.
153 AddContextItem(manager, extension.get(), MenuItem::PAGE_ACTION);
154 }
155 RefreshMenu(menu);
156
157 // The menu should only have a limited number of extension items, since they
158 // are all top level items, and we limit the number of top level extension
159 // items.
160 ASSERT_TRUE(CountExtensionItems(menu) ==
161 api::context_menus::ACTION_MENU_TOP_LEVEL_LIMIT);
162
163 AddContextItem(manager, extension.get(), MenuItem::PAGE_ACTION);
164 RefreshMenu(menu);
165
166 // Adding another top level item should not increase the count.
167 ASSERT_TRUE(CountExtensionItems(menu) ==
168 api::context_menus::ACTION_MENU_TOP_LEVEL_LIMIT);
169 }
170
69 } // namespace 171 } // namespace
70 } // namespace extensions 172 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698