diff options
author | deepak.m1 <deepak.m1@samsung.com> | 2015-04-14 23:30:11 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-04-15 06:30:30 +0000 |
commit | 75277b0f5f91981603f04c7d39a582b700e45830 (patch) | |
tree | 2be2ad3127bd85239d66496c782422b40e14905f | |
parent | d7f0d7b7cbdd2b4645bcca1b8703307b9d7266a5 (diff) | |
download | chromium_src-75277b0f5f91981603f04c7d39a582b700e45830.zip chromium_src-75277b0f5f91981603f04c7d39a582b700e45830.tar.gz chromium_src-75277b0f5f91981603f04c7d39a582b700e45830.tar.bz2 |
Fix for ERROR:url_pattern_set.cc(240)] Invalid url pattern: chrome://print/*
This issue is due to usage of UserScript::ValidUserScriptSchemes()
instead of UserScript::kValidUserScriptSchemes,
we will add CHROMEUI scheme in valid schemes mask if extension is component extension.
BUG=467230
Review URL: https://codereview.chromium.org/1025613003
Cr-Commit-Position: refs/heads/master@{#325197}
-rw-r--r-- | chrome/browser/extensions/extension_prefs_unittest.cc | 80 | ||||
-rw-r--r-- | chrome/browser/extensions/test_extension_prefs.cc | 7 | ||||
-rw-r--r-- | chrome/browser/extensions/test_extension_prefs.h | 3 | ||||
-rw-r--r-- | extensions/browser/extension_prefs.cc | 8 | ||||
-rw-r--r-- | extensions/browser/extension_prefs.h | 1 |
5 files changed, 99 insertions, 0 deletions
diff --git a/chrome/browser/extensions/extension_prefs_unittest.cc b/chrome/browser/extensions/extension_prefs_unittest.cc index d9067d3..9b2b74e 100644 --- a/chrome/browser/extensions/extension_prefs_unittest.cc +++ b/chrome/browser/extensions/extension_prefs_unittest.cc @@ -25,6 +25,7 @@ #include "extensions/browser/extension_prefs.h" #include "extensions/browser/install_flag.h" #include "extensions/common/extension.h" +#include "extensions/common/extension_builder.h" #include "extensions/common/manifest_constants.h" #include "extensions/common/permissions/permission_set.h" #include "extensions/common/permissions/permissions_info.h" @@ -913,4 +914,83 @@ class ExtensionPrefsClearLastLaunched : public ExtensionPrefsTest { }; TEST_F(ExtensionPrefsClearLastLaunched, ExtensionPrefsClearLastLaunched) {} +class ExtensionPrefsComponentExtension : public ExtensionPrefsTest { + public: + ~ExtensionPrefsComponentExtension() override {} + void Initialize() override { + // Adding a component extension. + component_extension_ = + ExtensionBuilder() + .SetManifest(DictionaryBuilder() + .Set(manifest_keys::kName, "a") + .Set(manifest_keys::kVersion, "0.1")) + .SetLocation(Manifest::COMPONENT) + .SetPath(prefs_.extensions_dir().AppendASCII("a")) + .Build(); + prefs_.AddExtension(component_extension_.get()); + + // Adding a non component extension. + no_component_extension_ = + ExtensionBuilder() + .SetManifest(DictionaryBuilder() + .Set(manifest_keys::kName, "b") + .Set(manifest_keys::kVersion, "0.1")) + .SetLocation(Manifest::INTERNAL) + .SetPath(prefs_.extensions_dir().AppendASCII("b")) + .Build(); + prefs_.AddExtension(no_component_extension_.get()); + + APIPermissionSet api_perms; + api_perms.insert(APIPermission::kTab); + api_perms.insert(APIPermission::kBookmark); + api_perms.insert(APIPermission::kHistory); + + ManifestPermissionSet empty_manifest_permissions; + + URLPatternSet ehosts, shosts; + AddPattern(&shosts, "chrome://print/*"); + + active_perms_ = new PermissionSet(api_perms, empty_manifest_permissions, + ehosts, shosts); + // Set the active permissions. + prefs()->SetActivePermissions(component_extension_->id(), + active_perms_.get()); + prefs()->SetActivePermissions(no_component_extension_->id(), + active_perms_.get()); + } + + void Verify() override { + // Component extension can access chrome://print/*. + scoped_refptr<PermissionSet> component_permissions( + prefs()->GetActivePermissions(component_extension_->id())); + EXPECT_EQ(1u, component_permissions->scriptable_hosts().size()); + + // Non Component extension can not access chrome://print/*. + scoped_refptr<PermissionSet> no_component_permissions( + prefs()->GetActivePermissions(no_component_extension_->id())); + EXPECT_EQ(0u, no_component_permissions->scriptable_hosts().size()); + + // |URLPattern::SCHEME_CHROMEUI| scheme will be added in valid_schemes for + // component extensions. + URLPatternSet scriptable_hosts; + std::string pref_key = "active_permissions.scriptable_host"; + int valid_schemes = URLPattern::SCHEME_ALL & ~URLPattern::SCHEME_CHROMEUI; + + EXPECT_TRUE(prefs()->ReadPrefAsURLPatternSet(component_extension_->id(), + pref_key, &scriptable_hosts, + valid_schemes)); + + EXPECT_FALSE(prefs()->ReadPrefAsURLPatternSet(no_component_extension_->id(), + pref_key, &scriptable_hosts, + valid_schemes)); + } + + private: + scoped_refptr<PermissionSet> active_perms_; + scoped_refptr<Extension> component_extension_; + scoped_refptr<Extension> no_component_extension_; +}; +TEST_F(ExtensionPrefsComponentExtension, ExtensionPrefsComponentExtension) { +} + } // namespace extensions diff --git a/chrome/browser/extensions/test_extension_prefs.cc b/chrome/browser/extensions/test_extension_prefs.cc index 4c98c5a..11f8317 100644 --- a/chrome/browser/extensions/test_extension_prefs.cc +++ b/chrome/browser/extensions/test_extension_prefs.cc @@ -176,6 +176,13 @@ std::string TestExtensionPrefs::AddExtensionAndReturnId( return extension->id(); } +void TestExtensionPrefs::AddExtension(Extension* extension) { + prefs_->OnExtensionInstalled(extension, + Extension::ENABLED, + syncer::StringOrdinal::CreateInitialOrdinal(), + std::string()); +} + PrefService* TestExtensionPrefs::CreateIncognitoPrefService() const { return pref_service_->CreateIncognitoPrefService( new ExtensionPrefStore(extension_pref_value_map_.get(), true)); diff --git a/chrome/browser/extensions/test_extension_prefs.h b/chrome/browser/extensions/test_extension_prefs.h index b451b71..94a383c 100644 --- a/chrome/browser/extensions/test_extension_prefs.h +++ b/chrome/browser/extensions/test_extension_prefs.h @@ -78,6 +78,9 @@ class TestExtensionPrefs { // assigned. std::string AddExtensionAndReturnId(const std::string& name); + // This will add extension in our ExtensionPrefs. + void AddExtension(Extension* extension); + PrefService* CreateIncognitoPrefService() const; // Allows disabling the loading of preferences of extensions. Becomes diff --git a/extensions/browser/extension_prefs.cc b/extensions/browser/extension_prefs.cc index 44853c8..ff70812 100644 --- a/extensions/browser/extension_prefs.cc +++ b/extensions/browser/extension_prefs.cc @@ -543,6 +543,14 @@ bool ExtensionPrefs::ReadPrefAsURLPatternSet(const std::string& extension_id, const base::ListValue* value = NULL; if (!ReadPrefAsList(extension_id, pref_key, &value)) return false; + const base::DictionaryValue* extension = GetExtensionPref(extension_id); + if (!extension) + return false; + int location; + if (extension->GetInteger(kPrefLocation, &location) && + static_cast<Manifest::Location>(location) == Manifest::COMPONENT) { + valid_schemes |= URLPattern::SCHEME_CHROMEUI; + } bool allow_file_access = AllowFileAccess(extension_id); return result->Populate(*value, valid_schemes, allow_file_access, NULL); diff --git a/extensions/browser/extension_prefs.h b/extensions/browser/extension_prefs.h index 09b4fba..f08e299 100644 --- a/extensions/browser/extension_prefs.h +++ b/extensions/browser/extension_prefs.h @@ -537,6 +537,7 @@ class ExtensionPrefs : public ExtensionScopedPrefs, public KeyedService { private: friend class ExtensionPrefsBlacklistedExtensions; // Unit test. + friend class ExtensionPrefsComponentExtension; // Unit test. friend class ExtensionPrefsUninstallExtension; // Unit test. enum DisableReasonChange { |