Przeglądaj źródła

fix: tab reload hint on subsequent opening of popup

e.g. disabled scripts -> reloaded page -> enabled scripts -> opened popup (ok) -> closed it -> opened again (bug)
tophf 2 lat temu
rodzic
commit
bfc1902caf

+ 3 - 3
src/background/utils/icon.js

@@ -156,9 +156,9 @@ function resetBadgeData(tabId, isInjected) {
  */
 export function setBadge(ids, reset, { tab, [kFrameId]: frameId, [kTop]: isTop }) {
   const tabId = tab.id;
-  const injectable = ids === SKIP_SCRIPTS ? SKIP_SCRIPTS : !!ids;
+  const injectable = ids === SKIP_SCRIPTS || ids === 'off' ? ids : !!ids;
   const data = !(reset && isTop) && badges[tabId] || resetBadgeData(tabId, injectable);
-  if (ids && ids !== SKIP_SCRIPTS) {
+  if (Array.isArray(ids)) {
     const { idMap, totalMap } = data;
     // uniques
     ids.forEach(idMap.add, idMap);
@@ -228,7 +228,7 @@ async function setIcon({ id: tabId } = {}, data = badges[tabId] || {}) {
 export function getFailureReason(url, data) {
   return !injectableRe.test(url) ? [titleNoninjectable, INJECT_INTO]
     : ((url = testBlacklist(url))) ? [titleBlacklisted, 'blacklisted', url]
-      : !isApplied ? [titleDisabled, IS_APPLIED]
+      : !isApplied || data?.[INJECT] === 'off' ? [titleDisabled, IS_APPLIED]
         : !data ? []
           : data[INJECT] === SKIP_SCRIPTS
             ? [titleSkipped, SKIP_SCRIPTS]

+ 1 - 0
src/background/utils/popup-tracker.js

@@ -20,6 +20,7 @@ addPublicCommands({
       failure = getFailureReason('');
     }
     data.tab = tab;
+    data[IS_APPLIED] = badgeData[INJECT] !== 'off'; // will be used by reloadHint in popup
     return [cachedSetPopup, data, failure];
   },
   async SetPopup(data, src) {

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

@@ -200,13 +200,14 @@ addPublicCommands({
       [kTop]: isTop,
       tab: { id: tabId },
     } = src;
+    const hasIds = +ids?.[0];
     setBadge(ids, reset, src);
     if (isTop === 3) {
-      reifyValueOpener(ids, docId);
+      if (hasIds) reifyValueOpener(ids, docId);
       reifyRequests(tabId, docId);
       clearNotifications(tabId);
     }
-    if (reset === 'bfcache' && +ids?.[0]) {
+    if (reset === 'bfcache' && hasIds) {
       addValueOpener(ids, tabId, getFrameDocId(isTop, docId, src[kFrameId]));
     }
   },

+ 6 - 7
src/injected/content/cmd-run.js

@@ -34,11 +34,6 @@ function onShown(evt) {
 }
 
 export function Run(id, realm) {
-  if (id === SKIP_SCRIPTS) {
-    runningIds = SKIP_SCRIPTS;
-    report();
-    return;
-  }
   safePush(runningIds, id);
   bridge[IDS][id] = realm || PAGE;
   if (!pending) pending = report(2);
@@ -53,6 +48,10 @@ async function report(delay, reset = !sent) {
   sent = true;
 }
 
-export function finish() {
-  if (!pending && !sent) report();
+export function finish(injectInto) {
+  if (pending || sent) return;
+  if (injectInto === SKIP_SCRIPTS || injectInto === 'off') {
+    runningIds = injectInto;
+  }
+  report();
 }

+ 2 - 5
src/injected/content/index.js

@@ -31,14 +31,11 @@ async function init() {
       ? await getDataFF(dataPromise)
       : await dataPromise
   );
+  const injectInto = bridge[INJECT_INTO] = data[INJECT_INTO];
   assign(ids, data[IDS]);
   if (IS_FIREFOX && !data.clipFF) {
     off('copy', onClipboardCopy, true);
   }
-  if ((bridge[INJECT_INTO] = data[INJECT_INTO]) === SKIP_SCRIPTS) {
-    Run(SKIP_SCRIPTS);
-    return;
-  }
   if (data[EXPOSE] != null && !isXml && injectPageSandbox(data)) {
     addHandlers({ GetScriptVer: true });
     bridge.post('Expose', data[EXPOSE]);
@@ -48,7 +45,7 @@ async function init() {
     await injectScripts(data, isXml);
   }
   onScripts.length = 0;
-  finish();
+  finish(injectInto);
 }
 
 addBackgroundHandlers({