Browse Source

fix: init all `env` areas

tophf 2 years ago
parent
commit
459a86cff9
3 changed files with 8 additions and 6 deletions
  1. 3 2
      src/background/utils/db.js
  2. 3 4
      src/background/utils/preinject.js
  3. 2 0
      src/types.d.ts

+ 3 - 2
src/background/utils/db.js

@@ -271,7 +271,8 @@ export function getScriptsByURL(url, isTop, errors) {
   const envStart = makeEnv();
   /** @type {VMInjection.EnvDelayed} */
   const envDelayed = makeEnv();
-  for (const [, listName] of STORAGE_ROUTES_ENTRIES) {
+  for (const [areaName, listName] of STORAGE_ROUTES_ENTRIES) {
+    envStart[areaName] = {}; envDelayed[areaName] = {};
     envStart[listName] = []; envDelayed[listName] = [];
   }
   allScripts.forEach((script) => {
@@ -337,7 +338,6 @@ async function readEnvironmentData(env) {
   const data = await storage.base.getMulti(keys);
   const badScripts = new Set();
   for (const [area, listName] of STORAGE_ROUTES_ENTRIES) {
-    env[area] = {}; // presence of the area object is used to check that `env[PROMISE]` is resolved
     for (const id of env[listName]) {
       let val = data[storage[area].toKey(id)];
       if (!val && area === S_VALUE) val = {};
@@ -354,6 +354,7 @@ async function readEnvironmentData(env) {
   if (badScripts.size) {
     reportBadScripts(badScripts);
   }
+  env[PROMISE] = null; // indicating it's been processed
   return env;
 }
 

+ 3 - 4
src/background/utils/preinject.js

@@ -136,11 +136,10 @@ addPublicCommands({
     injectContentRealm(items, tabId, frameId);
     if (!moreKey) return;
     if (!url) url = src.url || tab.url;
-    let more = cache.get(moreKey)
+    const env = cache.get(moreKey)
       || cache.put(moreKey, getScriptsByURL(url, !frameId));
-    const envCache = more[S_CACHE]
-      || cache.put(moreKey, more = await more[PROMISE])[S_CACHE];
-    const scripts = prepareScripts(more);
+    const envCache = (env[PROMISE] ? await env[PROMISE] : env)[S_CACHE];
+    const scripts = prepareScripts(env);
     triageRealms(scripts, forceContent, tabId, frameId);
     addValueOpener(scripts, tabId, frameId);
     return {

+ 2 - 0
src/types.d.ts

@@ -246,11 +246,13 @@ declare namespace VMInjection {
     clipFF?: boolean;
     forceContent?: boolean;
     more: EnvDelayed;
+    /** `null` = env was processed and contains data now */
     promise: Promise<EnvStart>;
   }
   interface EnvDelayed extends Env {
     /** cache key for Bag */
     more: string;
+    /** `null` = env was processed and contains data now */
     promise: Promise<EnvDelayed>;
   }
   /**