Skip to content

Commit 1083daa

Browse files
committed
[mv3] Bring popup blocking out of experimental status
Related issue: uBlockOrigin/uBOL-home#632 Popup blocking will be enabled by default, and is active when default filtering mode is optimal or complete. Users can wholly disable popup blocking in the dashboard.
1 parent 9a75400 commit 1083daa

8 files changed

Lines changed: 85 additions & 16 deletions

File tree

platform/mv3/extension/_locales/en/messages.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,14 @@
255255
"message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.",
256256
"description": "Short description for a checkbox in the options page"
257257
},
258+
"enablePopupBlockLabel": {
259+
"message": "Enable pop-up blocking",
260+
"description": "Label for a checkbox in the options page"
261+
},
262+
"enablePopupBlockLegend": {
263+
"message": "When active, matching filters will automatically close unwanted browser tabs created by websites.",
264+
"description": "Short description for a checkbox in the options page"
265+
},
258266
"developerModeLabel": {
259267
"message": "Developer mode",
260268
"description": "Label for a checkbox in the options page"

platform/mv3/extension/dashboard.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ <h3 data-i18n="behaviorSectionLabel"></h3>
9797
</p>
9898
<p><label id="showBlockedCount" data-i18n="showBlockedCountLabel"><span class="input checkbox"><input type="checkbox"><svg viewBox="0 0 24 24"><path d="M1.73,12.91 8.1,19.28 22.79,4.59"/></svg></span>_</label>
9999
<p data-platform-exclude="safari"><label id="strictBlockMode" data-i18n="enableStrictBlockLabel"><span class="input checkbox"><input type="checkbox"><svg viewBox="0 0 24 24"><path d="M1.73,12.91 8.1,19.28 22.79,4.59"/></svg></span>_</label><legend data-i18n="enableStrictBlockLegend"></legend>
100+
<p><label id="popupBlockMode" data-i18n="enablePopupBlockLabel"><span class="input checkbox"><input type="checkbox"><svg viewBox="0 0 24 24"><path d="M1.73,12.91 8.1,19.28 22.79,4.59"/></svg></span>_</label><legend data-i18n="enablePopupBlockLegend"></legend>
100101
<p id="developerMode"><label data-i18n="developerModeLabel"><span class="input checkbox"><input type="checkbox"><svg viewBox="0 0 24 24"><path d="M1.73,12.91 8.1,19.28 22.79,4.59"/></svg></span>_</label><legend data-i18n="developerModeLegend"></legend>
101102
</div>
102103
<div>

platform/mv3/extension/js/background.js

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,17 @@ onPermissionsChanged.pending = [];
209209

210210
/******************************************************************************/
211211

212+
async function setPopupBlockMode(state) {
213+
state = state === true;
214+
if ( state === rulesetConfig.popupBlockMode ) { return; }
215+
rulesetConfig.popupBlockMode = state;
216+
await saveRulesetConfig();
217+
await registerInjectables();
218+
broadcastMessage({ popupBlockMode: rulesetConfig.popupBlockMode });
219+
}
220+
221+
/******************************************************************************/
222+
212223
function setDeveloperMode(state) {
213224
rulesetConfig.developerMode = state === true;
214225
toggleDeveloperMode(rulesetConfig.developerMode);
@@ -335,12 +346,17 @@ function onMessage(request, sender, callback) {
335346
developerMode: defaultConfig.developerMode,
336347
showBlockedCount: defaultConfig.showBlockedCount,
337348
strictBlockMode: defaultConfig.strictBlockMode,
349+
popupBlockMode: defaultConfig.popupBlockMode,
338350
rulesets,
339351
filteringModes: Object.assign(defaultFilteringModes),
340352
});
341353
});
342354
return true;
343355

