wait for real prefs on bg startup
+ convert msg.sendXXX to async
This commit is contained in:
parent
cc3c85be58
commit
9d64e9ba54
|
@ -222,6 +222,6 @@ Promise.all([
|
|||
require(['/background/context-menus']),
|
||||
]).then(() => {
|
||||
bgReady._resolveAll();
|
||||
msg.isBgReady = true;
|
||||
msg.ready = true;
|
||||
msg.broadcast({method: 'backgroundReady'});
|
||||
});
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* Common stuff that's loaded first so it's immediately available to all background scripts
|
||||
*/
|
||||
|
||||
const bgReady = {};
|
||||
window.bgReady = {}; /* global bgReady */
|
||||
bgReady.styles = new Promise(r => (bgReady._resolveStyles = r));
|
||||
bgReady.all = new Promise(r => (bgReady._resolveAll = r));
|
||||
|
||||
|
|
|
@ -75,7 +75,7 @@ const styleMan = (() => {
|
|||
};
|
||||
uuidIndex.addCustomId(orderWrap, {set: setOrder});
|
||||
/** @type {Promise|boolean} will be `true` to avoid wasting a microtask tick on each `await` */
|
||||
let ready = init();
|
||||
let ready = Promise.all([init(), prefs.ready]);
|
||||
|
||||
chrome.runtime.onConnect.addListener(port => {
|
||||
if (port.name === 'livePreview') {
|
||||
|
|
25
js/msg.js
25
js/msg.js
|
@ -16,6 +16,8 @@
|
|||
];
|
||||
const ERR_NO_RECEIVER = 'Receiving end does not exist';
|
||||
const ERR_PORT_CLOSED = 'The message port closed before';
|
||||
const NULL_RESPONSE = {error: {message: ERR_NO_RECEIVER}};
|
||||
const STACK = 'Callstack before invoking msg.';
|
||||
const handler = {
|
||||
both: new Set(),
|
||||
tab: new Set(),
|
||||
|
@ -76,14 +78,14 @@
|
|||
}
|
||||
},
|
||||
|
||||
send(data, target = 'extension') {
|
||||
return browser.runtime.sendMessage({data, target})
|
||||
.then(unwrapResponseFactory('send'));
|
||||
async send(data, target = 'extension') {
|
||||
const err = new Error(`${STACK}send:`); // Saving callstack prior to `await`
|
||||
return unwrap(err, await browser.runtime.sendMessage({data, target}));
|
||||
},
|
||||
|
||||
sendTab(tabId, data, options, target = 'tab') {
|
||||
return browser.tabs.sendMessage(tabId, {data, target}, options)
|
||||
.then(unwrapResponseFactory('sendTab'));
|
||||
async sendTab(tabId, data, options, target = 'tab') {
|
||||
const err = new Error(`${STACK}sendTab:`); // Saving callstack prior to `await`
|
||||
return unwrap(err, await browser.tabs.sendMessage(tabId, {data, target}, options));
|
||||
},
|
||||
|
||||
_execute(types, ...args) {
|
||||
|
@ -113,7 +115,7 @@
|
|||
function getExtBg() {
|
||||
const fn = chrome.extension.getBackgroundPage;
|
||||
const bg = fn && fn();
|
||||
return bg === window || bg && bg.msg && bg.msg.isBgReady ? bg : null;
|
||||
return bg === window || bg && (bg.msg || {}).ready ? bg : null;
|
||||
}
|
||||
|
||||
function onRuntimeMessage({data, target}, sender, sendResponse) {
|
||||
|
@ -138,12 +140,7 @@
|
|||
};
|
||||
}
|
||||
|
||||
function unwrapResponseFactory(name) {
|
||||
// Saving the local callstack before making an async call
|
||||
return unwrapResponse.bind(null, new Error(`Callstack before invoking msg.${name}:`));
|
||||
}
|
||||
|
||||
function unwrapResponse(localErr, {data, error} = {error: {message: ERR_NO_RECEIVER}}) {
|
||||
function unwrap(localErr, {data, error} = NULL_RESPONSE) {
|
||||
return error
|
||||
? Promise.reject(Object.assign(localErr, error, error.stack && {
|
||||
stack: `${error.stack}\n${localErr.stack}`,
|
||||
|
@ -163,7 +160,7 @@
|
|||
const message = {method: 'invokeAPI', path, args};
|
||||
let res;
|
||||
// content scripts, probably private tabs, and our extension tab during Chrome startup
|
||||
if (!bg) {
|
||||
if (!bg || !bg.msg || !bg.msg.ready && await bg.bgReady.all && false) {
|
||||
res = msg.send(message);
|
||||
} else {
|
||||
res = deepMerge(await bg.msg._execute(TARGETS.extension, message, {
|
||||
|
|
Loading…
Reference in New Issue
Block a user