Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement temporary switches #330

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/js/document-blocked.js
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,8 @@ var proceedPermanent = function() {
name: 'no-strict-blocking',
hostname: getTargetHostname(),
deep: true,
state: true
state: true,
persist: true
},
proceedToURL
);
Expand Down
129 changes: 69 additions & 60 deletions src/js/dyna-rules.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*******************************************************************************

uBlock Origin - a browser extension to block requests.
Copyright (C) 2014-2018 Raymond Hill
Copyright (C) 2014-present Raymond Hill

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
Expand Down Expand Up @@ -67,12 +67,12 @@ var differ;
// ... and modified as needed.

var updateOverlay = (function() {
var reFilter;
var mode = {
let reFilter;
let mode = {
token: function(stream) {
if ( reFilter !== undefined ) {
reFilter.lastIndex = stream.pos;
var match = reFilter.exec(stream.string);
let match = reFilter.exec(stream.string);
if ( match !== null ) {
if ( match.index === stream.pos ) {
stream.pos += match[0].length || 1;
Expand Down Expand Up @@ -100,35 +100,38 @@ var updateOverlay = (function() {
// - Minimum amount of text updated

var rulesToDoc = function(clearHistory) {
for ( var key in unfilteredRules ) {
for ( let key in unfilteredRules ) {
if ( unfilteredRules.hasOwnProperty(key) === false ) { continue; }
var doc = unfilteredRules[key].doc;
var rules = filterRules(key);
if ( doc.lineCount() === 1 && doc.getValue() === '' || rules.length === 0 ) {
let doc = unfilteredRules[key].doc;
let rules = filterRules(key);
if (
doc.lineCount() === 1 && doc.getValue() === '' ||
rules.length === 0
) {
doc.setValue(rules.length !== 0 ? rules.join('\n') : '');
continue;
}
if ( differ === undefined ) { differ = new diff_match_patch(); }
var beforeText = doc.getValue();
var afterText = rules.join('\n');
var diffs = differ.diff_main(beforeText, afterText);
let beforeText = doc.getValue();
let afterText = rules.join('\n');
let diffs = differ.diff_main(beforeText, afterText);
doc.startOperation();
var i = diffs.length,
let i = diffs.length,
iedit = beforeText.length;
while ( i-- ) {
var diff = diffs[i];
let diff = diffs[i];
if ( diff[0] === 0 ) {
iedit -= diff[1].length;
continue;
}
var end = doc.posFromIndex(iedit);
let end = doc.posFromIndex(iedit);
if ( diff[0] === 1 ) {
doc.replaceRange(diff[1], end, end);
continue;
}
/* diff[0] === -1 */
iedit -= diff[1].length;
var beg = doc.posFromIndex(iedit);
let beg = doc.posFromIndex(iedit);
doc.replaceRange('', beg, end);
}
doc.endOperation();
Expand All @@ -143,11 +146,11 @@ var rulesToDoc = function(clearHistory) {
/******************************************************************************/

var filterRules = function(key) {
var rules = unfilteredRules[key].rules;
var filter = uDom('#ruleFilter input').val();
let rules = unfilteredRules[key].rules;
let filter = uDom.nodeFromSelector('#ruleFilter input').value;
if ( filter !== '' ) {
rules = rules.slice();
var i = rules.length;
let i = rules.length;
while ( i-- ) {
if ( rules[i].indexOf(filter) === -1 ) {
rules.splice(i, 1);
Expand All @@ -160,16 +163,23 @@ var filterRules = function(key) {
/******************************************************************************/

var renderRules = (function() {
var firstVisit = true;
let firstVisit = true;
let reIsSwitchRule = /^[a-z-]+: /;

// Switches always listed at the top.
let customSort = (a, b) => {
let aIsSwitch = reIsSwitchRule.test(a);
if ( reIsSwitchRule.test(b) === aIsSwitch ) {
return a.localeCompare(b);
}
return aIsSwitch ? -1 : 1;
};

return function(details) {
details.hnSwitches.sort();
details.permanentRules.sort();
details.sessionRules.sort();
unfilteredRules.orig.rules =
details.hnSwitches.concat(details.permanentRules);
unfilteredRules.edit.rules =
details.hnSwitches.concat(details.sessionRules);
details.permanentRules.sort(customSort);
details.sessionRules.sort(customSort);
unfilteredRules.orig.rules = details.permanentRules;
unfilteredRules.edit.rules = details.sessionRules;
rulesToDoc(firstVisit);
if ( firstVisit ) {
firstVisit = false;
Expand Down Expand Up @@ -206,20 +216,19 @@ mergeView.options.revertChunk = function(
) {
// https://github.com/gorhill/uBlock/issues/3611
if ( document.body.getAttribute('dir') === 'rtl' ) {
var tmp;
tmp = from; from = to; to = tmp;
let tmp = from; from = to; to = tmp;
tmp = fromStart; fromStart = toStart; toStart = tmp;
tmp = fromEnd; fromEnd = toEnd; toEnd = tmp;
}
if ( typeof fromStart.ch !== 'number' ) { fromStart.ch = 0; }
if ( fromEnd.ch !== 0 ) { fromEnd.line += 1; }
var toAdd = from.getRange(
let toAdd = from.getRange(
{ line: fromStart.line, ch: 0 },
{ line: fromEnd.line, ch: 0 }
);
if ( typeof toStart.ch !== 'number' ) { toStart.ch = 0; }
if ( toEnd.ch !== 0 ) { toEnd.line += 1; }
var toRemove = to.getRange(
let toRemove = to.getRange(
{ line: toStart.line, ch: 0 },
{ line: toEnd.line, ch: 0 }
);
Expand All @@ -229,31 +238,31 @@ mergeView.options.revertChunk = function(
/******************************************************************************/

function handleImportFilePicker() {
var fileReaderOnLoadHandler = function() {
let fileReaderOnLoadHandler = function() {
if ( typeof this.result !== 'string' || this.result === '' ) { return; }
// https://github.com/chrisaljoudi/uBlock/issues/757
// Support RequestPolicy rule syntax
var result = this.result;
var matches = /\[origins-to-destinations\]([^\[]+)/.exec(result);
let result = this.result;
let matches = /\[origins-to-destinations\]([^\[]+)/.exec(result);
if ( matches && matches.length === 2 ) {
result = matches[1].trim()
.replace(/\|/g, ' ')
.replace(/\n/g, ' * noop\n');
}
applyDiff(false, result, '');
};
var file = this.files[0];
let file = this.files[0];
if ( file === undefined || file.name === '' ) { return; }
if ( file.type.indexOf('text') !== 0 ) { return; }
var fr = new FileReader();
let fr = new FileReader();
fr.onload = fileReaderOnLoadHandler;
fr.readAsText(file);
}

/******************************************************************************/

var startImportFilePicker = function() {
var input = document.getElementById('importFilePicker');
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.
Expand All @@ -264,7 +273,7 @@ var startImportFilePicker = function() {
/******************************************************************************/

function exportUserRulesToFile() {
var filename = vAPI.i18n('rulesDefaultFileName')
let filename = vAPI.i18n('rulesDefaultFileName')
.replace('{{datetime}}', uBlockDashboard.dateNowToSensibleString())
.replace(/ +/g, '_');
vAPI.download({
Expand All @@ -279,14 +288,14 @@ function exportUserRulesToFile() {
/******************************************************************************/

var onFilterChanged = (function() {
var timer,
let timer,
overlay = null,
last = '';

var process = function() {
let process = function() {
timer = undefined;
if ( mergeView.editor().isClean(cleanEditToken) === false ) { return; }
var filter = uDom('#ruleFilter input').val();
let filter = uDom.nodeFromSelector('#ruleFilter input').value;
if ( filter === last ) { return; }
last = filter;
if ( overlay !== null ) {
Expand All @@ -311,12 +320,12 @@ var onFilterChanged = (function() {
/******************************************************************************/

var onTextChanged = (function() {
var timer;
let timer;

var process = function(now) {
let process = function(now) {
timer = undefined;
var isClean = mergeView.editor().isClean(cleanEditToken);
var diff = document.getElementById('diff');
let isClean = mergeView.editor().isClean(cleanEditToken);
let diff = document.getElementById('diff');
if (
now &&
isClean === false &&
Expand All @@ -331,7 +340,7 @@ var onTextChanged = (function() {
'disabled',
isClean
);
var input = document.querySelector('#ruleFilter input');
let input = document.querySelector('#ruleFilter input');
if ( isClean ) {
input.removeAttribute('disabled');
CodeMirror.commands.save = undefined;
Expand All @@ -350,15 +359,15 @@ var onTextChanged = (function() {
/******************************************************************************/

var revertAllHandler = function() {
var toAdd = [], toRemove = [];
var left = mergeView.leftOriginal(),
let toAdd = [], toRemove = [];
let left = mergeView.leftOriginal(),
edit = mergeView.editor();
for ( var chunk of mergeView.leftChunks() ) {
var addedLines = left.getRange(
for ( let chunk of mergeView.leftChunks() ) {
let addedLines = left.getRange(
{ line: chunk.origFrom, ch: 0 },
{ line: chunk.origTo, ch: 0 }
);
var removedLines = edit.getRange(
let removedLines = edit.getRange(
{ line: chunk.editFrom, ch: 0 },
{ line: chunk.editTo, ch: 0 }
);
Expand All @@ -371,15 +380,15 @@ var revertAllHandler = function() {
/******************************************************************************/

var commitAllHandler = function() {
var toAdd = [], toRemove = [];
var left = mergeView.leftOriginal(),
let toAdd = [], toRemove = [];
let left = mergeView.leftOriginal(),
edit = mergeView.editor();
for ( var chunk of mergeView.leftChunks() ) {
var addedLines = edit.getRange(
for ( let chunk of mergeView.leftChunks() ) {
let addedLines = edit.getRange(
{ line: chunk.editFrom, ch: 0 },
{ line: chunk.editTo, ch: 0 }
);
var removedLines = left.getRange(
let removedLines = left.getRange(
{ line: chunk.origFrom, ch: 0 },
{ line: chunk.origTo, ch: 0 }
);
Expand All @@ -392,16 +401,16 @@ var commitAllHandler = function() {
/******************************************************************************/

var editSaveHandler = function() {
var editor = mergeView.editor();
var editText = editor.getValue().trim();
let editor = mergeView.editor();
let editText = editor.getValue().trim();
if ( editText === cleanEditText ) {
onTextChanged(true);
return;
}
if ( differ === undefined ) { differ = new diff_match_patch(); }
var toAdd = [], toRemove = [];
var diffs = differ.diff_main(cleanEditText, editText);
for ( var diff of diffs ) {
let toAdd = [], toRemove = [];
let diffs = differ.diff_main(cleanEditText, editText);
for ( let diff of diffs ) {
if ( diff[0] === 1 ) {
toAdd.push(diff[1]);
} else if ( diff[0] === -1 ) {
Expand Down
68 changes: 41 additions & 27 deletions src/js/dynamic-net-filtering.js
Original file line number Diff line number Diff line change
Expand Up @@ -137,45 +137,59 @@ Matrix.prototype.assign = function(other) {

/******************************************************************************/

Matrix.prototype.copyRules = function(other, srcHostname, desHostnames) {

Matrix.prototype.copyRules = function(from, srcHostname, desHostnames) {
// Specific types
var bits = other.rules.get('* *');
if ( bits !== undefined ) {
this.rules.set('* *', bits);
} else {
this.rules.delete('* *');
let thisBits = this.rules.get('* *');
let fromBits = from.rules.get('* *');
if ( fromBits !== thisBits ) {
if ( fromBits !== undefined ) {
this.rules.set('* *', fromBits);
} else {
this.rules.delete('* *');
}
this.changed = true;
}
var key = srcHostname + ' *';
bits = other.rules.get(key);
if ( bits !== undefined ) {
this.rules.set(key, bits);
} else {
this.rules.delete(key);

let key = srcHostname + ' *';
thisBits = this.rules.get(key);
fromBits = from.rules.get(key);
if ( fromBits !== thisBits ) {
if ( fromBits !== undefined ) {
this.rules.set(key, fromBits);
} else {
this.rules.delete(key);
}
this.changed = true;
}

// Specific destinations
for ( var desHostname in desHostnames ) {
for ( let desHostname in desHostnames ) {
if ( desHostnames.hasOwnProperty(desHostname) === false ) { continue; }
key = '* ' + desHostname;
bits = other.rules.get(key);
if ( bits !== undefined ) {
this.rules.set(key, bits);
} else {
this.rules.delete(key);
thisBits = this.rules.get(key);
fromBits = from.rules.get(key);
if ( fromBits !== thisBits ) {
if ( fromBits !== undefined ) {
this.rules.set(key, fromBits);
} else {
this.rules.delete(key);
}
this.changed = true;
}
key = srcHostname + ' ' + desHostname ;
bits = other.rules.get(key);
if ( bits !== undefined ) {
this.rules.set(key, bits);
} else {
this.rules.delete(key);
thisBits = this.rules.get(key);
fromBits = from.rules.get(key);
if ( fromBits !== thisBits ) {
if ( fromBits !== undefined ) {
this.rules.set(key, fromBits);
} else {
this.rules.delete(key);
}
this.changed = true;
}
}

this.changed = true;

return true;
return this.changed;
};

/******************************************************************************/
Expand Down
Loading