mirror of
https://github.com/gorhill/uBlock.git
synced 2024-10-06 09:37:12 +02:00
code review redirection engine: minimize number of entries in inner loop
This commit is contained in:
parent
9e174c4fd1
commit
dcb7ba9f7f
@ -19,8 +19,6 @@
|
|||||||
Home: https://github.com/gorhill/uBlock
|
Home: https://github.com/gorhill/uBlock
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* global µBlock */
|
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
µBlock.redirectEngine = (function(){
|
µBlock.redirectEngine = (function(){
|
||||||
@ -120,19 +118,21 @@ RedirectEngine.prototype.lookup = function(context) {
|
|||||||
var src, des = context.requestHostname,
|
var src, des = context.requestHostname,
|
||||||
srcHostname = context.pageHostname,
|
srcHostname = context.pageHostname,
|
||||||
reqURL = context.requestURL,
|
reqURL = context.requestURL,
|
||||||
desEntry, entries, i, entry;
|
desEntry, rules, rule, pattern;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
desEntry = typeEntry[des];
|
desEntry = typeEntry[des];
|
||||||
if ( desEntry !== undefined ) {
|
if ( desEntry !== undefined ) {
|
||||||
src = srcHostname;
|
src = srcHostname;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
entries = desEntry[src];
|
rules = desEntry[src];
|
||||||
if ( entries !== undefined ) {
|
if ( rules !== undefined ) {
|
||||||
i = entries.length;
|
for ( rule in rules ) {
|
||||||
while ( i-- ) {
|
pattern = rules[rule];
|
||||||
entry = entries[i];
|
if ( pattern instanceof RegExp === false ) {
|
||||||
if ( entry.c.test(reqURL) ) {
|
pattern = rules[rule] = new RegExp(pattern);
|
||||||
return (this.resourceNameRegister = entry.r);
|
}
|
||||||
|
if ( pattern.test(reqURL) ) {
|
||||||
|
return (this.resourceNameRegister = rule);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -180,14 +180,29 @@ RedirectEngine.prototype.addRule = function(src, des, type, pattern, redirect) {
|
|||||||
if ( desEntry === undefined ) {
|
if ( desEntry === undefined ) {
|
||||||
desEntry = typeEntry[des] = Object.create(null);
|
desEntry = typeEntry[des] = Object.create(null);
|
||||||
}
|
}
|
||||||
var ruleEntries = desEntry[src];
|
var rules = desEntry[src];
|
||||||
if ( ruleEntries === undefined ) {
|
if ( rules === undefined ) {
|
||||||
ruleEntries = desEntry[src] = [];
|
rules = desEntry[src] = Object.create(null);
|
||||||
}
|
}
|
||||||
ruleEntries.push({
|
var p = rules[redirect];
|
||||||
c: new RegExp(pattern),
|
if ( p === undefined ) {
|
||||||
r: redirect
|
rules[redirect] = pattern;
|
||||||
});
|
return;
|
||||||
|
}
|
||||||
|
if ( p instanceof RegExp ) {
|
||||||
|
p = p.source;
|
||||||
|
}
|
||||||
|
// Duplicate?
|
||||||
|
var pos = p.indexOf(pattern);
|
||||||
|
if ( pos !== -1 ) {
|
||||||
|
if ( pos === 0 || p.charAt(pos - 1) === '|' ) {
|
||||||
|
pos += pattern.length;
|
||||||
|
if ( pos === p.length || p.charAt(pos) === '|' ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rules[redirect] = p + '|' + pattern;
|
||||||
};
|
};
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
@ -209,7 +224,7 @@ RedirectEngine.prototype.compileRuleFromStaticFilter = function(line) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var des = matches[1] || '';
|
var des = matches[1] || '';
|
||||||
var pattern = (des + matches[2]).replace(/[.+?{}()|[\]\\]/g, '\\$&')
|
var pattern = (des + matches[2]).replace(/[.+?{}()|[\]\/\\]/g, '\\$&')
|
||||||
.replace(/\^/g, '[^\\w\\d%-]')
|
.replace(/\^/g, '[^\\w\\d%-]')
|
||||||
.replace(/\*/g, '.*?');
|
.replace(/\*/g, '.*?');
|
||||||
var type;
|
var type;
|
||||||
@ -297,21 +312,24 @@ RedirectEngine.prototype.toSelfie = function() {
|
|||||||
rules: []
|
rules: []
|
||||||
};
|
};
|
||||||
|
|
||||||
var typeEntry, desEntry, entries, entry;
|
var typeEntry, desEntry, rules, pattern;
|
||||||
for ( var type in this.rules ) {
|
for ( var type in this.rules ) {
|
||||||
typeEntry = this.rules[type];
|
typeEntry = this.rules[type];
|
||||||
for ( var des in typeEntry ) {
|
for ( var des in typeEntry ) {
|
||||||
desEntry = typeEntry[des];
|
desEntry = typeEntry[des];
|
||||||
for ( var src in desEntry ) {
|
for ( var src in desEntry ) {
|
||||||
entries = desEntry[src];
|
rules = desEntry[src];
|
||||||
for ( var i = 0; i < entries.length; i++ ) {
|
for ( var rule in rules ) {
|
||||||
entry = entries[i];
|
pattern = rules[rule];
|
||||||
|
if ( pattern instanceof RegExp ) {
|
||||||
|
pattern = pattern.source;
|
||||||
|
}
|
||||||
r.rules.push(
|
r.rules.push(
|
||||||
src + '\t' +
|
src + '\t' +
|
||||||
des + '\t' +
|
des + '\t' +
|
||||||
type + '\t' +
|
type + '\t' +
|
||||||
entry.c.source + '\t' +
|
pattern + '\t' +
|
||||||
entry.r
|
rule
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user