[mv3] Workaround for permissions dialog preventing proper mode change

This is a Chromium-specific issue.

Related issue:
https://github.com/uBlockOrigin/uBOL-home/issues/280
This commit is contained in:
Raymond Hill 2025-02-21 08:23:27 -05:00
parent 128083c203
commit 1d2378e74e
No known key found for this signature in database
GPG key ID: 25E1490B761470C2
3 changed files with 53 additions and 10 deletions

View file

@ -45,6 +45,11 @@ import {
getAdminRulesets, getAdminRulesets,
} from './admin.js'; } from './admin.js';
import {
broadcastMessage,
hostnamesFromMatches,
} from './utils.js';
import { import {
enableRulesets, enableRulesets,
excludeFromStrictBlock, excludeFromStrictBlock,
@ -70,7 +75,6 @@ import {
saveRulesetConfig, saveRulesetConfig,
} from './config.js'; } from './config.js';
import { broadcastMessage } from './utils.js';
import { registerInjectables } from './scripting-manager.js'; import { registerInjectables } from './scripting-manager.js';
/******************************************************************************/ /******************************************************************************/
@ -79,6 +83,8 @@ const UBOL_ORIGIN = runtime.getURL('').replace(/\/$/, '');
const canShowBlockedCount = typeof dnr.setExtensionActionOptions === 'function'; const canShowBlockedCount = typeof dnr.setExtensionActionOptions === 'function';
let pendingPermissionRequest;
/******************************************************************************/ /******************************************************************************/
function getCurrentVersion() { function getCurrentVersion() {
@ -116,6 +122,30 @@ async function onPermissionsRemoved() {
return true; return true;
} }
// https://github.com/uBlockOrigin/uBOL-home/issues/280
async function onPermissionsAdded(permissions) {
const details = pendingPermissionRequest;
pendingPermissionRequest = undefined;
if ( details === undefined ) { return; }
const defaultMode = await getDefaultFilteringMode();
if ( defaultMode >= MODE_OPTIMAL ) { return; }
if ( Array.isArray(permissions.origins) === false ) { return; }
const hostnames = hostnamesFromMatches(permissions.origins);
if ( hostnames.includes(details.hostname) === false ) { return; }
const beforeLevel = await getFilteringMode(details.hostname);
if ( beforeLevel === details.afterLevel ) { return; }
const afterLevel = await setFilteringMode(details.hostname, details.afterLevel);
if ( afterLevel !== details.afterLevel ) { return; }
await registerInjectables();
if ( rulesetConfig.autoReload ) {
self.setTimeout(( ) => {
browser.tabs.update(details.tabId, {
url: details.url,
});
}, 437);
}
}
/******************************************************************************/ /******************************************************************************/
async function gotoURL(url, type) { async function gotoURL(url, type) {
@ -312,6 +342,10 @@ function onMessage(request, sender, callback) {
return true; return true;
} }
case 'setPendingFilteringMode':
pendingPermissionRequest = request;
break;
case 'getDefaultFilteringMode': { case 'getDefaultFilteringMode': {
getDefaultFilteringMode().then(level => { getDefaultFilteringMode().then(level => {
callback(level); callback(level);
@ -434,10 +468,6 @@ async function start() {
runtime.onMessage.addListener(onMessage); runtime.onMessage.addListener(onMessage);
browser.permissions.onRemoved.addListener(
( ) => { onPermissionsRemoved(); }
);
if ( process.firstRun ) { if ( process.firstRun ) {
const enableOptimal = await hasOmnipotence(); const enableOptimal = await hasOmnipotence();
if ( enableOptimal ) { if ( enableOptimal ) {
@ -463,6 +493,9 @@ async function start() {
if ( process.wakeupRun === false ) { if ( process.wakeupRun === false ) {
adminReadEx('disabledFeatures'); adminReadEx('disabledFeatures');
} }
browser.permissions.onRemoved.addListener(onPermissionsRemoved);
browser.permissions.onAdded.addListener(onPermissionsAdded);
} }
// https://github.com/uBlockOrigin/uBOL-home/issues/199 // https://github.com/uBlockOrigin/uBOL-home/issues/199

View file

@ -74,6 +74,16 @@ async function commitFilteringMode() {
const afterLevel = parseInt(modeSlider.dataset.level, 10); const afterLevel = parseInt(modeSlider.dataset.level, 10);
const beforeLevel = parseInt(modeSlider.dataset.levelBefore, 10); const beforeLevel = parseInt(modeSlider.dataset.levelBefore, 10);
if ( afterLevel > 1 ) { if ( afterLevel > 1 ) {
if ( beforeLevel <= 1 ) {
sendMessage({
what: 'setPendingFilteringMode',
tabId: currentTab.id,
url: tabURL.href,
hostname: targetHostname,
beforeLevel,
afterLevel,
});
}
let granted = false; let granted = false;
try { try {
granted = await browser.permissions.request({ granted = await browser.permissions.request({

View file

@ -93,7 +93,7 @@ const uidint32 = (s) => {
const stdOutput = []; const stdOutput = [];
const log = (text, silent = false) => { const log = (text, silent = true) => {
stdOutput.push(text); stdOutput.push(text);
if ( silent === false ) { if ( silent === false ) {
console.log(text); console.log(text);
@ -166,7 +166,7 @@ const requiredRedirectResources = new Set();
// This will be used to sign our inserted `!#trusted on` directives // This will be used to sign our inserted `!#trusted on` directives
const secret = createHash('sha256').update(randomBytes(16)).digest('hex').slice(0,16); const secret = createHash('sha256').update(randomBytes(16)).digest('hex').slice(0,16);
log(`Secret: ${secret}`); log(`Secret: ${secret}`, false);
/******************************************************************************/ /******************************************************************************/
@ -245,7 +245,7 @@ async function fetchList(assetDetails) {
return { url, content }; return { url, content };
} }
} }
log(`No valid content for ${details.name}`); log(`No valid content for ${details.name}`, false);
return { url, content: '' }; return { url, content: '' };
}) })
); );
@ -257,7 +257,7 @@ async function fetchList(assetDetails) {
const text = parts.join('\n'); const text = parts.join('\n');
if ( text === '' ) { if ( text === '' ) {
log('No filterset found'); log('No filterset found', false);
} }
return text; return text;
} }
@ -1308,7 +1308,7 @@ async function main() {
const minutePart = Math.floor(now.getUTCMinutes()); const minutePart = Math.floor(now.getUTCMinutes());
version = `${yearPart}.${monthPart}.${dayPart}.${hourPart * 60 + minutePart}`; version = `${yearPart}.${monthPart}.${dayPart}.${hourPart * 60 + minutePart}`;
} }
log(`Version: ${version}`); log(`Version: ${version}`, false);
// Get assets.json content // Get assets.json content
const assets = await fs.readFile( const assets = await fs.readFile(