|
@@ -15,6 +15,7 @@ interface GuestInstance {
|
|
|
}
|
|
|
|
|
|
const webViewManager = process._linkedBinding('electron_browser_web_view_manager');
|
|
|
+const eventBinding = process._linkedBinding('electron_browser_event');
|
|
|
|
|
|
const supportedWebViewEvents = Object.keys(webViewEvents);
|
|
|
|
|
@@ -75,7 +76,7 @@ function makeWebPreferences (embedder: Electron.WebContents, params: Record<stri
|
|
|
}
|
|
|
|
|
|
// Create a new guest instance.
|
|
|
-const createGuest = function (embedder: Electron.WebContents, params: Record<string, any>) {
|
|
|
+const createGuest = function (embedder: Electron.WebContents, embedderFrameId: number, elementInstanceId: number, params: Record<string, any>) {
|
|
|
// eslint-disable-next-line no-undef
|
|
|
const guest = (webContents as typeof ElectronInternal.WebContents).create({
|
|
|
type: 'webview',
|
|
@@ -159,20 +160,22 @@ const createGuest = function (embedder: Electron.WebContents, params: Record<str
|
|
|
}
|
|
|
});
|
|
|
|
|
|
- return guestInstanceId;
|
|
|
+ if (attachGuest(embedder, embedderFrameId, elementInstanceId, guestInstanceId, params)) {
|
|
|
+ return guestInstanceId;
|
|
|
+ }
|
|
|
+
|
|
|
+ return -1;
|
|
|
};
|
|
|
|
|
|
// Attach the guest to an element of embedder.
|
|
|
-const attachGuest = function (event: Electron.IpcMainInvokeEvent,
|
|
|
- embedderFrameId: number, elementInstanceId: number, guestInstanceId: number, params: Record<string, any>) {
|
|
|
- const embedder = event.sender;
|
|
|
+const attachGuest = function (embedder: Electron.WebContents, embedderFrameId: number, elementInstanceId: number, guestInstanceId: number, params: Record<string, any>) {
|
|
|
// Destroy the old guest when attaching.
|
|
|
const key = `${embedder.id}-${elementInstanceId}`;
|
|
|
const oldGuestInstanceId = embedderElementsMap.get(key);
|
|
|
if (oldGuestInstanceId != null) {
|
|
|
// Reattachment to the same guest is just a no-op.
|
|
|
if (oldGuestInstanceId === guestInstanceId) {
|
|
|
- return;
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
const oldGuestInstance = guestInstances.get(oldGuestInstanceId);
|
|
@@ -184,11 +187,13 @@ const attachGuest = function (event: Electron.IpcMainInvokeEvent,
|
|
|
const guestInstance = guestInstances.get(guestInstanceId);
|
|
|
// If this isn't a valid guest instance then do nothing.
|
|
|
if (!guestInstance) {
|
|
|
- throw new Error(`Invalid guestInstanceId: ${guestInstanceId}`);
|
|
|
+ console.error(new Error(`Guest attach failed: Invalid guestInstanceId ${guestInstanceId}`));
|
|
|
+ return false;
|
|
|
}
|
|
|
const { guest } = guestInstance;
|
|
|
if (guest.hostWebContents !== embedder) {
|
|
|
- throw new Error(`Access denied to guestInstanceId: ${guestInstanceId}`);
|
|
|
+ console.error(new Error(`Guest attach failed: Access denied to guestInstanceId ${guestInstanceId}`));
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
// If this guest is already attached to an element then remove it
|
|
@@ -205,11 +210,12 @@ const attachGuest = function (event: Electron.IpcMainInvokeEvent,
|
|
|
|
|
|
const webPreferences = makeWebPreferences(embedder, params);
|
|
|
|
|
|
+ const event = eventBinding.createWithSender(embedder);
|
|
|
embedder.emit('will-attach-webview', event, webPreferences, params);
|
|
|
if (event.defaultPrevented) {
|
|
|
if (guest.viewInstanceId == null) guest.viewInstanceId = params.instanceId;
|
|
|
guest.destroy();
|
|
|
- return;
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
guest.attachParams = params;
|
|
@@ -223,6 +229,7 @@ const attachGuest = function (event: Electron.IpcMainInvokeEvent,
|
|
|
|
|
|
webViewManager.addGuest(guestInstanceId, embedder, guest, webPreferences);
|
|
|
guest.attachToIframe(embedder, embedderFrameId);
|
|
|
+ return true;
|
|
|
};
|
|
|
|
|
|
// Remove an guest-embedder relationship.
|
|
@@ -307,16 +314,8 @@ const handleMessageSync = function (channel: string, handler: (event: ElectronIn
|
|
|
ipcMainUtils.handleSync(channel, makeSafeHandler(channel, handler));
|
|
|
};
|
|
|
|
|
|
-handleMessage(IPC_MESSAGES.GUEST_VIEW_MANAGER_CREATE_GUEST, function (event, params) {
|
|
|
- return createGuest(event.sender, params);
|
|
|
-});
|
|
|
-
|
|
|
-handleMessage(IPC_MESSAGES.GUEST_VIEW_MANAGER_ATTACH_GUEST, function (event, embedderFrameId: number, elementInstanceId: number, guestInstanceId: number, params) {
|
|
|
- try {
|
|
|
- attachGuest(event, embedderFrameId, elementInstanceId, guestInstanceId, params);
|
|
|
- } catch (error) {
|
|
|
- console.error(`Guest attach failed: ${error}`);
|
|
|
- }
|
|
|
+handleMessage(IPC_MESSAGES.GUEST_VIEW_MANAGER_CREATE_AND_ATTACH_GUEST, function (event, embedderFrameId: number, elementInstanceId: number, params) {
|
|
|
+ return createGuest(event.sender, embedderFrameId, elementInstanceId, params);
|
|
|
});
|
|
|
|
|
|
handleMessageSync(IPC_MESSAGES.GUEST_VIEW_MANAGER_DETACH_GUEST, function (event, guestInstanceId: number) {
|