--- a/toolkit/modules/addons/WebRequest.jsm
+++ b/toolkit/modules/addons/WebRequest.jsm
@@ -702,44 +702,45 @@ HttpObserverManager = {
this.runChannelListener(channel, "onStart");
break;
case "stop":
this.runChannelListener(channel, "onStop");
break;
}
},
+ STATUS_TYPES: new Set(["headersReceived", "authRequired", "onRedirect", "onStart", "onStop"]),
+ FILTER_TYPES: new Set(["opening", "modify", "afterModify", "headersReceived", "authRequired", "onRedirect"]),
+
runChannelListener(channel, kind, extraData = null) {
let handlerResults = [];
let requestHeaders;
let responseHeaders;
try {
if (kind !== "onError" && channel.errorString) {
return;
}
- let includeStatus = ["headersReceived", "authRequired", "onRedirect", "onStart", "onStop"].includes(kind);
- let registerFilter = ["opening", "modify", "afterModify", "headersReceived", "authRequired", "onRedirect"].includes(kind);
-
+ let registerFilter = this.FILTER_TYPES.has(kind);
let commonData = null;
let requestBody;
- for (let [callback, opts] of this.listeners[kind].entries()) {
+ this.listeners[kind].forEach((opts, callback) => {
if (!channel.matches(opts.filter, opts.extension)) {
- continue;
+ return;
}
if (!commonData) {
commonData = this.getRequestData(channel, extraData);
- if (includeStatus) {
+ if (this.STATUS_TYPES.has(kind)) {
commonData.statusCode = channel.statusCode;
commonData.statusLine = channel.statusLine;
}
}
- let data = Object.assign({}, commonData);
+ let data = Object.create(commonData);
if (registerFilter && opts.blocking && opts.extension) {
channel.registerTraceableChannel(opts.extension, opts.tabParent);
}
if (opts.requestHeaders) {
requestHeaders = requestHeaders || new RequestHeaderChanger(channel);
data.requestHeaders = requestHeaders.toArray();
@@ -759,17 +760,17 @@ HttpObserverManager = {
let result = callback(data);
if (channel.canModify && result && typeof result === "object" && opts.blocking) {
handlerResults.push({opts, result});
}
} catch (e) {
Cu.reportError(e);
}
- }
+ });
} catch (e) {
Cu.reportError(e);
}
return this.applyChanges(kind, channel, handlerResults, requestHeaders, responseHeaders);
},
async applyChanges(kind, channel, handlerResults, requestHeaders, responseHeaders) {