summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordeepak.m1 <deepak.m1@samsung.com>2015-04-14 23:30:11 -0700
committerCommit bot <commit-bot@chromium.org>2015-04-15 06:30:30 +0000
commit75277b0f5f91981603f04c7d39a582b700e45830 (patch)
tree2be2ad3127bd85239d66496c782422b40e14905f
parentd7f0d7b7cbdd2b4645bcca1b8703307b9d7266a5 (diff)
downloadchromium_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.cc80
-rw-r--r--chrome/browser/extensions/test_extension_prefs.cc7
-rw-r--r--chrome/browser/extensions/test_extension_prefs.h3
-rw-r--r--extensions/browser/extension_prefs.cc8
-rw-r--r--extensions/browser/extension_prefs.h1
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 {