| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- /* 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({force: true});
- }
- function DirectDownloader() {
- let oldCode = null;
- return async () => {
- const code = await download(initialUrl, {
- // Disabling cache on http://localhost otherwise the recheck delay gets too big
- headers: {'Cache-Control': 'no-cache, no-store'},
- });
- 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};
- }
- })(),
- };
- })();
|