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

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

Issue 476873002: Make hiding an extension action cause it to go to the overflow menu (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 6 years, 4 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/api/extension_action/extension_action_api.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"
9 #include "chrome/browser/extensions/menu_manager.h" 10 #include "chrome/browser/extensions/menu_manager.h"
10 #include "chrome/browser/extensions/menu_manager_factory.h" 11 #include "chrome/browser/extensions/menu_manager_factory.h"
11 #include "chrome/browser/ui/browser.h" 12 #include "chrome/browser/ui/browser.h"
12 #include "chrome/browser/ui/host_desktop.h" 13 #include "chrome/browser/ui/host_desktop.h"
13 #include "chrome/common/extensions/api/context_menus.h" 14 #include "chrome/common/extensions/api/context_menus.h"
14 #include "chrome/test/base/test_browser_window.h" 15 #include "chrome/test/base/test_browser_window.h"
15 #include "chrome/test/base/testing_profile.h" 16 #include "chrome/test/base/testing_profile.h"
17 #include "components/crx_file/id_util.h"
18 #include "extensions/browser/extension_prefs.h"
16 #include "extensions/browser/extension_system.h" 19 #include "extensions/browser/extension_system.h"
17 #include "extensions/browser/test_management_policy.h" 20 #include "extensions/browser/test_management_policy.h"
18 #include "extensions/common/extension_builder.h" 21 #include "extensions/common/extension_builder.h"
22 #include "extensions/common/feature_switch.h"
23 #include "extensions/common/manifest_constants.h"
19 #include "extensions/common/value_builder.h" 24 #include "extensions/common/value_builder.h"
25 #include "grit/generated_resources.h"
20 #include "testing/gtest/include/gtest/gtest.h" 26 #include "testing/gtest/include/gtest/gtest.h"
27 #include "ui/base/l10n/l10n_util.h"
21 28
22 namespace extensions { 29 namespace extensions {
23 30
31 namespace {
32
33 // Build an extension to pass to the menu constructor, with the an action
34 // specified by |action_key|.
35 scoped_refptr<const Extension> BuildExtension(const std::string& name,
36 const char* action_key) {
37 return ExtensionBuilder()
38 .SetManifest(DictionaryBuilder()
39 .Set("name", name)
40 .Set("version", "1")
41 .Set("manifest_version", 2)
42 .Set(action_key, DictionaryBuilder().Pass()))
43 .SetID(crx_file::id_util::GenerateId(name))
44 .Build();
45 }
46
47 // Create a Browser for the ExtensionContextMenuModel to use.
48 scoped_ptr<Browser> CreateBrowser(Profile* profile) {
49 Browser::CreateParams params(profile, chrome::GetActiveDesktop());
50 TestBrowserWindow test_window;
51 params.window = &test_window;
52 return scoped_ptr<Browser>(new Browser(params));
53 }
54
55 // Returns the index of the given |command_id| in the given |menu|, or -1 if it
56 // is not found.
57 int GetCommandIndex(const scoped_refptr<ExtensionContextMenuModel> menu,
58 int command_id) {
59 int item_count = menu->GetItemCount();
60 for (int i = 0; i < item_count; ++i) {
61 if (menu->GetCommandIdAt(i) == command_id)
62 return i;
63 }
64 return -1;
65 }
66
67 } // namespace
68
24 class ExtensionContextMenuModelTest : public ExtensionServiceTestBase { 69 class ExtensionContextMenuModelTest : public ExtensionServiceTestBase {
25 public: 70 public:
26 ExtensionContextMenuModelTest(); 71 ExtensionContextMenuModelTest();
27 72
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| 73 // Creates an extension menu item for |extension| with the given |context|
33 // and adds it to |manager|. Refreshes |model| to show new item. 74 // and adds it to |manager|. Refreshes |model| to show new item.
34 void AddContextItemAndRefreshModel(MenuManager* manager, 75 void AddContextItemAndRefreshModel(MenuManager* manager,
35 Extension* extension, 76 const Extension* extension,
36 MenuItem::Context context, 77 MenuItem::Context context,
37 ExtensionContextMenuModel* model); 78 ExtensionContextMenuModel* model);
38 79
39 // Reinitializes the given |model|. 80 // Reinitializes the given |model|.
40 void RefreshMenu(ExtensionContextMenuModel* model); 81 void RefreshMenu(ExtensionContextMenuModel* model);
41 82
42 // Returns the number of extension menu items that show up in |model|. 83 // Returns the number of extension menu items that show up in |model|.
43 int CountExtensionItems(ExtensionContextMenuModel* model); 84 int CountExtensionItems(ExtensionContextMenuModel* model);
44 85
45 private: 86 private:
46 int cur_id_; 87 int cur_id_;
47 }; 88 };
48 89
49 ExtensionContextMenuModelTest::ExtensionContextMenuModelTest() : cur_id_(0) { 90 ExtensionContextMenuModelTest::ExtensionContextMenuModelTest() : cur_id_(0) {
50 } 91 }
51 92
52 scoped_refptr<Extension> ExtensionContextMenuModelTest::BuildExtension() {
53 return ExtensionBuilder()
54 .SetManifest(DictionaryBuilder()
55 .Set("name", "Page Action Extension")
56 .Set("version", "1")
57 .Set("manifest_version", 2)
58 .Set("page_action",
59 DictionaryBuilder().Set("default_title", "Hello")))
60 .Build();
61 }
62 93
63 void ExtensionContextMenuModelTest::AddContextItemAndRefreshModel( 94 void ExtensionContextMenuModelTest::AddContextItemAndRefreshModel(
64 MenuManager* manager, 95 MenuManager* manager,
65 Extension* extension, 96 const Extension* extension,
66 MenuItem::Context context, 97 MenuItem::Context context,
67 ExtensionContextMenuModel* model) { 98 ExtensionContextMenuModel* model) {
68 MenuItem::Type type = MenuItem::NORMAL; 99 MenuItem::Type type = MenuItem::NORMAL;
69 MenuItem::ContextList contexts(context); 100 MenuItem::ContextList contexts(context);
70 const MenuItem::ExtensionKey key(extension->id()); 101 const MenuItem::ExtensionKey key(extension->id());
71 MenuItem::Id id(false, key); 102 MenuItem::Id id(false, key);
72 id.uid = ++cur_id_; 103 id.uid = ++cur_id_;
73 manager->AddContextItem(extension, 104 manager->AddContextItem(extension,
74 new MenuItem(id, 105 new MenuItem(id,
75 "test", 106 "test",
76 false, // checked 107 false, // checked
77 true, // enabled 108 true, // enabled
78 type, 109 type,
79 contexts)); 110 contexts));
80 RefreshMenu(model); 111 RefreshMenu(model);
81 } 112 }
82 113
83 void ExtensionContextMenuModelTest::RefreshMenu( 114 void ExtensionContextMenuModelTest::RefreshMenu(
84 ExtensionContextMenuModel* model) { 115 ExtensionContextMenuModel* model) {
85 model->InitMenu(model->GetExtension()); 116 model->InitMenu(model->GetExtension());
86 } 117 }
87 118
88 int ExtensionContextMenuModelTest::CountExtensionItems( 119 int ExtensionContextMenuModelTest::CountExtensionItems(
89 ExtensionContextMenuModel* model) { 120 ExtensionContextMenuModel* model) {
90 return model->extension_items_count_; 121 return model->extension_items_count_;
91 } 122 }
92 123
93 namespace {
94
95 // Tests that applicable menu items are disabled when a ManagementPolicy 124 // Tests that applicable menu items are disabled when a ManagementPolicy
96 // prohibits them. 125 // prohibits them.
97 TEST_F(ExtensionContextMenuModelTest, PolicyDisablesItems) { 126 TEST_F(ExtensionContextMenuModelTest, PolicyDisablesItems) {
98 InitializeEmptyExtensionService(); 127 InitializeEmptyExtensionService();
99 scoped_refptr<Extension> extension = BuildExtension(); 128 scoped_refptr<const Extension> extension =
129 BuildExtension("extension", manifest_keys::kPageAction);
100 ASSERT_TRUE(extension.get()); 130 ASSERT_TRUE(extension.get());
101 service_->AddExtension(extension.get()); 131 service()->AddExtension(extension.get());
102 132
103 // Create a Browser for the ExtensionContextMenuModel to use. 133 scoped_ptr<Browser> browser = CreateBrowser(profile());
104 Browser::CreateParams params(profile_.get(), chrome::GetActiveDesktop());
105 TestBrowserWindow test_window;
106 params.window = &test_window;
107 Browser browser(params);
108 134
109 scoped_refptr<ExtensionContextMenuModel> menu( 135 scoped_refptr<ExtensionContextMenuModel> menu(
110 new ExtensionContextMenuModel(extension.get(), &browser)); 136 new ExtensionContextMenuModel(extension.get(), browser.get()));
111 137
112 extensions::ExtensionSystem* system = 138 ExtensionSystem* system = ExtensionSystem::Get(profile());
113 extensions::ExtensionSystem::Get(profile_.get());
114 system->management_policy()->UnregisterAllProviders(); 139 system->management_policy()->UnregisterAllProviders();
115 140
116 // Actions should be enabled. 141 // Actions should be enabled.
117 ASSERT_TRUE(menu->IsCommandIdEnabled(ExtensionContextMenuModel::UNINSTALL)); 142 ASSERT_TRUE(menu->IsCommandIdEnabled(ExtensionContextMenuModel::UNINSTALL));
118 143
119 extensions::TestManagementPolicyProvider policy_provider( 144 TestManagementPolicyProvider policy_provider(
120 extensions::TestManagementPolicyProvider::PROHIBIT_MODIFY_STATUS); 145 TestManagementPolicyProvider::PROHIBIT_MODIFY_STATUS);
121 system->management_policy()->RegisterProvider(&policy_provider); 146 system->management_policy()->RegisterProvider(&policy_provider);
122 147
123 // Now the actions are disabled. 148 // Now the actions are disabled.
124 ASSERT_FALSE(menu->IsCommandIdEnabled(ExtensionContextMenuModel::UNINSTALL)); 149 ASSERT_FALSE(menu->IsCommandIdEnabled(ExtensionContextMenuModel::UNINSTALL));
125 150
126 // Don't leave |policy_provider| dangling. 151 // Don't leave |policy_provider| dangling.
127 system->management_policy()->UnregisterAllProviders(); 152 system->management_policy()->UnregisterAllProviders();
128 } 153 }
129 154
130 TEST_F(ExtensionContextMenuModelTest, ExtensionItemTest) { 155 TEST_F(ExtensionContextMenuModelTest, ExtensionItemTest) {
131 InitializeEmptyExtensionService(); 156 InitializeEmptyExtensionService();
132 scoped_refptr<Extension> extension = BuildExtension(); 157 scoped_refptr<const Extension> extension =
158 BuildExtension("extension", manifest_keys::kPageAction);
133 ASSERT_TRUE(extension.get()); 159 ASSERT_TRUE(extension.get());
134 service_->AddExtension(extension.get()); 160 service()->AddExtension(extension.get());
135 161
136 // Create a Browser for the ExtensionContextMenuModel to use. 162 scoped_ptr<Browser> browser = CreateBrowser(profile());
137 Browser::CreateParams params(profile_.get(), chrome::GetActiveDesktop());
138 TestBrowserWindow test_window;
139 params.window = &test_window;
140 Browser browser(params);
141 163
142 // Create a MenuManager for adding context items. 164 // Create a MenuManager for adding context items.
143 MenuManager* manager = static_cast<MenuManager*>( 165 MenuManager* manager = static_cast<MenuManager*>(
144 (MenuManagerFactory::GetInstance()->SetTestingFactoryAndUse( 166 (MenuManagerFactory::GetInstance()->SetTestingFactoryAndUse(
145 profile_.get(), 167 profile(),
146 &MenuManagerFactory::BuildServiceInstanceForTesting))); 168 &MenuManagerFactory::BuildServiceInstanceForTesting)));
147 ASSERT_TRUE(manager); 169 ASSERT_TRUE(manager);
148 170
149 scoped_refptr<ExtensionContextMenuModel> menu( 171 scoped_refptr<ExtensionContextMenuModel> menu(
150 new ExtensionContextMenuModel(extension.get(), &browser)); 172 new ExtensionContextMenuModel(extension.get(), browser.get()));
151 173
152 // There should be no extension items yet. 174 // There should be no extension items yet.
153 EXPECT_EQ(0, CountExtensionItems(menu)); 175 EXPECT_EQ(0, CountExtensionItems(menu));
154 176
155 // Add a browser action menu item for |extension| to |manager|. 177 // Add a browser action menu item for |extension| to |manager|.
156 AddContextItemAndRefreshModel( 178 AddContextItemAndRefreshModel(
157 manager, extension.get(), MenuItem::BROWSER_ACTION, menu); 179 manager, extension.get(), MenuItem::BROWSER_ACTION, menu);
158 180
159 // Since |extension| has a page action, the browser action menu item should 181 // Since |extension| has a page action, the browser action menu item should
160 // not be present. 182 // not be present.
(...skipping 19 matching lines...) Expand all
180 CountExtensionItems(menu)); 202 CountExtensionItems(menu));
181 203
182 AddContextItemAndRefreshModel( 204 AddContextItemAndRefreshModel(
183 manager, extension.get(), MenuItem::PAGE_ACTION, menu); 205 manager, extension.get(), MenuItem::PAGE_ACTION, menu);
184 206
185 // Adding another top level item should not increase the count. 207 // Adding another top level item should not increase the count.
186 EXPECT_EQ(api::context_menus::ACTION_MENU_TOP_LEVEL_LIMIT, 208 EXPECT_EQ(api::context_menus::ACTION_MENU_TOP_LEVEL_LIMIT,
187 CountExtensionItems(menu)); 209 CountExtensionItems(menu));
188 } 210 }
189 211
190 } // namespace 212 // Test that the "show" and "hide" menu items appear correctly in the extension
213 // context menu.
214 TEST_F(ExtensionContextMenuModelTest, ExtensionContextMenuShowAndHide) {
215 InitializeEmptyExtensionService();
216 scoped_refptr<const Extension> page_action =
217 BuildExtension("page_action_extension", manifest_keys::kPageAction);
218 ASSERT_TRUE(page_action.get());
219 scoped_refptr<const Extension> browser_action =
220 BuildExtension("browser_action_extension", manifest_keys::kBrowserAction);
221 ASSERT_TRUE(browser_action.get());
222
223 service()->AddExtension(page_action.get());
224 service()->AddExtension(browser_action.get());
225
226 scoped_ptr<Browser> browser = CreateBrowser(profile());
227
228 scoped_refptr<ExtensionContextMenuModel> menu(
229 new ExtensionContextMenuModel(page_action.get(), browser.get()));
230
231 // For laziness.
232 const ExtensionContextMenuModel::MenuEntries visibility_command =
233 ExtensionContextMenuModel::TOGGLE_VISIBILITY;
234 base::string16 hide_string =
235 l10n_util::GetStringUTF16(IDS_EXTENSIONS_HIDE_BUTTON);
236 base::string16 show_string =
237 l10n_util::GetStringUTF16(IDS_EXTENSIONS_SHOW_BUTTON);
238 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
239
240 int index = GetCommandIndex(menu, visibility_command);
241 // Without the toolbar redesign switch, page action menus shouldn't have a
242 // visibility option.
243 EXPECT_EQ(-1, index);
244
245 menu = new ExtensionContextMenuModel(browser_action.get(), browser.get());
246 index = GetCommandIndex(menu, visibility_command);
247 // Browser actions should have the visibility option.
248 EXPECT_NE(-1, index);
249
250 // Enabling the toolbar redesign switch should give page actions the button.
251 FeatureSwitch::ScopedOverride enable_toolbar_redesign(
252 FeatureSwitch::extension_action_redesign(), true);
253 menu = new ExtensionContextMenuModel(page_action.get(), browser.get());
254 index = GetCommandIndex(menu, visibility_command);
255 EXPECT_NE(-1, index);
256
257 // Next, we test the command label.
258 menu = new ExtensionContextMenuModel(browser_action.get(), browser.get());
259 index = GetCommandIndex(menu, visibility_command);
260 // By default, browser actions should be visible (and therefore the button
261 // should be to hide).
262 EXPECT_TRUE(ExtensionActionAPI::GetBrowserActionVisibility(
263 prefs, browser_action->id()));
264 EXPECT_EQ(hide_string, menu->GetLabelAt(index));
265
266 // Hide the browser action. This should mean the string is "show".
267 ExtensionActionAPI::SetBrowserActionVisibility(
268 prefs, browser_action->id(), false);
269 menu = new ExtensionContextMenuModel(browser_action.get(), browser.get());
270 index = GetCommandIndex(menu, visibility_command);
271 EXPECT_NE(-1, index);
272 EXPECT_EQ(show_string, menu->GetLabelAt(index));
273 }
274
191 } // namespace extensions 275 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/browser/extensions/extension_context_menu_model.cc ('k') | chrome/browser/extensions/extension_toolbar_model.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698