Implement asynchronous versions of getZoomFactor and GetZoomLevel on the webContents...
authorSamuel Attard <samuel.r.attard@gmail.com>
Tue, 2 Aug 2016 03:02:55 +0000 (13:02 +1000)
committerSamuel Attard <samuel.r.attard@gmail.com>
Tue, 2 Aug 2016 03:02:55 +0000 (13:02 +1000)
lib/browser/api/web-contents.js
lib/renderer/init.js

index 5515984..7a57eac 100644 (file)
@@ -89,6 +89,11 @@ const webFrameMethods = [
   'setZoomLevelLimits'
 ]
 
+const webFrameMethodsWithResult = [
+  'getZoomFactor',
+  'getZoomLevel'
+]
+
 // Add JavaScript wrappers for WebContents class.
 const wrapWebContents = function (webContents) {
   // webContents is an EventEmitter.
@@ -120,6 +125,21 @@ const wrapWebContents = function (webContents) {
     }
   }
 
+  const asyncWebFrameMethods = function (requestId, method, callback, ...args) {
+    this.send('ELECTRON_INTERNAL_RENDERER_ASYNC_WEB_FRAME_METHOD', requestId, method, args)
+    ipcMain.once(`ELECTRON_INTERNAL_BROWSER_ASYNC_WEB_FRAME_RESPONSE_${requestId}`, function (event, result) {
+      console.info(callback);
+      if (callback) callback(result)
+    })
+  }
+
+  const syncWebFrameMethods = function (requestId, method, callback, ...args) {
+    this.send('ELECTRON_INTERNAL_RENDERER_SYNC_WEB_FRAME_METHOD', requestId, method, args)
+    ipcMain.once(`ELECTRON_INTERNAL_BROWSER_SYNC_WEB_FRAME_RESPONSE_${requestId}`, function (event, result) {
+      if (callback) callback(result)
+    })
+  }
+
   // Mapping webFrame methods.
   for (const method of webFrameMethods) {
     webContents[method] = function (...args) {
@@ -127,11 +147,12 @@ const wrapWebContents = function (webContents) {
     }
   }
 
-  const asyncWebFrameMethods = function (requestId, method, callback, ...args) {
-    this.send('ELECTRON_INTERNAL_RENDERER_ASYNC_WEB_FRAME_METHOD', requestId, method, args)
-    ipcMain.once(`ELECTRON_INTERNAL_BROWSER_ASYNC_WEB_FRAME_RESPONSE_${requestId}`, function (event, result) {
-      if (callback) callback(result)
-    })
+  for (const method of webFrameMethodsWithResult) {
+    webContents[method] = function (...args) {
+      const callback = args[args.length - 1]
+      const actualArgs = args.slice(0, args.length - 2)
+      syncWebFrameMethods.call(this, getNextId(), method, callback, ...actualArgs)
+    }
   }
 
   // Make sure webContents.executeJavaScript would run the code only when the
index f0875ca..710c4c7 100644 (file)
@@ -32,6 +32,11 @@ electron.ipcRenderer.on('ELECTRON_INTERNAL_RENDERER_WEB_FRAME_METHOD', (event, m
   electron.webFrame[method].apply(electron.webFrame, args)
 })
 
+electron.ipcRenderer.on('ELECTRON_INTERNAL_RENDERER_SYNC_WEB_FRAME_METHOD', (event, requestId, method, args) => {
+  const result = electron.webFrame[method].apply(electron.webFrame, args)
+  event.sender.send(`ELECTRON_INTERNAL_BROWSER_SYNC_WEB_FRAME_RESPONSE_${requestId}`, result)
+})
+
 electron.ipcRenderer.on('ELECTRON_INTERNAL_RENDERER_ASYNC_WEB_FRAME_METHOD', (event, requestId, method, args) => {
   const responseCallback = function (result) {
     event.sender.send(`ELECTRON_INTERNAL_BROWSER_ASYNC_WEB_FRAME_RESPONSE_${requestId}`, result)