Browse Source

refactor: postpone envDelayed by one task

+ let GetInjected send envStart to content earlier
- remove leftovers for `sizing`
tophf 3 years ago
parent
commit
ea882981ff
2 changed files with 14 additions and 12 deletions
  1. 11 10
      src/background/utils/db.js
  2. 3 2
      src/background/utils/preinject.js

+ 11 - 10
src/background/utils/db.js

@@ -1,6 +1,7 @@
 import {
   compareVersion, dataUri2text, i18n, getScriptHome, isDataUri, makeDataUri,
   getFullUrl, getScriptName, getScriptUpdateUrl, isRemote, sendCmd, trueJoin,
+  makePause,
 } from '@/common';
 import { ICON_PREFIX, INJECT_PAGE, INJECT_AUTO, TIMEOUT_WEEK } from '@/common/consts';
 import { deepSize, forEachEntry, forEachKey, forEachValue } from '@/common/object';
@@ -251,14 +252,12 @@ export function getScriptsByURL(url, isTop) {
 
 /**
  * @param {VMScript[]} scripts
- * @param {boolean} [sizing]
- * @return {VMInjection.Env}
+ * @return {Promise<VMInjection.Env>}
  */
-function getScriptEnv(scripts, sizing) {
+async function getScriptEnv(scripts) {
   const disabledIds = [];
   const [envStart, envDelayed] = [0, 1].map(() => ({
     depsMap: {},
-    sizing,
     [ENV_SCRIPTS]: [],
   }));
   for (const [areaName, listName] of STORAGE_ROUTES_ENTRIES) {
@@ -267,7 +266,7 @@ function getScriptEnv(scripts, sizing) {
   }
   scripts.forEach((script) => {
     const { id } = script.props;
-    if (!sizing && !script.config.enabled) {
+    if (!script.config.enabled) {
       disabledIds.push(id);
       return;
     }
@@ -275,7 +274,7 @@ function getScriptEnv(scripts, sizing) {
     const { pathMap = buildPathMap(script) } = custom;
     const runAt = `${custom.runAt || meta.runAt || ''}`.match(RUN_AT_RE)?.[1] || 'end';
     /** @type {VMInjection.Env} */
-    const env = sizing || runAt === 'start' || runAt === 'body' ? envStart : envDelayed;
+    const env = runAt === 'start' || runAt === 'body' ? envStart : envDelayed;
     const { depsMap } = env;
     env.ids.push(id);
     if (meta.grant.some(GMVALUES_RE.test, GMVALUES_RE)) {
@@ -301,11 +300,13 @@ function getScriptEnv(scripts, sizing) {
         }
       }
     }
-    env[ENV_SCRIPTS].push(sizing ? script : { ...script, runAt });
+    env[ENV_SCRIPTS].push({ ...script, runAt });
   });
-  envStart.promise = readEnvironmentData(envStart);
+  if (envStart.ids.length) {
+    Object.assign(envStart, await readEnvironmentData(envStart));
+  }
   if (envDelayed.ids.length) {
-    envDelayed.promise = readEnvironmentData(envDelayed);
+    envDelayed.promise = makePause().then(() => readEnvironmentData(envDelayed));
   }
   return Object.assign(envStart, { disabledIds, envDelayed });
 }
@@ -324,7 +325,7 @@ async function readEnvironmentData(env, isRetry) {
       let val = data[storage[area].toKey(id)];
       if (!val && area === S_VALUE) val = {};
       env[area][id] = val;
-      if (val == null && !env.sizing && retriedStorageKeys[area + id] !== 2) {
+      if (val == null && retriedStorageKeys[area + id] !== 2) {
         retriedStorageKeys[area + id] = isRetry ? 2 : 1;
         if (!isRetry) {
           console.warn(`The "${area}" storage is missing "${id}"! Vacuuming...`);

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

@@ -271,8 +271,9 @@ function prepare(key, url, tabId, frameId, forceContent) {
  * @return {Promise<any>}
  */
 async function prepareScripts(res, cacheKey, url, tabId, frameId, forceContent) {
-  const bag = getScriptsByURL(url, !frameId);
-  const { envDelayed, [ENV_SCRIPTS]: scripts } = Object.assign(bag, await bag.promise);
+  const errors = [];
+  const bag = await getScriptsByURL(url, !frameId);
+  const { envDelayed, [ENV_SCRIPTS]: scripts } = bag;
   const isLate = forceContent != null;
   bag[FORCE_CONTENT] = forceContent; // used in prepareScript and isPageRealm
   const feedback = scripts.map(prepareScript, bag).filter(Boolean);