From 3a2d9bacc29725bf6f5a1007166e02a09c60938f Mon Sep 17 00:00:00 2001 From: tophf Date: Thu, 13 Feb 2025 00:47:04 +0300 Subject: [PATCH] disable style cache in db --- src/background/style-manager/cache.js | 90 ++------------------------ src/background/style-manager/init.js | 3 - src/background/style-via-webrequest.js | 36 +++-------- src/background/tab-manager.js | 2 +- 4 files changed, 13 insertions(+), 118 deletions(-) diff --git a/src/background/style-manager/cache.js b/src/background/style-manager/cache.js index 250ab4b590..cde2574ce7 100644 --- a/src/background/style-manager/cache.js +++ b/src/background/style-manager/cache.js @@ -1,6 +1,4 @@ import {bgBusy} from '../common'; -import {cacheDB, db as styleDB} from '../db'; -import {bgMortal, bgMortalChanged} from '../tab-manager'; let onDeleted; let timer; @@ -12,73 +10,20 @@ const toWrite = new Set(); export default cache; -if (__.MV3) { - bgMortalChanged.add(val => { - if (val) cacheDB.putMany(Object.values(cache)); - else cacheDB.clear(); - }); -} - /** @param {MatchCache.Entry} val * @return {void} */ export function add(val) { - cache.set(val.url, bgMortal ? hit(val) : val); + cache.set(val.url, hit(val)); if (cache.size >= MAX) prune(); } /** @return {void} */ export function clear() { if (onDeleted) cache.forEach(onDeleted); - if (__.MV3 && bgMortal) cacheDB.clear(); if (timer) timer = clearTimeout(timer); cache.clear(); } -/** @param {string} url - * @return {Promise} */ -export async function loadOne(url) { - const val = await cacheDB.get(url); - if (val) { - cache.set(url, hit(val)); - const styleIds = Object.keys(val.sections ??= {}).map(Number); - const styles = styleIds.length ? await styleDB.getMany(styleIds) : []; - for (const style of styles) { - if (!style || !make(val, style)) { - del([val]); - return; - } - } - } - return val; -} - -/** @return {Promise} */ -export async function loadAll() { - for (const val of await cacheDB.getAll()) { - if (!cache.has(val.url)) { - cache.set(val.url, val); - } - } -} - -/** @param {StyleDataMap} dataMap - * @return {void} */ -export function hydrate(dataMap) { - const toDel = []; - for (const val of cache.values()) { - for (const id in (val.sections ??= {})) { - const data = dataMap.get(+id); - if (!data || !make(val, data.style)) { - toDel.push(val); - break; - } else { - data.appliesTo.add(val.url); - } - } - } - if (toDel[0]) del(toDel); -} - /** * @param {MatchCache.DbEntry} entry * @param {StyleObj} style @@ -122,39 +67,12 @@ function del(items) { cache.delete(items[i] = val.url); onDeleted(val); } - if (__.MV3 && bgMortal) cacheDB.deleteMany(items); } /** @return {void} */ function flush() { - const bare = []; - let toDel; - nextEntry: - for (const val of toWrite) { - const {d, url, sections} = val; - /** @type {MatchCache.IndexMap} */ - const indexes = {}; - /** @type {MatchCache.DbEntry} */ - const res = {}; - let styleId; - for (styleId in sections) { - /** @type {Injection.Sections | MatchCache.Index} */ - const sec = sections[styleId]; - const idx = sec && (Array.isArray(sec) ? sec : sec.idx); - if (!idx) { - (toDel ??= []).push(val); - continue nextEntry; - } - indexes[styleId] = idx; - } - // Adding the meaningful props first to ensure their visibility in devtools DB viewer - if (styleId) res.sections = indexes; - res.d = [d?.[1] || 0, new Date()]; - res.url = url; - bare.push(res); - } - if (toDel) del(toDel); - if (__.MV3) cacheDB.putMany(bare); + for (const val of toWrite) + val.d = [val.d?.[1] || 0, new Date()]; toWrite.clear(); timer = null; } @@ -170,7 +88,7 @@ async function flushLater() { * @param {T} val * @return {T} */ export function hit(val) { - if (val && bgMortal) { + if (val) { toWrite.add(val); if (!timer) flushLater(); } diff --git a/src/background/style-manager/init.js b/src/background/style-manager/init.js index 290c4a7506..7afeb67c6a 100644 --- a/src/background/style-manager/init.js +++ b/src/background/style-manager/init.js @@ -4,7 +4,6 @@ import {STORAGE_KEY} from '@/js/prefs'; import * as colorScheme from '../color-scheme'; import {bgBusy, bgInit, onSchemeChange} from '../common'; import {db, draftsDB, execMirror, prefsDB} from '../db'; -import {bgMortal} from '../tab-manager'; import * as styleCache from './cache'; import './init'; import {fixKnownProblems} from './fixer'; @@ -16,7 +15,6 @@ bgInit.push(async () => { let [orderFromDb, styles] = await Promise.all([ prefsDB.get(kInjectionOrder), db.getAll(), - __.MV3 && bgMortal ? styleCache.loadAll() : [], ]); if (!orderFromDb) orderFromDb = await execMirror(STORAGE_KEY, 'get', kInjectionOrder); @@ -24,7 +22,6 @@ bgInit.push(async () => { styles = mirrored = await execMirror(DB, 'getAll'); setOrderImpl(orderFromDb, {store: false}); initStyleMap(styles, mirrored); - styleCache.hydrate(dataMap); __.DEBUGLOG('styleMan init done'); }); diff --git a/src/background/style-via-webrequest.js b/src/background/style-via-webrequest.js index 7840f4cc44..36f58f9002 100644 --- a/src/background/style-via-webrequest.js +++ b/src/background/style-via-webrequest.js @@ -5,7 +5,7 @@ import * as prefs from '@/js/prefs'; import {CHROME, FIREFOX} from '@/js/ua'; import {actionPopupUrl, ownRoot} from '@/js/urls'; import {deepEqual, isEmptyObj} from '@/js/util'; -import {ignoreChromeError, ownId, toggleListener} from '@/js/util-webext'; +import {ownId, toggleListener} from '@/js/util-webext'; import * as colorScheme from './color-scheme'; import {bgBusy, bgPreInit, clientDataJobs, dataHub, onUnload} from './common'; import {stateDB} from './db'; @@ -13,7 +13,6 @@ import {webNavigation} from './navigation-manager'; import offscreen from './offscreen'; import makePopupData from './popup-data'; import {getSectionsByUrl} from './style-manager'; -import * as styleCache from './style-manager/cache'; import tabCache, * as tabMan from './tab-manager'; const idCSP = 'patchCsp'; @@ -136,32 +135,14 @@ function toggle(prefKey) { async function prepareStyles(req) { const {tabId, frameId, url} = req; if (tabId < 0) return; const key = tabId + ':' + frameId; - const bgPreInitLen = __.MV3 && bgPreInit.length; - const isDark = curXHR - && colorScheme.isSystem() - && !tabMan.someInjectable() - && colorScheme.refreshSystemDark(); - __.DEBUGLOG('prepareStyles', key, req, {isDark}); - if (!curXHR && !curCSP && !bgBusy) return; - let cached, unlock; - let lock = __.MV3 && bgPreInitLen && new Promise(resolve => (unlock = resolve)); - if (__.MV3 && bgPreInitLen) { // bgPreInit in progress, let's join it - bgPreInit.push( - styleCache.loadOne(url), - frameId ? browser.tabs.get(tabId).catch(ignoreChromeError) : undefined, - isDark, - ); - const all = Promise.all(bgPreInit); - if (lock) bgPreInit.push(lock); // keeps bgBusy from resolving until we're done here - [cached, req.tab] = (await all).slice(bgPreInitLen); - __.DEBUGLOG('prepareStyles cache', key, cached); - } - if (!cached && bgBusy) { - if (lock) lock = unlock(); // set to undefined + const isInit = bgBusy; + __.DEBUGLOG('prepareStyles', key, req); + if (!curXHR && !curCSP && !bgBusy) + return; + if (bgBusy) await bgBusy; - } else if (!bgPreInitLen && isDark && __.MV3) { - await isDark; - } + if (curXHR && colorScheme.isSystem() && (isInit || !tabMan.someInjectable())) + await colorScheme.refreshSystemDark(); const oldData = toSend[key]; const data = oldData || {}; const payload = data.payload = getSectionsByUrl.call({sender: req}, url, null, kStyleViaXhr); @@ -172,7 +153,6 @@ async function prepareStyles(req) { await prepareStylesMV3(tabId, frameId, url, data, key, payload); } toSend[key] = data; - if (lock) setTimeout(unlock); __.DEBUGLOG('prepareStyles done', key, data); } diff --git a/src/background/tab-manager.js b/src/background/tab-manager.js index eab0cc8cbe..ca2b472e59 100644 --- a/src/background/tab-manager.js +++ b/src/background/tab-manager.js @@ -60,7 +60,7 @@ const putObject = obj => stateDB.putMany( ); export const bgMortalChanged = __.MV3 && new Set(); -export let bgMortal; +let bgMortal; bgInit.push(async () => { const [saved, tabs] = await Promise.all([