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

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

Issue 801603002: Add support for command line switches to Features, and as proof that it works, (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: test fixes Created 6 years 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
« no previous file with comments | « no previous file | chrome/common/extensions/api/_permission_features.json » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/crx_installer.h" 5 #include "chrome/browser/extensions/crx_installer.h"
6 6
7 #include "base/at_exit.h" 7 #include "base/at_exit.h"
8 #include "base/files/file_path.h"
8 #include "base/memory/ref_counted.h" 9 #include "base/memory/ref_counted.h"
9 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
10 #include "chrome/browser/download/download_crx_util.h" 11 #include "chrome/browser/download/download_crx_util.h"
11 #include "chrome/browser/extensions/browser_action_test_util.h" 12 #include "chrome/browser/extensions/browser_action_test_util.h"
12 #include "chrome/browser/extensions/extension_browsertest.h" 13 #include "chrome/browser/extensions/extension_browsertest.h"
13 #include "chrome/browser/extensions/extension_install_prompt.h" 14 #include "chrome/browser/extensions/extension_install_prompt.h"
14 #include "chrome/browser/extensions/extension_install_prompt_show_params.h" 15 #include "chrome/browser/extensions/extension_install_prompt_show_params.h"
15 #include "chrome/browser/extensions/extension_service.h" 16 #include "chrome/browser/extensions/extension_service.h"
16 #include "chrome/browser/extensions/extension_util.h" 17 #include "chrome/browser/extensions/extension_util.h"
17 #include "chrome/browser/extensions/fake_safe_browsing_database_manager.h" 18 #include "chrome/browser/extensions/fake_safe_browsing_database_manager.h"
(...skipping 12 matching lines...) Expand all
30 #include "content/public/test/test_utils.h" 31 #include "content/public/test/test_utils.h"
31 #include "extensions/browser/extension_prefs.h" 32 #include "extensions/browser/extension_prefs.h"
32 #include "extensions/browser/extension_registry.h" 33 #include "extensions/browser/extension_registry.h"
33 #include "extensions/browser/extension_system.h" 34 #include "extensions/browser/extension_system.h"
34 #include "extensions/browser/install/crx_installer_error.h" 35 #include "extensions/browser/install/crx_installer_error.h"
35 #include "extensions/browser/management_policy.h" 36 #include "extensions/browser/management_policy.h"
36 #include "extensions/browser/notification_types.h" 37 #include "extensions/browser/notification_types.h"
37 #include "extensions/common/extension.h" 38 #include "extensions/common/extension.h"
38 #include "extensions/common/feature_switch.h" 39 #include "extensions/common/feature_switch.h"
39 #include "extensions/common/file_util.h" 40 #include "extensions/common/file_util.h"
41 #include "extensions/common/permissions/api_permission.h"
40 #include "extensions/common/permissions/permission_set.h" 42 #include "extensions/common/permissions/permission_set.h"
43 #include "extensions/common/permissions/permissions_data.h"
41 #include "extensions/common/switches.h" 44 #include "extensions/common/switches.h"
42 #include "ui/base/l10n/l10n_util.h" 45 #include "ui/base/l10n/l10n_util.h"
43 46
44 #if defined(OS_CHROMEOS) 47 #if defined(OS_CHROMEOS)
45 #include "chrome/browser/chromeos/login/users/fake_user_manager.h" 48 #include "chrome/browser/chromeos/login/users/fake_user_manager.h"
46 #include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h" 49 #include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h"
47 #include "chrome/browser/extensions/extension_assets_manager_chromeos.h" 50 #include "chrome/browser/extensions/extension_assets_manager_chromeos.h"
48 #include "chromeos/chromeos_switches.h" 51 #include "chromeos/chromeos_switches.h"
49 #endif 52 #endif
50 53
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 return "ManagementPolicyMock"; 155 return "ManagementPolicyMock";
153 } 156 }
154 157
155 bool UserMayLoad(const Extension* extension, 158 bool UserMayLoad(const Extension* extension,
156 base::string16* error) const override { 159 base::string16* error) const override {
157 *error = base::UTF8ToUTF16("Dummy error message"); 160 *error = base::UTF8ToUTF16("Dummy error message");
158 return false; 161 return false;
159 } 162 }
160 }; 163 };
161 164
165 // Appends "enable-experimental-extension-apis" to the command line for the
166 // lifetime of this class.
167 class ScopedExperimentalCommandLine {
168 public:
169 ScopedExperimentalCommandLine() : saved_(*CommandLine::ForCurrentProcess()) {
170 CommandLine::ForCurrentProcess()->AppendSwitch(
171 switches::kEnableExperimentalExtensionApis);
172 }
173
174 ~ScopedExperimentalCommandLine() {
175 *CommandLine::ForCurrentProcess() = saved_;
176 }
177
178 private:
179 CommandLine saved_;
180 };
181
162 } // namespace 182 } // namespace
163 183
164 class ExtensionCrxInstallerTest : public ExtensionBrowserTest { 184 class ExtensionCrxInstallerTest : public ExtensionBrowserTest {
165 public: 185 protected:
166 scoped_ptr<WebstoreInstaller::Approval> GetApproval( 186 scoped_ptr<WebstoreInstaller::Approval> GetApproval(
167 const char* manifest_dir, 187 const char* manifest_dir,
168 const std::string& id, 188 const std::string& id,
169 bool strict_manifest_checks) { 189 bool strict_manifest_checks) {
170 scoped_ptr<WebstoreInstaller::Approval> result; 190 scoped_ptr<WebstoreInstaller::Approval> result;
171 191
172 base::FilePath ext_path = test_data_dir_.AppendASCII(manifest_dir); 192 base::FilePath ext_path = test_data_dir_.AppendASCII(manifest_dir);
173 std::string error; 193 std::string error;
174 scoped_ptr<base::DictionaryValue> parsed_manifest( 194 scoped_ptr<base::DictionaryValue> parsed_manifest(
175 file_util::LoadManifest(ext_path, &error)); 195 file_util::LoadManifest(ext_path, &error));
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 RunCrxInstaller(approval.get(), mock_install_prompt->CreatePrompt(), 232 RunCrxInstaller(approval.get(), mock_install_prompt->CreatePrompt(),
213 crx_path); 233 crx_path);
214 234
215 EXPECT_TRUE(mock_install_prompt->did_succeed()); 235 EXPECT_TRUE(mock_install_prompt->did_succeed());
216 } 236 }
217 237
218 // Installs an extension and checks that it has scopes granted IFF 238 // Installs an extension and checks that it has scopes granted IFF
219 // |record_oauth2_grant| is true. 239 // |record_oauth2_grant| is true.
220 void CheckHasEmptyScopesAfterInstall(const std::string& ext_relpath, 240 void CheckHasEmptyScopesAfterInstall(const std::string& ext_relpath,
221 bool record_oauth2_grant) { 241 bool record_oauth2_grant) {
222 CommandLine::ForCurrentProcess()->AppendSwitch( 242 ScopedExperimentalCommandLine scope;
223 switches::kEnableExperimentalExtensionApis);
224 243
225 scoped_refptr<MockPromptProxy> mock_prompt = 244 scoped_refptr<MockPromptProxy> mock_prompt =
226 CreateMockPromptProxyForBrowser(browser()); 245 CreateMockPromptProxyForBrowser(browser());
227 246
228 mock_prompt->set_record_oauth2_grant(record_oauth2_grant); 247 mock_prompt->set_record_oauth2_grant(record_oauth2_grant);
229 InstallWithPrompt("browsertest/scopes", std::string(), mock_prompt); 248 InstallWithPrompt("browsertest/scopes", std::string(), mock_prompt);
230 249
231 scoped_refptr<PermissionSet> permissions = 250 scoped_refptr<PermissionSet> permissions =
232 ExtensionPrefs::Get(browser()->profile()) 251 ExtensionPrefs::Get(browser()->profile())
233 ->GetGrantedPermissions(mock_prompt->extension_id()); 252 ->GetGrantedPermissions(mock_prompt->extension_id());
234 ASSERT_TRUE(permissions.get()); 253 ASSERT_TRUE(permissions.get());
235 } 254 }
255
256 // Returns a FilePath to an unpacked "experimental" extension (a test
257 // Extension which requests the "experimental" permission).
258 base::FilePath PackExperimentalExtension() {
259 // We must modify the command line temporarily in order to pack an
260 // extension that requests the experimental permission.
261 ScopedExperimentalCommandLine scope;
262 base::FilePath test_path = test_data_dir_.AppendASCII("experimental");
263 base::FilePath crx_path = PackExtension(test_path);
264 CHECK(!crx_path.empty()) << "Extension not found at " << test_path.value();
265 return crx_path;
266 }
236 }; 267 };
237 268
238 // This test is skipped on ChromeOS because it requires the NPAPI, 269 // This test is skipped on ChromeOS because it requires the NPAPI,
239 // which is not available on that platform. 270 // which is not available on that platform.
240 #if !defined(OS_CHROMEOS) 271 #if !defined(OS_CHROMEOS)
241 IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, Whitelisting) { 272 IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, Whitelisting) {
242 std::string id = "hdgllgikmikobbofgnabhfimcfoopgnd"; 273 std::string id = "hdgllgikmikobbofgnabhfimcfoopgnd";
243 ExtensionRegistry* registry = ExtensionRegistry::Get( 274 ExtensionRegistry* registry = ExtensionRegistry::Get(
244 browser()->profile()); 275 browser()->profile());
245 276
246 // Even whitelisted extensions with NPAPI should not prompt. 277 // Even whitelisted extensions with NPAPI should not prompt.
247 scoped_refptr<MockPromptProxy> mock_prompt = 278 scoped_refptr<MockPromptProxy> mock_prompt =
248 CreateMockPromptProxyForBrowser(browser()); 279 CreateMockPromptProxyForBrowser(browser());
249 InstallWithPrompt("uitest/plugins", id, mock_prompt); 280 InstallWithPrompt("uitest/plugins", id, mock_prompt);
250 EXPECT_FALSE(mock_prompt->confirmation_requested()); 281 EXPECT_FALSE(mock_prompt->confirmation_requested());
251 EXPECT_TRUE(registry->enabled_extensions().GetByID(id)); 282 EXPECT_TRUE(registry->enabled_extensions().GetByID(id));
252 } 283 }
253 #endif 284 #endif
254 285
255 IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, 286 IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest,
256 GalleryInstallGetsExperimental) { 287 ExperimentalExtensionFromGallery) {
257 // We must modify the command line temporarily in order to pack an extension 288 // Gallery-installed extensions should have their experimental permission
258 // that requests the experimental permission. 289 // preserved, since we allow the Webstore to make that decision.
259 CommandLine* command_line = CommandLine::ForCurrentProcess(); 290 base::FilePath crx_path = PackExperimentalExtension();
260 CommandLine old_command_line = *command_line; 291 const Extension* extension = InstallExtensionFromWebstore(crx_path, 1);
261 command_line->AppendSwitch(switches::kEnableExperimentalExtensionApis); 292 ASSERT_TRUE(extension);
262 base::FilePath crx_path = PackExtension( 293 EXPECT_TRUE(extension->permissions_data()->HasAPIPermission(
263 test_data_dir_.AppendASCII("experimental")); 294 APIPermission::kExperimental));
264 ASSERT_FALSE(crx_path.empty()); 295 }
265 296
266 // Now reset the command line so that we are testing specifically whether 297 IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest,
267 // installing from webstore enables experimental permissions. 298 ExperimentalExtensionFromOutsideGallery) {
268 *(CommandLine::ForCurrentProcess()) = old_command_line; 299 // Non-gallery-installed extensions should lose their experimental
300 // permission if the flag isn't enabled.
301 base::FilePath crx_path = PackExperimentalExtension();
302 const Extension* extension = InstallExtension(crx_path, 1);
303 ASSERT_TRUE(extension);
304 EXPECT_FALSE(extension->permissions_data()->HasAPIPermission(
305 APIPermission::kExperimental));
306 }
269 307
270 EXPECT_FALSE(InstallExtension(crx_path, 0)); 308 IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest,
271 EXPECT_TRUE(InstallExtensionFromWebstore(crx_path, 1)); 309 ExperimentalExtensionFromOutsideGalleryWithFlag) {
310 // Non-gallery-installed extensions should maintain their experimental
311 // permission if the flag is enabled.
312 base::FilePath crx_path = PackExperimentalExtension();
313 ScopedExperimentalCommandLine scope;
314 const Extension* extension = InstallExtension(crx_path, 1);
315 ASSERT_TRUE(extension);
316 EXPECT_TRUE(extension->permissions_data()->HasAPIPermission(
317 APIPermission::kExperimental));
272 } 318 }
273 319
274 IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, PlatformAppCrx) { 320 IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, PlatformAppCrx) {
275 CommandLine::ForCurrentProcess()->AppendSwitch( 321 ScopedExperimentalCommandLine scope;
276 switches::kEnableExperimentalExtensionApis);
277 EXPECT_TRUE(InstallExtension( 322 EXPECT_TRUE(InstallExtension(
278 test_data_dir_.AppendASCII("minimal_platform_app.crx"), 1)); 323 test_data_dir_.AppendASCII("minimal_platform_app.crx"), 1));
279 } 324 }
280 325
281 IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, PackAndInstallExtension) { 326 IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, PackAndInstallExtension) {
282 if (!FeatureSwitch::easy_off_store_install()->IsEnabled()) 327 if (!FeatureSwitch::easy_off_store_install()->IsEnabled())
283 return; 328 return;
284 329
285 const int kNumDownloadsExpected = 1; 330 const int kNumDownloadsExpected = 1;
286 331
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
595 // because previously withheld permissions are now being requested. 640 // because previously withheld permissions are now being requested.
596 enable_scripts_switch.reset(); 641 enable_scripts_switch.reset();
597 extension = InstallExtension(crx_path, -1); 642 extension = InstallExtension(crx_path, -1);
598 EXPECT_FALSE(registry->enabled_extensions().GetByID(extension_id)); 643 EXPECT_FALSE(registry->enabled_extensions().GetByID(extension_id));
599 EXPECT_TRUE(registry->disabled_extensions().GetByID(extension_id)); 644 EXPECT_TRUE(registry->disabled_extensions().GetByID(extension_id));
600 EXPECT_TRUE(ExtensionPrefs::Get(browser()->profile())->GetDisableReasons( 645 EXPECT_TRUE(ExtensionPrefs::Get(browser()->profile())->GetDisableReasons(
601 extension_id) & Extension::DISABLE_PERMISSIONS_INCREASE); 646 extension_id) & Extension::DISABLE_PERMISSIONS_INCREASE);
602 } 647 }
603 648
604 } // namespace extensions 649 } // namespace extensions
OLDNEW
« no previous file with comments | « no previous file | chrome/common/extensions/api/_permission_features.json » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698