Skip to content

Commit b47b22a

Browse files
committed
[workflow] Update uBOLite MV3 package files for 2026.422.1301
Files changed: M chromium/_locales/id/messages.json M chromium/css/settings.css M chromium/js/background.js M chromium/js/filter-manager-ui.js M chromium/js/filter-manager.js M chromium/log.txt M chromium/manifest.json M chromium/rulesets/main/adguard-mobile.json M chromium/rulesets/main/annoyances-cookies.json M chromium/rulesets/main/chn-0.json M chromium/rulesets/main/deu-0.json M chromium/rulesets/main/dpollock-0.json M chromium/rulesets/main/easylist.json M chromium/rulesets/main/easyprivacy.json M chromium/rulesets/main/ind-0.json M chromium/rulesets/main/nld-0.json M chromium/rulesets/main/pgl.json M chromium/rulesets/main/rus-0.json M chromium/rulesets/main/spa-1.json M chromium/rulesets/main/swe-1.json M chromium/rulesets/main/tur-0.json M chromium/rulesets/main/ublock-filters.json M chromium/rulesets/main/urlhaus-full.json M chromium/rulesets/main/vie-1.json M chromium/rulesets/ruleset-details.json M chromium/rulesets/scripting/generic/easylist.js M chromium/rulesets/scripting/generic/rus-0.js M chromium/rulesets/scripting/generic/swe-1.js M chromium/rulesets/scripting/generichigh/chn-0.css M chromium/rulesets/scripting/generichigh/fra-0.css M chromium/rulesets/scripting/popup/fra-0.js M chromium/rulesets/scripting/popup/rus-0.js M chromium/rulesets/scripting/popup/ublock-filters.js M chromium/rulesets/scripting/popup/vie-1.js M chromium/rulesets/scripting/procedural/annoyances-cookies.json M chromium/rulesets/scripting/procedural/annoyances-others.json M chromium/rulesets/scripting/procedural/annoyances-overlays.json M chromium/rulesets/scripting/procedural/annoyances-social.json M chromium/rulesets/scripting/procedural/deu-0.json M chromium/rulesets/scripting/procedural/hun-0.json M chromium/rulesets/scripting/procedural/ind-0.json M chromium/rulesets/scripting/procedural/rus-0.json M chromium/rulesets/scripting/procedural/swe-1.json M chromium/rulesets/scripting/procedural/tur-0.json M chromium/rulesets/scripting/scriptlet/isolated/annoyances-cookies.js M chromium/rulesets/scripting/scriptlet/isolated/tur-0.js M chromium/rulesets/scripting/scriptlet/isolated/ublock-filters.js M chromium/rulesets/scripting/scriptlet/main/annoyances-overlays.js M chromium/rulesets/scripting/scriptlet/main/chn-0.js M chromium/rulesets/scripting/scriptlet/main/easyprivacy.js M chromium/rulesets/scripting/scriptlet/main/jpn-1.js M chromium/rulesets/scripting/scriptlet/main/kor-1.js M chromium/rulesets/scripting/scriptlet/main/rus-0.js M chromium/rulesets/scripting/scriptlet/main/spa-1.js M chromium/rulesets/scripting/scriptlet/main/tur-0.js M chromium/rulesets/scripting/scriptlet/main/ublock-filters.js M chromium/rulesets/scripting/scriptlet/main/vie-1.js M chromium/rulesets/scripting/specific/adguard-mobile.json M chromium/rulesets/scripting/specific/annoyances-cookies.json M chromium/rulesets/scripting/specific/annoyances-others.json M chromium/rulesets/scripting/specific/annoyances-overlays.json M chromium/rulesets/scripting/specific/annoyances-social.json M chromium/rulesets/scripting/specific/chn-0.json M chromium/rulesets/scripting/specific/deu-0.json M chromium/rulesets/scripting/specific/easylist.json M chromium/rulesets/scripting/specific/grc-0.json M chromium/rulesets/scripting/specific/ind-0.json M chromium/rulesets/scripting/specific/ita-0.json M chromium/rulesets/scripting/specific/jpn-1.json M chromium/rulesets/scripting/specific/rou-1.json M chromium/rulesets/scripting/specific/rus-0.json M chromium/rulesets/scripting/specific/spa-1.json M chromium/rulesets/scripting/specific/swe-1.json M chromium/rulesets/scripting/specific/tur-0.json M chromium/rulesets/scripting/specific/ublock-filters.json M chromium/rulesets/scripting/specific/vie-1.json M chromium/rulesets/scriptlet-details.json M chromium/rulesets/strictblock/adguard-mobile.json M chromium/rulesets/strictblock/chn-0.json M chromium/rulesets/strictblock/dpollock-0.json M chromium/rulesets/strictblock/easylist.json M chromium/rulesets/strictblock/easyprivacy.json M chromium/rulesets/strictblock/pgl.json M chromium/rulesets/strictblock/ublock-badware.json M chromium/rulesets/strictblock/ublock-filters.json M chromium/rulesets/strictblock/urlhaus-full.json M chromium/rulesets/strictblock/vie-1.json
1 parent 14b367d commit b47b22a