356+
case 'getCurrentConfig':
357+
callback(rulesetConfig);
358+
break;
359+
344360
case 'getOptionsPageData':
345361
Promise.all([
346362
hasBroadHostPermissions(),
@@ -369,6 +385,7 @@ function onMessage(request, sender, callback) {
369385
showBlockedCount: rulesetConfig.showBlockedCount,
370386
canShowBlockedCount,
371387
strictBlockMode: rulesetConfig.strictBlockMode,
388+
popupBlockMode: rulesetConfig.popupBlockMode,
372389
firstRun: process.firstRun,
373390
isSideloaded,
374391
developerMode: rulesetConfig.developerMode,
@@ -410,10 +427,6 @@ function onMessage(request, sender, callback) {
410427
});
411428
return true;
412429

413-
case 'getShowBlockedCount':
414-
callback(rulesetConfig.showBlockedCount);
415-
break;
416-
417430
case 'setShowBlockedCount':
418431
rulesetConfig.showBlockedCount = request.state && true || false;
419432
if ( canShowBlockedCount ) {
@@ -434,6 +447,12 @@ function onMessage(request, sender, callback) {
434447
});
435448
return true;
436449

450+
case 'setPopupBlockMode':
451+
setPopupBlockMode(request.state).then(( ) => {
452+
callback();
453+
});
454+
return true;
455+
437456
case 'setDeveloperMode':
438457
setDeveloperMode(request.state).then(( ) => {
439458
callback();

platform/mv3/extension/js/config.js

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export const rulesetConfig = {
3333
autoReload: true,
3434
showBlockedCount: true,
3535
strictBlockMode: webextFlavor !== 'safari',
36+
popupBlockMode: true,
3637
developerMode: false,
3738
hasBroadHostPermissions: true,
3839
};
@@ -44,9 +45,11 @@ export const process = {
4445
wakeupRun: false,
4546
};
4647

48+
let pendingOpPromise = Promise.resolve();
49+
4750
/******************************************************************************/
4851

49-
export async function loadRulesetConfig() {
52+
async function _loadRulesetConfig() {
5053
const sessionData = await sessionRead('rulesetConfig');
5154
if ( sessionData ) {
5255
Object.assign(rulesetConfig, sessionData);
@@ -64,7 +67,19 @@ export async function loadRulesetConfig() {
6467
process.firstRun = true;
6568
}
6669

67-
export async function saveRulesetConfig() {
70+
async function _saveRulesetConfig() {
6871
sessionWrite('rulesetConfig', rulesetConfig);
6972
return localWrite('rulesetConfig', rulesetConfig);
7073
}
74+
75+
/******************************************************************************/
76+
77+
export function loadRulesetConfig() {
78+
pendingOpPromise = pendingOpPromise.then(_loadRulesetConfig);
79+
return pendingOpPromise;
80+
}
81+
82+
export function saveRulesetConfig() {
83+
pendingOpPromise = pendingOpPromise.then(_saveRulesetConfig);
84+
return pendingOpPromise;
85+
}

platform/mv3/extension/js/prevent-popup.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@
2020
*/
2121

2222
import { matchesFromHostnames } from './utils.js';
23+
import { rulesetConfig } from './config.js';
2324

2425
/******************************************************************************/
2526

2627
// https://github.com/uBlockOrigin/uBOL-home/issues/632
2728

2829
export async function registerPreventPopup(context) {
30+
if ( rulesetConfig.popupBlockMode !== true ) { return; }
2931
const js = [];
3032
for ( const { id, popups } of context.rulesetsDetails ) {
3133
if ( popups === undefined ) { continue; }
@@ -40,11 +42,11 @@ export async function registerPreventPopup(context) {
4042
const { none, basic, optimal, complete } = context.filteringModeDetails;
4143
let matches = [];
4244
let excludeMatches = [];
43-
if ( complete.has('all-urls') ) {
45+
if ( complete.has('all-urls') || optimal.has('all-urls') ) {
4446
matches = [ '*' ];
45-
excludeMatches = [ ...none, ...basic, ...optimal ];
47+
excludeMatches = [ ...none, ...basic ];
4648
} else {
47-
matches = [ ...complete ];
49+
matches = [ ...complete, ...optimal ];
4850
}
4951
if ( matches.length === 0 ) { return; }
5052

platform/mv3/extension/js/settings.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@ function renderWidgets() {
6767
dom.attr(input, 'disabled', canStrictBlock ? null : '');
6868
}
6969

70+
{
71+
const input = qs$('#popupBlockMode input[type="checkbox"]');
72+
input.checked = cachedRulesetData.popupBlockMode;
73+
}
74+
7075
{
7176
const state = Boolean(cachedRulesetData.developerMode) &&
7277
cachedRulesetData.disabledFeatures?.includes('develop') !== true;
@@ -213,6 +218,13 @@ dom.on('#strictBlockMode input[type="checkbox"]', 'change', ev => {
213218
});
214219
});
215220

221+
dom.on('#popupBlockMode input[type="checkbox"]', 'change', ev => {
222+
sendMessage({
223+
what: 'setPopupBlockMode',
224+
state: ev.target.checked,
225+
});
226+
});
227+
216228
dom.on('#developerMode input[type="checkbox"]', 'change', ev => {
217229
const state = ev.target.checked;
218230
sendMessage({ what: 'setDeveloperMode', state });
@@ -279,6 +291,13 @@ listen.onmessage = ev => {
279291
}
280292
}
281293

294+
if ( message.popupBlockMode !== undefined ) {
295+
if ( message.popupBlockMode !== local.popupBlockMode ) {
296+
local.popupBlockMode = message.popupBlockMode;
297+
render = true;
298+
}
299+
}
300+
282301
if ( message.developerMode !== undefined ) {
283302
if ( message.developerMode !== local.developerMode ) {
284303
local.developerMode = message.developerMode;

platform/mv3/extension/js/strictblock.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,12 +109,11 @@ function fragmentFromTemplate(template, placeholder, text, details) {
109109
// Enforce popup filters
110110

111111
(async ( ) => {
112-
const filteringMode = await sendMessage({
113-
what: 'getFilteringMode',
114-
hostname: toURL.hostname,
112+
const currentConfig = await sendMessage({
113+
what: 'getCurrentConfig',
115114
});
116115
// Enforce popup filtering in complete mode only
117-
if ( filteringMode < 3 ) { return; }
116+
if ( currentConfig.popupBlockingMode !== true ) { return; }
118117
const rulesetDetails = await rulesetDetailsPromise;
119118
const toImport = [];
120119
for ( const details of rulesetDetails ) {

platform/mv3/extension/js/troubleshooting.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,23 +54,23 @@ export async function getTroubleshootingInfo(details) {
5454
const [
5555
platformInfo,
5656
defaultConfig,
57+
currentConfig,
5758
enabledRulesets,
5859
rulesetDetails,
5960
defaultMode,
6061
userRules,
6162
consoleOutput,
62-
showBlockedCount,
6363
registeredScripts,
6464
hasOmnipotence,
6565
] = await Promise.all([
6666
runtime.getPlatformInfo(),
6767
sendMessage({ what: 'getDefaultConfig' }),
68+
sendMessage({ what: 'getCurrentConfig' }),
6869
sendMessage({ what: 'getEnabledRulesets' }),
6970
sendMessage({ what: 'getRulesetDetails' }).then(a => new Map(a.map(a => [ a.id, a ]))),
7071
sendMessage({ what: 'getDefaultFilteringMode' }),
7172
sendMessage({ what: 'getEffectiveUserRules' }),
7273
sendMessage({ what: 'getConsoleOutput' }),
73-
sendMessage({ what: 'getShowBlockedCount' }),
7474
sendMessage({ what: 'getRegisteredContentScripts' }),
7575
sendMessage({ what: 'hasBroadHostPermissions' }),
7676
]);
@@ -113,9 +113,15 @@ export async function getTroubleshootingInfo(details) {
113113
filtering,
114114
permission: hasOmnipotence ? 'all' : 'ask',
115115
};
116+
if ( currentConfig.strictBlockMode !== defaultConfig.strictBlockMode ) {
117+
config.strictblock = currentConfig.strictBlockMode;
118+
}
119+
if ( currentConfig.popupBlockMode !== defaultConfig.popupBlockMode ) {
120+
config.popupblock = currentConfig.popupBlockMode;
121+
}
116122
if ( details?.tabId ) {
117123
let badge = '?';
118-
if ( showBlockedCount ) {
124+
if ( currentConfig.showBlockedCount ) {
119125
badge = await browser.action.getBadgeText({ tabId: details.tabId });
120126
}
121127
if ( badge ) {

0 commit comments

Comments
 (0)