summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/extensions
diff options
context:
space:
mode:
authormpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-25 22:10:50 +0000
committermpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-25 22:10:50 +0000
commitdb7331aecb1f0c01aecf4cd4627d08a8d5b08bc2 (patch)
tree5a33fc21cb1628462f9e365add27aeaf058d60fc /chrome/renderer/extensions
parentf56abff188b90b7f2d67a094930d7d9407df507d (diff)
downloadchromium_src-db7331aecb1f0c01aecf4cd4627d08a8d5b08bc2.zip
chromium_src-db7331aecb1f0c01aecf4cd4627d08a8d5b08bc2.tar.gz
chromium_src-db7331aecb1f0c01aecf4cd4627d08a8d5b08bc2.tar.bz2
Allow users to enable extensions in incognito. Requires
--enable-experimental-extension-apis . The UI needs work. Tab and window events are hooked up so that they work with incognito tabs/windows when enabled. BUG=32365 BUG=36292 Review URL: http://codereview.chromium.org/657041 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@40057 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/extensions')
-rw-r--r--chrome/renderer/extensions/extension_api_client_unittest.cc4
-rw-r--r--chrome/renderer/extensions/extension_process_bindings.cc25
-rw-r--r--chrome/renderer/extensions/extension_process_bindings.h4
3 files changed, 31 insertions, 2 deletions
diff --git a/chrome/renderer/extensions/extension_api_client_unittest.cc b/chrome/renderer/extensions/extension_api_client_unittest.cc
index 39d275f..7158a8c 100644
--- a/chrome/renderer/extensions/extension_api_client_unittest.cc
+++ b/chrome/renderer/extensions/extension_api_client_unittest.cc
@@ -80,7 +80,7 @@ TEST_F(ExtensionAPIClientTest, CallbackDispatching) {
"function callback(result) {"
" assert(typeof result == 'object', 'result not object');"
" assert(JSON.stringify(result) == '{\"id\":1,\"index\":1,\"windowId\":1,"
- "\"selected\":true,"
+ "\"selected\":true,\"incognito\":false,"
"\"url\":\"http://www.google.com/\"}',"
" 'incorrect result');"
" console.log('pass')"
@@ -103,7 +103,7 @@ TEST_F(ExtensionAPIClientTest, CallbackDispatching) {
// Now send the callback a response
ExtensionProcessBindings::HandleResponse(
callback_id, true, "{\"id\":1,\"index\":1,\"windowId\":1,\"selected\":true,"
- "\"url\":\"http://www.google.com/\"}", "");
+ "\"incognito\":false,\"url\":\"http://www.google.com/\"}", "");
// And verify that it worked
ASSERT_EQ("pass", GetConsoleMessage());
diff --git a/chrome/renderer/extensions/extension_process_bindings.cc b/chrome/renderer/extensions/extension_process_bindings.cc
index f065dd9..694c276 100644
--- a/chrome/renderer/extensions/extension_process_bindings.cc
+++ b/chrome/renderer/extensions/extension_process_bindings.cc
@@ -55,6 +55,9 @@ typedef std::map<std::string, bool> PermissionsMap;
// A map of extension ID to permissions map.
typedef std::map<std::string, PermissionsMap> ExtensionPermissionsMap;
+// A map of extension ID to whether this extension was enabled in incognito.
+typedef std::map<std::string, bool> IncognitoEnabledMap;
+
const char kExtensionName[] = "chrome/ExtensionProcessBindings";
const char* kExtensionDeps[] = {
BaseJsV8Extension::kName,
@@ -68,6 +71,7 @@ struct SingletonData {
std::set<std::string> function_names_;
PageActionIdMap page_action_ids_;
ExtensionPermissionsMap permissions_;
+ std::map<std::string, bool> incognito_enabled_map_;
};
static std::set<std::string>* GetFunctionNameSet() {
@@ -82,6 +86,10 @@ static PermissionsMap* GetPermissionsMap(const std::string& extension_id) {
return &Singleton<SingletonData>()->permissions_[extension_id];
}
+static std::map<std::string, bool>* GetIncognitoEnabledMap() {
+ return &Singleton<SingletonData>()->incognito_enabled_map_;
+}
+
static void GetActiveExtensionIDs(std::set<std::string>* extension_ids) {
ExtensionPermissionsMap& permissions =
Singleton<SingletonData>()->permissions_;
@@ -237,6 +245,8 @@ class ExtensionImpl : public ExtensionBase {
return v8::FunctionTemplate::New(GetPopupParentWindow);
} else if (name->Equals(v8::String::New("SetExtensionActionIcon"))) {
return v8::FunctionTemplate::New(SetExtensionActionIcon);
+ } else if (name->Equals(v8::String::New("CanAccessIncognito"))) {
+ return v8::FunctionTemplate::New(CanAccessIncognito);
}
return ExtensionBase::GetNativeFunction(name);
@@ -495,6 +505,16 @@ class ExtensionImpl : public ExtensionBase {
return StartRequestCommon(args, dict);
}
+ // Returns true if the extension can access incognito data.
+ static v8::Handle<v8::Value> CanAccessIncognito(const v8::Arguments& args) {
+ std::string extension_id = ExtensionIdForCurrentContext();
+ if (extension_id.empty())
+ return v8::False();
+
+ bool enabled = (*GetIncognitoEnabledMap())[extension_id];
+ return v8::Boolean::New(enabled);
+ }
+
static v8::Handle<v8::Value> GetRenderViewId(const v8::Arguments& args) {
RenderView* renderview = bindings_utils::GetRenderViewForCurrentContext();
if (!renderview)
@@ -520,6 +540,11 @@ void ExtensionProcessBindings::SetFunctionNames(
ExtensionImpl::SetFunctionNames(names);
}
+void ExtensionProcessBindings::SetIncognitoEnabled(
+ const std::string& extension_id, bool enabled) {
+ (*GetIncognitoEnabledMap())[extension_id] = enabled;
+}
+
// static
void ExtensionProcessBindings::HandleResponse(int request_id, bool success,
const std::string& response,
diff --git a/chrome/renderer/extensions/extension_process_bindings.h b/chrome/renderer/extensions/extension_process_bindings.h
index 2fd7613..93c7d24 100644
--- a/chrome/renderer/extensions/extension_process_bindings.h
+++ b/chrome/renderer/extensions/extension_process_bindings.h
@@ -46,6 +46,10 @@ class ExtensionProcessBindings {
static void SetHostPermissions(const GURL& extension_url,
const std::vector<URLPattern>& permissions);
+ // Sets whether incognito is enabled for a particular extension.
+ static void SetIncognitoEnabled(const std::string& extension_id,
+ bool enabled);
+
// Check if the extension in the currently running context has permission to
// access the given extension function. Must be called with a valid V8
// context in scope.