From efc11563e8562e87ed56e1e961434730334e9826 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Tue, 3 Mar 2020 22:25:14 +0000 Subject: [PATCH] fix: properly forward properties to webview (#22485) --- lib/browser/guest-view-manager.js | 20 +++++++++++++++++++- lib/common/web-view-methods.ts | 8 ++++++++ lib/renderer/web-view/web-view-impl.ts | 21 ++++++++++++++++++++- 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/lib/browser/guest-view-manager.js b/lib/browser/guest-view-manager.js index 272cdd663b42..7baab1b2ca00 100644 --- a/lib/browser/guest-view-manager.js +++ b/lib/browser/guest-view-manager.js @@ -4,7 +4,7 @@ const { webContents } = require('electron') const { ipcMainInternal } = require('@electron/internal/browser/ipc-main-internal') const ipcMainUtils = require('@electron/internal/browser/ipc-main-internal-utils') const parseFeaturesString = require('@electron/internal/common/parse-features-string') -const { syncMethods, asyncMethods } = require('@electron/internal/common/web-view-methods') +const { syncMethods, asyncMethods, properties } = require('@electron/internal/common/web-view-methods') const { serialize } = require('@electron/internal/common/type-utils') // Doesn't exist in early initialization. @@ -384,6 +384,24 @@ handleMessageSync('ELECTRON_GUEST_VIEW_MANAGER_CALL', function (event, guestInst return guest[method](...args) }) +handleMessageSync('ELECTRON_GUEST_VIEW_MANAGER_PROPERTY_GET', function (event, guestInstanceId, property) { + const guest = getGuestForWebContents(guestInstanceId, event.sender) + if (!properties.has(property)) { + throw new Error(`Invalid property: ${property}`) + } + + return guest[property] +}) + +handleMessageSync('ELECTRON_GUEST_VIEW_MANAGER_PROPERTY_SET', function (event, guestInstanceId, property, val) { + const guest = getGuestForWebContents(guestInstanceId, event.sender) + if (!properties.has(property)) { + throw new Error(`Invalid property: ${property}`) + } + + guest[property] = val +}) + handleMessage('ELECTRON_GUEST_VIEW_MANAGER_CAPTURE_PAGE', async function (event, guestInstanceId, args) { const guest = getGuestForWebContents(guestInstanceId, event.sender) diff --git a/lib/common/web-view-methods.ts b/lib/common/web-view-methods.ts index 3ddd6e2fa08a..8018c7a87bbb 100644 --- a/lib/common/web-view-methods.ts +++ b/lib/common/web-view-methods.ts @@ -50,6 +50,14 @@ export const syncMethods = new Set([ 'setZoomLevel' ]) +export const properties = new Set([ + 'audioMuted', + 'userAgent', + 'zoomLevel', + 'zoomFactor', + 'frameRate' +]) + export const asyncMethods = new Set([ 'loadURL', 'executeJavaScript', diff --git a/lib/renderer/web-view/web-view-impl.ts b/lib/renderer/web-view/web-view-impl.ts index 40f67a54874d..5edc5e168ff2 100644 --- a/lib/renderer/web-view/web-view-impl.ts +++ b/lib/renderer/web-view/web-view-impl.ts @@ -4,7 +4,7 @@ import { ipcRendererInternal } from '@electron/internal/renderer/ipc-renderer-in import * as ipcRendererUtils from '@electron/internal/renderer/ipc-renderer-internal-utils' import * as guestViewInternal from '@electron/internal/renderer/web-view/guest-view-internal' import { WEB_VIEW_CONSTANTS } from '@electron/internal/renderer/web-view/web-view-constants' -import { syncMethods, asyncMethods } from '@electron/internal/common/web-view-methods' +import { syncMethods, asyncMethods, properties } from '@electron/internal/common/web-view-methods' import { deserialize } from '@electron/internal/common/type-utils' const { webFrame } = electron @@ -249,6 +249,25 @@ export const setupMethods = (WebViewElement: typeof ElectronInternal.WebViewElem WebViewElement.prototype.capturePage = async function (...args) { return deserialize(await ipcRendererInternal.invoke('ELECTRON_GUEST_VIEW_MANAGER_CAPTURE_PAGE', this.getWebContentsId(), args)) } + + const createPropertyGetter = function (property: string) { + return function (this: ElectronInternal.WebViewElement) { + return ipcRendererUtils.invokeSync('ELECTRON_GUEST_VIEW_MANAGER_PROPERTY_GET', this.getWebContentsId(), property) + } + } + + const createPropertySetter = function (property: string) { + return function (this: ElectronInternal.WebViewElement, arg: any) { + return ipcRendererUtils.invokeSync('ELECTRON_GUEST_VIEW_MANAGER_PROPERTY_SET', this.getWebContentsId(), property, arg) + } + } + + for (const property of properties) { + Object.defineProperty(WebViewElement.prototype, property, { + get: createPropertyGetter(property) as any, + set: createPropertySetter(property) + }) + } } export const webViewImplModule = {