From 29b9ff228033c2758c380072e9318d62a7649093 Mon Sep 17 00:00:00 2001 From: Alexander Danilov Date: Sun, 11 Oct 2020 14:05:25 +0300 Subject: [PATCH] Fix initialization of plugins --- package.json | 2 +- src/background/injector.js | 17 +++++++++++------ src/background/intel.js | 29 ++++++++++++++++++++--------- src/background/manager.js | 4 ++-- src/content-scripts/loader.js | 10 +++++----- src/helpers.js | 7 ++++--- 6 files changed, 43 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index 03dda00..db15eff 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iitc-button", - "version": "1.5.0", + "version": "1.5.1", "repository": "https://github.com/IITC-CE/IITC-Button.git", "license": "GPLv3", "private": true, diff --git a/src/background/injector.js b/src/background/injector.js index ffc575f..e593d70 100644 --- a/src/background/injector.js +++ b/src/background/injector.js @@ -1,15 +1,12 @@ //@license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-v3 -export async function injectUserScript(code) { +export async function injectUserScript(code, tabs) { const inject = ` document.dispatchEvent(new CustomEvent('IITCButtonInitJS', { detail: ${JSON.stringify(code)} })); `; - // Fetch all completly loaded Ingress Intel tabs - const tabs = await browser.tabs.query({ - url: "https://intel.ingress.com/*", - status: "complete" - }); + + if (tabs === undefined) tabs = await getTabsToInject(); for (let tab of Object.values(tabs)) { try { @@ -21,3 +18,11 @@ export async function injectUserScript(code) { } } } + +// Fetch all completly loaded Ingress Intel tabs +export async function getTabsToInject() { + return await browser.tabs.query({ + url: "https://intel.ingress.com/*", + status: "complete" + }); +} diff --git a/src/background/intel.js b/src/background/intel.js index a3503ba..2340e58 100644 --- a/src/background/intel.js +++ b/src/background/intel.js @@ -1,6 +1,6 @@ //@license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-v3 -import { preparationUserScript } from "../helpers"; -import { injectUserScript } from "./injector"; +import { getUID, parse_meta, preparationUserScript } from "../helpers"; +import { getTabsToInject, injectUserScript } from "./injector"; let lastIITCTab = null; @@ -87,25 +87,36 @@ async function initialize() { const plugins_user = data[channel + "_plugins_user"]; if ((status === undefined || status === true) && iitc_code !== undefined) { - const inject_iitc_code = preparationUserScript({ - version: iitc_version, - code: iitc_code - }); - await injectUserScript(inject_iitc_code); + const tabs = await getTabsToInject(); + const userscripts = []; + + const iitc_meta = parse_meta(iitc_code); + const iitc_uid = getUID(iitc_meta); + const inject_iitc_code = preparationUserScript( + { + version: iitc_version, + code: iitc_code + }, + iitc_uid + ); + userscripts.push(inject_iitc_code); const plugins_flat = data[channel + "_plugins_flat"]; for (const uid of Object.keys(plugins_flat)) { if (plugins_flat[uid]["status"] === "on") { - await injectUserScript( + userscripts.push( preparationUserScript( plugins_flat[uid]["user"] === true ? plugins_user[uid] : plugins_local[uid], uid - ) + ), + tabs ); } } + + await Promise.all(userscripts.map(code => injectUserScript(code, tabs))); } } diff --git a/src/background/manager.js b/src/background/manager.js index cca6150..bb98597 100644 --- a/src/background/manager.js +++ b/src/background/manager.js @@ -296,7 +296,7 @@ async function updateExternalPlugins(local) { let exist_updates = false; const hash = `?${Date.now()}`; - for await (const uid of Object.keys(plugins_user)) { + for (const uid of Object.keys(plugins_user)) { const plugin = plugins_user[uid]; if (plugin["updateURL"] && plugin["downloadURL"]) { @@ -335,7 +335,7 @@ async function updateLocalPlugins(plugins_flat, plugins_local) { if (plugins_local === undefined) return {}; // Iteration local plugins - for await (const uid of Object.keys(plugins_local)) { + for (const uid of Object.keys(plugins_local)) { let filename = plugins_local[uid]["filename"]; if (filename && plugins_flat[uid]) { diff --git a/src/content-scripts/loader.js b/src/content-scripts/loader.js index be603c6..f28f5ba 100644 --- a/src/content-scripts/loader.js +++ b/src/content-scripts/loader.js @@ -55,13 +55,13 @@ function preparePage() { const GM_info_raw = code.substring(0, code.indexOf(";/* END GM_info */")); const GM_info = new Function("GM_info", GM_info_raw + ";return GM_info")(); - const id = GM_info.script.name; + const uid = GM_info.script.uid; - if (loaded_plugins.includes(id)) { - console.debug(`Plugin ${id} is already loaded. Skip`); + if (loaded_plugins.includes(uid)) { + console.debug(`Plugin ${uid} is already loaded. Skip`); } else { - loaded_plugins.push(id); - console.debug(`Plugin ${id} loaded`); + loaded_plugins.push(uid); + console.debug(`Plugin ${uid} loaded`); new Function(sandbox + code)(); } }); diff --git a/src/helpers.js b/src/helpers.js index ae429d2..15433e1 100644 --- a/src/helpers.js +++ b/src/helpers.js @@ -89,13 +89,14 @@ function h(str) { } // Implementation of partial sufficient compatibility with GreaseMonkey -export function preparationUserScript(plugin, name) { - if (name === undefined) name = ""; +export function preparationUserScript(plugin, uid) { + if (uid === undefined) uid = ""; return `var GM_info = { "script": { + "uid": "${h(uid)}", "version": "${h(plugin["version"])}", - "name": "${h(name)}", + "name": "${h(plugin["name"])}", "description": "${h(plugin["description"])}" } };/* END GM_info */