diff --git a/lib/browser/chrome-extension.js b/lib/browser/chrome-extension.js index 840715a08a1..a49b8f2651a 100644 --- a/lib/browser/chrome-extension.js +++ b/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) { diff --git a/lib/renderer/chrome-api.js b/lib/renderer/chrome-api.js index b49d7382c04..4bd69d0be16 100644 --- a/lib/renderer/chrome-api.js +++ b/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(),