mirror of https://github.com/gorhill/uBlock.git
122 lines
4.1 KiB
JavaScript
122 lines
4.1 KiB
JavaScript
/*******************************************************************************
|
|
|
|
uBlock Origin Lite - a comprehensive, MV3-compliant content blocker
|
|
Copyright (C) 2022-present Raymond Hill
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see {http://www.gnu.org/licenses/}.
|
|
|
|
Home: https://github.com/gorhill/uBlock
|
|
*/
|
|
|
|
import {
|
|
adminRead,
|
|
localRead, localWrite,
|
|
sessionRead, sessionWrite,
|
|
} from './ext.js';
|
|
|
|
import {
|
|
enableRulesets,
|
|
getRulesetDetails,
|
|
} from './ruleset-manager.js';
|
|
|
|
import {
|
|
getTrustedSites,
|
|
readFilteringModeDetails,
|
|
} from './mode-manager.js';
|
|
|
|
import { broadcastMessage } from './utils.js';
|
|
import { dnr } from './ext.js';
|
|
import { registerInjectables } from './scripting-manager.js';
|
|
import { rulesetConfig } from './config.js';
|
|
import { ubolLog } from './debug.js';
|
|
|
|
/******************************************************************************/
|
|
|
|
const adminSettings = {
|
|
keys: new Set(),
|
|
timer: undefined,
|
|
change(key) {
|
|
this.keys.add(key);
|
|
if ( this.timer !== undefined ) { return; }
|
|
this.timer = self.setTimeout(( ) => {
|
|
this.timer = undefined;
|
|
this.process();
|
|
}, 127);
|
|
},
|
|
async process() {
|
|
if ( this.keys.has('rulesets') ) {
|
|
ubolLog('admin setting "rulesets" changed');
|
|
await enableRulesets(rulesetConfig.enabledRulesets);
|
|
await registerInjectables();
|
|
const results = await Promise.all([
|
|
getAdminRulesets(),
|
|
dnr.getEnabledRulesets(),
|
|
]);
|
|
const [ adminRulesets, enabledRulesets ] = results;
|
|
broadcastMessage({ adminRulesets, enabledRulesets });
|
|
}
|
|
if ( this.keys.has('noFiltering') ) {
|
|
ubolLog('admin setting "noFiltering" changed');
|
|
await readFilteringModeDetails(true);
|
|
const trustedSites = await getTrustedSites();
|
|
broadcastMessage({ trustedSites: Array.from(trustedSites) });
|
|
}
|
|
this.keys.clear();
|
|
}
|
|
};
|
|
|
|
/******************************************************************************/
|
|
|
|
export async function getAdminRulesets() {
|
|
const adminList = await adminReadEx('rulesets');
|
|
const adminRulesets = new Set(Array.isArray(adminList) && adminList || []);
|
|
if ( adminRulesets.has('-*') ) {
|
|
adminRulesets.delete('-*');
|
|
const rulesetDetails = await getRulesetDetails();
|
|
for ( const ruleset of rulesetDetails.values() ) {
|
|
if ( ruleset.enabled ) { continue; }
|
|
if ( adminRulesets.has(`+${ruleset.id}`) ) { continue; }
|
|
adminRulesets.add(`-${ruleset.id}`);
|
|
}
|
|
}
|
|
return Array.from(adminRulesets);
|
|
}
|
|
|
|
/******************************************************************************/
|
|
|
|
export async function adminReadEx(key) {
|
|
let cacheValue;
|
|
const session = await sessionRead(`admin_${key}`);
|
|
if ( session ) {
|
|
cacheValue = session.data;
|
|
} else {
|
|
const local = await localRead(`admin_${key}`);
|
|
if ( local ) {
|
|
cacheValue = local.data;
|
|
}
|
|
}
|
|
adminRead(key).then(async value => {
|
|
const adminKey = `admin_${key}`;
|
|
await Promise.all([
|
|
sessionWrite(adminKey, { data: value }),
|
|
localWrite(adminKey, { data: value }),
|
|
]);
|
|
if ( JSON.stringify(value) === JSON.stringify(cacheValue) ) { return; }
|
|
adminSettings.change(key);
|
|
});
|
|
return cacheValue;
|
|
}
|
|
|
|
/******************************************************************************/
|