Skip to content

Commit

Permalink
Improved plugin management in UserScript API mode
Browse files Browse the repository at this point in the history
  • Loading branch information
modos189 committed Apr 9, 2024
1 parent e19ee7a commit af95030
Show file tree
Hide file tree
Showing 8 changed files with 120 additions and 94 deletions.
8 changes: 4 additions & 4 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"core-js": "^3.8.3",
"highlight.js": "^10.7.3",
"jszip": "^3.10.1",
"lib-iitc-manager": "^1.8.4",
"lib-iitc-manager": "^1.9.0",
"scored-fuzzysearch": "^1.0.5",
"vue": "^2.6.14"
},
Expand Down
82 changes: 44 additions & 38 deletions src/background/background.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { Manager } from "lib-iitc-manager";
import browser from "webextension-polyfill";
import { IS_SCRIPTING_API, IS_USERSCRIPTS_API } from "@/userscripts/env";
import { _ } from "@/i18n";
import { inject_gm_api, inject_plugin } from "@/userscripts/wrapper";
import {
onUpdatedListener,
onRemovedListener,
Expand All @@ -13,9 +12,14 @@ import {
import "./requests";
import { strToBase64 } from "@/strToBase64";
import {
is_userscripts_api_available,
init_userscripts_api,
is_iitc_enabled,
is_userscripts_api_available,
} from "@/userscripts/utils";
import {
inject_plugin_via_content_scripts,
manage_userscripts_api,
} from "@/background/injector";

const manager = new Manager({
storage: browser.storage.local,
Expand All @@ -42,19 +46,17 @@ const manager = new Manager({
} catch {
// If popup is closed, message goes nowhere and an error occurs. Ignore.
}
if (IS_USERSCRIPTS_API) {
is_iitc_enabled().then((status) => {
if (status) {
init_userscripts_api();
manager.inject().then();
}
});
}
},
inject_plugin: async (plugin) => {
await inject_plugin(plugin);
if (IS_USERSCRIPTS_API) return;

const iitc_status = await is_iitc_enabled();
if (iitc_status === false) return;

await inject_plugin_via_content_scripts(plugin, true);
},
is_daemon: IS_USERSCRIPTS_API,
plugin_event: async (data) => await manage_userscripts_api(data),
is_daemon: true,
});

manager.run().then();
Expand All @@ -73,19 +75,19 @@ browser.runtime.onMessage.addListener(async (request) => {
await onRequestOpenIntel();
break;
case "toggleIITC":
await onToggleIITC(request.value);
if (IS_USERSCRIPTS_API && request.value === true) {
await initUserscriptsApi();
}
break;
case "popupWasOpened":
if (IS_USERSCRIPTS_API) {
await manage_user_scripts_status(request.value);
await initUserscriptsApi();
}
await onToggleIITC(request.value);
break;
case "xmlHttpRequestHandler":
await xmlHttpRequestHandler(request.value);
break;
}
});

browser.runtime.onMessage.addListener(async function (request) {
switch (request.type) {
case "managePlugin":
await manager.managePlugin(request.uid, request.action);
break;
Expand Down Expand Up @@ -239,24 +241,28 @@ async function xmlHttpRequestHandler(data) {
}
}

const init_userscripts_api = () => {
if (!is_userscripts_api_available) return;
chrome.userScripts.configureWorld({
csp: "script-src 'self' 'unsafe-inline'",
messaging: true,
});
inject_gm_api();
};
async function initUserscriptsApi() {
if (IS_SCRIPTING_API) return;

async function manage_user_scripts_status(status) {
if (status === true) {
init_userscripts_api();
manager.inject().then();
} else {
try {
await chrome.userScripts.unregister();
} catch (e) {
console.log(e);
}
}
let scripts = [];
try {
scripts = await chrome.userScripts.getScripts();
// eslint-disable-next-line no-empty
} catch {}

const is_gm_api_plugin_exist = scripts.some(
(script) => script.id === "gm_api"
);
if (is_gm_api_plugin_exist) return;

init_userscripts_api();
const plugins_event = {
event: "add",
plugins: await manager.getEnabledPlugins(),
};
await manage_userscripts_api(plugins_event);
}

self.addEventListener("activate", () => {
initUserscriptsApi().then();
});
53 changes: 31 additions & 22 deletions src/background/injector.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,39 +33,48 @@ export async function inject_plugin_via_content_scripts(plugin, use_gm_api) {
}
}

export async function inject_plugin_via_userscripts_api(plugin, use_gm_api) {
export async function manage_userscripts_api(plugins_event) {
if (!is_userscripts_api_available) return;

if (use_gm_api) {
plugin.code = await gm_api_for_plugin(plugin, 0);
}
const event = plugins_event.event;
const plugins = plugins_event.plugins;
const use_gm_api = plugins_event.use_gm_api === true;

let scripts = [];
try {
scripts = await chrome.userScripts.getScripts();
} catch (e) {
console.log(e);
return;
if (event === "remove") {
const remove_ids = Object.keys(plugins);
try {
await browser.userScripts.unregister({ ids: remove_ids });
} catch (e) {
console.log("an error occurred while unregistering the plugin", e);

Check warning on line 48 in src/background/injector.js

View workflow job for this annotation

GitHub Actions / build

Unexpected console statement
}
}
const plugin_obj = [
{

let plugins_obj = [];
for (let plugin of Object.values(plugins)) {
if (use_gm_api) {
plugin.code = await gm_api_for_plugin(plugin, 0);
}
plugins_obj.push({
id: plugin.uid,
matches:
plugin.uid === "gm_api" ? ["https://*/*"] : getPluginMatches(plugin),
js: [{ code: plugin.code }],
runAt: plugin.uid === "gm_api" ? "document_start" : "document_end",
world: "MAIN",
},
];

const is_exist = scripts.some((script) => script.id === plugin.uid);
if (!is_exist) {
await chrome.userScripts.register(plugin_obj);
return;
});
}

const exist_script = scripts.find((script) => script.id === plugin.uid);
if (exist_script.js[0].code !== plugin_obj[0].js[0].code) {
await chrome.userScripts.update(plugin_obj);
if (event === "add") {
try {
await browser.userScripts.register(plugins_obj);
} catch (e) {
console.log("an error occurred while registering the plugin", e);

Check warning on line 71 in src/background/injector.js

View workflow job for this annotation

GitHub Actions / build

Unexpected console statement
}
} else if (event === "update") {
try {
await browser.userScripts.update(plugins_obj);
} catch (e) {
console.log("an error occurred while updating the plugin", e);

Check warning on line 77 in src/background/injector.js

View workflow job for this annotation

GitHub Actions / build

Unexpected console statement
}
}
}
24 changes: 17 additions & 7 deletions src/background/intel.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import browser from "webextension-polyfill";
import { getTabsToInject } from "@/background/utils";
import { is_iitc_enabled } from "@/userscripts/utils";
import { IS_USERSCRIPTS_API } from "@/userscripts/env";

let lastIITCTab = null;

Expand All @@ -24,15 +25,24 @@ export async function onRequestOpenIntel() {
}
}

export async function onToggleIITC(value) {
await browser.storage.local.set({ IITC_is_enabled: value });
export async function onToggleIITC(status) {
await browser.storage.local.set({ IITC_is_enabled: status });

// Fetch all completly loaded Ingress Intel tabs
const tabs = await getTabsToInject();
if (IS_USERSCRIPTS_API) {
if (status === false) {
try {
await browser.userScripts.unregister();
// eslint-disable-next-line no-empty
} catch {}
}
} else {
// Fetch all completly loaded Ingress Intel tabs
const tabs = await getTabsToInject();

for (let tab of Object.values(tabs)) {
if (isIngressIntelUrl(tab.url)) {
await browser.tabs.reload(tab.id);
for (let tab of Object.values(tabs)) {
if (isIngressIntelUrl(tab.url)) {
await browser.tabs.reload(tab.id);
}
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions src/popup/App.vue
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import Message from "./components/Message";
import Alert from "./components/Alert";

import * as data from "./data.js";
import browser from "webextension-polyfill";

export default {
name: "App",
Expand Down Expand Up @@ -61,6 +62,7 @@ export default {
await data.init(this);
await data.onChangedListener(this);
await data.onMessageListener(this);
await browser.runtime.sendMessage({ type: "popupWasOpened" });
},
methods: {
detect_safari: function () {
Expand Down
15 changes: 14 additions & 1 deletion src/userscripts/utils.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
//@license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-v3

import browser from "webextension-polyfill";
import { inject_gm_api } from "@/userscripts/wrapper";

export async function is_iitc_enabled() {
const status = await browser.storage.local
Expand All @@ -12,10 +13,22 @@ export async function is_iitc_enabled() {
export function is_userscripts_api_available() {
try {
// Property access which throws if developer mode is not enabled.
chrome.userScripts;
browser.userScripts;
return true;
} catch {
// Not available.
return false;
}
}

export const init_userscripts_api = () => {
if (!is_userscripts_api_available) return;
try {
browser.userScripts.configureWorld({
csp: "script-src 'self' 'unsafe-inline'",
messaging: true,
});
inject_gm_api();
// eslint-disable-next-line no-empty
} catch {}
};
28 changes: 7 additions & 21 deletions src/userscripts/wrapper.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,35 +2,16 @@

import browser from "webextension-polyfill";
import { IS_USERSCRIPTS_API } from "@/userscripts/env";
import {
inject_plugin_via_content_scripts,
inject_plugin_via_userscripts_api,
} from "@/background/injector";
import { manage_userscripts_api } from "@/background/injector";
import { strToBase64 } from "@/strToBase64";
import { getUID } from "lib-iitc-manager";
import { inject } from "@/content-scripts/utils";
import { GM } from "@/userscripts/gm-api";
import { is_iitc_enabled } from "@/userscripts/utils";

function getPluginHash(uid) {
return "VMin" + strToBase64(uid);
}

export async function inject_plugin(plugin, use_gm_api) {
if (use_gm_api === undefined) use_gm_api = true;

const iitc_status = await is_iitc_enabled();
if (iitc_status === false) return;

if (IS_USERSCRIPTS_API) {
console.log("INJECT LIKE IS CHROME MV3");
await inject_plugin_via_userscripts_api(plugin, use_gm_api);
} else {
console.log("INJECT LIKE OTHER BROWSER");
await inject_plugin_via_content_scripts(plugin, use_gm_api);
}
}

export function inject_gm_api() {
const plugin = {
uid: "gm_api",
Expand All @@ -40,7 +21,12 @@ export function inject_gm_api() {
};

if (IS_USERSCRIPTS_API) {
inject_plugin_via_userscripts_api(plugin, false).then();
const plugins_event = {
event: "add",
use_gm_api: false,
plugins: [plugin],
};
manage_userscripts_api(plugins_event).then();
} else {
inject(plugin.code);
}
Expand Down

0 comments on commit af95030

Please sign in to comment.