Bug 1303798: Correctly propagate addListener errors from WebRequest.jsm to extension. r=mixedpuppy

MozReview-Commit-ID: BTTNaaAdBs5

--HG--
extra : rebase_source : 585e886fd44d689fea68e49b92e6bb1d29868924
This commit is contained in:
Kris Maglione 2016-11-06 18:08:46 -08:00
parent fff7097f0f
commit e6570d6708
3 changed files with 30 additions and 7 deletions

View File

@ -50,6 +50,12 @@ function getConsole() {
XPCOMUtils.defineLazyGetter(this, "console", getConsole);
/**
* An Error subclass for which complete error messages are always passed
* to extensions, rather than being interpreted as an unknown error.
*/
class ExtensionError extends Error {}
function filterStack(error) {
return String(error.stack).replace(/(^.*(Task\.jsm|Promise-backend\.js).*\n)+/gm, "<Promise Chain>\n");
}
@ -368,7 +374,7 @@ class BaseContext {
return error;
}
let message;
if (instanceOf(error, "Object")) {
if (instanceOf(error, "Object") || error instanceof ExtensionError) {
message = error.message;
} else if (typeof error == "object" &&
this.principal.subsumes(Cu.getObjectPrincipal(error))) {
@ -1748,7 +1754,11 @@ class LocalAPIImplementation extends SchemaAPIInterface {
}
addListener(listener, args) {
this.pathObj[this.name].addListener.call(null, listener, ...args);
try {
this.pathObj[this.name].addListener.call(null, listener, ...args);
} catch (e) {
throw this.context.normalizeError(e);
}
}
hasListener(listener) {
@ -2236,6 +2246,7 @@ this.ExtensionUtils = {
DefaultWeakMap,
EventEmitter,
EventManager,
ExtensionError,
IconDetails,
LocalAPIImplementation,
LocaleData,

View File

@ -72,10 +72,12 @@ function background() {
"onCompleted": [{urls: ["<all_urls>"]}, ["responseHeaders"]],
};
let requestBodySupported = true;
function onUpload(details) {
let url = new URL(details.url);
let upload = url.searchParams.get("upload");
if (!upload) {
if (!upload || !requestBodySupported) {
return;
}
let requestBody = details.requestBody;
@ -113,12 +115,18 @@ function background() {
browser.webRequest[name].addListener(
listener.bind(null, name), ...args);
} catch (e) {
browser.test.assertTrue(/\brequestBody\b/.test(e.message),
"Request body is unsupported");
// requestBody is disabled in release builds
if (!/\brequestBody\b/.test(e.message)) {
args.pop();
browser.webRequest[name].addListener(
listener.bind(null, name), ...args);
throw e;
}
requestBodySupported = false;
args.pop();
browser.webRequest[name].addListener(
listener.bind(null, name), ...args);
}
}
}

View File

@ -22,11 +22,15 @@ XPCOMUtils.defineLazyModuleGetter(this, "AppConstants",
"resource://gre/modules/AppConstants.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "BrowserUtils",
"resource://gre/modules/BrowserUtils.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "ExtensionUtils",
"resource://gre/modules/ExtensionUtils.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "WebRequestCommon",
"resource://gre/modules/WebRequestCommon.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "WebRequestUpload",
"resource://gre/modules/WebRequestUpload.jsm");
XPCOMUtils.defineLazyGetter(this, "ExtensionError", () => ExtensionUtils.ExtensionError);
function attachToChannel(channel, key, data) {
if (channel instanceof Ci.nsIWritablePropertyBag2) {
let wrapper = {wrappedJSObject: data};
@ -80,7 +84,7 @@ function parseExtra(extra, allowed = []) {
if (extra) {
for (let ex of extra) {
if (allowed.indexOf(ex) == -1) {
throw new Error(`Invalid option ${ex}`);
throw new ExtensionError(`Invalid option ${ex}`);
}
}
}