@@ -41,7 +41,6 @@ export interface VideoElement {
4141
4242export 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