Browse Source

feat: deprecate <webview>.getWebContents() (#20726)

Milan Burda 5 years ago
parent
commit
f1e7393e30

+ 41 - 0
docs/api/breaking-changes.md

@@ -59,6 +59,47 @@ these kinds of objects will throw a 'could not be cloned' error.
 
 [SCA]: https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm
 
+### `<webview>.getWebContents()`
+
+This API is implemented using the `remote` module, which has both performance
+and security implications. Therefore its usage should be explicit.
+
+```js
+// Deprecated
+webview.getWebContents()
+// Replace with
+const { remote } = require('electron')
+remote.webContents.fromId(webview.getWebContentsId())
+```
+
+However, it is recommended to avoid using the `remote` module altogether.
+
+```js
+// main
+const { ipcMain, webContents } = require('electron')
+
+const getGuestForWebContents = function (webContentsId, contents) {
+  const guest = webContents.fromId(webContentsId)
+  if (!guest) {
+    throw new Error(`Invalid webContentsId: ${webContentsId}`)
+  }
+  if (guest.hostWebContents !== contents) {
+    throw new Error(`Access denied to webContents`)
+  }
+  return guest
+}
+
+ipcMain.handle('openDevTools', (event, webContentsId) => {
+  const guest = getGuestForWebContents(webContentsId, event.sender)
+  guest.openDevTools()
+})
+
+// renderer
+const { ipcRenderer } = require('electron')
+
+ipcRenderer.invoke('openDevTools', webview.getWebContentsId())
+```
+
 ## Planned Breaking API Changes (7.0)
 
 ### Node Headers URL

+ 1 - 1
docs/api/webview-tag.md

@@ -648,7 +648,7 @@ Sets the maximum and minimum layout-based (i.e. non-visual) zoom level.
 
 Shows pop-up dictionary that searches the selected word on the page.
 
-### `<webview>.getWebContents()`
+### `<webview>.getWebContents()` _Deprecated_
 
 Returns [`WebContents`](web-contents.md) - The web contents associated with
 this `webview`.

+ 6 - 0
lib/renderer/web-view/web-view-impl.ts

@@ -238,6 +238,12 @@ export const setupMethods = (WebViewElement: typeof ElectronInternal.WebViewElem
     return remote.getGuestWebContents(internal.guestInstanceId!)
   }
 
+  WebViewElement.prototype.getWebContents = electron.deprecate.moveAPI(
+    WebViewElement.prototype.getWebContents,
+    'webview.getWebContents()',
+    'remote.webContents.fromId(webview.getWebContentsId())'
+  ) as any
+
   // Focusing the webview should move page focus to the underlying iframe.
   WebViewElement.prototype.focus = function () {
     this.contentWindow.focus()

+ 2 - 1
spec/fixtures/pages/webview-devtools.html

@@ -8,7 +8,8 @@
     <script>
         var wv = document.querySelector('webview')
         wv.addEventListener('dom-ready', () => {
-          const webContents = wv.getWebContents()
+          const { remote } = require('electron')
+          const webContents = remote.webContents.fromId(wv.getWebContentsId())
           webContents.on('devtools-opened', function () {
             var showPanelIntevalId = setInterval(function () {
               if (webContents.devToolsWebContents) {