Implement chrome.runtime.onMessage response callback

This commit is contained in:
Samuel Attard 2016-11-15 21:30:40 +11:00
parent 7cfe1dd0af
commit 01005688b6
No known key found for this signature in database
GPG key ID: 273DC1869D8F13EF
2 changed files with 26 additions and 11 deletions

View file

@ -170,17 +170,22 @@ ipcMain.on('CHROME_I18N_MANIFEST', function (event, extensionId) {
event.returnValue = manifestMap[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] const page = backgroundPages[extensionId]
if (!page) { if (!page) {
console.error(`Connect to unknown extension ${extensionId}`) console.error(`Connect to unknown extension ${extensionId}`)
return 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) const contents = webContents.fromId(tabId)
if (!contents) { if (!contents) {
console.error(`Sending message to unknown tab ${tabId}`) 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 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) { ipcMain.on('CHROME_TABS_EXECUTESCRIPT', function (event, requestId, tabId, extensionId, details) {

View file

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