run webframe methods for webview in its context
This commit is contained in:
parent
8386baf267
commit
1235907835
5 changed files with 32 additions and 27 deletions
|
@ -12,9 +12,6 @@ const debuggerBinding = process.atomBinding('debugger');
|
||||||
let slice = [].slice;
|
let slice = [].slice;
|
||||||
let nextId = 0;
|
let nextId = 0;
|
||||||
|
|
||||||
// Map of requestId and response callback.
|
|
||||||
let responseCallback = {};
|
|
||||||
|
|
||||||
let getNextId = function() {
|
let getNextId = function() {
|
||||||
return ++nextId;
|
return ++nextId;
|
||||||
};
|
};
|
||||||
|
@ -108,13 +105,11 @@ let wrapWebContents = function(webContents) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const asyncWebFrameMethods = function(requestId, method, ...args) {
|
const asyncWebFrameMethods = function(requestId, method, callback, ...args) {
|
||||||
this.send('ELECTRON_INTERNAL_RENDERER_ASYNC_WEB_FRAME_METHOD', requestId, method, args);
|
this.send('ELECTRON_INTERNAL_RENDERER_ASYNC_WEB_FRAME_METHOD', requestId, method, args);
|
||||||
ipcMain.once('ELECTRON_INTERNAL_RENDERER_ASYNC_WEB_FRAME_RESPONSE_' + requestId, function(event, result) {
|
ipcMain.once(`ELECTRON_INTERNAL_BROWSER_ASYNC_WEB_FRAME_RESPONSE_${requestId}`, function(event, result) {
|
||||||
if (responseCallback[requestId]) {
|
if (callback)
|
||||||
responseCallback[requestId](result);
|
callback(result);
|
||||||
delete responseCallback[requestId];
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -126,12 +121,10 @@ let wrapWebContents = function(webContents) {
|
||||||
callback = hasUserGesture;
|
callback = hasUserGesture;
|
||||||
hasUserGesture = false;
|
hasUserGesture = false;
|
||||||
}
|
}
|
||||||
if (callback != null)
|
|
||||||
responseCallback[requestId] = callback;
|
|
||||||
if (this.getURL() && !this.isLoading())
|
if (this.getURL() && !this.isLoading())
|
||||||
return asyncWebFrameMethods.call(this, requestId, "executeJavaScript", code, hasUserGesture);
|
return asyncWebFrameMethods.call(this, requestId, "executeJavaScript", callback, code, hasUserGesture);
|
||||||
else
|
else
|
||||||
return this.once('did-finish-load', asyncWebFrameMethods.bind(this, requestId, "executeJavaScript", code, hasUserGesture));
|
return this.once('did-finish-load', asyncWebFrameMethods.bind(this, requestId, "executeJavaScript", callback, code, hasUserGesture));
|
||||||
};
|
};
|
||||||
|
|
||||||
// Dispatch IPC messages to the ipc module.
|
// Dispatch IPC messages to the ipc module.
|
||||||
|
|
|
@ -354,11 +354,17 @@ ipcMain.on('ATOM_BROWSER_GUEST_WEB_CONTENTS', function(event, guestInstanceId) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
ipcMain.on('ATOM_BROWSER_ASYNC_CALL_TO_GUEST_VIEW', function(event, guestInstanceId, method, ...args) {
|
ipcMain.on('ATOM_BROWSER_ASYNC_CALL_TO_GUEST_VIEW', function(event, requestId, guestInstanceId, method, ...args) {
|
||||||
try {
|
try {
|
||||||
let guestViewManager = require('./guest-view-manager');
|
let guestViewManager = require('./guest-view-manager');
|
||||||
let guest = guestViewManager.getGuest(guestInstanceId);
|
let guest = guestViewManager.getGuest(guestInstanceId);
|
||||||
return guest[method].apply(guest, args);
|
if (requestId) {
|
||||||
|
const responseCallback = function(result) {
|
||||||
|
event.sender.send(`ATOM_RENDERER_ASYNC_CALL_TO_GUEST_VIEW_RESPONSE_${requestId}`, result);
|
||||||
|
};
|
||||||
|
args.push(responseCallback);
|
||||||
|
}
|
||||||
|
guest[method].apply(guest, args);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
return event.returnValue = exceptionToMeta(error);
|
return event.returnValue = exceptionToMeta(error);
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@ class ScriptExecutionCallback : public blink::WebScriptExecutionCallback {
|
||||||
|
|
||||||
void completed(
|
void completed(
|
||||||
const blink::WebVector<v8::Local<v8::Value>>& result) override {
|
const blink::WebVector<v8::Local<v8::Value>>& result) override {
|
||||||
if (!callback_.is_null())
|
if (!callback_.is_null() && !result.isEmpty() && !result[0].IsEmpty())
|
||||||
// Right now only single results per frame is supported.
|
// Right now only single results per frame is supported.
|
||||||
callback_.Run(result[0]);
|
callback_.Run(result[0]);
|
||||||
delete this;
|
delete this;
|
||||||
|
|
|
@ -38,7 +38,7 @@ electron.ipcRenderer.on('ELECTRON_INTERNAL_RENDERER_WEB_FRAME_METHOD', (event, m
|
||||||
|
|
||||||
electron.ipcRenderer.on('ELECTRON_INTERNAL_RENDERER_ASYNC_WEB_FRAME_METHOD', (event, requestId, method, args) => {
|
electron.ipcRenderer.on('ELECTRON_INTERNAL_RENDERER_ASYNC_WEB_FRAME_METHOD', (event, requestId, method, args) => {
|
||||||
const responseCallback = function(result) {
|
const responseCallback = function(result) {
|
||||||
event.sender.send('ELECTRON_INTERNAL_RENDERER_ASYNC_WEB_FRAME_RESPONSE_' + requestId, result);
|
event.sender.send(`ELECTRON_INTERNAL_BROWSER_ASYNC_WEB_FRAME_RESPONSE_${requestId}`, result);
|
||||||
};
|
};
|
||||||
args.push(responseCallback);
|
args.push(responseCallback);
|
||||||
electron.webFrame[method].apply(electron.webFrame, args);
|
electron.webFrame[method].apply(electron.webFrame, args);
|
||||||
|
|
|
@ -307,7 +307,7 @@ var registerBrowserPluginElement = function() {
|
||||||
|
|
||||||
// Registers <webview> custom element.
|
// Registers <webview> custom element.
|
||||||
var registerWebViewElement = function() {
|
var registerWebViewElement = function() {
|
||||||
var createBlockHandler, createNonBlockHandler, i, j, len, len1, m, methods, nonblockMethods, webFrameMethods, proto;
|
var createBlockHandler, createNonBlockHandler, i, j, len, len1, m, methods, nonblockMethods, proto;
|
||||||
proto = Object.create(HTMLObjectElement.prototype);
|
proto = Object.create(HTMLObjectElement.prototype);
|
||||||
proto.createdCallback = function() {
|
proto.createdCallback = function() {
|
||||||
return new WebViewImpl(this);
|
return new WebViewImpl(this);
|
||||||
|
@ -392,12 +392,9 @@ var registerWebViewElement = function() {
|
||||||
];
|
];
|
||||||
nonblockMethods = [
|
nonblockMethods = [
|
||||||
'insertCSS',
|
'insertCSS',
|
||||||
|
'insertText',
|
||||||
'send',
|
'send',
|
||||||
'sendInputEvent',
|
'sendInputEvent',
|
||||||
];
|
|
||||||
webFrameMethods = [
|
|
||||||
'executeJavaScript',
|
|
||||||
'insertText',
|
|
||||||
'setZoomFactor',
|
'setZoomFactor',
|
||||||
'setZoomLevel',
|
'setZoomLevel',
|
||||||
'setZoomLevelLimits',
|
'setZoomLevelLimits',
|
||||||
|
@ -424,7 +421,7 @@ var registerWebViewElement = function() {
|
||||||
var args, internal;
|
var args, internal;
|
||||||
args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
|
args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
|
||||||
internal = v8Util.getHiddenValue(this, 'internal');
|
internal = v8Util.getHiddenValue(this, 'internal');
|
||||||
return ipcRenderer.send.apply(ipcRenderer, ['ATOM_BROWSER_ASYNC_CALL_TO_GUEST_VIEW', internal.guestInstanceId, m].concat(slice.call(args)));
|
return ipcRenderer.send.apply(ipcRenderer, ['ATOM_BROWSER_ASYNC_CALL_TO_GUEST_VIEW', null, internal.guestInstanceId, m].concat(slice.call(args)));
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
for (j = 0, len1 = nonblockMethods.length; j < len1; j++) {
|
for (j = 0, len1 = nonblockMethods.length; j < len1; j++) {
|
||||||
|
@ -432,10 +429,19 @@ var registerWebViewElement = function() {
|
||||||
proto[m] = createNonBlockHandler(m);
|
proto[m] = createNonBlockHandler(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Forward proto.foo* webframe method calls to WebFrame.foo*.
|
proto.executeJavaScript = function(code, hasUserGesture, callback) {
|
||||||
for (let method of webFrameMethods) {
|
var internal = v8Util.getHiddenValue(this, 'internal');
|
||||||
proto[method] = webFrame[method].bind(webFrame);
|
if (typeof hasUserGesture === "function") {
|
||||||
|
callback = hasUserGesture;
|
||||||
|
hasUserGesture = false;
|
||||||
}
|
}
|
||||||
|
let requestId = getNextId();
|
||||||
|
ipcRenderer.send('ATOM_BROWSER_ASYNC_CALL_TO_GUEST_VIEW', requestId, internal.guestInstanceId, "executeJavaScript", code, hasUserGesture);
|
||||||
|
ipcRenderer.once(`ATOM_RENDERER_ASYNC_CALL_TO_GUEST_VIEW_RESPONSE_${requestId}`, function(event, result) {
|
||||||
|
if (callback)
|
||||||
|
callback(result);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
// WebContents associated with this webview.
|
// WebContents associated with this webview.
|
||||||
proto.getWebContents = function() {
|
proto.getWebContents = function() {
|
||||||
|
|
Loading…
Reference in a new issue