From ffff7b3c7353f830bcc0358b82238fcb5379a8a5 Mon Sep 17 00:00:00 2001 From: xmcp Date: Sun, 21 Apr 2024 02:38:08 +0800 Subject: [PATCH] reduce hard minimum chrome version to 94 with a warning bar --- pakkujs/background/background.ts | 14 ++++---- pakkujs/background/config.ts | 9 +++-- pakkujs/background/danmu_update_blocker.ts | 39 ++++++++++++++++------ pakkujs/background/state.ts | 27 ++++++++++----- pakkujs/content_script/main.ts | 8 ++++- pakkujs/manifest.json | 9 +---- pakkujs/page/options.ts | 11 ++++-- 7 files changed, 77 insertions(+), 40 deletions(-) diff --git a/pakkujs/background/background.ts b/pakkujs/background/background.ts index 76df0bc..51eb7a1 100644 --- a/pakkujs/background/background.ts +++ b/pakkujs/background/background.ts @@ -1,4 +1,4 @@ -import {reset_dnr_status} from "./danmu_update_blocker"; +import {install_dnr_rule} from "./danmu_update_blocker"; import {get_config, hotfix_on_update, save_config} from "./config"; import {get_state, HAS_SESSION_STORAGE, init_state, save_state} from "./state"; @@ -150,23 +150,25 @@ function install_declarative_stuff() { // best practice to re-install all declarative stuff on every startup // https://groups.google.com/a/chromium.org/g/chromium-extensions/c/ZM0Vzb_vuIs/m/Nm4gK-X0AQAJ - void reset_dnr_status(); + void install_dnr_rule(); void install_context_menu(); void install_content_script(); } chrome.runtime.onStartup.addListener(async ()=>{ + install_declarative_stuff(); + if(!HAS_SESSION_STORAGE) { console.error('pakku state: EMULATING session storage'); await chrome.storage.local.clear(); // redo the init since the state is reset await perform_init(); } - - install_declarative_stuff(); }); chrome.runtime.onInstalled.addListener(async (details)=>{ + install_declarative_stuff(); + if(details.reason==='install') { void chrome.tabs.create({url: chrome.runtime.getURL('page/options.html')}); } @@ -177,8 +179,6 @@ chrome.runtime.onInstalled.addListener(async (details)=>{ hotfix_on_update(config); await save_config(config); } - - install_declarative_stuff(); }); chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => { @@ -217,7 +217,7 @@ chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => { return true; } else if(msg.type==='reset_dnr_status') { - void reset_dnr_status(); + void install_dnr_rule(); } else if(msg.type==='xhr_proxy') { let perform = async ()=>{ diff --git a/pakkujs/background/config.ts b/pakkujs/background/config.ts index 5c1321c..1a1e6b1 100644 --- a/pakkujs/background/config.ts +++ b/pakkujs/background/config.ts @@ -133,9 +133,12 @@ export async function save_config>(config: So await chrome.storage.sync.set(config); } -export async function get_config(): Promise { - let remote = await chrome.storage.sync.get(); - return migrate_config(remote); +export function get_config(): Promise { + return new Promise((resolve)=>{ + chrome.storage.sync.get((config: AnyObject)=>{ + resolve(migrate_config(config)); + }); + }); } function _to_int(config: AnyObject, k: (keyof Config)) { diff --git a/pakkujs/background/danmu_update_blocker.ts b/pakkujs/background/danmu_update_blocker.ts index 45dc221..ee4995b 100644 --- a/pakkujs/background/danmu_update_blocker.ts +++ b/pakkujs/background/danmu_update_blocker.ts @@ -1,18 +1,37 @@ import {get_config} from "./config"; +import Rule = chrome.declarativeNetRequest.Rule; -export async function reset_dnr_status() { +const RULE = { + id: 1001, + action: { + type: 'block', + }, + condition: { + requestDomains: [ + 'chat.bilibili.com' + ], + excludedInitiatorDomains: [ + 'live.bilibili.com' + ], + resourceTypes: [ + 'websocket' + ], + }, +} as Rule; + +export async function install_dnr_rule() { let config = await get_config(); + let enabled = (await chrome.declarativeNetRequest.getDynamicRules()).some(r => r.id===RULE.id); - // reset status of danmu-update-blocker - if(config.BREAK_UPDATE) { - await chrome.declarativeNetRequest.updateEnabledRulesets({ - enableRulesetIds: ['danmu-update-blocker'], + if(config.BREAK_UPDATE && !enabled) { + await chrome.declarativeNetRequest.updateDynamicRules({ + addRules: [RULE], }); - console.log('pakku update blocker: enabled dnr ruleset'); - } else { - await chrome.declarativeNetRequest.updateEnabledRulesets({ - disableRulesetIds: ['danmu-update-blocker'], + console.log('pakku update blocker: add dnr ruleset'); + } else if(!config.BREAK_UPDATE && enabled) { + await chrome.declarativeNetRequest.updateDynamicRules({ + removeRuleIds: [RULE.id], }); - console.log('pakku update blocker: disabled dnr ruleset'); + console.log('pakku update blocker: remove dnr ruleset'); } } \ No newline at end of file diff --git a/pakkujs/background/state.ts b/pakkujs/background/state.ts index 5f8570d..348acff 100644 --- a/pakkujs/background/state.ts +++ b/pakkujs/background/state.ts @@ -1,4 +1,4 @@ -import {MessageStats, Stats, int, AnyObject} from "../core/types"; +import {MessageStats, Stats, AnyObject} from "../core/types"; // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage/session#browser_compatibility // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage/StorageArea/setAccessLevel#browser_compatibility @@ -22,11 +22,18 @@ export type State = typeof DEFAULT_STATE & { export async function init_state(): Promise { let store = HAS_SESSION_STORAGE ? chrome.storage.session : chrome.storage.local; - let {_INITIALIZED} = await store.get(['_INITIALIZED']); + let _INITIALIZED = false; + try { + _INITIALIZED = (await store.get(['_INITIALIZED']))._INITIALIZED; + } catch(e) {} + if(!_INITIALIZED) { console.log('pakku state: init state'); + + // maybe no permission if(store.setAccessLevel) await store.setAccessLevel({accessLevel: 'TRUSTED_AND_UNTRUSTED_CONTEXTS'}); + await store.set(DEFAULT_STATE); return true; } @@ -43,11 +50,13 @@ export async function remove_state(keys: (keyof State)[]) { await store.remove(keys); } -export async function get_state(): Promise { - let store = HAS_SESSION_STORAGE ? chrome.storage.session : chrome.storage.local; - let state = await store.get() as State; - - if(!state._INITIALIZED) - return DEFAULT_STATE; - return state; +export function get_state(): Promise { + return new Promise((resolve)=>{ + let store = HAS_SESSION_STORAGE ? chrome.storage.session : chrome.storage.local; + store.get((state: State)=>{ + if(!state._INITIALIZED) + resolve(DEFAULT_STATE); + resolve(state); + }); + }); } \ No newline at end of file diff --git a/pakkujs/content_script/main.ts b/pakkujs/content_script/main.ts index 0ae3a28..8079d8f 100644 --- a/pakkujs/content_script/main.ts +++ b/pakkujs/content_script/main.ts @@ -49,13 +49,19 @@ function get_player_blacklist(): BlacklistItem[] { let tabid: null | int = null; let unreg_userscript = true; +function get_tabid() { + return new Promise((resolve) => { + chrome.runtime.sendMessage({type: 'get_tabid'}, resolve); + }); +} + async function apply_local_config(config: Config, is_pure_env: boolean = false): Promise { let state = await get_state(); let userscript = config.USERSCRIPT; if(!tabid) { - tabid = await chrome.runtime.sendMessage({type: 'get_tabid'}) as int; + tabid = await get_tabid() as int; // storage cleanup window.onunload = function() { diff --git a/pakkujs/manifest.json b/pakkujs/manifest.json index 86fdfbe..b9dfea6 100644 --- a/pakkujs/manifest.json +++ b/pakkujs/manifest.json @@ -11,7 +11,7 @@ "author": "xmcp", "manifest_version": 3, - "minimum_chrome_version": "99", + "minimum_chrome_version": "94", "permissions": [ "notifications", @@ -74,13 +74,6 @@ } ], - "declarative_net_request": { - "rule_resources": [{ - "id": "danmu-update-blocker", - "enabled": false, - "path": "assets/danmu_update_blocker.json" - }] - }, "web_accessible_resources": [{ "resources": ["/generated/combine_worker.js", "/generated/xhr_hook.js"], "matches": ["*://*.bilibili.com/*"] diff --git a/pakkujs/page/options.ts b/pakkujs/page/options.ts index 27cdeb5..3493834 100644 --- a/pakkujs/page/options.ts +++ b/pakkujs/page/options.ts @@ -1,4 +1,5 @@ import {DEFAULT_CONFIG, get_config, migrate_config, save_config} from '../background/config'; +import Permissions = chrome.permissions.Permissions; const IS_FIREFOX = process.env.PAKKU_CHANNEL==='firefox'; const IS_EDG = process.env.PAKKU_CHANNEL==='chrome' && navigator.userAgent.includes('Edg/'); @@ -95,7 +96,7 @@ async function ver_check() { if(process.env.PAKKU_CHANNEL==='chrome' && chrome_ver && chrome_ver { + return new Promise((resolve)=>{ + chrome.permissions.getAll(resolve); + }); +} + let config = await get_config(); -let perms = await chrome.permissions.getAll(); +let perms = await get_perms(); if(!perms.origins?.includes('*://*.bilibili.com/*')) { id('fix-permission-hint').style.display = 'initial';