Restyle, start transferring to async storage, manifest now generates mv3 and mv2 (not tested)

This commit is contained in:
ilyaigpetrov 2022-10-05 23:10:29 +05:00
parent df8d1dfe0c
commit 991022b83c
6 changed files with 94 additions and 72 deletions

View File

@ -0,0 +1,5 @@
console.log('Shimming for mv3...');
if (!chrome.browserAction) {
chrome.browserAction = chrome.action;
}

View File

@ -33,7 +33,7 @@ console.log('Extension started.');
throwIfError(err) { throwIfError(err) {
if(err) { if (err) {
throw err; throw err;
} }
@ -94,7 +94,7 @@ console.log('Extension started.');
throw new TypeError('Property must be supplied.'); throw new TypeError('Property must be supplied.');
} }
const lastProp = props.pop(); const lastProp = props.pop();
for( const prop of props ) { for ( const prop of props ) {
if (!(prop in obj)) { if (!(prop in obj)) {
return undefined; return undefined;
} }
@ -106,7 +106,7 @@ console.log('Extension started.');
assert(value) { assert(value) {
if(!value) { if (!value) {
console.assert(value); console.assert(value);
throw new Error('Assert failed for:' + value); throw new Error('Assert failed for:' + value);
} }
@ -115,7 +115,7 @@ console.log('Extension started.');
addRequestResponder(requestType, responder) { addRequestResponder(requestType, responder) {
if( privates.requestToResponder[requestType] ) { if ( privates.requestToResponder[requestType] ) {
throw new TypeError(`Request ${requestType} already has responder!`); throw new TypeError(`Request ${requestType} already has responder!`);
} }
privates.requestToResponder[requestType] = responder; privates.requestToResponder[requestType] = responder;
@ -127,7 +127,7 @@ console.log('Extension started.');
const cb = args.slice(-1)[0]; const cb = args.slice(-1)[0];
self.assert(typeof(cb) === 'function'); self.assert(typeof(cb) === 'function');
const responder = privates.requestToResponder[requestType]; const responder = privates.requestToResponder[requestType];
if(responder) { if (responder) {
responder(...args); responder(...args);
} else { } else {
cb(); cb();
@ -137,20 +137,21 @@ console.log('Extension started.');
createStorage(prefix) { createStorage(prefix) {
return function state(key, value) { return async function state(key, value) {
const storage = chrome.storage.local;
key = prefix + key; key = prefix + key;
if (value === null) { if (value === null) {
return globalThis.localStorage.removeItem(key); return storage.remove(key);
} }
if (value === undefined) { if (value === undefined) {
const item = globalThis.localStorage.getItem(key); const item = await storage.get(key);
return item && JSON.parse(item); return item && JSON.parse(item);
} }
if (value instanceof Date) { if (value instanceof Date) {
throw new TypeError('Converting Date format to JSON is not supported.'); throw new TypeError('Converting Date format to JSON is not supported.');
} }
globalThis.localStorage.setItem(key, JSON.stringify(value)); storage.set({[key]: JSON.stringify(value)});
}; };
@ -160,8 +161,8 @@ console.log('Extension started.');
get(key) { get(key) {
return new Promise((resolve) => ( return new Promise((resolve) => (
chrome.storage.local.get( chrome.storage.local.get(
key, key,
globalThis.utils.getOrDie((storage) => resolve(key ? storage[key] : storage)), globalThis.utils.getOrDie((storage) => resolve(key ? storage[key] : storage)),
) )
)); ));
}, },
@ -240,11 +241,11 @@ console.log('Extension started.');
let parts; let parts;
parts = crededAddr.split('@'); parts = crededAddr.split('@');
let [creds, addr] = [parts.slice(0, -1).join('@'), parts[parts.length - 1]]; const [creds, addr] = [parts.slice(0, -1).join('@'), parts[parts.length - 1]];
const [hostname, port] = addr.split(':'); const [hostname, port] = addr.split(':');
parts = creds.split(':') parts = creds.split(':');
const username = parts[0]; const username = parts[0];
const password = parts.slice(1).join(':'); const password = parts.slice(1).join(':');
@ -255,15 +256,15 @@ console.log('Extension started.');
hostname, hostname,
port, port,
creds, creds,
} };
}, },
openAndFocus(url) { openAndFocus(url) {
chrome.tabs.create( chrome.tabs.create(
{url: url}, {url: url},
(tab) => chrome.globalThiss.update(tab.globalThisId, {focused: true}) (tab) => chrome.globalThiss.update(tab.globalThisId, {focused: true}),
); );
}, },
@ -271,10 +272,10 @@ console.log('Extension started.');
}; };
const max = 2**16; const max = 2**16;
const versionToArray = (v) => [ ...v.split('.'), 0, 0, 0].slice(0,4); const versionToArray = (v) => [...v.split('.'), 0, 0, 0].slice(0, 4);
const versionToInt = (v) => versionToArray(v) const versionToInt = (v) => versionToArray(v)
.reverse() .reverse()
.reduce((acc, vv, i) => acc + parseInt(vv)*(max**i), 0); .reduce((acc, vv, i) => acc + parseInt(vv)*(max**i), 0);
const compareVersions = (a, b) => versionToInt(a) - versionToInt(b); const compareVersions = (a, b) => versionToInt(a) - versionToInt(b);

View File

@ -1,3 +1,4 @@
import './00---mv3-shim.mjs';
import './00-init-apis.mjs'; import './00-init-apis.mjs';
${scripts_0x} ${scripts_0x}
import './11-error-handlers-api.mjs'; import './11-error-handlers-api.mjs';

View File

@ -1,5 +1,5 @@
{ {
"manifest_version": 2, "manifest_version": ${manifestVersion},
"name": "__MSG_extName__", "name": "__MSG_extName__",
"default_locale": "ru", "default_locale": "ru",
@ -21,6 +21,9 @@
, "notifications" , "notifications"
${extraPermissions} ${extraPermissions}
], ],
${hostPermissions}
"minimum_chrome_version": "55.0.0.0", "minimum_chrome_version": "55.0.0.0",
"browser_specific_settings": { "browser_specific_settings": {
"gecko": { "gecko": {
@ -36,18 +39,14 @@
} }
}, },
"background": { ${background},
${persistent}
"page": "./bg.html"
},
"browser_action": { "${action}": {
"default_title": "Этот сайт благословлён | Версия ${version + versionSuffix}", "default_title": "Этот сайт благословлён | Версия ${version + versionSuffix}",
"default_popup": "/pages/options/index.html" "default_popup": "/pages/options/index.html"
}, },
"options_ui": { "options_ui": {
"page": "/pages/options/index.html", "page": "/pages/options/index.html"
"chrome_style": false }
}
} }

View File

@ -1,55 +1,53 @@
'use strict';
{ const chromified = globalThis.utils.chromified;
const chromified = globalThis.utils.chromified;
const lastErrors = []; const lastErrors = [];
const lastErrorsLength = 20; const lastErrorsLength = 20;
const IF_COLL_KEY = 'err-to-exc-if-coll'; const state = await globalThis.utils.createstate('err-to-exc');
const IF_COLL_KEY = 'if-coll';
const privates = {
ifCollecting: globalThis.localStorage[IF_COLL_KEY] || false,
};
const that = globalThis.apis.lastNetErrors = { const privates = {
get ifCollecting() { ifCollecting: (await state.get(IF_COLL_KEY)) || false,
};
return privates.ifCollecting; const that = globalThis.apis.lastNetErrors = {
get ifCollecting() {
}, return privates.ifCollecting;
set ifCollecting(newValue) { },
privates.ifCollecting = globalThis.localStorage[IF_COLL_KEY] = newValue; set ifCollecting(newValue) {
}, privates.ifCollecting = newValue;
get: () => lastErrors, state.set(IF_COLL_KEY, newValue);
},
get: () => lastErrors,
};
chrome.webRequest.onErrorOccurred.addListener(chromified((err/*Ignored*/, details) => {
if (!that.ifCollecting || [
'net::ERR_BLOCKED_BY_CLIENT',
'net::ERR_ABORTED',
'net::ERR_CACHE_MISS',
'net::ERR_INSUFFICIENT_RESOURCES',
].includes(details.error) ) {
return;
}
const last = lastErrors[0];
if (last && details.error === last.error && details.url === last.url) {
// Dup.
return;
} }
chrome.webRequest.onErrorOccurred.addListener(chromified((err/*Ignored*/, details) => { lastErrors.unshift(details);
if (lastErrors.length > lastErrorsLength) {
lastErrors.pop();
}
if (!that.ifCollecting || [ }), {urls: ['<all_urls>']},
'net::ERR_BLOCKED_BY_CLIENT', );
'net::ERR_ABORTED',
'net::ERR_CACHE_MISS',
'net::ERR_INSUFFICIENT_RESOURCES',
].includes(details.error) ) {
return;
}
const last = lastErrors[0];
if (last && details.error === last.error && details.url === last.url) {
// Dup.
return;
}
lastErrors.unshift(details);
if (lastErrors.length > lastErrorsLength) {
lastErrors.pop();
}
}),
{urls: ['<all_urls>']}
);
}

View File

@ -19,11 +19,21 @@ const contexts = {};
const extraPermissions = ', "webRequest", "webRequestBlocking", "webNavigation"'; const extraPermissions = ', "webRequest", "webRequestBlocking", "webNavigation"';
contexts.full = Object.assign({}, commonContext, { contexts.full = Object.assign({}, commonContext, {
manifestVersion: '3',
versionSuffix: '', versionSuffix: '',
nameSuffixEn: '', nameSuffixEn: '',
nameSuffixRu: '', nameSuffixRu: '',
hostPermissions: `"host_permissions": [
"*://*/*"
],`,
extraPermissions, extraPermissions,
persistent: '', action: 'action',
background: `
"background": {
"service_worker": "./index.mjs",
"type": "module"
}
`,
scripts_0x: '', scripts_0x: '',
scripts_2x: "import './20-ip-to-host-api.mjs';", scripts_2x: "import './20-ip-to-host-api.mjs';",
scripts_8x: ` scripts_8x: `
@ -34,11 +44,19 @@ contexts.full = Object.assign({}, commonContext, {
}); });
contexts.mini = Object.assign({}, commonContext, { contexts.mini = Object.assign({}, commonContext, {
manifestVersion: '2',
versionSuffix: '-mini', versionSuffix: '-mini',
nameSuffixEn: ' MINI', nameSuffixEn: ' MINI',
nameSuffixRu: ' МИНИ', nameSuffixRu: ' МИНИ',
extraPermissions: '', extraPermissions: '',
persistent: '"persistent": false,', hostPermissions: '',
action: 'browser_action',
background: `
"background": {
"persistent": false,
"page": "./bg.html"
}
`,
scripts_0x: '', scripts_0x: '',
scripts_2x: "import '20-for-mini-only.mjs';", scripts_2x: "import '20-for-mini-only.mjs';",
scripts_8x: '', scripts_8x: '',