Handle executeJavaScript in JavaScript

This commit is contained in:
Cheng Zhao 2016-01-13 12:11:46 +08:00
parent 5b7d1a9890
commit 55dfddba77
8 changed files with 28 additions and 52 deletions

View file

@ -756,11 +756,6 @@ bool WebContents::SavePage(const base::FilePath& full_file_path,
return handler->Handle(full_file_path, save_type); return handler->Handle(full_file_path, save_type);
} }
void WebContents::ExecuteJavaScript(const base::string16& code,
bool has_user_gesture) {
Send(new AtomViewMsg_ExecuteJavaScript(routing_id(), code, has_user_gesture));
}
void WebContents::OpenDevTools(mate::Arguments* args) { void WebContents::OpenDevTools(mate::Arguments* args) {
if (type_ == REMOTE) if (type_ == REMOTE)
return; return;
@ -1093,7 +1088,6 @@ void WebContents::BuildPrototype(v8::Isolate* isolate,
.SetMethod("getUserAgent", &WebContents::GetUserAgent) .SetMethod("getUserAgent", &WebContents::GetUserAgent)
.SetMethod("insertCSS", &WebContents::InsertCSS) .SetMethod("insertCSS", &WebContents::InsertCSS)
.SetMethod("savePage", &WebContents::SavePage) .SetMethod("savePage", &WebContents::SavePage)
.SetMethod("_executeJavaScript", &WebContents::ExecuteJavaScript)
.SetMethod("openDevTools", &WebContents::OpenDevTools) .SetMethod("openDevTools", &WebContents::OpenDevTools)
.SetMethod("closeDevTools", &WebContents::CloseDevTools) .SetMethod("closeDevTools", &WebContents::CloseDevTools)
.SetMethod("isDevToolsOpened", &WebContents::IsDevToolsOpened) .SetMethod("isDevToolsOpened", &WebContents::IsDevToolsOpened)

View file

@ -74,8 +74,6 @@ class WebContents : public mate::TrackableObject<WebContents>,
bool SavePage(const base::FilePath& full_file_path, bool SavePage(const base::FilePath& full_file_path,
const content::SavePageType& save_type, const content::SavePageType& save_type,
const SavePageHandler::SavePageCallback& callback); const SavePageHandler::SavePageCallback& callback);
void ExecuteJavaScript(const base::string16& code,
bool has_user_gesture);
void OpenDevTools(mate::Arguments* args); void OpenDevTools(mate::Arguments* args);
void CloseDevTools(); void CloseDevTools();
bool IsDevToolsOpened(); bool IsDevToolsOpened();

View file

@ -57,6 +57,7 @@ PDFPageSize = {
// Following methods are mapped to webFrame. // Following methods are mapped to webFrame.
const webFrameMethods = [ const webFrameMethods = [
'executeJavaScript',
'insertText', 'insertText',
]; ];
@ -73,21 +74,6 @@ wrapWebContents = function(webContents) {
return this._send(channel, slice.call(args)); return this._send(channel, slice.call(args));
}; };
/*
Make sure webContents.executeJavaScript would run the code only when the
web contents has been loaded.
*/
webContents.executeJavaScript = function(code, hasUserGesture) {
if (hasUserGesture == null) {
hasUserGesture = false;
}
if (this.getURL() && !this.isLoading()) {
return this._executeJavaScript(code, hasUserGesture);
} else {
return webContents.once('did-finish-load', this._executeJavaScript.bind(this, code, hasUserGesture));
}
};
/* The navigation controller. */ /* The navigation controller. */
controller = new NavigationController(webContents); controller = new NavigationController(webContents);
ref1 = NavigationController.prototype; ref1 = NavigationController.prototype;
@ -110,6 +96,20 @@ wrapWebContents = function(webContents) {
}; };
} }
// Make sure webContents.executeJavaScript would run the code only when the
// webContents has been loaded.
const executeJavaScript = webContents.executeJavaScript;
webContents.executeJavaScript = function(code, hasUserGesture) {
// TODO(zcbenz): Use default parameter after Chrome 49.
if (hasUserGesture === undefined)
hasUserGesture = false;
if (this.getURL() && !this.isLoading())
return executeJavaScript.call(this, code, hasUserGesture);
else
return this.once('did-finish-load', executeJavaScript.bind(this, code, hasUserGesture));
};
/* Dispatch IPC messages to the ipc module. */ /* Dispatch IPC messages to the ipc module. */
webContents.on('ipc-message', function(event, packed) { webContents.on('ipc-message', function(event, packed) {
var args, channel; var args, channel;

View file

@ -40,10 +40,6 @@ IPC_MESSAGE_ROUTED2(AtomViewMsg_Message,
base::string16 /* channel */, base::string16 /* channel */,
base::ListValue /* arguments */) base::ListValue /* arguments */)
IPC_MESSAGE_ROUTED2(AtomViewMsg_ExecuteJavaScript,
base::string16 /* code */,
bool /* has user gesture */)
// Sent by the renderer when the draggable regions are updated. // Sent by the renderer when the draggable regions are updated.
IPC_MESSAGE_ROUTED1(AtomViewHostMsg_UpdateDraggableRegions, IPC_MESSAGE_ROUTED1(AtomViewHostMsg_UpdateDraggableRegions,
std::vector<atom::DraggableRegion> /* regions */) std::vector<atom::DraggableRegion> /* regions */)

View file

@ -15,6 +15,8 @@
#include "native_mate/object_template_builder.h" #include "native_mate/object_template_builder.h"
#include "third_party/WebKit/public/web/WebDocument.h" #include "third_party/WebKit/public/web/WebDocument.h"
#include "third_party/WebKit/public/web/WebLocalFrame.h" #include "third_party/WebKit/public/web/WebLocalFrame.h"
#include "third_party/WebKit/public/web/WebScopedUserGesture.h"
#include "third_party/WebKit/public/web/WebScriptSource.h"
#include "third_party/WebKit/public/web/WebSecurityPolicy.h" #include "third_party/WebKit/public/web/WebSecurityPolicy.h"
#include "third_party/WebKit/public/web/WebView.h" #include "third_party/WebKit/public/web/WebView.h"
@ -120,6 +122,12 @@ void WebFrame::InsertText(const std::string& text) {
web_frame_->insertText(blink::WebString::fromUTF8(text)); web_frame_->insertText(blink::WebString::fromUTF8(text));
} }
void WebFrame::ExecuteJavaScript(const base::string16& code, bool by_user) {
scoped_ptr<blink::WebScopedUserGesture> gesture(
by_user ? new blink::WebScopedUserGesture : nullptr);
web_frame_->executeScriptAndReturnValue(blink::WebScriptSource(code));
}
mate::ObjectTemplateBuilder WebFrame::GetObjectTemplateBuilder( mate::ObjectTemplateBuilder WebFrame::GetObjectTemplateBuilder(
v8::Isolate* isolate) { v8::Isolate* isolate) {
return mate::ObjectTemplateBuilder(isolate) return mate::ObjectTemplateBuilder(isolate)
@ -141,7 +149,8 @@ mate::ObjectTemplateBuilder WebFrame::GetObjectTemplateBuilder(
&WebFrame::RegisterURLSchemeAsBypassingCSP) &WebFrame::RegisterURLSchemeAsBypassingCSP)
.SetMethod("registerURLSchemeAsPrivileged", .SetMethod("registerURLSchemeAsPrivileged",
&WebFrame::RegisterURLSchemeAsPrivileged) &WebFrame::RegisterURLSchemeAsPrivileged)
.SetMethod("insertText", &WebFrame::InsertText); .SetMethod("insertText", &WebFrame::InsertText)
.SetMethod("executeJavaScript", &WebFrame::ExecuteJavaScript);
} }
// static // static

View file

@ -63,6 +63,9 @@ class WebFrame : public mate::Wrappable {
// Editing. // Editing.
void InsertText(const std::string& text); void InsertText(const std::string& text);
// Excecuting scripts.
void ExecuteJavaScript(const base::string16& code, bool by_user);
// mate::Wrappable: // mate::Wrappable:
virtual mate::ObjectTemplateBuilder GetObjectTemplateBuilder( virtual mate::ObjectTemplateBuilder GetObjectTemplateBuilder(
v8::Isolate* isolate); v8::Isolate* isolate);

View file

@ -27,8 +27,6 @@
#include "third_party/WebKit/public/web/WebFrame.h" #include "third_party/WebKit/public/web/WebFrame.h"
#include "third_party/WebKit/public/web/WebLocalFrame.h" #include "third_party/WebKit/public/web/WebLocalFrame.h"
#include "third_party/WebKit/public/web/WebKit.h" #include "third_party/WebKit/public/web/WebKit.h"
#include "third_party/WebKit/public/web/WebScopedUserGesture.h"
#include "third_party/WebKit/public/web/WebScriptSource.h"
#include "third_party/WebKit/public/web/WebView.h" #include "third_party/WebKit/public/web/WebView.h"
#include "ui/base/resource/resource_bundle.h" #include "ui/base/resource/resource_bundle.h"
#include "native_mate/dictionary.h" #include "native_mate/dictionary.h"
@ -115,8 +113,6 @@ bool AtomRenderViewObserver::OnMessageReceived(const IPC::Message& message) {
bool handled = true; bool handled = true;
IPC_BEGIN_MESSAGE_MAP(AtomRenderViewObserver, message) IPC_BEGIN_MESSAGE_MAP(AtomRenderViewObserver, message)
IPC_MESSAGE_HANDLER(AtomViewMsg_Message, OnBrowserMessage) IPC_MESSAGE_HANDLER(AtomViewMsg_Message, OnBrowserMessage)
IPC_MESSAGE_HANDLER(AtomViewMsg_ExecuteJavaScript,
OnJavaScriptExecuteRequest)
IPC_MESSAGE_UNHANDLED(handled = false) IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP() IPC_END_MESSAGE_MAP()
@ -152,22 +148,4 @@ void AtomRenderViewObserver::OnBrowserMessage(const base::string16& channel,
} }
} }
void AtomRenderViewObserver::OnJavaScriptExecuteRequest(
const base::string16& code, bool has_user_gesture) {
if (!document_created_)
return;
if (!render_view()->GetWebView())
return;
scoped_ptr<blink::WebScopedUserGesture> gesture(
has_user_gesture ? new blink::WebScopedUserGesture : nullptr);
v8::Isolate* isolate = blink::mainThreadIsolate();
v8::HandleScope handle_scope(isolate);
blink::WebFrame* frame = render_view()->GetWebView()->mainFrame();
frame->executeScriptAndReturnValue(blink::WebScriptSource(code));
}
} // namespace atom } // namespace atom

View file

@ -32,8 +32,6 @@ class AtomRenderViewObserver : public content::RenderViewObserver {
void OnBrowserMessage(const base::string16& channel, void OnBrowserMessage(const base::string16& channel,
const base::ListValue& args); const base::ListValue& args);
void OnJavaScriptExecuteRequest(const base::string16& code,
bool has_user_gesture);
// Weak reference to renderer client. // Weak reference to renderer client.
AtomRendererClient* renderer_client_; AtomRendererClient* renderer_client_;