From 288df6a7bf8b933e2dc499e38f4915fcf974c14b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs?= Date: Mon, 30 Dec 2019 15:55:13 -0500 Subject: backport - Flush caches on upgrade - Properly handle FrameModule's unloading - Use the new module and remove the old implementation --- js/user-rules.js | 280 ++++++++++++++++++++++++++----------------------------- 1 file changed, 134 insertions(+), 146 deletions(-) (limited to 'js/user-rules.js') 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 .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 .right > ul').on('click', 'li', temporaryRulesToggler); - vAPI.messaging.send('user-rules.js', { what: 'getUserRules' }, processUserRules); + vAPI.messaging.send('user-rules.js', { + what: 'getUserRules', + }, processUserRules); }); - - /******************************************************************************/ - })(); -- cgit v1.2.3