diff options
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/extensions/all_urls_apitest.cc | 14 | ||||
-rw-r--r-- | chrome/common/extensions/extension.cc | 61 | ||||
-rw-r--r-- | chrome/common/extensions/extension.h | 6 |
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_; |