Browse Source

fix: do not wait on promise returned by remote APIs (6-0-x) (#19190)

* fix: make <webview>.loadURL async

* docs: webview.loadURL returns Promise
Cheng Zhao 5 years ago
parent
commit
742292f082

+ 5 - 0
docs/api/webview-tag.md

@@ -277,6 +277,11 @@ webview.addEventListener('dom-ready', () => {
   * `postData` ([UploadRawData[]](structures/upload-raw-data.md) | [UploadFile[]](structures/upload-file.md) | [UploadBlob[]](structures/upload-blob.md)) (optional)
   * `baseURLForDataURL` String (optional) - Base url (with trailing path separator) for files to be loaded by the data url. This is needed only if the specified `url` is a data url and needs to load other files.
 
+Returns `Promise<void>` - The promise will resolve when the page has finished loading
+(see [`did-finish-load`](webview-tag.md#event-did-finish-load)), and rejects
+if the page fails to load (see
+[`did-fail-load`](webview-tag.md#event-did-fail-load)).
+
 Loads the `url` in the webview, the `url` must contain the protocol prefix,
 e.g. the `http://` or `file://`.
 

+ 1 - 1
lib/common/web-view-methods.js

@@ -3,7 +3,6 @@
 // Public-facing API methods.
 exports.syncMethods = new Set([
   'getURL',
-  'loadURL',
   'getTitle',
   'isLoading',
   'isLoadingMainFrame',
@@ -64,6 +63,7 @@ exports.asyncCallbackMethods = new Set([
 ])
 
 exports.asyncPromiseMethods = new Set([
+  'loadURL',
   'capturePage',
   'executeJavaScript',
   'printToPDF'

+ 1 - 1
lib/renderer/web-view/web-view-attributes.ts

@@ -196,7 +196,7 @@ class SrcAttribute extends WebViewAttribute {
     const method = 'loadURL'
     const args = [this.getValue(), opts]
 
-    ipcRendererUtils.invokeSync('ELECTRON_GUEST_VIEW_MANAGER_CALL', guestInstanceId, method, args)
+    ipcRendererUtils.invoke('ELECTRON_GUEST_VIEW_MANAGER_CALL', guestInstanceId, method, args)
   }
 }
 

+ 14 - 0
spec/webview-spec.js

@@ -171,6 +171,20 @@ describe('<webview> tag', function () {
         expect(webview.src).to.equal('')
       }
     })
+
+    it('does not wait until loadURL is resolved', async () => {
+      await loadWebView(webview, { src: 'about:blank' })
+
+      const before = Date.now()
+      webview.src = 'https://github.com'
+      const now = Date.now()
+
+      // Setting src is essentially sending a sync IPC message, which should
+      // not exceed more than a few ms.
+      //
+      // This is for testing #18638.
+      expect(now - before).to.be.below(100)
+    })
   })
 
   describe('nodeintegration attribute', () => {