Skip to content

Commit 7d558e1

Browse files
committed
Widget exceptions is now an "always activate" list
Instead of a "keep blocking but don't replace" list.
1 parent 30fb890 commit 7d558e1

File tree

8 files changed

+64
-71
lines changed

8 files changed

+64
-71
lines changed

src/_locales/en_US/messages.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -495,8 +495,8 @@
495495
"message": "Widget Exceptions",
496496
"description": "Header text on the Widget Replacement tab"
497497
},
498-
"options_hide_social_widgets": {
499-
"message": "Don't replace the following widgets:",
498+
"options_widget_exceptions_label": {
499+
"message": "Always allow the following widgets:",
500500
"description": "Label for a form on the Widget Replacement tab"
501501
},
502502
"options_widget_site_exceptions_header": {

src/js/background.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -768,7 +768,7 @@ Badger.prototype = {
768768
showExpandedTrackingSection: false,
769769
showIntroPage: true,
770770
showNonTrackingDomains: false,
771-
widgetReplacementExceptions: [],
771+
widgetAllowlist: [],
772772
widgetSiteAllowlist: {},
773773
},
774774

@@ -846,6 +846,7 @@ Badger.prototype = {
846846
"showTrackingDomains",
847847
"socialWidgetReplacementEnabled",
848848
"webRTCIPProtection",
849+
"widgetReplacementExceptions",
849850
].forEach(item => {
850851
if (settings.hasItem(item)) { settings.deleteItem(item); }
851852
});

src/js/options.js

+17-13
Original file line numberDiff line numberDiff line change
@@ -259,21 +259,23 @@ function loadOptions() {
259259
});
260260
});
261261

262-
const $widgetExceptions = $("#hide-widgets-select");
262+
const $widgetExceptions = $("#always-activate-select");
263263

264264
// Initialize Select2 and populate options
265265
$widgetExceptions.select2({
266266
width: '100%'
267267
});
268-
OPTIONS_DATA.widgets.forEach(function (key) {
269-
const isSelected = OPTIONS_DATA.settings.widgetReplacementExceptions && OPTIONS_DATA.settings.widgetReplacementExceptions.includes(key);
270-
const option = new Option(key, key, false, isSelected);
271-
$widgetExceptions.append(option).trigger("change");
272-
});
268+
for (let widget_name of OPTIONS_DATA.widgets) {
269+
let is_selected = OPTIONS_DATA.settings.widgetAllowlist &&
270+
OPTIONS_DATA.settings.widgetAllowlist.includes(widget_name);
271+
$widgetExceptions
272+
.append(new Option(widget_name, widget_name, false, is_selected))
273+
.trigger("change");
274+
}
273275

274-
$widgetExceptions.on('select2:select', updateWidgetReplacementExceptions);
275-
$widgetExceptions.on('select2:unselect', updateWidgetReplacementExceptions);
276-
$widgetExceptions.on('select2:clear', updateWidgetReplacementExceptions);
276+
$widgetExceptions.on('select2:select', updateWidgetExceptions);
277+
$widgetExceptions.on('select2:unselect', updateWidgetExceptions);
278+
$widgetExceptions.on('select2:clear', updateWidgetExceptions);
277279

278280
reloadDisabledSites();
279281
reloadTrackingDomainsTab();
@@ -1035,13 +1037,15 @@ function removeDomain(event) {
10351037
}
10361038

