diff options
author | yoz@chromium.org <yoz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-26 10:38:42 +0000 |
---|---|---|
committer | yoz@chromium.org <yoz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-26 10:38:42 +0000 |
commit | c81f5d320735ef94097d08e1c2627ce7fd0842df (patch) | |
tree | f42e624467c97a756f67431cf864ff6e12713f04 | |
parent | 1df64bf50ea7132a0f9ccaa618f54ce716f439a7 (diff) | |
download | chromium_src-c81f5d320735ef94097d08e1c2627ce7fd0842df.zip chromium_src-c81f5d320735ef94097d08e1c2627ce7fd0842df.tar.gz chromium_src-c81f5d320735ef94097d08e1c2627ce7fd0842df.tar.bz2 |
Extension cleanup: Move scripting whitelist to ExtensionsClient.
BUG=298586
Review URL: https://codereview.chromium.org/30533006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@231188 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/apps/web_view_browsertest.cc | 5 | ||||
-rw-r--r-- | chrome/browser/extensions/all_urls_apitest.cc | 5 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_service.cc | 3 | ||||
-rw-r--r-- | chrome/common/extensions/chrome_extensions_client.cc | 25 | ||||
-rw-r--r-- | chrome/common/extensions/chrome_extensions_client.h | 9 | ||||
-rw-r--r-- | chrome/common/extensions/extension.cc | 57 | ||||
-rw-r--r-- | chrome/common/extensions/extension.h | 9 | ||||
-rw-r--r-- | chrome/common/extensions/extension_messages.h | 3 | ||||
-rw-r--r-- | chrome/common/extensions/permissions/permissions_data.cc | 14 | ||||
-rw-r--r-- | chrome/renderer/extensions/dispatcher.cc | 4 | ||||
-rw-r--r-- | chrome/renderer/extensions/dispatcher.h | 3 | ||||
-rw-r--r-- | chrome/renderer/extensions/renderer_permissions_policy_delegate.cc | 9 | ||||
-rw-r--r-- | extensions/common/extensions_client.h | 11 |
13 files changed, 69 insertions, 88 deletions
diff --git a/chrome/browser/apps/web_view_browsertest.cc b/chrome/browser/apps/web_view_browsertest.cc index 09f2352..d19f0fa 100644 --- a/chrome/browser/apps/web_view_browsertest.cc +++ b/chrome/browser/apps/web_view_browsertest.cc @@ -25,6 +25,7 @@ #include "content/public/common/content_switches.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/fake_speech_recognition_manager.h" +#include "extensions/common/extensions_client.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "net/test/embedded_test_server/http_request.h" #include "net/test/embedded_test_server/http_response.h" @@ -1747,10 +1748,10 @@ IN_PROC_BROWSER_TEST_F(WebViewTest, DownloadPermission) { // extension which has content script whitelisted/forced. IN_PROC_BROWSER_TEST_F(WebViewTest, WhitelistedContentScript) { // Whitelist the extension for running content script we are going to load. - extensions::Extension::ScriptingWhitelist whitelist; + extensions::ExtensionsClient::ScriptingWhitelist whitelist; const std::string extension_id = "imeongpbjoodlnmlakaldhlcmijmhpbb"; whitelist.push_back(extension_id); - extensions::Extension::SetScriptingWhitelist(whitelist); + extensions::ExtensionsClient::Get()->SetScriptingWhitelist(whitelist); // Load the extension. const extensions::Extension* content_script_whitelisted_extension = diff --git a/chrome/browser/extensions/all_urls_apitest.cc b/chrome/browser/extensions/all_urls_apitest.cc index 24a1886..b43227f 100644 --- a/chrome/browser/extensions/all_urls_apitest.cc +++ b/chrome/browser/extensions/all_urls_apitest.cc @@ -12,6 +12,7 @@ #include "chrome/common/extensions/extension.h" #include "chrome/test/base/test_switches.h" #include "chrome/test/base/ui_test_utils.h" +#include "extensions/common/extensions_client.h" #include "extensions/common/id_util.h" const std::string kAllUrlsTarget = @@ -39,10 +40,10 @@ IN_PROC_BROWSER_TEST_F(AllUrlsApiTest, MAYBE_WhitelistedExtension) { .AppendASCII("execute_script"); // Then add the two extensions to the whitelist. - extensions::Extension::ScriptingWhitelist whitelist; + extensions::ExtensionsClient::ScriptingWhitelist whitelist; whitelist.push_back(extensions::id_util::GenerateIdForPath(extension_dir1)); whitelist.push_back(extensions::id_util::GenerateIdForPath(extension_dir2)); - extensions::Extension::SetScriptingWhitelist(whitelist); + extensions::ExtensionsClient::Get()->SetScriptingWhitelist(whitelist); // Then load extensions. ExtensionService* service = extensions::ExtensionSystem::Get( diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc index 1e373f8..4f891fd 100644 --- a/chrome/browser/extensions/extension_service.cc +++ b/chrome/browser/extensions/extension_service.cc @@ -97,6 +97,7 @@ #include "content/public/browser/url_data_source.h" #include "extensions/common/constants.h" #include "extensions/common/error_utils.h" +#include "extensions/common/extensions_client.h" #include "extensions/common/manifest.h" #include "extensions/common/manifest_constants.h" #include "extensions/common/permissions/permission_message_provider.h" @@ -2842,7 +2843,7 @@ void ExtensionService::Observe(int type, // Scripting whitelist. This is modified by tests and must be communicated // to renderers. process->Send(new ExtensionMsg_SetScriptingWhitelist( - *Extension::GetScriptingWhitelist())); + extensions::ExtensionsClient::Get()->GetScriptingWhitelist())); // Loaded extensions. std::vector<ExtensionMsg_Loaded_Params> loaded_extensions; diff --git a/chrome/common/extensions/chrome_extensions_client.cc b/chrome/common/extensions/chrome_extensions_client.cc index dcc4d5f..8d16496 100644 --- a/chrome/common/extensions/chrome_extensions_client.cc +++ b/chrome/common/extensions/chrome_extensions_client.cc @@ -5,6 +5,7 @@ #include "chrome/common/extensions/chrome_extensions_client.h" #include "chrome/common/extensions/chrome_manifest_handlers.h" +#include "chrome/common/extensions/extension_constants.h" #include "chrome/common/extensions/features/base_feature_provider.h" #include "chrome/common/url_constants.h" #include "content/public/common/url_constants.h" @@ -28,6 +29,20 @@ ChromeExtensionsClient::~ChromeExtensionsClient() { void ChromeExtensionsClient::Initialize() { RegisterChromeManifestHandlers(); + + // Set up the scripting whitelist. + // Whitelist ChromeVox, an accessibility extension from Google that needs + // the ability to script webui pages. This is temporary and is not + // meant to be a general solution. + // TODO(dmazzoni): remove this once we have an extension API that + // allows any extension to request read-only access to webui pages. + scripting_whitelist_.push_back(extension_misc::kChromeVoxExtensionId); + + // Whitelist "Discover DevTools Companion" extension from Google that + // needs the ability to script DevTools pages. Companion will assist + // online courses and will be needed while the online educational programs + // are in place. + scripting_whitelist_.push_back("angkfkebojeancgemegoedelbnjgcgme"); } const PermissionsProvider& @@ -67,6 +82,16 @@ void ChromeExtensionsClient::FilterHostPermissions( } } +void ChromeExtensionsClient::SetScriptingWhitelist( + const ExtensionsClient::ScriptingWhitelist& whitelist) { + scripting_whitelist_ = whitelist; +} + +const ExtensionsClient::ScriptingWhitelist& +ChromeExtensionsClient::GetScriptingWhitelist() const { + return scripting_whitelist_; +} + // static ChromeExtensionsClient* ChromeExtensionsClient::GetInstance() { return g_client.Pointer(); diff --git a/chrome/common/extensions/chrome_extensions_client.h b/chrome/common/extensions/chrome_extensions_client.h index f832172..ca7b43b 100644 --- a/chrome/common/extensions/chrome_extensions_client.h +++ b/chrome/common/extensions/chrome_extensions_client.h @@ -32,6 +32,9 @@ class ChromeExtensionsClient : public ExtensionsClient { const URLPatternSet& hosts, URLPatternSet* new_hosts, std::set<PermissionMessage>* messages) const OVERRIDE; + virtual void SetScriptingWhitelist(const ScriptingWhitelist& whitelist) + OVERRIDE; + virtual const ScriptingWhitelist& GetScriptingWhitelist() const OVERRIDE; // Get the LazyInstance for ChromeExtensionsClient. static ChromeExtensionsClient* GetInstance(); @@ -40,6 +43,12 @@ class ChromeExtensionsClient : public ExtensionsClient { const ChromeAPIPermissions chrome_api_permissions_; const ChromePermissionMessageProvider permission_message_provider_; + // 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. + ScriptingWhitelist scripting_whitelist_; + friend struct base::DefaultLazyInstanceTraits<ChromeExtensionsClient>; DISALLOW_COPY_AND_ASSIGN(ChromeExtensionsClient); diff --git a/chrome/common/extensions/extension.cc b/chrome/common/extensions/extension.cc index 920f9cb..44e7215 100644 --- a/chrome/common/extensions/extension.cc +++ b/chrome/common/extensions/extension.cc @@ -62,41 +62,6 @@ const char kKeyInfoEndMarker[] = "KEY-----"; const char kPublic[] = "PUBLIC"; const char kPrivate[] = "PRIVATE"; -// A singleton object containing global data needed by the extension objects. -class ExtensionConfig { - public: - static ExtensionConfig* GetInstance() { - return Singleton<ExtensionConfig>::get(); - } - - Extension::ScriptingWhitelist* whitelist() { return &scripting_whitelist_; } - - private: - friend struct DefaultSingletonTraits<ExtensionConfig>; - - ExtensionConfig() { - // Whitelist ChromeVox, an accessibility extension from Google that needs - // the ability to script webui pages. This is temporary and is not - // meant to be a general solution. - // TODO(dmazzoni): remove this once we have an extension API that - // allows any extension to request read-only access to webui pages. - scripting_whitelist_.push_back(extension_misc::kChromeVoxExtensionId); - - // Whitelist "Discover DevTools Companion" extension from Google that - // needs the ability to script DevTools pages. Companion will assist - // online courses and will be needed while the online educational programs - // are in place. - scripting_whitelist_.push_back("angkfkebojeancgemegoedelbnjgcgme"); - } - ~ExtensionConfig() { } - - // 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_; -}; - bool ContainsReservedCharacters(const base::FilePath& path) { // We should disallow backslash '\\' as file path separator even on Windows, // because the backslash is not regarded as file path separator on Linux/Mac. @@ -110,11 +75,6 @@ bool ContainsReservedCharacters(const base::FilePath& path) { } // namespace -#if defined(OS_WIN) -const char Extension::kExtensionRegistryPath[] = - "Software\\Google\\Chrome\\Extensions"; -#endif - const char Extension::kMimeType[] = "application/x-chrome-extension"; const int Extension::kValidWebExtentSchemes = @@ -329,23 +289,6 @@ GURL Extension::GetBaseURLFromExtensionId(const std::string& extension_id) { content::kStandardSchemeSeparator + extension_id + "/"); } -// static -void Extension::SetScriptingWhitelist( - const Extension::ScriptingWhitelist& whitelist) { - ScriptingWhitelist* current_whitelist = - ExtensionConfig::GetInstance()->whitelist(); - current_whitelist->clear(); - for (ScriptingWhitelist::const_iterator it = whitelist.begin(); - it != whitelist.end(); ++it) { - current_whitelist->push_back(*it); - } -} - -// static -const Extension::ScriptingWhitelist* Extension::GetScriptingWhitelist() { - return ExtensionConfig::GetInstance()->whitelist(); -} - bool Extension::HasAPIPermission(APIPermission::ID permission) const { return PermissionsData::HasAPIPermission(this, permission); } diff --git a/chrome/common/extensions/extension.h b/chrome/common/extensions/extension.h index 913e0c24..2ebeeda 100644 --- a/chrome/common/extensions/extension.h +++ b/chrome/common/extensions/extension.h @@ -55,7 +55,6 @@ class Extension : public base::RefCountedThreadSafe<Extension> { public: struct ManifestData; - typedef std::vector<std::string> ScriptingWhitelist; typedef std::map<const std::string, linked_ptr<ManifestData> > ManifestDataMap; @@ -176,10 +175,6 @@ class Extension : public base::RefCountedThreadSafe<Extension> { // Valid schemes for host permission URLPatterns. static const int kValidHostPermissionSchemes; -#if defined(OS_WIN) - static const char kExtensionRegistryPath[]; -#endif - // The mimetype used for extensions. static const char kMimeType[]; @@ -229,10 +224,6 @@ class Extension : public base::RefCountedThreadSafe<Extension> { // Returns the base extension url for a given |extension_id|. static GURL GetBaseURLFromExtensionId(const std::string& extension_id); - // Adds an extension to the scripting whitelist. Used for testing only. - static void SetScriptingWhitelist(const ScriptingWhitelist& whitelist); - static const ScriptingWhitelist* GetScriptingWhitelist(); - // DEPRECATED: These methods have been moved to PermissionsData. // TODO(rdevlin.cronin): remove these once all calls have been updated. bool HasAPIPermission(APIPermission::ID permission) const; diff --git a/chrome/common/extensions/extension_messages.h b/chrome/common/extensions/extension_messages.h index c2b28c1..381a9d7 100644 --- a/chrome/common/extensions/extension_messages.h +++ b/chrome/common/extensions/extension_messages.h @@ -21,6 +21,7 @@ #include "content/public/common/common_param_traits.h" #include "content/public/common/socket_permission_request.h" #include "extensions/common/draggable_region.h" +#include "extensions/common/extensions_client.h" #include "extensions/common/url_pattern.h" #include "extensions/common/url_pattern_set.h" #include "extensions/common/view_type.h" @@ -347,7 +348,7 @@ IPC_MESSAGE_CONTROL1(ExtensionMsg_Unloaded, // only used for testing. IPC_MESSAGE_CONTROL1(ExtensionMsg_SetScriptingWhitelist, // extension ids - extensions::Extension::ScriptingWhitelist) + extensions::ExtensionsClient::ScriptingWhitelist) // Notification that renderer should run some JavaScript code. IPC_MESSAGE_ROUTED1(ExtensionMsg_ExecuteCode, diff --git a/chrome/common/extensions/permissions/permissions_data.cc b/chrome/common/extensions/permissions/permissions_data.cc index f5fe932..d6fb529 100644 --- a/chrome/common/extensions/permissions/permissions_data.cc +++ b/chrome/common/extensions/permissions/permissions_data.cc @@ -18,6 +18,7 @@ #include "content/public/common/url_constants.h" #include "extensions/common/constants.h" #include "extensions/common/error_utils.h" +#include "extensions/common/extensions_client.h" #include "extensions/common/features/feature.h" #include "extensions/common/features/feature_provider.h" #include "extensions/common/manifest.h" @@ -538,16 +539,11 @@ bool PermissionsData::CanExecuteScriptEverywhere(const Extension* extension) { if (extension->location() == Manifest::COMPONENT) return true; - const Extension::ScriptingWhitelist* whitelist = - Extension::GetScriptingWhitelist(); + const ExtensionsClient::ScriptingWhitelist& whitelist = + ExtensionsClient::Get()->GetScriptingWhitelist(); - for (Extension::ScriptingWhitelist::const_iterator iter = whitelist->begin(); - iter != whitelist->end(); ++iter) { - if (extension->id() == *iter) - return true; - } - - return false; + return std::find(whitelist.begin(), whitelist.end(), extension->id()) != + whitelist.end(); } // static diff --git a/chrome/renderer/extensions/dispatcher.cc b/chrome/renderer/extensions/dispatcher.cc index 3d011c6..9d85990 100644 --- a/chrome/renderer/extensions/dispatcher.cc +++ b/chrome/renderer/extensions/dispatcher.cc @@ -655,8 +655,8 @@ void Dispatcher::OnUnloaded(const std::string& id) { } void Dispatcher::OnSetScriptingWhitelist( - const Extension::ScriptingWhitelist& extension_ids) { - Extension::SetScriptingWhitelist(extension_ids); + const ExtensionsClient::ScriptingWhitelist& extension_ids) { + ExtensionsClient::Get()->SetScriptingWhitelist(extension_ids); } bool Dispatcher::IsExtensionActive( diff --git a/chrome/renderer/extensions/dispatcher.h b/chrome/renderer/extensions/dispatcher.h index e9ba78ca..a42a604 100644 --- a/chrome/renderer/extensions/dispatcher.h +++ b/chrome/renderer/extensions/dispatcher.h @@ -19,6 +19,7 @@ #include "chrome/renderer/resource_bundle_source_map.h" #include "content/public/renderer/render_process_observer.h" #include "extensions/common/event_filter.h" +#include "extensions/common/extensions_client.h" #include "extensions/common/features/feature.h" #include "third_party/WebKit/public/platform/WebString.h" #include "third_party/WebKit/public/platform/WebVector.h" @@ -174,7 +175,7 @@ class Dispatcher : public content::RenderProcessObserver { void OnLoadedInternal(scoped_refptr<const Extension> extension); void OnUnloaded(const std::string& id); void OnSetScriptingWhitelist( - const Extension::ScriptingWhitelist& extension_ids); + const ExtensionsClient::ScriptingWhitelist& extension_ids); void OnPageActionsUpdated(const std::string& extension_id, const std::vector<std::string>& page_actions); void OnActivateExtension(const std::string& extension_id); diff --git a/chrome/renderer/extensions/renderer_permissions_policy_delegate.cc b/chrome/renderer/extensions/renderer_permissions_policy_delegate.cc index d9a75cb..0f751b2 100644 --- a/chrome/renderer/extensions/renderer_permissions_policy_delegate.cc +++ b/chrome/renderer/extensions/renderer_permissions_policy_delegate.cc @@ -8,6 +8,7 @@ #include "chrome/common/chrome_switches.h" #include "chrome/common/extensions/extension_constants.h" #include "chrome/renderer/extensions/dispatcher.h" +#include "extensions/common/extensions_client.h" #include "extensions/common/manifest_constants.h" namespace extensions { @@ -30,10 +31,10 @@ bool RendererPermissionsPolicyDelegate::CanExecuteScriptOnPage( const UserScript* script, int process_id, std::string* error) { - const Extension::ScriptingWhitelist* whitelist = - Extension::GetScriptingWhitelist(); - if (std::find(whitelist->begin(), whitelist->end(), extension->id()) != - whitelist->end()) { + const ExtensionsClient::ScriptingWhitelist& whitelist = + ExtensionsClient::Get()->GetScriptingWhitelist(); + if (std::find(whitelist.begin(), whitelist.end(), extension->id()) != + whitelist.end()) { return true; } diff --git a/extensions/common/extensions_client.h b/extensions/common/extensions_client.h index ed06d32..57e25c4 100644 --- a/extensions/common/extensions_client.h +++ b/extensions/common/extensions_client.h @@ -7,6 +7,7 @@ #include <set> #include <string> +#include <vector> namespace extensions { @@ -20,6 +21,8 @@ class URLPatternSet; // process. This should be implemented by the client of the extensions system. class ExtensionsClient { public: + typedef std::vector<std::string> ScriptingWhitelist; + // Initializes global state. Not done in the constructor because unit tests // can create additional ExtensionsClients because the utility thread runs // in-process. @@ -45,6 +48,14 @@ class ExtensionsClient { URLPatternSet* new_hosts, std::set<PermissionMessage>* messages) const = 0; + // Replaces the scripting whitelist with |whitelist|. Used in the renderer; + // only used for testing in the browser process. + virtual void SetScriptingWhitelist(const ScriptingWhitelist& whitelist) = 0; + + // Return the whitelist of extensions that can run content scripts on + // any origin. + virtual const ScriptingWhitelist& GetScriptingWhitelist() const = 0; + // Return the extensions client. static ExtensionsClient* Get(); |