Index: chrome/renderer/extensions/extension_process_bindings.cc |
=================================================================== |
--- chrome/renderer/extensions/extension_process_bindings.cc (revision 24584) |
+++ chrome/renderer/extensions/extension_process_bindings.cc (working copy) |
@@ -9,6 +9,7 @@ |
#include "chrome/common/extensions/url_pattern.h" |
#include "chrome/common/render_messages.h" |
#include "chrome/common/url_constants.h" |
+#include "chrome/renderer/extension_groups.h" |
#include "chrome/renderer/extensions/bindings_utils.h" |
#include "chrome/renderer/extensions/event_bindings.h" |
#include "chrome/renderer/extensions/js_only_v8_extensions.h" |
@@ -17,6 +18,7 @@ |
#include "grit/common_resources.h" |
#include "grit/renderer_resources.h" |
#include "webkit/api/public/WebFrame.h" |
+#include "webkit/api/public/WebScriptSource.h" |
#include "webkit/api/public/WebURL.h" |
#include "webkit/api/public/WebKit.h" |
@@ -28,6 +30,8 @@ |
using bindings_utils::PendingRequest; |
using bindings_utils::PendingRequestMap; |
using bindings_utils::ExtensionBase; |
+using WebKit::WebScriptSource; |
+using WebKit::WebString; |
namespace { |
@@ -105,12 +109,46 @@ |
return v8::FunctionTemplate::New(GetCurrentPageActions); |
} else if (name->Equals(v8::String::New("StartRequest"))) { |
return v8::FunctionTemplate::New(StartRequest); |
+ } else if (name->Equals(v8::String::New("ExecuteScript"))) { |
+ return v8::FunctionTemplate::New(ExecuteScript); |
+ } else if (name->Equals(v8::String::New("ExecuteScriptWithUrl"))) { |
+ return v8::FunctionTemplate::New(ExecuteScriptWithUrl); |
} |
return ExtensionBase::GetNativeFunction(name); |
} |
private: |
+ static v8::Handle<v8::Value> ExecuteScript(const v8::Arguments& args) { |
+ if (args.Length() != 1 || !args[0]->IsString()) |
+ return v8::Boolean::New(false); |
+ |
+ std::string script_source = *v8::String::Utf8Value(args[0]->ToString()); |
+ WebScriptSource web_script = WebScriptSource( |
+ WebString::fromUTF8(script_source)); |
+ RenderView* renderview = bindings_utils::GetRenderViewForCurrentContext(); |
+ if (!renderview) |
+ return v8::Boolean::New(false); |
+ |
+ renderview->webview()->GetMainFrame()->executeScriptInNewWorld( |
+ &web_script, 1, EXTENSION_GROUP_CONTENT_SCRIPTS); |
+ return v8::Boolean::New(true); |
+ } |
+ |
+ static v8::Handle<v8::Value> ExecuteScriptWithUrl(const v8::Arguments& args) { |
+ if (args.Length() != 2) |
+ return v8::Undefined(); |
+ |
+ if (!args[0]->IsInt32() || !args[1]->IsString()) |
+ return v8::Undefined(); |
+ |
+ int request_id = args[0]->Int32Value(); |
+ std::string script_url = *v8::String::Utf8Value(args[1]->ToString()); |
+ SendExtensionRequest("extension.executeScriptWithUrl", script_url, |
+ request_id, true); |
+ return v8::Boolean::New(true); |
+ } |
+ |
static v8::Handle<v8::Value> GetExtensionAPIDefinition( |
const v8::Arguments& args) { |
return v8::String::New(GetStringResource<IDR_EXTENSION_API_JSON>()); |
@@ -233,12 +271,6 @@ |
// Starts an API request to the browser, with an optional callback. The |
// callback will be dispatched to EventBindings::HandleResponse. |
static v8::Handle<v8::Value> StartRequest(const v8::Arguments& args) { |
- // Get the current RenderView so that we can send a routed IPC message from |
- // the correct source. |
- RenderView* renderview = bindings_utils::GetRenderViewForCurrentContext(); |
- if (!renderview) |
- return v8::Undefined(); |
- |
if (args.Length() != 4 || !args[0]->IsString() || !args[1]->IsString() || |
!args[2]->IsInt32() || !args[3]->IsBoolean()) |
return v8::Undefined(); |
@@ -260,7 +292,20 @@ |
std::string json_args = *v8::String::Utf8Value(args[1]); |
int request_id = args[2]->Int32Value(); |
bool has_callback = args[3]->BooleanValue(); |
+ SendExtensionRequest(name, json_args, request_id, has_callback); |
+ return v8::Undefined(); |
+ } |
+ |
+ static bool SendExtensionRequest(std::string name, |
+ std::string json_args, |
+ int request_id, |
+ bool has_callback) { |
+ // Get the current RenderView so that we can send a routed IPC message from |
+ // the correct source. |
+ RenderView* renderview = bindings_utils::GetRenderViewForCurrentContext(); |
+ if (!renderview) |
+ return false; |
v8::Persistent<v8::Context> current_context = |
v8::Persistent<v8::Context>::New(v8::Context::GetCurrent()); |
DCHECK(!current_context.IsEmpty()); |
@@ -268,8 +313,7 @@ |
current_context, name)); |
renderview->SendExtensionRequest(name, json_args, request_id, has_callback); |
- |
- return v8::Undefined(); |
+ return true; |
} |
}; |