diff options
Diffstat (limited to 'js/vapi-background.js')
-rw-r--r-- | js/vapi-background.js | 66 |
1 files changed, 48 insertions, 18 deletions
diff --git a/js/vapi-background.js b/js/vapi-background.js index b4f1eac..7dfe924 100644 --- a/js/vapi-background.js +++ b/js/vapi-background.js @@ -1664,14 +1664,36 @@ var HTTPRequestHeaders = function(channel) { HTTPRequestHeaders.prototype.init = function(channel) { this.channel = channel; + this.headers = new Array(); + this.originalHeaderNames = new Array(); + channel.visitRequestHeaders({visitHeader: function(name, value) { + this.headers.push({name: name, value: value}); + this.originalHeaderNames.push(name); + }.bind(this)}); return this; }; HTTPRequestHeaders.prototype.dispose = function() { this.channel = null; + this.headers = null; + this.originalHeaderNames = null; httpRequestHeadersFactory.junkyard.push(this); }; +HTTPRequestHeaders.prototype.update = function() { + var newHeaderNames = new Set(); + for ( var header of this.headers ) { + this.setHeader(header.name, header.value, true); + newHeaderNames.add(header.name); + } + //Clear any headers that were removed + for ( var name of this.originalHeaderNames ) { + if ( !newHeaderNames.has(name) ) { + this.channel.setRequestHeader(name, '', false); + } + } +} + HTTPRequestHeaders.prototype.getHeader = function(name) { try { return this.channel.getRequestHeader(name); @@ -1901,13 +1923,17 @@ var httpObserver = { var onBeforeSendHeaders = vAPI.net.onBeforeSendHeaders; if ( onBeforeSendHeaders.types === null || onBeforeSendHeaders.types.has(type) ) { var requestHeaders = httpRequestHeadersFactory(channel); - onBeforeSendHeaders.callback({ + var newHeaders = onBeforeSendHeaders.callback({ parentFrameId: type === 'main_frame' ? -1 : 0, - requestHeaders: requestHeaders, + requestHeaders: requestHeaders.headers, tabId: tabId, type: type, - url: URI.asciiSpec + url: URI.asciiSpec, + method:channel.requestMethod }); + if ( newHeaders ) { + requestHeaders.update(); + } requestHeaders.dispose(); } @@ -2009,30 +2035,34 @@ var httpObserver = { return; } - topic = 'Content-Security-Policy'; + //topic = ['Content-Security-Policy', 'Content-Security-Policy-Report-Only']; + // Can send empty responseHeaders as these headers are only added and then merged + - var result; - try { - result = channel.getResponseHeader(topic); - } catch (ex) { - result = null; - } + // TODO: Find better place for this, needs to be set before onHeadersReceived.callback + // Web workers not blocked in Pale Moon as child-src currently unavailable, see: + // https://github.com/MoonchildProductions/Pale-Moon/issues/949 + if (μMatrix.cspNoWorker === undefined) { + μMatrix.cspNoWorker = "child-src 'none'; frame-src data: blob: *; report-uri about:blank"; + } - result = vAPI.net.onHeadersReceived.callback({ + var result = vAPI.net.onHeadersReceived.callback({ parentFrameId: type === 'main_frame' ? -1 : 0, - responseHeaders: result ? [{name: topic, value: result}] : [], + responseHeaders: [], tabId: channelData[0], type: type, url: URI.asciiSpec }); if ( result ) { - channel.setResponseHeader( - topic, - result.responseHeaders.pop().value, - true - ); - } + for (let header of result.reponseHeaders ) { + channel.setResponseHeader( + header.name, + header.value, + true + ); + } + } return; } |