diff options
author | Jesús <heckyel@hyperbola.info> | 2019-12-30 15:55:13 -0500 |
---|---|---|
committer | Jesús <heckyel@hyperbola.info> | 2019-12-30 15:55:13 -0500 |
commit | 288df6a7bf8b933e2dc499e38f4915fcf974c14b (patch) | |
tree | 77bba994f260c064d3ee7f76c427ddfaa4f91710 /js/user-rules.js | |
parent | a2c9deaa145b780722e93b3899600f287c8094a4 (diff) | |
download | ematrix-288df6a7bf8b933e2dc499e38f4915fcf974c14b.tar.lz ematrix-288df6a7bf8b933e2dc499e38f4915fcf974c14b.tar.xz ematrix-288df6a7bf8b933e2dc499e38f4915fcf974c14b.zip |
backport
- Flush caches on upgrade
- Properly handle FrameModule's unloading
- Use the new module and remove the old implementation
Diffstat (limited to 'js/user-rules.js')
-rw-r--r-- | js/user-rules.js | 280 |
1 files changed, 134 insertions, 146 deletions
diff --git a/js/user-rules.js b/js/user-rules.js index 02ff787..4ab850b 100644 --- a/js/user-rules.js +++ b/js/user-rules.js @@ -21,79 +21,69 @@ uMatrix Home: https://github.com/gorhill/uMatrix */ -/* global uDom */ - 'use strict'; -/******************************************************************************/ - -(function() { - - /******************************************************************************/ - +(function () { // Switches before, rules after - var directiveSort = function(a, b) { - var aIsSwitch = a.indexOf(':') !== -1; - var bIsSwitch = b.indexOf(':') !== -1; - if ( aIsSwitch === bIsSwitch ) { + let directiveSort = function (a, b) { + let aIsSwitch = a.indexOf(':') !== -1; + let bIsSwitch = b.indexOf(':') !== -1; + + if (aIsSwitch === bIsSwitch) { return a.localeCompare(b); } + return aIsSwitch ? -1 : 1; }; - /******************************************************************************/ + let processUserRules = function (response) { + let allRules = {}; + let permanentRules = {}; + let temporaryRules = {}; - var processUserRules = function(response) { - var rules, rule, i; - var allRules = {}; - var permanentRules = {}; - var temporaryRules = {}; - var onLeft, onRight; - - rules = response.permanentRules.split(/\n+/); - i = rules.length; - while ( i-- ) { - rule = rules[i].trim(); - if ( rule.length !== 0 ) { + let rules = response.permanentRules.split(/\n+/); + for (let i=rules.length-1; i>=0; --i) { + let rule = rules[i].trim(); + if (rule.length !== 0) { permanentRules[rule] = allRules[rule] = true; } } + rules = response.temporaryRules.split(/\n+/); - i = rules.length; - while ( i-- ) { - rule = rules[i].trim(); - if ( rule.length !== 0 ) { + for (let i=rules.length-1; i>=0; --i) { + let rule = rules[i].trim(); + if (rule.length !== 0) { temporaryRules[rule] = allRules[rule] = true; } } - var permanentList = document.createDocumentFragment(), - temporaryList = document.createDocumentFragment(), - li; + let permanentList = document.createDocumentFragment(); + let temporaryList = document.createDocumentFragment(); + let li; rules = Object.keys(allRules).sort(directiveSort); - for ( i = 0; i < rules.length; i++ ) { - rule = rules[i]; - onLeft = permanentRules.hasOwnProperty(rule); - onRight = temporaryRules.hasOwnProperty(rule); - if ( onLeft && onRight ) { - li = document.createElement('li'); + for (let i=0; i<rules.length; ++i) { + let rule = rules[i]; + let onLeft = permanentRules.hasOwnProperty(rule); + let onRight = temporaryRules.hasOwnProperty(rule); + + li = document.createElement('li'); + + if (onLeft && onRight) { li.textContent = rule; permanentList.appendChild(li); li = document.createElement('li'); li.textContent = rule; temporaryList.appendChild(li); - } else if ( onLeft ) { - li = document.createElement('li'); + } else if (onLeft) { li.textContent = rule; permanentList.appendChild(li); li = document.createElement('li'); li.textContent = rule; li.className = 'notRight toRemove'; temporaryList.appendChild(li); - } else if ( onRight ) { - li = document.createElement('li'); + } else if (onRight) { li.textContent = '\xA0'; permanentList.appendChild(li); li = document.createElement('li'); @@ -109,17 +99,16 @@ document.querySelector('#diff > .left > ul').appendChild(permanentList); uDom('#diff > .right > ul > li').remove(); document.querySelector('#diff > .right > ul').appendChild(temporaryList); - uDom('#diff').toggleClass('dirty', response.temporaryRules !== response.permanentRules); + uDom('#diff') + .toggleClass('dirty', + response.temporaryRules !== response.permanentRules); }; - /******************************************************************************/ - // https://github.com/chrisaljoudi/uBlock/issues/757 // Support RequestPolicy rule syntax - - var fromRequestPolicy = function(content) { - var matches = /\[origins-to-destinations\]([^\[]+)/.exec(content); - if ( matches === null || matches.length !== 2 ) { + let fromRequestPolicy = function (content) { + let matches = /\[origins-to-destinations\]([^\[]+)/.exec(content); + if (matches === null || matches.length !== 2) { return; } return matches[1].trim() @@ -127,88 +116,95 @@ .replace(/\n/g, ' * allow\n'); }; - /******************************************************************************/ - // https://github.com/gorhill/uMatrix/issues/270 + let fromNoScript = function (content) { + let noscript = null; - var fromNoScript = function(content) { - var noscript = null; try { noscript = JSON.parse(content); } catch (e) { } - if ( - noscript === null || - typeof noscript !== 'object' || - typeof noscript.prefs !== 'object' || - typeof noscript.prefs.clearClick === 'undefined' || - typeof noscript.whitelist !== 'string' || - typeof noscript.V !== 'string' - ) { + + if (noscript === null + || typeof noscript !== 'object' + || typeof noscript.prefs !== 'object' + || typeof noscript.prefs.clearClick === 'undefined' + || typeof noscript.whitelist !== 'string' + || typeof noscript.V !== 'string') { return; } - var out = new Set(); - var reBad = /[a-z]+:\w*$/; - var reURL = /[a-z]+:\/\/([0-9a-z.-]+)/; - var directives = noscript.whitelist.split(/\s+/); - var i = directives.length; - var directive, matches; - while ( i-- ) { - directive = directives[i].trim(); - if ( directive === '' ) { + + let out = new Set(); + let reBad = /[a-z]+:\w*$/; + let reURL = /[a-z]+:\/\/([0-9a-z.-]+)/; + let directives = noscript.whitelist.split(/\s+/); + + for (let i=directives.length-1; i>=0; --i) { + let directive = directives[i].trim(); + if (directive === '') { continue; } - if ( reBad.test(directive) ) { + if (reBad.test(directive)) { continue; } - matches = reURL.exec(directive); - if ( matches !== null ) { + + let matches = reURL.exec(directive); + if (matches !== null) { directive = matches[1]; } + out.add('* ' + directive + ' * allow'); out.add('* ' + directive + ' script allow'); out.add('* ' + directive + ' frame allow'); } + return Array.from(out).join('\n'); }; - /******************************************************************************/ - - var handleImportFilePicker = function() { - var fileReaderOnLoadHandler = function() { - if ( typeof this.result !== 'string' || this.result === '' ) { + let handleImportFilePicker = function () { + let fileReaderOnLoadHandler = function () { + if (typeof this.result !== 'string' || this.result === '') { return; } - var result = fromRequestPolicy(this.result); - if ( result === undefined ) { + + let result = fromRequestPolicy(this.result); + if (result === undefined) { result = fromNoScript(this.result); - if ( result === undefined ) { + if (result === undefined) { result = this.result; } } - if ( this.result === '' ) { return; } - var request = { + + if (this.result === '') { + return; + } + + let request = { 'what': 'setUserRules', - 'temporaryRules': rulesFromHTML('#diff .right li') + '\n' + result + 'temporaryRules': rulesFromHTML('#diff .right li') + + '\n' + result, }; + vAPI.messaging.send('user-rules.js', request, processUserRules); }; + var file = this.files[0]; - if ( file === undefined || file.name === '' ) { + if (file === undefined || file.name === '') { return; } - if ( file.type.indexOf('text') !== 0 && file.type !== 'application/json') { + + if (file.type.indexOf('text') !== 0 + && file.type !== 'application/json') { return; } - var fr = new FileReader(); + + let fr = new FileReader(); fr.onload = fileReaderOnLoadHandler; fr.readAsText(file); }; - /******************************************************************************/ - - var startImportFilePicker = function() { - var input = document.getElementById('importFilePicker'); + let startImportFilePicker = function () { + let input = document.getElementById('importFilePicker'); // Reset to empty string, this will ensure an change event is properly // triggered if the user pick a file, even if it is the same as the last // one picked. @@ -216,112 +212,105 @@ input.click(); }; - /******************************************************************************/ - function exportUserRulesToFile() { vAPI.download({ - 'url': 'data:text/plain,' + encodeURIComponent(rulesFromHTML('#diff .left li') + '\n'), - 'filename': uDom('[data-i18n="userRulesDefaultFileName"]').text() + 'url': 'data:text/plain,' + + encodeURIComponent(rulesFromHTML('#diff .left li') + '\n'), + 'filename': uDom('[data-i18n="userRulesDefaultFileName"]').text(), }); } - /******************************************************************************/ - var rulesFromHTML = function(selector) { - var rules = []; - var lis = uDom(selector); - var li; - for ( var i = 0; i < lis.length; i++ ) { - li = lis.at(i); - if ( li.hasClassName('toRemove') ) { + let rules = []; + let lis = uDom(selector); + + for (let i=0; i<lis.length; ++i) { + let li = lis.at(i); + if (li.hasClassName('toRemove')) { rules.push(''); } else { rules.push(li.text()); } } + return rules.join('\n'); }; - /******************************************************************************/ - - var revertHandler = function() { - var request = { + let revertHandler = function () { + let request = { 'what': 'setUserRules', - 'temporaryRules': rulesFromHTML('#diff .left li') + 'temporaryRules': rulesFromHTML('#diff .left li'), }; + vAPI.messaging.send('user-rules.js', request, processUserRules); }; - /******************************************************************************/ - - var commitHandler = function() { + let commitHandler = function () { var request = { 'what': 'setUserRules', - 'permanentRules': rulesFromHTML('#diff .right li') + 'permanentRules': rulesFromHTML('#diff .right li'), }; + vAPI.messaging.send('user-rules.js', request, processUserRules); }; - /******************************************************************************/ - - var editStartHandler = function() { + let editStartHandler = function () { uDom('#diff .right textarea').val(rulesFromHTML('#diff .right li')); - var parent = uDom(this).ancestors('#diff'); + let parent = uDom(this).ancestors('#diff'); parent.toggleClass('edit', true); }; - /******************************************************************************/ - - var editStopHandler = function() { - var parent = uDom(this).ancestors('#diff'); + let editStopHandler = function () { + let parent = uDom(this).ancestors('#diff'); parent.toggleClass('edit', false); - var request = { + + let request = { 'what': 'setUserRules', - 'temporaryRules': uDom('#diff .right textarea').val() + 'temporaryRules': uDom('#diff .right textarea').val(), }; + vAPI.messaging.send('user-rules.js', request, processUserRules); }; - /******************************************************************************/ - - var editCancelHandler = function() { - var parent = uDom(this).ancestors('#diff'); + let editCancelHandler = function () { + let parent = uDom(this).ancestors('#diff'); parent.toggleClass('edit', false); }; - /******************************************************************************/ - - var temporaryRulesToggler = function() { + let temporaryRulesToggler = function() { var li = uDom(this); li.toggleClass('toRemove'); - var request = { + + let request = { 'what': 'setUserRules', - 'temporaryRules': rulesFromHTML('#diff .right li') + 'temporaryRules': rulesFromHTML('#diff .right li'), }; + vAPI.messaging.send('user-rules.js', request, processUserRules); }; - /******************************************************************************/ - - self.cloud.onPush = function() { + self.cloud.onPush = function () { return rulesFromHTML('#diff .left li'); }; - self.cloud.onPull = function(data, append) { - if ( typeof data !== 'string' ) { return; } - if ( append ) { + self.cloud.onPull = function (data, append) { + if (typeof data !== 'string') { + return; + } + + if (append) { data = rulesFromHTML('#diff .right li') + '\n' + data; } - var request = { + + let request = { 'what': 'setUserRules', - 'temporaryRules': data + 'temporaryRules': data, }; + vAPI.messaging.send('user-rules.js', request, processUserRules); }; - /******************************************************************************/ - - uDom.onLoad(function() { + uDom.onLoad(function () { // Handle user interaction uDom('#importButton').on('click', startImportFilePicker); uDom('#importFilePicker').on('change', handleImportFilePicker); @@ -333,9 +322,8 @@ uDom('#editCancelButton').on('click', editCancelHandler); uDom('#diff > .right > ul').on('click', 'li', temporaryRulesToggler); - vAPI.messaging.send('user-rules.js', { what: 'getUserRules' }, processUserRules); + vAPI.messaging.send('user-rules.js', { + what: 'getUserRules', + }, processUserRules); }); - - /******************************************************************************/ - })(); |