fdbfb23547
* parserlib: fast section extraction, tweaks and speedups
* csslint: "simple-not" rule
* csslint: enable and fix "selector-newline" rule
* simplify db: resolve with result
* simplify download()
* remove noCode param as it wastes more time/memory on copying
* styleManager: switch style<->data names to reflect their actual contents
* inline method bodies to avoid indirection and enable better autocomplete/hint/jump support in IDE
* upgrade getEventKeyName to handle mouse clicks
* don't trust location.href as it hides text fragment
* getAllKeys is implemented since Chrome48, FF44
* allow recoverable css errors + async'ify usercss.js
* openManage: unminimize windows
* remove the obsolete Chrome pre-65 workaround
* fix temporal dead zone in apply.js
* ff bug workaround for simple editor window
* consistent window scrolling in scrollToEditor and jumpToPos
* rework waitForSelector and collapsible <details>
* blank paint frame workaround for new Chrome
* extract stuff from edit.js and load on demand
* simplify regexpTester::isShown
* move MozDocMapper to sections-util.js
* extract fitSelectBox()
* initialize router earlier
* use helpPopup.close()
* fix autofocus in popups, follow-up to 5bb1b5ef
* clone objects in prefs.get() + cosmetics
* reuse getAll result for INC
91 lines
2.3 KiB
JavaScript
91 lines
2.3 KiB
JavaScript
/* global API */// msg.js
|
|
/* global closeCurrentTab download */// toolbox.js
|
|
'use strict';
|
|
|
|
/* exported preinit */
|
|
const preinit = (() => {
|
|
const params = new URLSearchParams(location.search);
|
|
const tabId = params.has('tabId') ? Number(params.get('tabId')) : -1;
|
|
const initialUrl = params.get('updateUrl');
|
|
|
|
/** @type function(?options):Promise<?string> */
|
|
let getData;
|
|
/** @type {Promise<?string>} */
|
|
let firstGet;
|
|
if (tabId < 0) {
|
|
getData = DirectDownloader();
|
|
firstGet = API.usercss.getInstallCode(initialUrl)
|
|
.then(code => code || getData())
|
|
.catch(getData);
|
|
} else {
|
|
getData = PortDownloader();
|
|
firstGet = getData({timer: false});
|
|
}
|
|
|
|
function DirectDownloader() {
|
|
let oldCode = null;
|
|
return async () => {
|
|
const code = await download(initialUrl);
|
|
if (oldCode !== code) {
|
|
oldCode = code;
|
|
return code;
|
|
}
|
|
};
|
|
}
|
|
|
|
function PortDownloader() {
|
|
const resolvers = new Map();
|
|
const port = chrome.tabs.connect(tabId, {name: 'downloadSelf'});
|
|
port.onMessage.addListener(({id, code, error}) => {
|
|
const r = resolvers.get(id);
|
|
resolvers.delete(id);
|
|
if (error) {
|
|
r.reject(error);
|
|
} else {
|
|
r.resolve(code);
|
|
}
|
|
});
|
|
port.onDisconnect.addListener(async () => {
|
|
const tab = await browser.tabs.get(tabId).catch(() => ({}));
|
|
if (tab.url === initialUrl) {
|
|
location.reload();
|
|
} else {
|
|
closeCurrentTab();
|
|
}
|
|
});
|
|
return (opts = {}) => new Promise((resolve, reject) => {
|
|
const id = performance.now();
|
|
resolvers.set(id, {resolve, reject});
|
|
opts.id = id;
|
|
port.postMessage(opts);
|
|
});
|
|
}
|
|
|
|
return {
|
|
|
|
getData,
|
|
initialUrl,
|
|
tabId,
|
|
|
|
/** @type {Promise<{style, dup} | {error}>} */
|
|
ready: (async () => {
|
|
let sourceCode;
|
|
try {
|
|
sourceCode = await firstGet;
|
|
} catch (error) {
|
|
return {error};
|
|
}
|
|
try {
|
|
const data = await API.usercss.build({sourceCode, checkDup: true, metaOnly: true});
|
|
Object.defineProperty(data.style, 'sectionsPromise', {
|
|
value: API.usercss.buildCode(data.style).then(style => style.sections),
|
|
configurable: true,
|
|
});
|
|
return data;
|
|
} catch (error) {
|
|
return {error, sourceCode};
|
|
}
|
|
})(),
|
|
};
|
|
})();
|