diff --git a/lib/renderer/chrome-api.ts b/lib/renderer/chrome-api.ts index 8c5538378c13d..1f121e5e795f5 100644 --- a/lib/renderer/chrome-api.ts +++ b/lib/renderer/chrome-api.ts @@ -120,7 +120,11 @@ export function injectTo (extensionId: string, context: any) { let targetExtensionId = extensionId let connectInfo = { name: '' } if (args.length === 1) { - targetExtensionId = args[0] + if (typeof args[0] === 'string') { + targetExtensionId = args[0] + } else { + connectInfo = args[0] + } } else if (args.length === 2) { [targetExtensionId, connectInfo] = args } diff --git a/spec-main/extensions-spec.ts b/spec-main/extensions-spec.ts index b799d3199dc96..1e001a5a2fca1 100644 --- a/spec-main/extensions-spec.ts +++ b/spec-main/extensions-spec.ts @@ -109,6 +109,20 @@ ifdescribe(!process.electronBinding('features').isExtensionsEnabled())('chrome e afterEach(() => closeWindow(w).then(() => { w = null as unknown as BrowserWindow })) + it('chrome.runtime.connect parses arguments properly', async function () { + await w.loadURL('about:blank') + + const promise = emittedOnce(w.webContents, 'console-message') + + const message = { method: 'connect' } + w.webContents.executeJavaScript(`window.postMessage('${JSON.stringify(message)}', '*')`) + + const [,, responseString] = await promise + const response = JSON.parse(responseString) + + expect(response).to.be.true() + }) + it('runtime.getManifest returns extension manifest', async () => { const actualManifest = (() => { const data = fs.readFileSync(path.join(fixtures, 'extensions/chrome-api/manifest.json'), 'utf-8') diff --git a/spec/fixtures/extensions/chrome-api/main.js b/spec/fixtures/extensions/chrome-api/main.js index 2784e82c37fd0..ee7ec1f2b91cb 100644 --- a/spec/fixtures/extensions/chrome-api/main.js +++ b/spec/fixtures/extensions/chrome-api/main.js @@ -5,6 +5,17 @@ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { }) const testMap = { + connect () { + let success = false + try { + chrome.runtime.connect(chrome.runtime.id) + chrome.runtime.connect(chrome.runtime.id, { name: 'content-script' }) + chrome.runtime.connect({ name: 'content-script' }) + success = true + } finally { + console.log(JSON.stringify(success)) + } + }, getManifest () { const manifest = chrome.runtime.getManifest() console.log(JSON.stringify(manifest))