From d597a0e8b0121b54375412af3d8a4a9db60ba21a Mon Sep 17 00:00:00 2001 From: Milan Burda Date: Sat, 30 Mar 2019 02:10:21 +0100 Subject: [PATCH] refactor: expose ipcRendererInternal to the main world for window-setup using the content script world pattern (#17591) --- lib/content_script/init.js | 4 ++-- lib/isolated_renderer/init.js | 12 ++++++---- lib/renderer/init.ts | 2 +- lib/renderer/window-setup.ts | 44 +++++++++++++++-------------------- 4 files changed, 30 insertions(+), 32 deletions(-) diff --git a/lib/content_script/init.js b/lib/content_script/init.js index 7300a718b4..f10942afc9 100644 --- a/lib/content_script/init.js +++ b/lib/content_script/init.js @@ -24,9 +24,9 @@ Object.setPrototypeOf(process, EventEmitter.prototype) const isolatedWorldArgs = v8Util.getHiddenValue(isolatedWorld, 'isolated-world-args') if (isolatedWorldArgs) { - const { ipcRendererInternal, guestInstanceId, isHiddenPage, openerId, usesNativeWindowOpen } = isolatedWorldArgs + const { guestInstanceId, isHiddenPage, openerId, usesNativeWindowOpen } = isolatedWorldArgs const { windowSetup } = require('@electron/internal/renderer/window-setup') - windowSetup(ipcRendererInternal, guestInstanceId, openerId, isHiddenPage, usesNativeWindowOpen) + windowSetup(guestInstanceId, openerId, isHiddenPage, usesNativeWindowOpen) } const extensionId = v8Util.getHiddenValue(isolatedWorld, `extension-${worldId}`) diff --git a/lib/isolated_renderer/init.js b/lib/isolated_renderer/init.js index ddbff865af..4df0730ddb 100644 --- a/lib/isolated_renderer/init.js +++ b/lib/isolated_renderer/init.js @@ -2,9 +2,13 @@ /* global nodeProcess, isolatedWorld */ -const electronBinding = require('@electron/internal/common/atom-binding-setup').electronBindingSetup(nodeProcess.binding, 'renderer') +process.electronBinding = require('@electron/internal/common/atom-binding-setup').electronBindingSetup(nodeProcess.binding, 'renderer') -const v8Util = electronBinding('v8_util') +const v8Util = process.electronBinding('v8_util') + +// The `lib/renderer/ipc-renderer-internal.js` module looks for the ipc object in the +// "ipc-internal" hidden value +v8Util.setHiddenValue(global, 'ipc-internal', v8Util.getHiddenValue(isolatedWorld, 'ipc-internal')) const webViewImpl = v8Util.getHiddenValue(isolatedWorld, 'web-view-impl') @@ -17,7 +21,7 @@ if (webViewImpl) { const isolatedWorldArgs = v8Util.getHiddenValue(isolatedWorld, 'isolated-world-args') if (isolatedWorldArgs) { - const { ipcRendererInternal, guestInstanceId, isHiddenPage, openerId, usesNativeWindowOpen } = isolatedWorldArgs + const { guestInstanceId, isHiddenPage, openerId, usesNativeWindowOpen } = isolatedWorldArgs const { windowSetup } = require('@electron/internal/renderer/window-setup') - windowSetup(ipcRendererInternal, guestInstanceId, openerId, isHiddenPage, usesNativeWindowOpen) + windowSetup(guestInstanceId, openerId, isHiddenPage, usesNativeWindowOpen) } diff --git a/lib/renderer/init.ts b/lib/renderer/init.ts index 21b3b79254..e22f68409e 100644 --- a/lib/renderer/init.ts +++ b/lib/renderer/init.ts @@ -82,7 +82,7 @@ switch (window.location.protocol) { default: { // Override default web functions. const { windowSetup } = require('@electron/internal/renderer/window-setup') - windowSetup(ipcRendererInternal, guestInstanceId, openerId, isHiddenPage, usesNativeWindowOpen) + windowSetup(guestInstanceId, openerId, isHiddenPage, usesNativeWindowOpen) // Inject content scripts. require('@electron/internal/renderer/content-scripts-injector')(process.getRenderProcessPreferences) diff --git a/lib/renderer/window-setup.ts b/lib/renderer/window-setup.ts index ff5340f387..c219d0f737 100644 --- a/lib/renderer/window-setup.ts +++ b/lib/renderer/window-setup.ts @@ -1,6 +1,4 @@ -// This file should have no requires since it is used by the isolated context -// preload bundle. Instead arguments should be passed in for everything it -// needs. +import { ipcRendererInternal } from '@electron/internal/renderer/ipc-renderer-internal' // This file implements the following APIs: // - window.history.back() @@ -37,10 +35,10 @@ const toString = (value: any) => { const windowProxies: Record = {} -const getOrCreateProxy = (ipcRenderer: Electron.IpcRenderer, guestId: number) => { +const getOrCreateProxy = (guestId: number) => { let proxy = windowProxies[guestId] if (proxy == null) { - proxy = new BrowserWindowProxy(ipcRenderer, guestId) + proxy = new BrowserWindowProxy(guestId) windowProxies[guestId] = proxy } return proxy @@ -63,7 +61,6 @@ class LocationProxy { @LocationProxy.ProxyProperty public protocol!: string; @LocationProxy.ProxyProperty public search!: URLSearchParams; - private ipcRenderer: Electron.IpcRenderer; private guestId: number; /** @@ -92,11 +89,10 @@ class LocationProxy { }) } - constructor (ipcRenderer: Electron.IpcRenderer, guestId: number) { + constructor (guestId: number) { // eslint will consider the constructor "useless" // unless we assign them in the body. It's fine, that's what // TS would do anyway. - this.ipcRenderer = ipcRenderer this.guestId = guestId this.getGuestURL = this.getGuestURL.bind(this) } @@ -106,7 +102,7 @@ class LocationProxy { } private getGuestURL (): URL | null { - const urlString = this.ipcRenderer.sendSync('ELECTRON_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD_SYNC', this.guestId, 'getURL') + const urlString = ipcRendererInternal.sendSync('ELECTRON_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD_SYNC', this.guestId, 'getURL') try { return new URL(urlString) } catch (e) { @@ -122,7 +118,6 @@ class BrowserWindowProxy { private _location: LocationProxy private guestId: number - private ipcRenderer: Electron.IpcRenderer // TypeScript doesn't allow getters/accessors with different types, // so for now, we'll have to make do with an "any" in the mix. @@ -132,47 +127,46 @@ class BrowserWindowProxy { } public set location (url: string | any) { url = resolveURL(url) - this.ipcRenderer.sendSync('ELECTRON_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD_SYNC', this.guestId, 'loadURL', url) + ipcRendererInternal.sendSync('ELECTRON_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD_SYNC', this.guestId, 'loadURL', url) } - constructor (ipcRenderer: Electron.IpcRenderer, guestId: number) { + constructor (guestId: number) { this.guestId = guestId - this.ipcRenderer = ipcRenderer - this._location = new LocationProxy(ipcRenderer, guestId) + this._location = new LocationProxy(guestId) - ipcRenderer.once(`ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_CLOSED_${guestId}`, () => { + ipcRendererInternal.once(`ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_CLOSED_${guestId}`, () => { removeProxy(guestId) this.closed = true }) } public close () { - this.ipcRenderer.send('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_CLOSE', this.guestId) + ipcRendererInternal.send('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_CLOSE', this.guestId) } public focus () { - this.ipcRenderer.send('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_METHOD', this.guestId, 'focus') + ipcRendererInternal.send('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_METHOD', this.guestId, 'focus') } public blur () { - this.ipcRenderer.send('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_METHOD', this.guestId, 'blur') + ipcRendererInternal.send('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_METHOD', this.guestId, 'blur') } public print () { - this.ipcRenderer.send('ELECTRON_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD', this.guestId, 'print') + ipcRendererInternal.send('ELECTRON_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD', this.guestId, 'print') } public postMessage (message: any, targetOrigin: any) { - this.ipcRenderer.send('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_POSTMESSAGE', this.guestId, message, toString(targetOrigin), window.location.origin) + ipcRendererInternal.send('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_POSTMESSAGE', this.guestId, message, toString(targetOrigin), window.location.origin) } public eval (...args: any[]) { - this.ipcRenderer.send('ELECTRON_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD', this.guestId, 'executeJavaScript', ...args) + ipcRendererInternal.send('ELECTRON_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD', this.guestId, 'executeJavaScript', ...args) } } export const windowSetup = ( - ipcRendererInternal: Electron.IpcRendererInternal, guestInstanceId: number, openerId: number, isHiddenPage: boolean, usesNativeWindowOpen: boolean + guestInstanceId: number, openerId: number, isHiddenPage: boolean, usesNativeWindowOpen: boolean ) => { if (guestInstanceId == null) { // Override default window.close. @@ -189,14 +183,14 @@ export const windowSetup = ( } const guestId = ipcRendererInternal.sendSync('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_OPEN', url, toString(frameName), toString(features)) if (guestId != null) { - return getOrCreateProxy(ipcRendererInternal, guestId) + return getOrCreateProxy(guestId) } else { return null } } if (openerId != null) { - window.opener = getOrCreateProxy(ipcRendererInternal, openerId) + window.opener = getOrCreateProxy(openerId) } } @@ -219,7 +213,7 @@ export const windowSetup = ( event.data = message event.origin = sourceOrigin - event.source = getOrCreateProxy(ipcRendererInternal, sourceId) + event.source = getOrCreateProxy(sourceId) window.dispatchEvent(event as MessageEvent) })