add a callstack to errors in browser
and msg
(#1369)
This commit is contained in:
parent
9d2854c272
commit
0ac01d2e22
15
js/msg.js
15
js/msg.js
|
@ -78,12 +78,12 @@
|
|||
|
||||
send(data, target = 'extension') {
|
||||
return browser.runtime.sendMessage({data, target})
|
||||
.then(unwrapResponse);
|
||||
.then(unwrapResponseFactory('send'));
|
||||
},
|
||||
|
||||
sendTab(tabId, data, options, target = 'tab') {
|
||||
return browser.tabs.sendMessage(tabId, {data, target}, options)
|
||||
.then(unwrapResponse);
|
||||
.then(unwrapResponseFactory('sendTab'));
|
||||
},
|
||||
|
||||
_execute(types, ...args) {
|
||||
|
@ -138,9 +138,16 @@
|
|||
};
|
||||
}
|
||||
|
||||
function unwrapResponse({data, error} = {error: {message: ERR_NO_RECEIVER}}) {
|
||||
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}}) {
|
||||
return error
|
||||
? Promise.reject(Object.assign(new Error(error.message), error))
|
||||
? Promise.reject(Object.assign(localErr, error, error.stack && {
|
||||
stack: `${error.stack}\n${localErr.stack}`,
|
||||
}))
|
||||
: data;
|
||||
}
|
||||
|
||||
|
|
|
@ -23,14 +23,21 @@
|
|||
};
|
||||
const promisify = function (fn, ...args) {
|
||||
let res;
|
||||
let resolve, reject;
|
||||
// Saving the local callstack before making an async call
|
||||
const err = new Error();
|
||||
try {
|
||||
let resolve, reject;
|
||||
/* Some callbacks have 2 parameters so we're resolving as an array in that case.
|
||||
For example, chrome.runtime.requestUpdateCheck and chrome.webRequest.onAuthRequired */
|
||||
args.push((...results) =>
|
||||
chrome.runtime.lastError ?
|
||||
reject(new Error(chrome.runtime.lastError.message)) :
|
||||
resolve(results.length <= 1 ? results[0] : results));
|
||||
args.push((...results) => {
|
||||
const {lastError} = chrome.runtime;
|
||||
if (lastError) {
|
||||
err.message = lastError.message;
|
||||
reject(err);
|
||||
} else {
|
||||
/* Some callbacks have 2 parameters so we're resolving as an array in that case.
|
||||
For example, chrome.runtime.requestUpdateCheck and chrome.webRequest.onAuthRequired */
|
||||
resolve(results.length <= 1 ? results[0] : results);
|
||||
}
|
||||
});
|
||||
fn.apply(this, args);
|
||||
res = new Promise((...rr) => ([resolve, reject] = rr));
|
||||
} catch (err) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user