diff options
-rw-r--r-- | frameModule.js | 2 | ||||
-rw-r--r-- | js/vapi-background.js | 66 | ||||
-rw-r--r-- | js/vapi-client.js | 9 |
3 files changed, 54 insertions, 23 deletions
diff --git a/frameModule.js b/frameModule.js index 46d9377..8af4671 100644 --- a/frameModule.js +++ b/frameModule.js @@ -304,7 +304,7 @@ var contentObserver = { let docReady = (e) => { let doc = e.target; doc.removeEventListener(e.type, docReady, true); - lss(this.contentBaseURI + 'contentscript-end.js', sandbox); + lss(this.contentBaseURI + 'contentscript.js', sandbox); }; if ( doc.readyState === 'loading') { 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; } diff --git a/js/vapi-client.js b/js/vapi-client.js index 7f9521d..fd77179 100644 --- a/js/vapi-client.js +++ b/js/vapi-client.js @@ -80,7 +80,7 @@ vAPI.messaging = { requestId: 1, connected: false, - setup: function() { + start: function() { this.addListener(this.builtinListener); if ( this.toggleListenerCallback === null ) { this.toggleListenerCallback = this.toggleListener.bind(this); @@ -206,18 +206,19 @@ vAPI.messaging = { } }; -vAPI.messaging.setup() +vAPI.messaging.start() /******************************************************************************/ // No need to have vAPI client linger around after shutdown if // we are not a top window (because element picker can still // be injected in top window). -if ( window !== window.top ) { +// Needs more investigating +/*if ( window !== window.top ) { vAPI.shutdown.add(function() { vAPI = null; }); -} +}*/ /******************************************************************************/ |