10371039
/**
1038-
* Update which widgets should not get replaced
1040+
* Update which widgets should always get activated.
10391041
*/
1040-
function updateWidgetReplacementExceptions() {
1041-
const widgetReplacementExceptions = $('#hide-widgets-select').select2('data').map(({ id }) => id);
1042+
function updateWidgetExceptions() {
1043+
let $el = $('#always-activate-select'),
1044+
widgetAllowlist = $el.select2('data').map(({ id }) => id);
1045+
10421046
chrome.runtime.sendMessage({
10431047
type: "updateSettings",
1044-
data: { widgetReplacementExceptions }
1048+
data: { widgetAllowlist }
10451049
});
10461050
}
10471051

src/js/storage.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -782,7 +782,7 @@ BadgerStorage.prototype = {
782782
if (self.name == "settings_map") {
783783
for (let prop in mapData) {
784784
// combine array settings via intersection/union
785-
if (prop == "disabledSites" || prop == "widgetReplacementExceptions") {
785+
if (prop == "disabledSites" || prop == "widgetAllowlist") {
786786
self.setItem(prop, utils.concatUniq(self.getItem(prop), mapData[prop]));
787787

788788
// string/array map

src/js/webrequest.js

+20-30
Original file line numberDiff line numberDiff line change
@@ -175,17 +175,7 @@ function onBeforeRequest(details) {
175175
}
176176

177177
if ((type == 'script' || sw_request) && from_current_tab) {
178-
let surrogate;
179-
180-
if (utils.hasOwn(surrogates.WIDGET_SURROGATES, request_host)) {
181-
let settings = badger.getSettings();
182-
if (!settings.getItem('widgetReplacementExceptions').includes(surrogates.WIDGET_SURROGATES[request_host].widgetName)) {
183-
surrogate = surrogates.getSurrogateUri(url, request_host);
184-
}
185-
186-
} else {
187-
surrogate = surrogates.getSurrogateUri(url, request_host);
188-
}
178+
let surrogate = surrogates.getSurrogateUri(url, request_host);
189179

190180
if (surrogate) {
191181
let secret = getWarSecret(tab_id, frame_id, surrogate);
@@ -625,11 +615,7 @@ function hideBlockedFrame(tab_id, parent_frame_id, frame_url, frame_host) {
625615
}
626616

627617
// don't hide widget frames
628-
let exceptions = badger.getSettings().getItem('widgetReplacementExceptions');
629618
for (let widget of badger.widgetList) {
630-
if (exceptions.includes(widget.name)) {
631-
continue;
632-
}
633619
for (let domain of widget.domains) {
634620
if (domain == frame_host) {
635621
return;
@@ -844,8 +830,7 @@ let getWidgetList = (function () {
844830
let widgetsToReplace = {},
845831
widgetList = [],
846832
trackers = badger.tabData.getTrackers(tab_id),
847-
trackerDomains = Object.keys(trackers),
848-
exceptions = badger.getSettings().getItem('widgetReplacementExceptions');
833+
trackerDomains = Object.keys(trackers);
849834

850835
// optimize translation lookups by doing them just once,
851836
// the first time they are needed
@@ -862,12 +847,6 @@ let getWidgetList = (function () {
862847
}
863848

864849
for (let widget of badger.widgetList) {
865-
// replace only if the widget is not on the 'do not replace' list
866-
// also don't send widget data used later for dynamic replacement
867-
if (exceptions.includes(widget.name)) {
868-
continue;
869-
}
870-
871850
widgetList.push(widget);
872851

873852
// replace only if we haven't already allowed this widget for the tab/site
@@ -1004,13 +983,24 @@ function getWidgetDomains(widget_name) {
1004983
* with domains for widgets marked as always allowed on a given site.
1005984
*/
1006985
function initAllowedWidgets(tab_id, tab_host) {
1007-
let allowedWidgets = badger.getSettings().getItem('widgetSiteAllowlist');
1008-
if (utils.hasOwn(allowedWidgets, tab_host)) {
1009-
for (let widget_name of allowedWidgets[tab_host]) {
1010-
let widgetDomains = getWidgetDomains(widget_name);
1011-
if (widgetDomains) {
1012-
badger.tabData.allowOnTab(tab_id, widgetDomains, widget_name);
1013-
}
986+
let allowedWidgets = {},
987+
conf = badger.getSettings();
988+
989+
for (let widget_name of conf.getItem('widgetAllowlist')) {
990+
allowedWidgets[widget_name] = true;
991+
}
992+
993+
let siteExceptions = conf.getItem('widgetSiteAllowlist');
994+
if (utils.hasOwn(siteExceptions, tab_host)) {
995+
for (let widget_name of siteExceptions[tab_host]) {
996+
allowedWidgets[widget_name] = true;
997+
}
998+
}
999+
1000+
for (let name of Object.keys(allowedWidgets)) {
1001+
let widgetDomains = getWidgetDomains(name);
1002+
if (widgetDomains) {
1003+
badger.tabData.allowOnTab(tab_id, widgetDomains, name);
10141004
}
10151005
}
10161006
}

src/skin/options-layout.css

+1-1
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ p, #settingsForm {
210210
padding-inline-start: 25px;
211211
}
212212

213-
label[for=hide-widgets-select] {
213+
label[for=always-activate-select] {
214214
display: block;
215215
}
216216

src/skin/options.html

+3-3
Original file line numberDiff line numberDiff line change
@@ -258,10 +258,10 @@ <h4 class="i18n_options_advanced_settings"></h4>
258258
<h4 class="i18n_options_widget_exceptions_header"></h4>
259259

260260
<div style="max-width: 420px">
261-
<label for="hide-widgets-select">
262-
<span class="i18n_options_hide_social_widgets"></span>
261+
<label for="always-activate-select">
262+
<span class="i18n_options_widget_exceptions_label"></span>
263263
</label>
264-
<select name="states[]" multiple="multiple" id="hide-widgets-select"></select>
264+
<select name="states[]" multiple="multiple" id="always-activate-select"></select>
265265
</div>
266266

267267
<h4 class="i18n_options_widget_site_exceptions_header"></h4>

tests/selenium/widgets_test.py

+18-20
Original file line numberDiff line numberDiff line change
@@ -276,48 +276,46 @@ def test_activation_site(self):
276276
self.load_url(self.BASIC_FIXTURE_URL)
277277
self.assert_replacement()
278278

279-
def test_disabling_site(self):
279+
def test_activation_global(self):
280280
self.block_domain(self.THIRD_PARTY_DOMAIN)
281281

282-
self.disable_badger_on_site(self.BASIC_FIXTURE_URL)
282+
# add the widget to the list of exceptions
283+
self.load_url(self.options_url)
284+
self.wait_for_script("return window.OPTIONS_INITIALIZED")
285+
self.find_el_by_css('a[href="#tab-manage-widgets"]').click()
286+
self.find_el_by_css('input[type="search"]').send_keys(
287+
self.TYPE3_WIDGET_NAME, Keys.ENTER)
283288

284289
# verify basic widget is neither replaced nor blocked
285290
self.load_url(self.BASIC_FIXTURE_URL)
286291
self.assert_no_replacement()
287292
self.assert_widget()
288-
# type 4 replacement should also be missing
289-
self.assert_no_replacement(self.TYPE4_WIDGET_NAME)
290-
# while the type 4 widget script should have executed
291-
self.assert_widget("type4")
292293

293-
# verify dynamic widget is neither replaced nor blocked
294+
# verify dynamic widget is no longer replaced
294295
self.load_url(self.DYNAMIC_FIXTURE_URL)
295296
self.find_el_by_css('#widget-trigger').click()
296297
self.assert_no_replacement()
297298
self.assert_widget()
298299

299-
def test_disabling_replacement_for_one_widget(self):
300+
def test_disabling_site(self):
300301
self.block_domain(self.THIRD_PARTY_DOMAIN)
301302

302-
# add the widget to the list of exceptions
303-
self.load_url(self.options_url)
304-
self.wait_for_script("return window.OPTIONS_INITIALIZED")
305-
self.find_el_by_css('a[href="#tab-manage-widgets"]').click()
306-
self.find_el_by_css('input[type="search"]').send_keys(
307-
self.TYPE3_WIDGET_NAME, Keys.ENTER)
303+
self.disable_badger_on_site(self.BASIC_FIXTURE_URL)
308304

309-
# verify basic widget is no longer replaced
305+
# verify basic widget is neither replaced nor blocked
310306
self.load_url(self.BASIC_FIXTURE_URL)
311307
self.assert_no_replacement()
312-
self.assert_widget_blocked()
313-
# verify the type 4 widget is still replaced
314-
self.assert_replacement(self.TYPE4_WIDGET_NAME)
308+
self.assert_widget()
309+
# type 4 replacement should also be missing
310+
self.assert_no_replacement(self.TYPE4_WIDGET_NAME)
311+
# while the type 4 widget script should have executed
312+
self.assert_widget("type4")
315313

316-
# verify dynamic widget is no longer replaced
314+
# verify dynamic widget is neither replaced nor blocked
317315
self.load_url(self.DYNAMIC_FIXTURE_URL)
318316
self.find_el_by_css('#widget-trigger').click()
319317
self.assert_no_replacement()
320-
self.assert_widget_blocked()
318+
self.assert_widget()
321319

322320
def test_no_replacement_when_cookieblocked(self):
323321
self.cookieblock_domain(self.THIRD_PARTY_DOMAIN)

0 commit comments

Comments
 (0)