Browse Source

Implement chrome.runtime.onMessage response callback

Samuel Attard 8 years ago
parent
commit
01005688b6
2 changed files with 26 additions and 11 deletions
  1. 13 4
      lib/browser/chrome-extension.js
  2. 13 7
      lib/renderer/chrome-api.js

+ 13 - 4
lib/browser/chrome-extension.js

@@ -170,17 +170,22 @@ ipcMain.on('CHROME_I18N_MANIFEST', function (event, extensionId) {
   event.returnValue = manifestMap[extensionId]
 })
 
-ipcMain.on('CHROME_RUNTIME_SENDMESSAGE', function (event, extensionId, message) {
+let resultID = 1
+ipcMain.on('CHROME_RUNTIME_SENDMESSAGE', function (event, extensionId, message, originResultID) {
   const page = backgroundPages[extensionId]
   if (!page) {
     console.error(`Connect to unknown extension ${extensionId}`)
     return
   }
 
-  page.webContents.sendToAll(`CHROME_RUNTIME_ONMESSAGE_${extensionId}`, event.sender.id, message)
+  page.webContents.sendToAll(`CHROME_RUNTIME_ONMESSAGE_${extensionId}`, event.sender.id, message, resultID)
+  ipcMain.once(`CHROME_RUNTIME_ONMESSAGE_RESULT_${resultID}`, (event, result) => {
+    event.sender.send(`CHROME_RUNTIME_SENDMESSAGE_RESULT_${originResultID}`, result)
+  })
+  resultID++
 })
 
-ipcMain.on('CHROME_TABS_SEND_MESSAGE', function (event, tabId, extensionId, isBackgroundPage, message) {
+ipcMain.on('CHROME_TABS_SEND_MESSAGE', function (event, tabId, extensionId, isBackgroundPage, message, originResultID) {
   const contents = webContents.fromId(tabId)
   if (!contents) {
     console.error(`Sending message to unknown tab ${tabId}`)
@@ -189,7 +194,11 @@ ipcMain.on('CHROME_TABS_SEND_MESSAGE', function (event, tabId, extensionId, isBa
 
   const senderTabId = isBackgroundPage ? null : event.sender.id
 
-  contents.sendToAll(`CHROME_RUNTIME_ONMESSAGE_${extensionId}`, senderTabId, message)
+  contents.sendToAll(`CHROME_RUNTIME_ONMESSAGE_${extensionId}`, senderTabId, message, resultID)
+  ipcMain.once(`CHROME_RUNTIME_ONMESSAGE_RESULT_${resultID}`, (event, result) => {
+    event.sender.send(`CHROME_TABS_SEND_MESSAGE_RESULT_${originResultID}`, result)
+  })
+  resultID++
 })
 
 ipcMain.on('CHROME_TABS_EXECUTESCRIPT', function (event, requestId, tabId, extensionId, details) {

+ 13 - 7
lib/renderer/chrome-api.js

@@ -59,13 +59,16 @@ class Port {
 // Inject chrome API to the |context|
 exports.injectTo = function (extensionId, isBackgroundPage, context) {
   const chrome = context.chrome = context.chrome || {}
+  let originResultID = 1
 
   ipcRenderer.on(`CHROME_RUNTIME_ONCONNECT_${extensionId}`, (event, tabId, portId, connectInfo) => {
     chrome.runtime.onConnect.emit(new Port(tabId, portId, extensionId, connectInfo.name))
   })
 
-  ipcRenderer.on(`CHROME_RUNTIME_ONMESSAGE_${extensionId}`, (event, tabId, message) => {
-    chrome.runtime.onMessage.emit(message, new MessageSender(tabId, extensionId))
+  ipcRenderer.on(`CHROME_RUNTIME_ONMESSAGE_${extensionId}`, (event, tabId, message, resultID) => {
+    chrome.runtime.onMessage.emit(message, new MessageSender(tabId, extensionId), (messageResult) => {
+      ipcRenderer.send(`CHROME_RUNTIME_ONMESSAGE_RESULT_${resultID}`, messageResult)
+    })
   })
 
   ipcRenderer.on('CHROME_TABS_ONCREATED', (event, tabId) => {
@@ -121,16 +124,18 @@ exports.injectTo = function (extensionId, isBackgroundPage, context) {
       } else if (args.length === 2) {
         // A case of not provide extension-id: (message, responseCallback)
         if (typeof args[1] === 'function') {
-          console.error('responseCallback is not supported')
+          ipcRenderer.on(`CHROME_RUNTIME_SENDMESSAGE_RESULT_${originResultID}`, (event, result) => args[1](result))
           message = args[0]
         } else {
           [targetExtensionId, message] = args
         }
       } else {
-        console.error('options and responseCallback are not supported')
+        console.error('options is not supported')
+        ipcRenderer.on(`CHROME_RUNTIME_SENDMESSAGE_RESULT_${originResultID}`, (event, result) => args[2](result))
       }
 
-      ipcRenderer.send('CHROME_RUNTIME_SENDMESSAGE', targetExtensionId, message)
+      ipcRenderer.send('CHROME_RUNTIME_SENDMESSAGE', targetExtensionId, message, originResultID)
+      originResultID++
     },
 
     onConnect: new Event(),
@@ -149,9 +154,10 @@ exports.injectTo = function (extensionId, isBackgroundPage, context) {
 
     sendMessage (tabId, message, options, responseCallback) {
       if (responseCallback) {
-        console.error('responseCallback is not supported')
+        ipcRenderer.on(`CHROME_TABS_SEND_MESSAGE_RESULT_${originResultID}`, (event, result) => responseCallback(result))
       }
-      ipcRenderer.send('CHROME_TABS_SEND_MESSAGE', tabId, extensionId, isBackgroundPage, message)
+      ipcRenderer.send('CHROME_TABS_SEND_MESSAGE', tabId, extensionId, isBackgroundPage, message, originResultID)
+      originResultID++;
     },
 
     onUpdated: new Event(),