From 7f368d46ea06164da025c1ac4ed9a65ad23b25ef Mon Sep 17 00:00:00 2001 From: Wojtek Kosior Date: Wed, 12 May 2021 16:00:09 +0200 Subject: stop using js modules --- background/reverse_use_info.js | 96 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 background/reverse_use_info.js (limited to 'background/reverse_use_info.js') diff --git a/background/reverse_use_info.js b/background/reverse_use_info.js new file mode 100644 index 0000000..3399285 --- /dev/null +++ b/background/reverse_use_info.js @@ -0,0 +1,96 @@ +/** +* Myext scripts and bundles usage index +* +* Copyright (C) 2021 Wojtek Kosior +* +* Dual-licensed under: +* - 0BSD license +* - GPLv3 or (at your option) any later version +*/ + +"use strict"; + +/* + * We want to count referenes to scripts and bundles in order to know, + * for example, whether one can be safely deleted. + */ + +(() => { + const TYPE_PREFIX = window.TYPE_PREFIX; + const get_storage = window.get_storage; + const make_once = window.make_once; + + var component_uses = new Map(); + var storage; + + function add_use_info_by_item(prefix, item, components) + { + for (let component of components) { + component = component.join(""); + + let used_by_info = component_uses.get(component); + + if (used_by_info === undefined) { + used_by_info = {}; + component_uses.set(component, used_by_info); + } + + if (used_by_info[prefix] === undefined) + used_by_info[prefix] = new Set(); + + used_by_info[prefix].add(item); + } + } + + function remove_use_info_by_item(prefix, item, components) + { + for (let component of components) { + used_by_info = component_uses.get(component.join("")); + if (used_by_info === undefined || + used_by_info[prefix] === undefined) + return; + + used_by_info[prefix].delete(item); + } + } + + function build_reverse_uses_info(entries_it, type_prefix) + { + for (let [item, components] of storage.get_all_it(type_prefix)) + add_use_info_by_item(type_prefix, item, components); + } + + function handle_change(change) + { + if (change.old_val !== undefined) + remove_use_info_by_item(change.prefix, change.item, change.old_val); + + if (change.new_val !== undefined) + add_use_info_by_item(change.prefix, change.item, change.new_val); + } + + function get_uses(arg1, arg2=undefined) + { + let [prefix, item] = [arg1, arg2]; + + if (arg2 === undefined) + [prefix, item] = arg1; + + return component_uses.get(prefix + item); + } + + async function init() + { + storage = await get_storage(); + + prefixes = [TYPE_PREFIX.PAGE, TYPE_PREFIX.BUNDLE]; + for (let prefix of prefixes) + build_reverse_uses_info(prefix); + + storage.add_change_listener(handle_change, prefixes); + + return get_uses; + } + + window.get_reverse_use_info = make_once(init); +})(); -- cgit v1.2.3