diff options
author | Alessio Vanni <vannilla@firemail.cc> | 2019-02-19 21:06:09 +0100 |
---|---|---|
committer | Alessio Vanni <vannilla@firemail.cc> | 2019-02-19 21:06:09 +0100 |
commit | fe2f8acc8210c2ddead4621797b47106a9b38f5b (patch) | |
tree | 5fb103d45d7e4345f56fc068ce8173b82fa7051f /js/vapi-common.js | |
download | ematrix-fe2f8acc8210c2ddead4621797b47106a9b38f5b.tar.lz ematrix-fe2f8acc8210c2ddead4621797b47106a9b38f5b.tar.xz ematrix-fe2f8acc8210c2ddead4621797b47106a9b38f5b.zip |
Fork uMatrix
Pretty much just changing the name and the copyright.
Diffstat (limited to 'js/vapi-common.js')
-rw-r--r-- | js/vapi-common.js | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/js/vapi-common.js b/js/vapi-common.js new file mode 100644 index 0000000..3b51d17 --- /dev/null +++ b/js/vapi-common.js @@ -0,0 +1,192 @@ +/******************************************************************************* + + η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/}. + + uMatrix Home: https://github.com/gorhill/uMatrix +*/ + +/* global sendAsyncMessage */ + +// For background page or non-background pages + +'use strict'; + +/******************************************************************************/ + +(function(self) { + +/******************************************************************************/ + +const {Services} = Components.utils.import( + 'resource://gre/modules/Services.jsm', + null +); + +// https://bugs.chromium.org/p/project-zero/issues/detail?id=1225&desc=6#c10 +if ( self.vAPI === undefined || self.vAPI.uMatrix !== true ) { + self.vAPI = { uMatrix: true }; +} + +var vAPI = self.vAPI; + +/******************************************************************************/ + +vAPI.setTimeout = vAPI.setTimeout || function(callback, delay, extra) { + return setTimeout(function(a) { callback(a); }, delay, extra); +}; + +/******************************************************************************/ + +// http://www.w3.org/International/questions/qa-scripts#directions + +var setScriptDirection = function(language) { + document.body.setAttribute( + 'dir', + ['ar', 'he', 'fa', 'ps', 'ur'].indexOf(language) !== -1 ? 'rtl' : 'ltr' + ); +}; + +/******************************************************************************/ + +vAPI.download = function(details) { + if ( !details.url ) { + return; + } + + var a = document.createElement('a'); + a.href = details.url; + a.setAttribute('download', details.filename || ''); + a.dispatchEvent(new MouseEvent('click')); +}; + +/******************************************************************************/ + +vAPI.insertHTML = (function() { + const parser = Components.classes['@mozilla.org/parserutils;1'] + .getService(Components.interfaces.nsIParserUtils); + + // https://github.com/gorhill/uBlock/issues/845 + // Apparently dashboard pages execute with `about:blank` principal. + + return function(node, html) { + while ( node.firstChild ) { + node.removeChild(node.firstChild); + } + + node.appendChild(parser.parseFragment( + html, + parser.SanitizerAllowStyle, + false, + Services.io.newURI('about:blank', null, null), + document.documentElement + )); + }; +})(); + +/******************************************************************************/ + +vAPI.getURL = function(path) { + return 'chrome://' + location.host + '/content/' + path.replace(/^\/+/, ''); +}; + +/******************************************************************************/ + +vAPI.i18n = (function() { + var stringBundle = Services.strings.createBundle( + 'chrome://' + location.host + '/locale/messages.properties' + ); + + return function(s) { + try { + return stringBundle.GetStringFromName(s); + } catch (ex) { + return ''; + } + }; +})(); + +setScriptDirection(navigator.language); + +/******************************************************************************/ + +vAPI.closePopup = function() { + sendAsyncMessage(location.host + ':closePopup'); +}; + +/******************************************************************************/ + +// A localStorage-like object which should be accessible from the +// background page or auxiliary pages. +// This storage is optional, but it is nice to have, for a more polished user +// experience. + +vAPI.localStorage = { + pbName: '', + pb: null, + str: Components.classes['@mozilla.org/supports-string;1'] + .createInstance(Components.interfaces.nsISupportsString), + init: function(pbName) { + this.pbName = pbName; + this.pb = Services.prefs.getBranch(pbName); + }, + getItem: function(key) { + try { + return this.pb.getComplexValue( + key, + Components.interfaces.nsISupportsString + ).data; + } catch (ex) { + return null; + } + }, + setItem: function(key, value) { + this.str.data = value; + this.pb.setComplexValue( + key, + Components.interfaces.nsISupportsString, + this.str + ); + }, + getBool: function(key) { + try { + return this.pb.getBoolPref(key); + } catch (ex) { + return null; + } + }, + setBool: function(key, value) { + this.pb.setBoolPref(key, value); + }, + setDefaultBool: function(key, defaultValue) { + Services.prefs.getDefaultBranch(this.pbName).setBoolPref(key, defaultValue); + }, + removeItem: function(key) { + this.pb.clearUserPref(key); + }, + clear: function() { + this.pb.deleteBranch(''); + } +}; + +vAPI.localStorage.init('extensions.' + location.host + '.'); + +/******************************************************************************/ + +})(this); + +/******************************************************************************/ |