This commit is contained in:
gorhill 2015-05-22 08:05:55 -04:00
parent 284b4f62d1
commit 43f9657d0f
6 changed files with 85 additions and 44 deletions

View File

@ -2,7 +2,7 @@
"manifest_version": 2, "manifest_version": 2,
"name": "uBlock Origin", "name": "uBlock Origin",
"version": "0.9.6.0", "version": "0.9.7.5",
"default_locale": "en", "default_locale": "en",
"description": "__MSG_extShortDesc__", "description": "__MSG_extShortDesc__",
@ -13,8 +13,8 @@
"browser_action": { "browser_action": {
"default_icon": { "default_icon": {
"19": "img/browsericons/icon19-off.png", "19": "img/browsericons/icon19.png",
"38": "img/browsericons/icon38-off.png" "38": "img/browsericons/icon19.png"
}, },
"default_title": "uBlock Origin", "default_title": "uBlock Origin",
"default_popup": "popup.html" "default_popup": "popup.html"

View File

@ -277,6 +277,7 @@ body[dir="rtl"] #popupContainer > div {
#urlFilteringMenu .dialog { #urlFilteringMenu .dialog {
background-color: white; background-color: white;
border: 1px solid gray; border: 1px solid gray;
max-width: 70%;
padding: 0.2em; padding: 0.2em;
position: fixed; position: fixed;
} }
@ -310,7 +311,6 @@ body.dirty #urlFilteringMenu .save {
#urlFilteringMenu .entries { #urlFilteringMenu .entries {
font-size: 13px; font-size: 13px;
max-height: 12em; max-height: 12em;
max-width: 70vw;
overflow-y: auto; overflow-y: auto;
} }
#urlFilteringMenu .entries > div { #urlFilteringMenu .entries > div {

View File

@ -645,6 +645,8 @@ var urlFilteringMenu = (function() {
return; return;
} }
var persist = !!ev.ctrlKey || !!ev.metaKey;
// Remove url filtering rule // Remove url filtering rule
if ( target.classList.contains('action') ) { if ( target.classList.contains('action') ) {
messager.send({ messager.send({
@ -652,7 +654,8 @@ var urlFilteringMenu = (function() {
context: selectContext.value, context: selectContext.value,
url: target.getAttribute('data-url'), url: target.getAttribute('data-url'),
type: uglyTypeFromSelector(), type: uglyTypeFromSelector(),
action: 0 action: 0,
persist: persist
}, colorize); }, colorize);
return; return;
} }
@ -664,7 +667,8 @@ var urlFilteringMenu = (function() {
context: selectContext.value, context: selectContext.value,
url: target.parentNode.getAttribute('data-url'), url: target.parentNode.getAttribute('data-url'),
type: uglyTypeFromSelector(), type: uglyTypeFromSelector(),
action: 2 action: 2,
persist: persist
}, colorize); }, colorize);
return; return;
} }
@ -676,7 +680,8 @@ var urlFilteringMenu = (function() {
context: selectContext.value, context: selectContext.value,
url: target.parentNode.getAttribute('data-url'), url: target.parentNode.getAttribute('data-url'),
type: uglyTypeFromSelector(), type: uglyTypeFromSelector(),
action: 3 action: 3,
persist: persist
}, colorize); }, colorize);
return; return;
} }
@ -688,7 +693,8 @@ var urlFilteringMenu = (function() {
context: selectContext.value, context: selectContext.value,
url: target.parentNode.getAttribute('data-url'), url: target.parentNode.getAttribute('data-url'),
type: uglyTypeFromSelector(), type: uglyTypeFromSelector(),
action: 1 action: 1,
persist: persist
}, colorize); }, colorize);
return; return;
} }

View File

