summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryoz@chromium.org <yoz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-26 10:38:42 +0000
committeryoz@chromium.org <yoz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-26 10:38:42 +0000
commitc81f5d320735ef94097d08e1c2627ce7fd0842df (patch)
treef42e624467c97a756f67431cf864ff6e12713f04
parent1df64bf50ea7132a0f9ccaa618f54ce716f439a7 (diff)
downloadchromium_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.cc5
-rw-r--r--chrome/browser/extensions/all_urls_apitest.cc5
-rw-r--r--chrome/browser/extensions/extension_service.cc3
-rw-r--r--chrome/common/extensions/chrome_extensions_client.cc25
-rw-r--r--chrome/common/extensions/chrome_extensions_client.h9
-rw-r--r--chrome/common/extensions/extension.cc57
-rw-r--r--chrome/common/extensions/extension.h9
-rw-r--r--chrome/common/extensions/extension_messages.h3
-rw-r--r--chrome/common/extensions/permissions/permissions_data.cc14
-rw-r--r--chrome/renderer/extensions/dispatcher.cc4
-rw-r--r--chrome/renderer/extensions/dispatcher.h3
-rw-r--r--chrome/renderer/extensions/renderer_permissions_policy_delegate.cc9
-rw-r--r--extensions/common/extensions_client.h11
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();