87 files changed

Lines changed: 2701 additions & 1012 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

chromium/_locales/id/messages.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -312,15 +312,15 @@
312312
"description": "Label for checkbox in document-blocked page"
313313
},
314314
"strictblockProceed": {
315-
"message": "Lanjutkan",
315+
"message": "Proceed",
316316
"description": "A button to navigate to the blocked page"
317317
},
318318
"zapperTipEnter": {
319319
"message": "Masuk ke mode penghapus elemen",
320320
"description": "Tooltip for the button used to enter zapper mode"
321321
},
322322
"zapperTipQuit": {
323-
"message": "Keluar dari mode penghapus elemen",
323+
"message": "Mbyll asgjësuesin e elementeve",
324324
"description": "Tooltip for the button used to exit zapper mode"
325325
},
326326
"pickerTipEnter": {

chromium/css/settings.css

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -257,10 +257,12 @@ section[data-pane="filters"] ul {
257257
margin: 0;
258258
padding-inline-start: 0;
259259
}
260-
section[data-pane="filters"] .hostnames > li.hostname > div {
261-
background-color: var(--surface-2);
260+
section[data-pane="filters"] li[data-pretty] > div {
262261
padding-inline-start: 0.5em;
263262
}
263+
section[data-pane="filters"] li.hostname > div {
264+
background-color: var(--surface-2);
265+
}
264266
section[data-pane="filters"] ul ul {
265267
padding-block-end: 1em;
266268
padding-inline-start: 0.5em;
@@ -342,6 +344,9 @@ section[data-pane="filters"] aside p {
342344
flex-wrap: wrap;
343345
gap: 1em;
344346
}
347+
section[data-pane="filters"] li.error[data-pretty] > div span[contenteditable] {
348+
color: var(--info3-ink);
349+
}
345350

346351
@media (max-width: 480px) {
347352
#defaultFilteringMode {

chromium/js/background.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ import {
5757
broadcastMessage,
5858
hostnameFromMatch,
5959
hostnamesFromMatches,
60+
intFromVersion,
6061
} from './utils.js';
6162

6263
import {
@@ -664,10 +665,34 @@ async function startSession() {
664665
// The default rulesets may have changed, find out new ruleset to enable,
665666
// obsolete ruleset to remove.
666667
if ( isNewVersion ) {
668+
const previousVersion = rulesetConfig.version;
667669
ubolLog(`Version change: ${rulesetConfig.version} => ${currentVersion}`);
668670
rulesetConfig.version = currentVersion;
669671
await patchDefaultRulesets();
670672
saveRulesetConfig();
673+
// https://github.com/uBlockOrigin/uBOL-home/issues/670
674+
if ( intFromVersion(previousVersion) <= intFromVersion('2026.423.0000') ) {
675+
const promises = [];
676+
const customFilters = await getAllCustomFilters();
677+
for ( const [ hostname, selectors ] of customFilters ) {
678+
let modified = false;
679+
for ( let i = 0; i < selectors.length; i++ ) {
680+
const selector = selectors[i];
681+
if ( selector.startsWith('0') === false ) { continue; }
682+
selectors[i] = selector.slice(1);
683+
modified = true;
684+
}
685+
if ( modified === false ) { continue; }
686+
promises.push(
687+
removeAllCustomFilters(hostname).then(( ) =>
688+
addCustomFilters(hostname, selectors)
689+
)
690+
);
691+
}
692+
if ( promises.length !== 0 ) {
693+
await Promise.all(promises);
694+
}
695+
}
671696
}
672697

673698
const rulesetsUpdated = await enableRulesets(rulesetConfig.enabledRulesets);

chromium/js/filter-manager-ui.js

Lines changed: 63 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,15 @@ const dataContainer = qs$('section[data-pane="filters"] .hostnames');
3030

3131
/******************************************************************************/
3232

33+
function getSFP() {
34+
if ( getSFP.sfp === undefined ) {
35+
getSFP.sfp = import('./static-filtering-parser.js');
36+
}
37+
return getSFP.sfp;
38+
}
39+
40+
/******************************************************************************/
41+
3342
function isValidHostname(hostname) {
3443
try {
3544
const url = new URL(`https://${hostname}/`);
@@ -234,6 +243,29 @@ function updateContentEditability() {
234243

235244
/******************************************************************************/
236245

246+
async function validateSelector(target, selector) {
247+
const sfp = await getSFP();
248+
const parser = new sfp.AstFilterParser({
249+
nativeCssHas: true,
250+
trustedSource: true,
251+
});
252+
parser.parse(`##${selector}`);
253+
let pretty, ugly;
254+
if ( parser.hasError() === false ) {
255+
if ( parser.isScriptletFilter() ) {
256+
pretty = `+js(${parser.getTypeString(sfp.NODE_TYPE_EXT_PATTERN_SCRIPTLET)})`;
257+
ugly = pretty;
258+
} else if ( parser.isCosmeticFilter() ) {
259+
pretty = parser.getTypeString(sfp.NODE_TYPE_EXT_PATTERN_COSMETIC);
260+
ugly = parser.result.compiled;
261+
}
262+
}
263+
if ( Boolean(pretty) === false ) { return {}; }
264+
return { pretty, ugly };
265+
}
266+
267+
/******************************************************************************/
268+
237269
async function onHostnameChanged(target, before, after) {
238270
const uglyAfter = punycode.toASCII(after);
239271
if ( isValidHostname(uglyAfter) === false ) {
@@ -272,45 +304,29 @@ async function onSelectorChanged(target, before, after) {
272304
if ( selectorNode === null ) { return; }
273305

274306
// Validate selector
275-
const sfp = await import('./static-filtering-parser.js');
276-
const parser = new sfp.AstFilterParser({
277-
nativeCssHas: true,
278-
trustedSource: true,
279-
});
280-
const hostname = hostnameFromNode(target);
281-
parser.parse(`##${after}`);
282-
if ( parser.hasError() ) {
283-
target.textContent = before;
284-
return;
285-
}
286-
let prettySelector, uglySelector;
287-
if ( parser.isScriptletFilter() ) {
288-
prettySelector = `+js(${parser.getTypeString(sfp.NODE_TYPE_EXT_PATTERN_SCRIPTLET)})`;
289-
uglySelector = prettySelector;
290-
} else if ( parser.isCosmeticFilter() ) {
291-
prettySelector = parser.getTypeString(sfp.NODE_TYPE_EXT_PATTERN_COSMETIC);
292-
uglySelector = parser.result.compiled;
293-
}
294-
if ( Boolean(prettySelector) === false ) {
307+
const { pretty, ugly } = await validateSelector(target, after);
308+
if ( Boolean(pretty) === false ) {
295309
target.textContent = before;
296310
return;
297311
}
298312

299313
dom.cl.add(dom.body, 'readonly');
300314
updateContentEditability();
301315

316+
const hostname = hostnameFromNode(target);
317+
302318
// Remove old selector from storage
303319
await sendMessage({ what: 'removeCustomFilters',
304320
hostname,
305321
selectors: [ selectorNode.dataset.ugly ],
306322
});
307323

308324
// Add new selector to storage
309-
selectorNode.dataset.ugly = uglySelector;
310-
selectorNode.dataset.pretty = prettySelector;
325+
selectorNode.dataset.ugly = ugly;
326+
selectorNode.dataset.pretty = pretty;
311327
await sendMessage({ what: 'addCustomFilters',
312328
hostname,
313-
selectors: [ uglySelector ],
329+
selectors: [ ugly ],
314330
});
315331

316332
await debounceRenderCustomFilters();
@@ -321,12 +337,13 @@ async function onSelectorChanged(target, before, after) {
321337
function onTextChanged(target) {
322338
const itemNode = target.closest('[data-pretty]');
323339
if ( itemNode === null ) { return; }
340+
dom.cl.remove(itemNode, 'error');
324341
const before = itemNode.dataset.pretty;
325342
const after = target.textContent.trim().replace('\n', '');
326343
if ( after !== target.textContent ) {
327344
target.textContent = after;
328345
}
329-
if ( after === before ) { return; }
346+
if ( before !== '' && after === before ) { return; }
330347
if ( after === '' ) {
331348
target.textContent = before;
332349
return;
@@ -355,12 +372,32 @@ function endEdit(ev) {
355372
function commitEdit(ev) {
356373
const { target } = ev;
357374
if ( target === focusedEditableContent ) {
358-
if ( ev.inputType === 'insertLineBreak' ) { target.blur(); }
375+
if ( ev.inputType === 'insertLineBreak' ) {
376+
target.blur();
377+
} else {
378+
validateEdit(ev);
379+
}
359380
return;
360381
}
361382
onTextChanged(target);
362383
}
363384

385+
function validateEdit(ev) {
386+
const { target } = ev;
387+
const itemNode = target.closest('[data-pretty]');
388+
if ( itemNode === null ) { return; }
389+
const after = target.textContent.trim().replace('\n', '');
390+
if ( after === '' ) { return; }
391+
if ( target.matches('.selector') ) {
392+
validateSelector(target, after).then(({ pretty }) => {
393+
if ( focusedEditableContent !== target ) { return; }
394+
dom.cl.toggle(itemNode, 'error', after !== '' && Boolean(pretty) === false);
395+
});
396+
} else if ( target.matches('.hostname') ) {
397+
dom.cl.toggle(itemNode, 'error', isValidHostname(punycode.toASCII(after)) === false);
398+
}
399+
}
400+
364401
let focusedEditableContent = null;
365402

366403
/******************************************************************************/
@@ -400,7 +437,7 @@ function onUndoClicked(ev) {
400437
/******************************************************************************/
401438

402439
async function importFromText(text) {
403-
const sfp = await import('./static-filtering-parser.js');
440+
const sfp = await getSFP();
404441
const parser = new sfp.AstFilterParser({
405442
nativeCssHas: true,
406443
trustedSource: true,

chromium/js/filter-manager.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,8 @@ registerCustomScriptlets.create = async function() {
363363
await browser.userScripts.unregister();
364364
ubolLog(`Unregistered userscript ${toRemove.map(v => v.id)}`);
365365
}
366+
const customFilters = await getAllCustomFilters();
367+
if ( customFilters.some(a => a[1].some(b => isScriptlet(b))) === false ) { return; }
366368
const { promise: offscreenPromise, resolve: offscreenResolve } = Promise.withResolvers();
367369
const handler = (msg, sender, callback) => {
368370
if ( typeof msg !== 'object' ) { return; }

0 commit comments

Comments
 (0)