summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/extensions/all_urls_apitest.cc14
-rw-r--r--chrome/common/extensions/extension.cc61
-rw-r--r--chrome/common/extensions/extension.h6
3 files changed, 39 insertions, 42 deletions
diff --git a/chrome/browser/extensions/all_urls_apitest.cc b/chrome/browser/extensions/all_urls_apitest.cc
index 7de8eb4..24166fc 100644
--- a/chrome/browser/extensions/all_urls_apitest.cc
+++ b/chrome/browser/extensions/all_urls_apitest.cc
@@ -15,8 +15,7 @@ const std::string kAllUrlsTarget =
typedef ExtensionApiTest AllUrlsApiTest;
-// Flaky, see http://crbug.com/57694.
-IN_PROC_BROWSER_TEST_F(AllUrlsApiTest, FLAKY_WhitelistedExtension) {
+IN_PROC_BROWSER_TEST_F(AllUrlsApiTest, WhitelistedExtension) {
// First load the two extension.
FilePath extension_dir1 = test_data_dir_.AppendASCII("all_urls")
.AppendASCII("content_script");
@@ -31,12 +30,11 @@ IN_PROC_BROWSER_TEST_F(AllUrlsApiTest, FLAKY_WhitelistedExtension) {
Extension* extensionA = service->extensions()->at(size_before);
Extension* extensionB = service->extensions()->at(size_before + 1);
- const char* kCanExecuteScriptsEverywhere[] = {
- extensionA->id().c_str(),
- extensionB->id().c_str(),
- };
- Extension::SetScriptingWhitelist(kCanExecuteScriptsEverywhere,
- arraysize(kCanExecuteScriptsEverywhere));
+ // Then add the two extensions to the whitelist.
+ Extension::ScriptingWhitelist whitelist;
+ whitelist.push_back(extensionA->id().c_str());
+ whitelist.push_back(extensionB->id().c_str());
+ Extension::SetScriptingWhitelist(whitelist);
// Ideally, we'd set the whitelist first and then load the extensions.
// However, we can't reliably know the ids of the extensions until we load
diff --git a/chrome/common/extensions/extension.cc b/chrome/common/extensions/extension.cc
index cc6b8585..752b051 100644
--- a/chrome/common/extensions/extension.cc
+++ b/chrome/common/extensions/extension.cc
@@ -131,42 +131,37 @@ const char* kNonPermissionFunctionNames[] = {
const size_t kNumNonPermissionFunctionNames =
arraysize(kNonPermissionFunctionNames);
-// Ids of extensions allowed to execute scripts everywhere. Do not add to this
-// list without consulting the Extensions team first.
-// Note: Component extensions have this right implicitly and do not need to be
-// added to this list.
-const char* kCanExecuteScriptsEverywhere[] = {
- "", // Extension ids for whitelisted extensions go here.
-};
-
-// The size of the kCanExecuteScriptsEverywhere list.
-static size_t kNumCanExecuteScriptsEverywhere =
- arraysize(kCanExecuteScriptsEverywhere);
-
-// A map between permission name and its install warning message.
-class PermissionMap {
+// A singleton object containing global data needed by the extension objects.
+class ExtensionConfig {
public:
- static PermissionMap* GetSingleton() {
- return Singleton<PermissionMap>::get();
+ static ExtensionConfig* GetSingleton() {
+ return Singleton<ExtensionConfig>::get();
}
int GetPermissionMessageId(const std::string& permission) {
return Extension::kPermissions[permission_map_[permission]].message_id;
}
+ Extension::ScriptingWhitelist* whitelist() { return &scripting_whitelist_; }
+
private:
- friend struct DefaultSingletonTraits<PermissionMap>;
+ friend struct DefaultSingletonTraits<ExtensionConfig>;
- PermissionMap() {
+ ExtensionConfig() {
for (size_t i = 0; i < Extension::kNumPermissions; ++i)
permission_map_[Extension::kPermissions[i].name] = i;
};
- ~PermissionMap() { }
+ ~ExtensionConfig() { }
std::map<const std::string, size_t> permission_map_;
-};
+ // A whitelist of extensions that can script anywhere. Do not add to this
+ // list (except in tests) without consulting the Extensions team first.
+ // Note: Component extensions have this right implicitly and do not need to be
+ // added to this list.
+ Extension::ScriptingWhitelist scripting_whitelist_;
+};
// Aliased to kTabPermission for purposes of API checks, but not allowed
// in the permissions field of the manifest.
@@ -174,9 +169,6 @@ static const char kWindowPermission[] = "windows";
} // namespace
-char** Extension::scripting_whitelist_ =
- const_cast<char**>(&kCanExecuteScriptsEverywhere[0]);
-
const FilePath::CharType Extension::kManifestFilename[] =
FILE_PATH_LITERAL("manifest.json");
const FilePath::CharType Extension::kLocaleFolder[] =
@@ -273,7 +265,7 @@ Extension::StaticData::~StaticData() {
// static
int Extension::GetPermissionMessageId(const std::string& permission) {
- return PermissionMap::GetSingleton()->GetPermissionMessageId(permission);
+ return ExtensionConfig::GetSingleton()->GetPermissionMessageId(permission);
}
std::vector<string16> Extension::GetPermissionMessages() {
@@ -1909,10 +1901,15 @@ static std::string SizeToString(const gfx::Size& max_size) {
}
// static
-void Extension::SetScriptingWhitelist(const char** whitelist, size_t size) {
- DCHECK(whitelist);
- scripting_whitelist_ = const_cast<char**>(whitelist);
- kNumCanExecuteScriptsEverywhere = size;
+void Extension::SetScriptingWhitelist(
+ const std::vector<std::string>& whitelist) {
+ ScriptingWhitelist* current_whitelist =
+ ExtensionConfig::GetSingleton()->whitelist();
+ current_whitelist->clear();
+ for (ScriptingWhitelist::const_iterator it = whitelist.begin();
+ it != whitelist.end(); ++it) {
+ current_whitelist->push_back(*it);
+ }
}
void Extension::SetCachedImage(const ExtensionResource& source,
@@ -2143,8 +2140,12 @@ bool Extension::CanExecuteScriptEverywhere() const {
if (location() == Extension::COMPONENT)
return true;
- for (size_t i = 0; i < kNumCanExecuteScriptsEverywhere; ++i) {
- if (id() == scripting_whitelist_[i])
+ ScriptingWhitelist* whitelist =
+ ExtensionConfig::GetSingleton()->whitelist();
+
+ for (ScriptingWhitelist::const_iterator it = whitelist->begin();
+ it != whitelist->end(); ++it) {
+ if (id() == *it)
return true;
}
diff --git a/chrome/common/extensions/extension.h b/chrome/common/extensions/extension.h
index e012ad6..8190b3c 100644
--- a/chrome/common/extensions/extension.h
+++ b/chrome/common/extensions/extension.h
@@ -33,6 +33,7 @@ class Version;
class Extension {
public:
typedef std::map<const std::string, GURL> URLOverrideMap;
+ typedef std::vector<std::string> ScriptingWhitelist;
// What an extension was loaded from.
// NOTE: These values are stored as integers in the preferences, so you
@@ -324,7 +325,7 @@ class Extension {
std::string* error);
// Adds an extension to the scripting whitelist. Used for testing only.
- static void SetScriptingWhitelist(const char** whitelist, size_t size);
+ static void SetScriptingWhitelist(const ScriptingWhitelist& whitelist);
// Initialize the extension from a parsed manifest.
// Usually, the id of an extension is generated by the "key" property of
@@ -646,9 +647,6 @@ class Extension {
// The type of container to launch into.
extension_misc::LaunchContainer launch_container_;
- // A whitelist of extensions that can script anywhere.
- static char** scripting_whitelist_;
-
// The default size of the container when launching. Only respected for
// containers like panels and windows.
int launch_width_;