From 8f6a5433981cb65eb570be91a52873b0daf6bd39 Mon Sep 17 00:00:00 2001 From: Samuel Maddock Date: Wed, 13 Feb 2019 12:16:12 -0500 Subject: [PATCH] feat: add chrome.runtime.getManifest (#16891) * feat: add chrome.runtime.getManifest * Add test for chrome.runtime.getManifest * Use IPC utils for getManifest internals --- lib/browser/chrome-extension.js | 8 ++++ lib/renderer/chrome-api.js | 6 +++ spec/chrome-api-spec.js | 48 +++++++++++++++++++ spec/fixtures/extensions/chrome-api/main.js | 15 ++++++ .../extensions/chrome-api/manifest.json | 12 +++++ 5 files changed, 89 insertions(+) create mode 100644 spec/chrome-api-spec.js create mode 100644 spec/fixtures/extensions/chrome-api/main.js create mode 100644 spec/fixtures/extensions/chrome-api/manifest.json diff --git a/lib/browser/chrome-extension.js b/lib/browser/chrome-extension.js index 0d6400617672f..e451fcbce208a 100644 --- a/lib/browser/chrome-extension.js +++ b/lib/browser/chrome-extension.js @@ -169,6 +169,14 @@ ipcMainInternal.on('CHROME_RUNTIME_CONNECT', function (event, extensionId, conne page.webContents._sendInternalToAll(`CHROME_RUNTIME_ONCONNECT_${extensionId}`, event.sender.id, portId, connectInfo) }) +ipcMainUtils.handleSync('CHROME_EXTENSION_MANIFEST', function (event, extensionId) { + const manifest = manifestMap[extensionId] + if (!manifest) { + throw new Error(`Invalid extensionId: ${extensionId}`) + } + return manifest +}) + let resultID = 1 ipcMainInternal.on('CHROME_RUNTIME_SENDMESSAGE', function (event, extensionId, message, originResultID) { const page = backgroundPages[extensionId] diff --git a/lib/renderer/chrome-api.js b/lib/renderer/chrome-api.js index f34454c01851b..5a7726b07796b 100644 --- a/lib/renderer/chrome-api.js +++ b/lib/renderer/chrome-api.js @@ -1,6 +1,7 @@ 'use strict' const ipcRenderer = require('@electron/internal/renderer/ipc-renderer-internal') +const ipcRendererUtils = require('@electron/internal/renderer/ipc-renderer-internal-utils') const Event = require('@electron/internal/renderer/extensions/event') const url = require('url') @@ -93,6 +94,11 @@ exports.injectTo = function (extensionId, isBackgroundPage, context) { }) }, + getManifest: function () { + const manifest = ipcRendererUtils.invokeSync('CHROME_EXTENSION_MANIFEST', extensionId) + return manifest + }, + connect (...args) { if (isBackgroundPage) { console.error('chrome.runtime.connect is not supported in background page') diff --git a/spec/chrome-api-spec.js b/spec/chrome-api-spec.js new file mode 100644 index 0000000000000..ddea70685727b --- /dev/null +++ b/spec/chrome-api-spec.js @@ -0,0 +1,48 @@ +const fs = require('fs') +const path = require('path') + +const { expect } = require('chai') +const { remote } = require('electron') + +const { closeWindow } = require('./window-helpers') +const { emittedOnce } = require('./events-helpers') + +const { BrowserWindow } = remote + +describe('chrome api', () => { + const fixtures = path.resolve(__dirname, 'fixtures') + let w + + before(() => { + BrowserWindow.addExtension(path.join(fixtures, 'extensions/chrome-api')) + }) + + after(() => { + BrowserWindow.removeExtension('chrome-api') + }) + + beforeEach(() => { + w = new BrowserWindow({ + show: false + }) + }) + + afterEach(() => closeWindow(w).then(() => { w = null })) + + it('runtime.getManifest returns extension manifest', async () => { + const actualManifest = (() => { + const data = fs.readFileSync(path.join(fixtures, 'extensions/chrome-api/manifest.json'), 'utf-8') + return JSON.parse(data) + })() + + w.loadURL('about:blank') + + const p = emittedOnce(w.webContents, 'console-message') + w.webContents.executeJavaScript(`window.postMessage('getManifest', '*')`) + const [,, manifestString] = await p + const manifest = JSON.parse(manifestString) + + expect(manifest.name).to.equal(actualManifest.name) + expect(manifest.content_scripts.length).to.equal(actualManifest.content_scripts.length) + }) +}) diff --git a/spec/fixtures/extensions/chrome-api/main.js b/spec/fixtures/extensions/chrome-api/main.js new file mode 100644 index 0000000000000..066b609e7917f --- /dev/null +++ b/spec/fixtures/extensions/chrome-api/main.js @@ -0,0 +1,15 @@ +/* global chrome */ + +const testMap = { + getManifest () { + const manifest = chrome.runtime.getManifest() + console.log(JSON.stringify(manifest)) + } +} + +const dispatchTest = (event) => { + const testName = event.data + const test = testMap[testName] + test() +} +window.addEventListener('message', dispatchTest, false) diff --git a/spec/fixtures/extensions/chrome-api/manifest.json b/spec/fixtures/extensions/chrome-api/manifest.json new file mode 100644 index 0000000000000..4e52fb3248412 --- /dev/null +++ b/spec/fixtures/extensions/chrome-api/manifest.json @@ -0,0 +1,12 @@ +{ + "name": "chrome-api", + "version": "1.0", + "content_scripts": [ + { + "matches": [""], + "js": ["main.js"], + "run_at": "document_start" + } + ], + "manifest_version": 2 +}