@ -1212,35 +1212,6 @@ var getURLFilteringData = function(details) {
/******************************************************************************/ /******************************************************************************/
var saveTemporaryURLFilteringRules = function(details) {
var changed = false;
var suf = µb.sessionURLFiltering;
var puf = µb.permanentURLFiltering;
var urls = details.urls,
context = details.context,
type = details.type;
var url, sOwn, pOwn;
var i = urls.length;
while ( i-- ) {
url = urls[i];
suf.evaluateZ(context, url, type);
sOwn = suf.context === context && suf.url === url && suf.type === type;
puf.evaluateZ(context, url, type);
pOwn = puf.context === context && puf.url === url && puf.type === type;
if ( sOwn && !pOwn ) {
puf.setRule(context, url, type, suf.r);
changed = true;
}
if ( !sOwn && pOwn ) {
puf.removeRule(context, url, type);
changed = true;
}
}
return changed;
};
/******************************************************************************/
var onMessage = function(request, sender, callback) { var onMessage = function(request, sender, callback) {
// Async // Async
switch ( request.what ) { switch ( request.what ) {
@ -1276,7 +1247,13 @@ var onMessage = function(request, sender, callback) {
break; break;
case 'saveURLFilteringRules': case 'saveURLFilteringRules':
if ( saveTemporaryURLFilteringRules(request) ) { response = µb.permanentURLFiltering.copyRules(
µb.sessionURLFiltering,
request.context,
request.urls,
request.type
);
if ( response ) {
µb.savePermanentURLFilteringRules(); µb.savePermanentURLFilteringRules();
} }
break; break;

View File

@ -325,6 +325,21 @@ var matchWhitelistDirective = function(url, hostname, directive) {
} }
this.cosmeticFilteringEngine.removeFromSelectorCache(details.context, 'net'); this.cosmeticFilteringEngine.removeFromSelectorCache(details.context, 'net');
if ( !details.persist ) {
return;
}
changed = this.permanentURLFiltering.setRule(
details.context,
details.url,
details.type,
details.action
);
if ( changed ) {
this.savePermanentFirewallRules();
}
}; };
/******************************************************************************/ /******************************************************************************/

View File

@ -32,7 +32,7 @@
/******************************************************************************* /*******************************************************************************
buckets: map of [origin + urlkey] buckets: map of [origin + urlkey + type]
bucket: array of rule entry, sorted from shorter to longer url bucket: array of rule entry, sorted from shorter to longer url
rule entry: { url, action } rule entry: { url, action }
@ -127,6 +127,10 @@ var addRuleEntry = function(urls, url, action) {
/******************************************************************************/ /******************************************************************************/
var urlKeyFromURL = function(url) { var urlKeyFromURL = function(url) {
// Experimental: running benchmarks first
//if ( url === '*' ) {
// return url;
//}
var match = reURLKey.exec(url); var match = reURLKey.exec(url);
return match !== null ? match[0] : ''; return match !== null ? match[0] : '';
}; };
@ -142,7 +146,7 @@ var URLNetFiltering = function() {
/******************************************************************************/ /******************************************************************************/
// rules: // rules:
// hostname + urlkey => urls // origin + urlkey + type => urls
// urls = collection of urls to match // urls = collection of urls to match
URLNetFiltering.prototype.reset = function() { URLNetFiltering.prototype.reset = function() {
@ -243,12 +247,12 @@ URLNetFiltering.prototype.evaluateZ = function(context, target, type) {
return this; return this;
} }
var urls, pos, i, entry, prefixKey; var urls, pos, i, entry, keyShard;
for (;;) { for (;;) {
this.context = context; this.context = context;
prefixKey = context + ' ' + urlKey; keyShard = context + ' ' + urlKey;
if ( urls = this.rules[prefixKey + ' ' + type] ) { if ( urls = this.rules[keyShard + ' ' + type] ) {
i = indexOfMatch(urls, target); i = indexOfMatch(urls, target);
if ( i !== -1 ) { if ( i !== -1 ) {
entry = urls[i]; entry = urls[i];
@ -258,7 +262,7 @@ URLNetFiltering.prototype.evaluateZ = function(context, target, type) {
return this; return this;
} }
} }
if ( urls = this.rules[prefixKey + ' *'] ) { if ( urls = this.rules[keyShard + ' *'] ) {
i = indexOfMatch(urls, target); i = indexOfMatch(urls, target);
if ( i !== -1 ) { if ( i !== -1 ) {
entry = urls[i]; entry = urls[i];
@ -268,6 +272,21 @@ URLNetFiltering.prototype.evaluateZ = function(context, target, type) {
return this; return this;
} }
} }
/* Experimental: running benchmarks first
if ( urls = this.rules[context + ' * ' + type] ) {
entry = urls[0];
this.url = '*';
this.type = type;
this.r = entry.action;
return this;
}
if ( urls = this.rules[context + ' * *'] ) {
entry = urls[0];
this.url = this.type = '*';
this.r = entry.action;
return this;
}
*/
if ( context === '*' ) { if ( context === '*' ) {
break; break;
} }
@ -304,6 +323,30 @@ URLNetFiltering.prototype.toFilterString = function() {
/******************************************************************************/ /******************************************************************************/
URLNetFiltering.prototype.copyRules = function(other, context, urls, type) {
var changed = false;
var url, otherOwn, thisOwn;
var i = urls.length;
while ( i-- ) {
url = urls[i];
other.evaluateZ(context, url, type);
otherOwn = other.context === context && other.url === url && other.type === type;
this.evaluateZ(context, url, type);
thisOwn = this.context === context && this.url === url && this.type === type;
if ( otherOwn && !thisOwn ) {
this.setRule(context, url, type, other.r);
changed = true;
}
if ( !otherOwn && thisOwn ) {
this.removeRule(context, url, type);
changed = true;
}
}
return changed;
};
/******************************************************************************/
// "url-filtering:" hostname url action // "url-filtering:" hostname url action
URLNetFiltering.prototype.toString = function() { URLNetFiltering.prototype.toString = function() {