diff options
author | Alessio Vanni <vannilla@firemail.cc> | 2019-06-23 03:11:39 +0200 |
---|---|---|
committer | Alessio Vanni <vannilla@firemail.cc> | 2019-06-23 03:11:39 +0200 |
commit | a7ad9ff0d7e80001db78e65fb5e756966141230f (patch) | |
tree | c5bca3a55fd0586a3704928096b41045f603570a | |
parent | 6458ec333511fe07101dd3afffbefed7b4fead07 (diff) | |
download | ematrix-a7ad9ff0d7e80001db78e65fb5e756966141230f.tar.lz ematrix-a7ad9ff0d7e80001db78e65fb5e756966141230f.tar.xz ematrix-a7ad9ff0d7e80001db78e65fb5e756966141230f.zip |
Make HTTPRequestHeaders a module
The same as CallbackWrapper.
-rw-r--r-- | HttpRequestHeaders.jsm | 100 | ||||
-rw-r--r-- | Makefile | 3 | ||||
-rw-r--r-- | js/vapi-background.js | 80 |
3 files changed, 105 insertions, 78 deletions
diff --git a/HttpRequestHeaders.jsm b/HttpRequestHeaders.jsm new file mode 100644 index 0000000..c2b0bcd --- /dev/null +++ b/HttpRequestHeaders.jsm @@ -0,0 +1,100 @@ +/******************************************************************************* + + ηMatrix - a browser extension to black/white list requests. + Copyright (C) 2014-2019 The uMatrix/uBlock Origin authors + Copyright (C) 2019 Alessio Vanni + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://gitlab.com/vannilla/ematrix + uMatrix Home: https://github.com/gorhill/uMatrix +*/ + +var EXPORTED_SYMBOLS = ['HTTPRequestHeaders']; + +var junkyard = []; + +let HTTPRequestHeaders = function (channel) { + this.init(channel); +}; + +HTTPRequestHeaders.factory = function (channel) { + let entry = junkyard.pop(); + if (entry) { + return entry.init(channel); + } + + return new HTTPRequestHeaders(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; + junkyard.push(this); +}; + +HTTPRequestHeaders.prototype.update = function () { + let newHeaderNames = new Set(); + for (let header of this.headers) { + this.setHeader(header.name, header.value, true); + newHeaderNames.add(header.name); + } + + //Clear any headers that were removed + for (let name of this.originalHeaderNames) { + if (!newHeaderNames.has(name)) { + this.channel.setRequestHeader(name, '', false); + } + } +}; + +HTTPRequestHeaders.prototype.getHeader = function (name) { + try { + return this.channel.getRequestHeader(name); + } catch (e) { + // Ignore + } + + return ''; +}; + +HTTPRequestHeaders.prototype.setHeader = function (name, newValue, create) { + let oldValue = this.getHeader(name); + if (newValue === oldValue) { + return false; + } + + if (oldValue === '' && create !== true) { + return false; + } + + this.channel.setRequestHeader(name, newValue, false); + return true; +}; @@ -119,7 +119,8 @@ JS2 := js/httpsb.js js/i18n.js js/liquid-dict.js js/logger.js \ # vapi-popup.js is apparently not needed on UXP # TODO: investigate wether or not it can be removed JS3 := js/tab.js js/traffic.js js/udom.js js/uritools.js js/user-rules.js \ - js/usersettings.js js/utils.js js/xal.js CallbackWrapper.jsm + js/usersettings.js js/utils.js js/xal.js CallbackWrapper.jsm \ + HTTPRequestHeaders.jsm JS4 := js/vapi-client.js js/vapi-common.js js/vapi-background.js \ js/vapi-popup.js js/vapi-tabs.js js/vapi-window.js \ diff --git a/js/vapi-background.js b/js/vapi-background.js index 0da0638..a7cc5f3 100644 --- a/js/vapi-background.js +++ b/js/vapi-background.js @@ -33,6 +33,8 @@ (function () { const {classes: Cc, interfaces: Ci, utils: Cu} = Components; const {Services} = Cu.import('resource://gre/modules/Services.jsm', null); + const {HTTPRequestHeaders} = + Cu.import('chrome://ematrix/content/HTTPRequestHeaders.jsm', null); let vAPI = self.vAPI; // Guaranteed to be initialized by vapi-core.js @@ -69,82 +71,6 @@ } }; - let httpRequestHeadersFactory = function (channel) { - let entry = httpRequestHeadersFactory.junkyard.pop(); - if (entry) { - return entry.init(channel); - } - - return new HTTPRequestHeaders(channel); - }; - - httpRequestHeadersFactory.junkyard = []; - - let HTTPRequestHeaders = function (channel) { - this.init(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 () { - let newHeaderNames = new Set(); - for (let header of this.headers) { - this.setHeader(header.name, header.value, true); - newHeaderNames.add(header.name); - } - - //Clear any headers that were removed - for (let name of this.originalHeaderNames) { - if (!newHeaderNames.has(name)) { - this.channel.setRequestHeader(name, '', false); - } - } - }; - - HTTPRequestHeaders.prototype.getHeader = function (name) { - try { - return this.channel.getRequestHeader(name); - } catch (e) { - // Ignore - } - - return ''; - }; - - HTTPRequestHeaders.prototype.setHeader = function (name, newValue, create) { - let oldValue = this.getHeader(name); - if (newValue === oldValue) { - return false; - } - - if (oldValue === '' && create !== true) { - return false; - } - - this.channel.setRequestHeader(name, newValue, false); - return true; - }; - let httpObserver = { classDescription: 'net-channel-event-sinks for ' + location.host, classID: Components.ID('{5d2e2797-6d68-42e2-8aeb-81ce6ba16b95}'), @@ -351,7 +277,7 @@ let onBeforeSendHeaders = vAPI.net.onBeforeSendHeaders; if (onBeforeSendHeaders.types === null || onBeforeSendHeaders.types.has(type)) { - let requestHeaders = httpRequestHeadersFactory(channel); + let requestHeaders = HTTPRequestHeaders.factory(channel); let newHeaders = onBeforeSendHeaders.callback({ parentFrameId: type === 'main_frame' ? -1 : 0, requestHeaders: requestHeaders.headers, |