Преглед изворни кода

add a throttled forEachTab()

tophf пре 6 година
родитељ
комит
7edb583ca0
1 измењених фајлова са 17 додато и 6 уклоњено
  1. 17 6
      src/background/utils/message.js

+ 17 - 6
src/background/utils/message.js

@@ -11,15 +11,26 @@ export function notify(options) {
 }
 
 export function broadcast(data) {
-  browser.tabs.query({})
-  .then((tabs) => {
-    tabs.forEach((tab) => {
-      browser.tabs.sendMessage(tab.id, data)
-      .catch(noop);
-    });
+  forEachTab((tab) => {
+    browser.tabs.sendMessage(tab.id, data)
+    .catch(noop);
   });
 }
 
 export function sendMessageOrIgnore(...args) {
   return browser.runtime.sendMessage(...args).catch(noop);
 }
+
+export function forEachTab(callback) {
+  // we'll run the callback for each tab in a separate event loop cycle
+  // because hundreds of tabs would make our extension process unresponsive,
+  // the same process used by our own pages like the background page, dashboard, or popups
+  browser.tabs.query({})
+  .then(function throttle(tabs) {
+    const tab = tabs.shift();
+    if (tab) {
+      callback(tab);
+      setTimeout(throttle, 0, tabs);
+    }
+  });
+}