Browse Source

fix: properly forward properties to webview (#22510)

Co-authored-by: Shelley Vohr <[email protected]>
trop[bot] 5 years ago
parent
commit
eb63062889

+ 19 - 1
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.
@@ -388,6 +388,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)
 

+ 8 - 0
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',

+ 20 - 1
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
 
@@ -274,6 +274,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 = {