From 097ca00d325fb11f53df5787099b1de511d57b9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20R=C3=A8gne?= Date: Fri, 29 Jan 2021 15:58:57 +0100 Subject: [PATCH] =?UTF-8?q?fix:=20G=C3=A9rer=20la=20suppression=20de=20per?= =?UTF-8?q?missions=20optionnelles.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/background/index.html | 1 + src/background/permissions.js | 24 ++++++++++++ test/polyfill/browser.js | 40 +++++++++++++++++-- test/unit/background/permissions.js | 59 +++++++++++++++++++++++++++++ 4 files changed, 120 insertions(+), 4 deletions(-) create mode 100644 src/background/permissions.js create mode 100644 test/unit/background/permissions.js diff --git a/src/background/index.html b/src/background/index.html index d2ca8c06..687b28b3 100644 --- a/src/background/index.html +++ b/src/background/index.html @@ -8,5 +8,6 @@ + diff --git a/src/background/permissions.js b/src/background/permissions.js new file mode 100644 index 00000000..e449bba0 --- /dev/null +++ b/src/background/permissions.js @@ -0,0 +1,24 @@ +/** + * @module + */ + +/** + * Actualise la configuration suite la suppression de permissions optionnelles. + * + * @param {Object} changes Les changements sur les permissions. + * @param {string[]} changes.permissions Les permissions supprimées. + */ +const handleRemove = async function ({ permissions }) { + if (permissions.includes("history")) { + browser.storage.local.set({ "general-history": false }); + } + if (permissions.includes("bookmarks")) { + const config = await browser.storage.local.get(["menu-contexts"]); + const contexts = config["menu-contexts"]; + browser.storage.local.set({ + "menu-contexts": contexts.filter((c) => "bookmark" !== c), + }); + } +}; + +browser.permissions.onRemoved.addListener(handleRemove); diff --git a/test/polyfill/browser.js b/test/polyfill/browser.js index c849bde2..f865931e 100644 --- a/test/polyfill/browser.js +++ b/test/polyfill/browser.js @@ -9,9 +9,13 @@ const I18NS = JSON.parse( ); const data = { - bookmarks: {}, - histories: [], - storage: { + bookmarks: {}, + histories: [], + permissions: { + data: new Set(), + listeners: [], + }, + storage: { local: { data: {}, listeners: [], @@ -63,6 +67,34 @@ export const browser = { }, }, + permissions: { + remove: ({ permissions }) => { + const changes = { permissions: [] }; + for (const permission of permissions) { + const deleted = data.permissions.data.delete(permission); + if (deleted) { + changes.permissions.push(permission); + } + } + if (0 !== changes.permissions.length) { + data.permissions.listeners.forEach((l) => l(changes)); + return Promise.resolve(true); + } + return Promise.resolve(false); + }, + request: ({ permissions }) => { + for (const permission of permissions) { + data.permissions.data.add(permission); + } + return Promise.resolve(true); + }, + onRemoved: { + addListener: (listener) => { + data.permissions.listeners.push(listener); + }, + }, + }, + storage: { local: { get: (properties = null) => { @@ -91,7 +123,7 @@ export const browser = { } return [key, change]; })); - data.storage.local.listeners.map((l) => l(changes)); + data.storage.local.listeners.forEach((l) => l(changes)); Object.assign(data.storage.local.data, values); }, clear: () => { diff --git a/test/unit/background/permissions.js b/test/unit/background/permissions.js new file mode 100644 index 00000000..6020ecbb --- /dev/null +++ b/test/unit/background/permissions.js @@ -0,0 +1,59 @@ +import assert from "assert"; +// eslint-disable-next-line import/no-unassigned-import +import "../../../src/background/permissions.js"; + +describe("background/permissions.js", function () { + describe("handleRemove()", function () { + it("should handle history", async function () { + await browser.permissions.request({ + permissions: ["foo", "history"], + }); + browser.storage.local.set({ "general-history": true }); + + await browser.permissions.remove({ permissions: ["foo"] }); + let config = await browser.storage.local.get(["general-history"]); + assert.strictEqual(config["general-history"], true); + + await browser.permissions.remove({ permissions: [] }); + config = await browser.storage.local.get(["general-history"]); + assert.strictEqual(config["general-history"], true); + + await browser.permissions.remove({ permissions: ["history"] }); + config = await browser.storage.local.get(["general-history"]); + assert.strictEqual(config["general-history"], false); + + await browser.permissions.remove({ permissions: ["history"] }); + config = await browser.storage.local.get(["general-history"]); + assert.strictEqual(config["general-history"], false); + + browser.storage.local.clear(); + }); + + it("should handle bookmarks", async function () { + await browser.permissions.request({ + permissions: ["foo", "bookmarks"], + }); + browser.storage.local.set({ "menu-contexts": ["bar", "bookmark"] }); + + await browser.permissions.remove({ permissions: ["foo"] }); + let config = await browser.storage.local.get(["menu-contexts"]); + assert.deepStrictEqual(config["menu-contexts"], + ["bar", "bookmark"]); + + await browser.permissions.remove({ permissions: [] }); + config = await browser.storage.local.get(["menu-contexts"]); + assert.deepStrictEqual(config["menu-contexts"], + ["bar", "bookmark"]); + + await browser.permissions.remove({ permissions: ["bookmarks"] }); + config = await browser.storage.local.get(["menu-contexts"]); + assert.deepStrictEqual(config["menu-contexts"], ["bar"]); + + await browser.permissions.remove({ permissions: ["bookmarks"] }); + config = await browser.storage.local.get(["menu-contexts"]); + assert.deepStrictEqual(config["menu-contexts"], ["bar"]); + + browser.storage.local.clear(); + }); + }); +});