diff options
Diffstat (limited to 'chromium/content/renderer/web_ui_extension.cc')
-rw-r--r-- | chromium/content/renderer/web_ui_extension.cc | 149 |
1 files changed, 59 insertions, 90 deletions
diff --git a/chromium/content/renderer/web_ui_extension.cc b/chromium/content/renderer/web_ui_extension.cc index f887e9d765e..11565f2b4ac 100644 --- a/chromium/content/renderer/web_ui_extension.cc +++ b/chromium/content/renderer/web_ui_extension.cc @@ -13,74 +13,23 @@ #include "content/public/renderer/render_view.h" #include "content/public/renderer/v8_value_converter.h" #include "content/renderer/web_ui_extension_data.h" +#include "gin/arguments.h" +#include "gin/function_template.h" #include "third_party/WebKit/public/web/WebDocument.h" -#include "third_party/WebKit/public/web/WebFrame.h" +#include "third_party/WebKit/public/web/WebKit.h" +#include "third_party/WebKit/public/web/WebLocalFrame.h" #include "third_party/WebKit/public/web/WebView.h" #include "url/gurl.h" #include "v8/include/v8.h" namespace content { -static const char* const kWebUIExtensionName = "v8/WebUI"; +namespace { -// Javascript that gets executed when the extension loads into all frames. -// Exposes two methods: -// - chrome.send: Used to send messages to the browser. Requires the message -// name as the first argument and can have an optional second argument that -// should be an array. -// - chrome.getVariableValue: Returns value for the input variable name if such -// a value was set by the browser. Else will return an empty string. -static const char* const kWebUIExtensionJS = - "var chrome;" - "if (!chrome)" - " chrome = {};" - "chrome.send = function(name, data) {" - " native function Send();" - " Send(name, data);" - "};" - "chrome.getVariableValue = function(name) {" - " native function GetVariableValue();" - " return GetVariableValue(name);" - "};"; - -class WebUIExtensionWrapper : public v8::Extension { - public: - WebUIExtensionWrapper(); - virtual ~WebUIExtensionWrapper(); - - virtual v8::Handle<v8::FunctionTemplate> GetNativeFunctionTemplate( - v8::Isolate* isolate, - v8::Handle<v8::String> name) OVERRIDE; - static void Send(const v8::FunctionCallbackInfo<v8::Value>& args); - static void GetVariableValue(const v8::FunctionCallbackInfo<v8::Value>& args); - - private: - static bool ShouldRespondToRequest(blink::WebFrame** frame_ptr, - RenderView** render_view_ptr); - - DISALLOW_COPY_AND_ASSIGN(WebUIExtensionWrapper); -}; - -WebUIExtensionWrapper::WebUIExtensionWrapper() - : v8::Extension(kWebUIExtensionName, kWebUIExtensionJS) {} - -WebUIExtensionWrapper::~WebUIExtensionWrapper() {} - -v8::Handle<v8::FunctionTemplate> -WebUIExtensionWrapper::GetNativeFunctionTemplate(v8::Isolate* isolate, - v8::Handle<v8::String> name) { - if (name->Equals(v8::String::NewFromUtf8(isolate, "Send"))) - return v8::FunctionTemplate::New(isolate, Send); - if (name->Equals(v8::String::NewFromUtf8(isolate, "GetVariableValue"))) - return v8::FunctionTemplate::New(isolate, GetVariableValue); - return v8::Handle<v8::FunctionTemplate>(); -} - -// static -bool WebUIExtensionWrapper::ShouldRespondToRequest( +bool ShouldRespondToRequest( blink::WebFrame** frame_ptr, RenderView** render_view_ptr) { - blink::WebFrame* frame = blink::WebFrame::frameForCurrentContext(); + blink::WebFrame* frame = blink::WebLocalFrame::frameForCurrentContext(); if (!frame || !frame->view()) return false; @@ -92,8 +41,8 @@ bool WebUIExtensionWrapper::ShouldRespondToRequest( bool webui_enabled = (render_view->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI) && - (frame_url.SchemeIs(chrome::kChromeUIScheme) || - frame_url.SchemeIs(chrome::kDataScheme)); + (frame_url.SchemeIs(kChromeUIScheme) || + frame_url.SchemeIs(url::kDataScheme)); if (!webui_enabled) return false; @@ -103,34 +52,68 @@ bool WebUIExtensionWrapper::ShouldRespondToRequest( return true; } +} // namespace + +// Exposes two methods: +// - chrome.send: Used to send messages to the browser. Requires the message +// name as the first argument and can have an optional second argument that +// should be an array. +// - chrome.getVariableValue: Returns value for the input variable name if such +// a value was set by the browser. Else will return an empty string. +void WebUIExtension::Install(blink::WebFrame* frame) { + v8::Isolate* isolate = blink::mainThreadIsolate(); + v8::HandleScope handle_scope(isolate); + v8::Handle<v8::Context> context = frame->mainWorldScriptContext(); + if (context.IsEmpty()) + return; + + v8::Context::Scope context_scope(context); + + v8::Handle<v8::Object> global = context->Global(); + v8::Handle<v8::Object> chrome = + global->Get(gin::StringToV8(isolate, "chrome"))->ToObject(); + if (chrome.IsEmpty()) { + chrome = v8::Object::New(isolate); + global->Set(gin::StringToSymbol(isolate, "chrome"), chrome); + } + chrome->Set(gin::StringToSymbol(isolate, "send"), + gin::CreateFunctionTemplate( + isolate, base::Bind(&WebUIExtension::Send))->GetFunction()); + chrome->Set(gin::StringToSymbol(isolate, "getVariableValue"), + gin::CreateFunctionTemplate( + isolate, base::Bind(&WebUIExtension::GetVariableValue)) + ->GetFunction()); +} + // static -void WebUIExtensionWrapper::Send( - const v8::FunctionCallbackInfo<v8::Value>& args) { +void WebUIExtension::Send(gin::Arguments* args) { blink::WebFrame* frame; RenderView* render_view; if (!ShouldRespondToRequest(&frame, &render_view)) return; - // We expect at least two parameters - a string message identifier, and - // an object parameter. The object param can be undefined. - if (args.Length() != 2 || !args[0]->IsString()) + std::string message; + if (!args->GetNext(&message)) { + args->ThrowError(); return; - - const std::string message = *v8::String::Utf8Value(args[0]->ToString()); + } // If they've provided an optional message parameter, convert that into a // Value to send to the browser process. - scoped_ptr<ListValue> content; - if (args[1]->IsUndefined()) { - content.reset(new ListValue()); + scoped_ptr<base::ListValue> content; + if (args->PeekNext().IsEmpty() || args->PeekNext()->IsUndefined()) { + content.reset(new base::ListValue()); } else { - if (!args[1]->IsObject()) + v8::Handle<v8::Object> obj; + if (!args->GetNext(&obj)) { + args->ThrowError(); return; + } scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); - base::Value* value = converter->FromV8Value( - args[1], frame->mainWorldScriptContext()); + base::Value* value = + converter->FromV8Value(obj, frame->mainWorldScriptContext()); base::ListValue* list = NULL; value->GetAsList(&list); DCHECK(list); @@ -145,27 +128,13 @@ void WebUIExtensionWrapper::Send( } // static -void WebUIExtensionWrapper::GetVariableValue( - const v8::FunctionCallbackInfo<v8::Value>& args) { +std::string WebUIExtension::GetVariableValue(const std::string& name) { blink::WebFrame* frame; RenderView* render_view; if (!ShouldRespondToRequest(&frame, &render_view)) - return; - - if (!args.Length() || !args[0]->IsString()) - return; + return std::string(); - std::string key = *v8::String::Utf8Value(args[0]->ToString()); - std::string value = WebUIExtensionData::Get(render_view)->GetValue(key); - args.GetReturnValue().Set(v8::String::NewFromUtf8(args.GetIsolate(), - value.c_str(), - v8::String::kNormalString, - value.length())); -} - -// static -v8::Extension* WebUIExtension::Get() { - return new WebUIExtensionWrapper(); + return WebUIExtensionData::Get(render_view)->GetValue(name); } } // namespace content |