mirror of https://github.com/gorhill/uBlock.git
fixed popup blocker switch; added ability to manually edit switches
This commit is contained in:
parent
fcfdfdf9c3
commit
651c25c839
|
@ -20,7 +20,7 @@
|
|||
<button type="button" id="revertButton" data-i18n="rulesRevert"></button>
|
||||
</div>
|
||||
<div class="rulesContainer">
|
||||
<ul></ul>
|
||||
<ul></ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="pane right">
|
||||
|
@ -33,8 +33,8 @@
|
|||
<button type="button" id="importButton" data-i18n="rulesImport"></button>
|
||||
</div>
|
||||
<div class="rulesContainer">
|
||||
<textarea spellcheck="false"></textarea>
|
||||
<ul></ul>
|
||||
<textarea spellcheck="false"></textarea>
|
||||
<ul></ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -71,7 +71,7 @@ var proceedTemporary = function() {
|
|||
var proceedPermanent = function() {
|
||||
messager.send({
|
||||
what: 'toggleHostnameSwitch',
|
||||
name: 'noStrictBlocking',
|
||||
name: 'no-strict-blocking',
|
||||
hostname: getTargetHostname(),
|
||||
deep: true,
|
||||
state: true
|
||||
|
|
|
@ -34,7 +34,23 @@ var messager = vAPI.messaging.channel('dyna-rules.js');
|
|||
/******************************************************************************/
|
||||
|
||||
var renderRules = function(details) {
|
||||
var liTemplate = uDom('#templates > ul > li');
|
||||
var ulLeft = uDom('#diff > .left ul').empty().remove();
|
||||
var ulRight = uDom('#diff > .right ul').empty().remove();
|
||||
var liLeft, liRight;
|
||||
var rules, rule, i;
|
||||
|
||||
// Switches always displayed first -- just like in uMatrix
|
||||
rules = details.hnSwitches.split(/\n+/).sort();
|
||||
for ( i = 0; i < rules.length; i++ ) {
|
||||
rule = rules[i];
|
||||
liLeft = liTemplate.clone().text(rule);
|
||||
liRight = liTemplate.clone().text(rule);
|
||||
ulLeft.append(liLeft);
|
||||
ulRight.append(liRight);
|
||||
}
|
||||
|
||||
// Firewall rules follow
|
||||
var allRules = {};
|
||||
var permanentRules = {};
|
||||
var sessionRules = {};
|
||||
|
@ -62,11 +78,6 @@ var renderRules = function(details) {
|
|||
}
|
||||
details.permanentRules = rules.sort().join('\n');
|
||||
|
||||
var liTemplate = uDom('#templates > ul > li');
|
||||
var ulLeft = uDom('#diff > .left ul').empty();
|
||||
var ulRight = uDom('#diff > .right ul').empty();
|
||||
var liLeft, liRight;
|
||||
|
||||
rules = Object.keys(allRules).sort();
|
||||
for ( i = 0; i < rules.length; i++ ) {
|
||||
rule = rules[i];
|
||||
|
@ -87,6 +98,8 @@ var renderRules = function(details) {
|
|||
ulRight.append(liRight);
|
||||
}
|
||||
|
||||
uDom('#diff > .left > .rulesContainer').append(ulLeft);
|
||||
uDom('#diff > .right > .rulesContainer').append(ulRight);
|
||||
uDom('#diff').toggleClass('dirty', details.sessionRules !== details.permanentRules);
|
||||
};
|
||||
|
||||
|
|
|
@ -37,14 +37,17 @@ var HnSwitches = function() {
|
|||
/******************************************************************************/
|
||||
|
||||
var switchBitOffsets = {
|
||||
'noStrictBlocking': 0,
|
||||
'noPopups': 2,
|
||||
'noCosmeticFiltering': 4
|
||||
'no-strict-blocking': 0,
|
||||
'no-popups': 2,
|
||||
'no-cosmetic-filtering': 4
|
||||
};
|
||||
|
||||
var fromLegacySwitchNames = {
|
||||
'dontBlockDoc': 'noStrictBlocking',
|
||||
'doBlockAllPopups': 'noPopups'
|
||||
'dontBlockDoc': 'no-strict-blocking',
|
||||
'doBlockAllPopups': 'no-popups',
|
||||
'noStrictBlocking': 'no-strict-blocking',
|
||||
'noPopups': 'no-popups',
|
||||
'noCosmeticFiltering': 'no-cosmetic-filtering'
|
||||
};
|
||||
|
||||
var switchStateToNameMap = {
|
||||
|
@ -279,6 +282,8 @@ HnSwitches.prototype.fromString = function(text) {
|
|||
var fields;
|
||||
var switchName, hostname, state;
|
||||
|
||||
this.reset();
|
||||
|
||||
while ( lineBeg < textEnd ) {
|
||||
lineEnd = text.indexOf('\n', lineBeg);
|
||||
if ( lineEnd < 0 ) {
|
||||
|
|
|
@ -234,9 +234,9 @@ var getStats = function(tabId, tabTitle) {
|
|||
r.firewallRules = getFirewallRules(tabContext.rootHostname, r.hostnameDict);
|
||||
r.canElementPicker = tabContext.rootHostname.indexOf('.') !== -1;
|
||||
r.canRequestLog = canRequestLog;
|
||||
r.noPopups = µb.hnSwitches.evaluateZ('noPopups', tabContext.rootHostname);
|
||||
r.noStrictBlocking = µb.hnSwitches.evaluateZ('noStrictBlocking', tabContext.rootHostname);
|
||||
r.noCosmeticFiltering = µb.hnSwitches.evaluateZ('noCosmeticFiltering', tabContext.rootHostname);
|
||||
r.noPopups = µb.hnSwitches.evaluateZ('no-popups', tabContext.rootHostname);
|
||||
r.noStrictBlocking = µb.hnSwitches.evaluateZ('no-strict-blocking', tabContext.rootHostname);
|
||||
r.noCosmeticFiltering = µb.hnSwitches.evaluateZ('no-cosmetic-filtering', tabContext.rootHostname);
|
||||
} else {
|
||||
r.hostnameDict = {};
|
||||
r.firewallRules = getFirewallRules();
|
||||
|
@ -832,10 +832,44 @@ var µb = µBlock;
|
|||
|
||||
/******************************************************************************/
|
||||
|
||||
var getFirewallRules = function() {
|
||||
var getRules = function() {
|
||||
return {
|
||||
permanentRules: µb.permanentFirewall.toString(),
|
||||
sessionRules: µb.sessionFirewall.toString()
|
||||
sessionRules: µb.sessionFirewall.toString(),
|
||||
hnSwitches: µb.hnSwitches.toString()
|
||||
};
|
||||
};
|
||||
|
||||
// Untangle rules and switches.
|
||||
var untangle = function(s) {
|
||||
var textEnd = s.length;
|
||||
var lineBeg = 0, lineEnd;
|
||||
var line;
|
||||
var rules = [];
|
||||
var switches = [];
|
||||
|
||||
while ( lineBeg < textEnd ) {
|
||||
lineEnd = s.indexOf('\n', lineBeg);
|
||||
if ( lineEnd < 0 ) {
|
||||
lineEnd = s.indexOf('\r', lineBeg);
|
||||
if ( lineEnd < 0 ) {
|
||||
lineEnd = textEnd;
|
||||
}
|
||||
}
|
||||
line = s.slice(lineBeg, lineEnd).trim();
|
||||
lineBeg = lineEnd + 1;
|
||||
|
||||
// Switches always contain a ':'
|
||||
if ( line.indexOf(':') === -1 ) {
|
||||
rules.push(line);
|
||||
} else {
|
||||
switches.push(line);
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
rules: rules.join('\n'),
|
||||
switches: switches.join('\n')
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -844,34 +878,40 @@ var getFirewallRules = function() {
|
|||
var onMessage = function(request, sender, callback) {
|
||||
// Async
|
||||
switch ( request.what ) {
|
||||
default:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
// Sync
|
||||
var r;
|
||||
var response;
|
||||
|
||||
switch ( request.what ) {
|
||||
case 'getFirewallRules':
|
||||
response = getFirewallRules();
|
||||
break;
|
||||
case 'getFirewallRules':
|
||||
response = getRules();
|
||||
break;
|
||||
|
||||
case 'setSessionFirewallRules':
|
||||
// https://github.com/chrisaljoudi/uBlock/issues/772
|
||||
µb.cosmeticFilteringEngine.removeFromSelectorCache('*');
|
||||
case 'setSessionFirewallRules':
|
||||
// https://github.com/chrisaljoudi/uBlock/issues/772
|
||||
µb.cosmeticFilteringEngine.removeFromSelectorCache('*');
|
||||
r = untangle(request.rules);
|
||||
µb.sessionFirewall.fromString(r.rules);
|
||||
µb.hnSwitches.fromString(r.switches);
|
||||
µb.saveHostnameSwitches();
|
||||
response = getRules();
|
||||
break;
|
||||
|
||||
µb.sessionFirewall.fromString(request.rules);
|
||||
response = getFirewallRules();
|
||||
break;
|
||||
case 'setPermanentFirewallRules':
|
||||
r = untangle(request.rules);
|
||||
µb.permanentFirewall.fromString(r.rules);
|
||||
µb.savePermanentFirewallRules();
|
||||
µb.hnSwitches.fromString(r.switches);
|
||||
µb.saveHostnameSwitches();
|
||||
response = getRules();
|
||||
break;
|
||||
|
||||
case 'setPermanentFirewallRules':
|
||||
µb.permanentFirewall.fromString(request.rules);
|
||||
µb.savePermanentFirewallRules();
|
||||
response = getFirewallRules();
|
||||
break;
|
||||
|
||||
default:
|
||||
return vAPI.messaging.UNHANDLED;
|
||||
default:
|
||||
return vAPI.messaging.UNHANDLED;
|
||||
}
|
||||
|
||||
callback(response);
|
||||
|
|
|
@ -497,11 +497,7 @@ PageStore.prototype.init = function(tabId) {
|
|||
/******************************************************************************/
|
||||
|
||||
PageStore.prototype.reuse = function(context) {
|
||||
// We can't do this: when force refreshing a page, the page store data
|
||||
// needs to be reset
|
||||
//if ( pageURL === this.pageURL ) {
|
||||
// return this;
|
||||
//}
|
||||
// When force refreshing a page, the page store data needs to be reset.
|
||||
|
||||
// If the hostname changes, we can't merely just update the context.
|
||||
var tabContext = µb.tabContextManager.lookup(this.tabId);
|
||||
|
@ -635,7 +631,7 @@ PageStore.prototype.getSpecificCosmeticFilteringSwitch = function() {
|
|||
|
||||
var tabContext = µb.tabContextManager.lookup(this.tabId);
|
||||
|
||||
if ( µb.hnSwitches.evaluateZ('noCosmeticFiltering', tabContext.rootHostname) ) {
|
||||
if ( µb.hnSwitches.evaluateZ('no-cosmetic-filtering', tabContext.rootHostname) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -145,7 +145,7 @@ var hashFromPopupData = function(reset) {
|
|||
}
|
||||
hasher.sort();
|
||||
hasher.push(uDom('body').hasClass('off'));
|
||||
hasher.push(uDom('#noCosmeticFiltering').hasClass('on'));
|
||||
hasher.push(uDom('#no-cosmetic-filtering').hasClass('on'));
|
||||
|
||||
var hash = hasher.join('');
|
||||
if ( reset ) {
|
||||
|
@ -432,9 +432,9 @@ var renderPopup = function() {
|
|||
renderPrivacyExposure();
|
||||
|
||||
// Extra tools
|
||||
uDom('#noPopups').toggleClass('on', popupData.noPopups === true);
|
||||
uDom('#noStrictBlocking').toggleClass('on', popupData.noStrictBlocking === true);
|
||||
uDom('#noCosmeticFiltering').toggleClass('on', popupData.noCosmeticFiltering === true);
|
||||
uDom('#no-popups').toggleClass('on', popupData.noPopups === true);
|
||||
uDom('#no-strict-blocking').toggleClass('on', popupData.noStrictBlocking === true);
|
||||
uDom('#no-cosmetic-filtering').toggleClass('on', popupData.noCosmeticFiltering === true);
|
||||
|
||||
// https://github.com/chrisaljoudi/uBlock/issues/470
|
||||
// This must be done here, to be sure the popup is resized properly
|
||||
|
@ -463,7 +463,7 @@ var renderPopup = function() {
|
|||
var renderPopupLazy = function() {
|
||||
var onDataReady = function(data) {
|
||||
var v = data.hiddenElementCount || '';
|
||||
uDom('#noCosmeticFiltering > span.badge').text(
|
||||
uDom('#no-cosmetic-filtering > span.badge').text(
|
||||
typeof v === 'number' ? v.toLocaleString() : v
|
||||
);
|
||||
};
|
||||
|
|
|
@ -413,11 +413,10 @@ vAPI.tabs.onClosed = function(tabId) {
|
|||
vAPI.tabs.onPopup = function(details) {
|
||||
//console.debug('vAPI.tabs.onPopup: details = %o', details);
|
||||
|
||||
var pageStore = µb.pageStoreFromTabId(details.openerTabId);
|
||||
var tabContext = µb.tabContextManager.lookup(details.openerTabId);
|
||||
var openerURL = details.openerURL || '';
|
||||
|
||||
if ( openerURL === '' && pageStore ) {
|
||||
openerURL = pageStore.pageURL;
|
||||
if ( openerURL === '' && tabContext.tabId === details.openerTabId ) {
|
||||
openerURL = tabContext.normalURL;
|
||||
}
|
||||
|
||||
if ( openerURL === '' ) {
|
||||
|
@ -452,8 +451,8 @@ vAPI.tabs.onPopup = function(details) {
|
|||
var result = '';
|
||||
|
||||
// Check user switch first
|
||||
if ( µb.hnSwitches.evaluateZ('noPopups', openerHostname) ) {
|
||||
result = 'ub:noPopups true';
|
||||
if ( µb.hnSwitches.evaluateZ('no-popups', openerHostname) ) {
|
||||
result = 'ub:no-popups true';
|
||||
}
|
||||
|
||||
// https://github.com/chrisaljoudi/uBlock/issues/323
|
||||
|
@ -468,6 +467,7 @@ vAPI.tabs.onPopup = function(details) {
|
|||
}
|
||||
|
||||
// https://github.com/chrisaljoudi/uBlock/issues/91
|
||||
var pageStore = µb.pageStoreFromTabId(details.openerTabId);
|
||||
if ( pageStore ) {
|
||||
pageStore.logRequest(context, result);
|
||||
}
|
||||
|
@ -545,18 +545,6 @@ vAPI.tabs.registerListeners();
|
|||
|
||||
/******************************************************************************/
|
||||
|
||||
µb.pageUrlFromTabId = function(tabId) {
|
||||
var pageStore = this.pageStores[tabId];
|
||||
return pageStore ? pageStore.pageURL : '';
|
||||
};
|
||||
|
||||
µb.pageUrlFromPageStats = function(pageStats) {
|
||||
if ( pageStats ) {
|
||||
return pageStats.pageURL;
|
||||
}
|
||||
return '';
|
||||
};
|
||||
|
||||
µb.pageStoreFromTabId = function(tabId) {
|
||||
return this.pageStores[tabId];
|
||||
};
|
||||
|
@ -583,7 +571,7 @@ var pageStoreJanitor = function() {
|
|||
var checkTab = function(tabId) {
|
||||
vapiTabs.get(tabId, function(tab) {
|
||||
if ( !tab ) {
|
||||
//console.error('tab.js> pageStoreJanitor(): stale page store found:', µb.pageUrlFromTabId(tabId));
|
||||
//console.error('tab.js> pageStoreJanitor(): stale page store found:', µtabId);
|
||||
µb.unbindTabFromPageStats(tabId);
|
||||
}
|
||||
});
|
||||
|
|
|
@ -154,8 +154,8 @@ var onBeforeRootFrameRequest = function(details) {
|
|||
var result = '';
|
||||
|
||||
// Permanently unrestricted?
|
||||
if ( result === '' && µb.hnSwitches.evaluateZ('noStrictBlocking', requestHostname) ) {
|
||||
result = 'ua:noStrictBlocking true';
|
||||
if ( result === '' && µb.hnSwitches.evaluateZ('no-strict-blocking', requestHostname) ) {
|
||||
result = 'ua:no-strict-blocking true';
|
||||
}
|
||||
|
||||
// Temporarily whitelisted?
|
||||
|
|
|
@ -324,7 +324,7 @@ var matchWhitelistDirective = function(url, hostname, directive) {
|
|||
}
|
||||
|
||||
// Take action if needed
|
||||
if ( details.name === 'noCosmeticFiltering' ) {
|
||||
if ( details.name === 'no-cosmetic-filtering' ) {
|
||||
vAPI.tabs.injectScript(details.tabId, {
|
||||
file: 'js/cosmetic-' + (details.state ? 'off' : 'on') + '.js',
|
||||
allFrames: true
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
<p class="statName">
|
||||
<span data-i18n="popupBlockedOnThisPagePrompt"> </span> 
|
||||
<span id="gotoPick" class="fa tool" data-i18n-tip="popupTipPicker"></span> 
|
||||
<a href="#" target="_blank" id="gotoLog" class="fa tool" data-i18n-tip="popupTipLog"></a>
|
||||
<a href="#" target="_blank" id="gotoLog" class="fa tool" data-i18n-tip="popupTipLog"></a>
|
||||
</p>
|
||||
<p class="statValue" id="page-blocked">?</p>
|
||||
<p class="statName" data-i18n="popupBlockedSinceInstallPrompt"> </p>
|
||||
|
@ -26,9 +26,9 @@
|
|||
<h2 data-i18n="popupHitDomainCountPrompt"> </h2>
|
||||
<p class="statValue" id="popupHitDomainCount"> </p>
|
||||
<div id="extraTools">
|
||||
<span id="noPopups" class="hnSwitch fa" data-i18n-tip="popupTipNoPopups"><span></span></span>
|
||||
<span id="noStrictBlocking" class="hnSwitch fa" data-i18n-tip="popupTipNoStrictBlocking"><span></span></span>
|
||||
<span id="noCosmeticFiltering" class="hnSwitch fa" data-i18n-tip="popupTipNoCosmeticFiltering"><span class="badge"></span><span></span></span>
|
||||
<span id="no-popups" class="hnSwitch fa" data-i18n-tip="popupTipNoPopups"><span></span></span>
|
||||
<span id="no-strict-blocking" class="hnSwitch fa" data-i18n-tip="popupTipNoStrictBlocking"><span></span></span>
|
||||
<span id="no-cosmetic-filtering" class="hnSwitch fa" data-i18n-tip="popupTipNoCosmeticFiltering"><span class="badge"></span><span></span></span>
|
||||
</div>
|
||||
<div id="refresh" class="fa"></div>
|
||||
<div id="tooltip"></div>
|
||||
|
|
Loading…
Reference in New Issue