Skip to content

Commit bb26cb5

Browse files
committed
More efficient tab API usage
1 parent 9318cf3 commit bb26cb5

File tree

2 files changed

+48
-58
lines changed

2 files changed

+48
-58
lines changed

extension/src/services/active-tab-permission-request.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,5 @@ export const setRequestingActiveTabPermission = async (tabId: number, src: strin
3232
};
3333

3434
const tabInfo = async (tabId: number) => {
35-
return (await chrome.tabs.query({})).find((t) => t.id === tabId);
35+
return await chrome.tabs.get(tabId);
3636
};

extension/src/services/tab-registry.ts

Lines changed: 47 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ export interface VideoElement {
4141

4242
export default class TabRegistry {
4343
private readonly _settings: SettingsProvider;
44-
private _onNoSyncedElementsCallbacks: (() => void)[] = [];
4544
private _onSyncedElementCallbacks: (() => void)[] = [];
4645
private _onAsbplayerInstanceCallbacks: (() => void)[] = [];
4746

@@ -51,38 +50,23 @@ export default class TabRegistry {
5150
// Update video element state on tab changes
5251
// Triggers events for when synced video elements appear/disappear
5352
chrome.tabs.onRemoved.addListener((tabId, removeInfo) => {
54-
this._videoElements();
53+
this._removeVideoElementsInTab(tabId);
54+
this._removeAsbplayersInTab(tabId);
5555
});
56-
chrome.tabs.onUpdated.addListener((tabId, removeInfo) => {
57-
if (removeInfo.status === 'loading' && removeInfo.url === undefined) {
56+
chrome.tabs.onUpdated.addListener((tabId, updateInfo) => {
57+
let shouldGarbageCollect = false;
58+
59+
if (updateInfo.status === 'loading' && updateInfo.url === undefined) {
5860
// New tab, or tab was refreshed
61+
shouldGarbageCollect = true;
62+
} else if (updateInfo.url !== undefined) {
63+
// Navigated to different URL
64+
shouldGarbageCollect = true;
65+
}
5966

60-
this._videoElements((videoElements) => {
61-
let changed = false;
62-
63-
for (const [k, v] of Object.entries(videoElements)) {
64-
if (v.tab.id === tabId) {
65-
delete videoElements[k];
66-
changed = true;
67-
}
68-
}
69-
70-
return changed;
71-
});
72-
this._asbplayers((asbplayers) => {
73-
let changed = false;
74-
75-
for (const [k, v] of Object.entries(asbplayers)) {
76-
if (v.tab?.id === tabId) {
77-
delete asbplayers[k];
78-
changed = true;
79-
}
80-
}
81-
82-
return changed;
83-
});
84-
} else {
85-
this._videoElements();
67+
if (shouldGarbageCollect) {
68+
this._removeVideoElementsInTab(tabId);
69+
this._removeAsbplayersInTab(tabId);
8670
}
8771
});
8872
}
@@ -99,24 +83,27 @@ export default class TabRegistry {
9983
await chrome.storage.session.set({ tabRegistryVideoElements: state });
10084
}
10185

86+
private async _removeVideoElementsInTab(tabId: number) {
87+
await this._videoElements((videoElements) => {
88+
let changed = false;
89+
90+
for (const [k, v] of Object.entries(videoElements)) {
91+
if (v.tab.id === tabId) {
92+
delete videoElements[k];
93+
changed = true;
94+
}
95+
}
96+
97+
return changed;
98+
});
99+
}
100+
102101
private async _videoElements(mutator?: (videoElements: { [key: string]: VideoElement }) => boolean) {
103-
const tabs = await chrome.tabs.query({});
104102
const videoElements = await this._fetchVideoElementState();
105103
const oldVideoElements = { ...videoElements };
106104

107105
let changed = false;
108106

109-
for (const id in videoElements) {
110-
const videoElement = videoElements[id];
111-
const disappeared =
112-
tabs.find((t) => t.id === videoElement.tab.id && t.url === videoElement.tab.url) === undefined;
113-
114-
if (disappeared) {
115-
changed = true;
116-
delete videoElements[id];
117-
}
118-
}
119-
120107
if (mutator !== undefined) {
121108
changed = mutator(videoElements) || changed;
122109
}
@@ -128,11 +115,7 @@ export default class TabRegistry {
128115
const oldSyncedElementExists = Object.values(oldVideoElements).find((v) => v.synced) !== undefined;
129116
const syncedElementExists = Object.values(videoElements).find((v) => v.synced) !== undefined;
130117

131-
if (this._onNoSyncedElementsCallbacks.length > 0 && oldSyncedElementExists && !syncedElementExists) {
132-
for (const c of this._onNoSyncedElementsCallbacks) {
133-
c();
134-
}
135-
} else if (this._onSyncedElementCallbacks.length > 0 && !oldSyncedElementExists && syncedElementExists) {
118+
if (this._onSyncedElementCallbacks.length > 0 && !oldSyncedElementExists && syncedElementExists) {
136119
for (const c of this._onSyncedElementCallbacks) {
137120
c();
138121
}
@@ -153,19 +136,30 @@ export default class TabRegistry {
153136
await chrome.storage.session.set({ tabRegistryAsbplayers: state });
154137
}
155138

139+
private async _removeAsbplayersInTab(tabId: number) {
140+
await this._asbplayers((asbplayers) => {
141+
let changed = false;
142+
143+
for (const [k, v] of Object.entries(asbplayers)) {
144+
if (v.tab?.id === tabId) {
145+
delete asbplayers[k];
146+
changed = true;
147+
}
148+
}
149+
150+
return changed;
151+
});
152+
}
153+
156154
private async _asbplayers(mutator?: (asbplayers: { [key: string]: Asbplayer }) => boolean) {
157-
const tabs = await chrome.tabs.query({});
158155
const asbplayers = await this._fetchAsbplayerState();
159156
const oldAsbplayers = { ...asbplayers };
160-
const now = Date.now();
161157
let changed = false;
158+
const now = Date.now();
162159

163160
for (const id in asbplayers) {
164161
const asbplayer = asbplayers[id];
165-
const disappeared =
166-
(asbplayer.sidePanel && now - asbplayer.timestamp >= 5000) ||
167-
(asbplayer.tab !== undefined &&
168-
tabs.find((t) => t.id === asbplayer.tab?.id && t.url === asbplayer.tab?.url) === undefined);
162+
const disappeared = asbplayer.sidePanel && now - asbplayer.timestamp >= 5000;
169163

170164
if (disappeared) {
171165
changed = true;
@@ -367,10 +361,6 @@ export default class TabRegistry {
367361
});
368362
}
369363

370-
onNoSyncedElements(callback: () => void) {
371-
this._onNoSyncedElementsCallbacks.push(callback);
372-
}
373-
374364
onSyncedElement(callback: () => void) {
375365
this._onSyncedElementCallbacks.push(callback);
376366
}

0 commit comments

Comments
 (0)