From 3e1d8467b38a31b8f3a9ef562fe9a890a5838276 Mon Sep 17 00:00:00 2001 From: Alessio Vanni Date: Sat, 22 Jun 2019 14:11:45 +0200 Subject: Move browser-related entities away from vapi-background --- js/vapi-browser.js | 250 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 250 insertions(+) create mode 100644 js/vapi-browser.js (limited to 'js/vapi-browser.js') diff --git a/js/vapi-browser.js b/js/vapi-browser.js new file mode 100644 index 0000000..be4a8bd --- /dev/null +++ b/js/vapi-browser.js @@ -0,0 +1,250 @@ +/******************************************************************************* + + η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 +*/ + +/* global self, Components */ + +// For background page (tabs management) + +'use strict'; + +/******************************************************************************/ + +(function () { + const {classes: Cc, interfaces: Ci, utils: Cu} = Components; + const {Services} = Cu.import('resource://gre/modules/Services.jsm', null); + + let vAPI = self.vAPI; // Guaranteed to be initialized by vapi-background.js + + vAPI.browser = {}; + + vAPI.browser.getTabBrowser = function (win) { + return win && win.gBrowser || null; + }; + + vAPI.browser.getOwnerWindow = function (target) { + if (target.ownerDocument) { + return target.ownerDocument.defaultView; + } + + return null; + }; + + vAPI.browser.settings = { + // For now, only booleans. + originalValues: {}, + + rememberOriginalValue: function (path, setting) { + let key = path + '.' + setting; + if (this.originalValues.hasOwnProperty(key)) { + return; + } + + let hasUserValue; + let branch = Services.prefs.getBranch(path + '.'); + + try { + hasUserValue = branch.prefHasUserValue(setting); + } catch (ex) { + // Ignore + } + + if (hasUserValue !== undefined) { + this.originalValues[key] = hasUserValue + ? this.getValue(path, setting) + : undefined; + } + }, + clear: function (path, setting) { + let key = path + '.' + setting; + + // Value was not overriden -- nothing to restore + if (this.originalValues.hasOwnProperty(key) === false) { + return; + } + + let value = this.originalValues[key]; + + // https://github.com/gorhill/uBlock/issues/292#issuecomment-109621979 + // Forget the value immediately, it may change outside of + // uBlock control. + delete this.originalValues[key]; + + // Original value was a default one + if (value === undefined) { + try { + Services.prefs.getBranch(path + '.').clearUserPref(setting); + } catch (ex) { + // Ignore + } + return; + } + + // Reset to original value + this.setValue(path, setting, value); + }, + getValue: function (path, setting) { + let branch = Services.prefs.getBranch(path + '.'); + + try { + switch (branch.getPrefType(setting)) { + case branch.PREF_INT: + return branch.getIntPref(setting); + case branch.PREF_BOOL: + return branch.getBoolPref(setting); + default: + // not supported + return; + } + } catch (e) { + // Ignore + } + }, + setValue: function (path, setting, value) { + let branch = Services.prefs.getBranch(path + '.'); + + try { + switch (typeof value) { + case 'number': + return branch.setIntPref(setting, value); + case 'boolean': + return branch.setBoolPref(setting, value); + default: + // not supported + return; + } + } catch (e) { + // Ignore + } + }, + setSetting: function (setting, value) { + switch (setting) { + case 'prefetching': + this.rememberOriginalValue('network', 'prefetch-next'); + // https://bugzilla.mozilla.org/show_bug.cgi?id=814169 + // Sigh. + // eMatrix: doesn't seem the case for Pale + // Moon/Basilisk, but let's keep this anyway + this.rememberOriginalValue('network.http', 'speculative-parallel-limit'); + + // https://github.com/gorhill/uBlock/issues/292 + // "true" means "do not disable", i.e. leave entry alone + if (value) { + this.clear('network', 'prefetch-next'); + this.clear('network.http', 'speculative-parallel-limit'); + } else { + this.setValue('network', 'prefetch-next', false); + this.setValue('network.http', + 'speculative-parallel-limit', 0); + } + break; + case 'hyperlinkAuditing': + this.rememberOriginalValue('browser', 'send_pings'); + this.rememberOriginalValue('beacon', 'enabled'); + + // https://github.com/gorhill/uBlock/issues/292 + // "true" means "do not disable", i.e. leave entry alone + if (value) { + this.clear('browser', 'send_pings'); + this.clear('beacon', 'enabled'); + } else { + this.setValue('browser', 'send_pings', false); + this.setValue('beacon', 'enabled', false); + } + break; + case 'webrtcIPAddress': + let prefName; + let prefVal; + + // https://github.com/gorhill/uBlock/issues/894 + // Do not disable completely WebRTC if it can be avoided. FF42+ + // has a `media.peerconnection.ice.default_address_only` pref which + // purpose is to prevent local IP address leakage. + if (this.getValue('media.peerconnection', + 'ice.default_address_only') !== undefined) { + prefName = 'ice.default_address_only'; + prefVal = true; + } else { + prefName = 'enabled'; + prefVal = false; + } + + this.rememberOriginalValue('media.peerconnection', prefName); + if (value) { + this.clear('media.peerconnection', prefName); + } else { + this.setValue('media.peerconnection', prefName, prefVal); + } + break; + default: + break; + } + }, + set: function (details) { + for (let setting in details) { + if (details.hasOwnProperty(setting) === false) { + continue; + } + this.setSetting(setting, !!details[setting]); + } + }, + restoreAll: function () { + let pos; + for (let key in this.originalValues) { + if (this.originalValues.hasOwnProperty(key) === false) { + continue; + } + + pos = key.lastIndexOf('.'); + this.clear(key.slice(0, pos), key.slice(pos + 1)); + } + }, + }; + + vAPI.addCleanUpTask(vAPI.browser.settings + .restoreAll.bind(vAPI.browser.settings)); + + vAPI.browser.data = {}; + + vAPI.browser.data.clearCache = function (callback) { + // PURGE_DISK_DATA_ONLY:1 + // PURGE_DISK_ALL:2 + // PURGE_EVERYTHING:3 + // However I verified that no argument does clear the cache data. + // There is no cache2 for older versions of Firefox. + if (Services.cache2) { + Services.cache2.clear(); + } else if (Services.cache) { + Services.cache.evictEntries(Services.cache.STORE_ON_DISK); + } + + if (typeof callback === 'function') { + callback(); + } + }; + + vAPI.browser.data.clearOrigin = function(/* domain */) { + // TODO + // eMatrix: is this actually needed? I don't really know what + // it's supposed to do anyway. + }; +})(); -- cgit v1.2.3 From 194b9f768b7e8ea57217fa6cf7b501727e65b662 Mon Sep 17 00:00:00 2001 From: Alessio Vanni Date: Sun, 23 Jun 2019 13:36:44 +0200 Subject: Remove some comments While they are technically informative, the splitting makes things easier to follow already (somewhat) and there's not really a need to list each global variable (there aren't many anyway.) --- js/vapi-browser.js | 4 ---- 1 file changed, 4 deletions(-) (limited to 'js/vapi-browser.js') diff --git a/js/vapi-browser.js b/js/vapi-browser.js index be4a8bd..27e5e9c 100644 --- a/js/vapi-browser.js +++ b/js/vapi-browser.js @@ -21,10 +21,6 @@ uMatrix Home: https://github.com/gorhill/uMatrix */ -/* global self, Components */ - -// For background page (tabs management) - 'use strict'; /******************************************************************************/ -- cgit v1.2.3 From 9d87f8f864b28d182af9659a3095433adb4b0126 Mon Sep 17 00:00:00 2001 From: Alessio Vanni Date: Thu, 4 Jul 2019 17:33:06 +0200 Subject: Change how modules are imported I can't really find a reason why the returned value is preferred over the normal importing process. Additionally, there's a good chance importing Services.jsm can be done only once at the start of everything, instead of binding each object to a separate closure. --- js/vapi-browser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'js/vapi-browser.js') diff --git a/js/vapi-browser.js b/js/vapi-browser.js index 27e5e9c..07d954b 100644 --- a/js/vapi-browser.js +++ b/js/vapi-browser.js @@ -27,7 +27,7 @@ (function () { const {classes: Cc, interfaces: Ci, utils: Cu} = Components; - const {Services} = Cu.import('resource://gre/modules/Services.jsm', null); + Cu.import('resource://gre/modules/Services.jsm'); let vAPI = self.vAPI; // Guaranteed to be initialized by vapi-background.js -- cgit v1.2.3 From 51f5e899fff9e804d9c91e4fefdd57ea5a85e99c Mon Sep 17 00:00:00 2001 From: Alessio Vanni Date: Thu, 4 Jul 2019 18:06:54 +0200 Subject: Make components and services global Given that they are used a lot, at least in vAPI, let's just define/import them only once. --- js/vapi-browser.js | 3 --- 1 file changed, 3 deletions(-) (limited to 'js/vapi-browser.js') diff --git a/js/vapi-browser.js b/js/vapi-browser.js index 07d954b..4828b3d 100644 --- a/js/vapi-browser.js +++ b/js/vapi-browser.js @@ -26,9 +26,6 @@ /******************************************************************************/ (function () { - const {classes: Cc, interfaces: Ci, utils: Cu} = Components; - Cu.import('resource://gre/modules/Services.jsm'); - let vAPI = self.vAPI; // Guaranteed to be initialized by vapi-background.js vAPI.browser = {}; -- cgit v1.2.3 From f1f66637b814155c95a2bfddfdd9cd2973b86659 Mon Sep 17 00:00:00 2001 From: Alessio Vanni Date: Thu, 4 Jul 2019 18:20:08 +0200 Subject: Revert "Make components and services global" This reverts commit 51f5e899fff9e804d9c91e4fefdd57ea5a85e99c. It seems to cause issues with the popup menu. --- js/vapi-browser.js | 3 +++ 1 file changed, 3 insertions(+) (limited to 'js/vapi-browser.js') diff --git a/js/vapi-browser.js b/js/vapi-browser.js index 4828b3d..07d954b 100644 --- a/js/vapi-browser.js +++ b/js/vapi-browser.js @@ -26,6 +26,9 @@ /******************************************************************************/ (function () { + const {classes: Cc, interfaces: Ci, utils: Cu} = Components; + Cu.import('resource://gre/modules/Services.jsm'); + let vAPI = self.vAPI; // Guaranteed to be initialized by vapi-background.js vAPI.browser = {}; -- cgit v1.2.3 From 6908a6c89f9f44380faa1831ec13cff4042b671a Mon Sep 17 00:00:00 2001 From: Alessio Vanni Date: Thu, 4 Jul 2019 18:41:18 +0200 Subject: Make vAPI definitely global At least for background.html, it can be defined once at the start of vapi-core and then populated. --- js/vapi-browser.js | 2 -- 1 file changed, 2 deletions(-) (limited to 'js/vapi-browser.js') diff --git a/js/vapi-browser.js b/js/vapi-browser.js index 07d954b..6b8a846 100644 --- a/js/vapi-browser.js +++ b/js/vapi-browser.js @@ -29,8 +29,6 @@ const {classes: Cc, interfaces: Ci, utils: Cu} = Components; Cu.import('resource://gre/modules/Services.jsm'); - let vAPI = self.vAPI; // Guaranteed to be initialized by vapi-background.js - vAPI.browser = {}; vAPI.browser.getTabBrowser = function (win) { -- cgit v1.2.3 From acd097e4733c106a15815c90e21c00d0c545e042 Mon Sep 17 00:00:00 2001 From: Alessio Vanni Date: Fri, 19 Jul 2019 16:00:08 +0200 Subject: Make components and Services.jsm global Once again, but this time it works. --- js/vapi-browser.js | 3 --- 1 file changed, 3 deletions(-) (limited to 'js/vapi-browser.js') diff --git a/js/vapi-browser.js b/js/vapi-browser.js index 6b8a846..b3c9a5f 100644 --- a/js/vapi-browser.js +++ b/js/vapi-browser.js @@ -26,9 +26,6 @@ /******************************************************************************/ (function () { - const {classes: Cc, interfaces: Ci, utils: Cu} = Components; - Cu.import('resource://gre/modules/Services.jsm'); - vAPI.browser = {}; vAPI.browser.getTabBrowser = function (win) { -- cgit v1.2.3