1
0
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:
gorhill 2016-01-21 18:30:06 -05:00
parent 9e174c4fd1
commit dcb7ba9f7f

View File

@ -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
); );
} }
} }