improve orphan check + cosmetics

This commit is contained in:
tophf 2022-08-03 23:58:55 +03:00
parent 685bf1fa3e
commit b88a978843
2 changed files with 25 additions and 21 deletions

View File

@ -259,7 +259,7 @@
} }
function orphanCheck() { function orphanCheck() {
if (tryCatch(() => chrome.i18n.getUILanguage())) return; if (chrome.runtime.id) return;
// In Chrome content script is orphaned on an extension update/reload // In Chrome content script is orphaned on an extension update/reload
// so we need to detach event listeners // so we need to detach event listeners
window.removeEventListener(orphanEventId, orphanCheck, true); window.removeEventListener(orphanEventId, orphanCheck, true);

View File

@ -174,7 +174,7 @@
} }
function orphanCheck() { function orphanCheck() {
if (chrome.i18n) return true; if (chrome.runtime.id) return true;
removeEventListener(orphanEventId, orphanCheck, true); removeEventListener(orphanEventId, orphanCheck, true);
removeEventListener('click', onClick, true); removeEventListener('click', onClick, true);
removeEventListener('change', onChange); removeEventListener('change', onChange);
@ -185,42 +185,46 @@
})(); })();
function inPageContext(eventId, eventIdHost, styleId, apiUrl) { function inPageContext(eventId, eventIdHost, styleId, apiUrl) {
window.isInstalled = true;
const {dispatchEvent, CustomEvent, removeEventListener} = window; const {dispatchEvent, CustomEvent, removeEventListener} = window;
const apply = Map.call.bind(Map.apply); const apply = Map.call.bind(Map.apply);
const CR = chrome.runtime; const CR = chrome.runtime;
const {sendMessage} = CR; const SEND = 'sendMessage';
const RP = Response.prototype; const RP = Response.prototype;
const origJson = RP.json; const ORIG = {json: RP.json, [SEND]: CR[SEND]};
let done, vars; let done, orphaned, vars;
CR.sendMessage = function (id, msg, opts, cb = opts) { CR[SEND] = ovrSend;
if (id === 'fjnbnpbmkenffdnngjfgmeleoegfcffe' && RP.json = ovrJson;
window.isInstalled = true;
addEventListener(eventId, onCommand, true);
function ovrSend(id, msg, opts, cb = opts) {
if (!orphaned &&
id === 'fjnbnpbmkenffdnngjfgmeleoegfcffe' &&
msg && msg.type === 'deleteStyle' && msg && msg.type === 'deleteStyle' &&
typeof cb === 'function') { typeof cb === 'function') {
cb(true); cb(true);
} else { } else {
return sendMessage(...arguments); return ORIG[SEND](...arguments);
} }
}; }
RP.json = async function () { async function ovrJson() {
const res = await apply(origJson, this, arguments); const res = await apply(ORIG.json, this, arguments);
try { try {
if (!done && this.url === apiUrl) { if (!done && this.url === apiUrl) {
RP.json = origJson; if (RP.json === ovrJson) RP.json = ORIG.json;
done = true; // will be used if called by another script that saved our RP.json hook done = true;
send(res); send(res);
setVars(res); setVars(res);
} }
} catch (e) {} } catch (e) {}
return res; return res;
}; }
addEventListener(eventId, onCommand, true);
function onCommand(e) { function onCommand(e) {
if (e.detail === 'quit') { if (e.detail === 'quit') {
removeEventListener(eventId, onCommand, true); removeEventListener(eventId, onCommand, true);
CR.sendMessage = sendMessage; // We can restore the hooks only if another script didn't modify them
RP.json = origJson; if (CR[SEND] === ovrSend) CR[SEND] = ovrSend;
done = true; if (RP.json === ovrJson) RP.json = ORIG.json;
done = orphaned = true;
} else if (/^vars:/.test(e.detail)) { } else if (/^vars:/.test(e.detail)) {
vars = JSON.parse(e.detail.slice(5)); vars = JSON.parse(e.detail.slice(5));
} else if (e.relatedTarget) { } else if (e.relatedTarget) {