@@ -934,14 +934,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
934934 // A PreloadManager can only be used with the Player instance that created
935935 // it, so all PreloadManagers this Player has created are now useless.
936936 // Destroy any remaining managers now, to help prevent memory leaks.
937- const preloadManagerDestroys = [ ] ;
938- for ( const preloadManager of this . createdPreloadManagers_ ) {
939- if ( ! preloadManager . isDestroyed ( ) ) {
940- preloadManagerDestroys . push ( preloadManager . destroy ( ) ) ;
941- }
942- }
943- this . createdPreloadManagers_ = [ ] ;
944- await Promise . all ( preloadManagerDestroys ) ;
937+ await this . destroyAllPreloads ( ) ;
945938
946939 // Tear-down the event managers to ensure handlers stop firing.
947940 if ( this . globalEventManager_ ) {
@@ -1796,6 +1789,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
17961789 /* allowPrefetch= */ true ,
17971790 /* disableVideo= */ false ,
17981791 /* allowMakeAbrManager= */ false ) ;
1792+ this . createdPreloadManagers_ . push ( preloadManager ) ;
17991793 preloadManager . attachManifest (
18001794 this . manifest_ , this . parser_ , this . parserFactory_ ) ;
18011795 preloadManager . attachAbrManager (
@@ -1853,6 +1847,21 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
18531847 return preloadManager ;
18541848 }
18551849
1850+ /**
1851+ * Calls |destroy| on each PreloadManager object this player has created.
1852+ * @export
1853+ */
1854+ async destroyAllPreloads ( ) {
1855+ const preloadManagerDestroys = [ ] ;
1856+ for ( const preloadManager of this . createdPreloadManagers_ ) {
1857+ if ( ! preloadManager . isDestroyed ( ) ) {
1858+ preloadManagerDestroys . push ( preloadManager . destroy ( ) ) ;
1859+ }
1860+ }
1861+ this . createdPreloadManagers_ = [ ] ;
1862+ await Promise . all ( preloadManagerDestroys ) ;
1863+ }
1864+
18561865 /**
18571866 * @param {string } assetUri
18581867 * @param {?number } startTime
@@ -1890,9 +1899,21 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
18901899 disableVideo = true ;
18911900 }
18921901 }
1893- return this . makePreloadManager_ (
1902+ let preloadManagerPromise = this . makePreloadManager_ (
18941903 assetUri , startTime , mimeType || null , startTimeOfLoad ,
18951904 /* allowPrefetch= */ ! standardLoad , disableVideo , allowMakeAbrManager ) ;
1905+ if ( ! standardLoad ) {
1906+ // We only need to track the PreloadManager if it is not part of a
1907+ // standard load. If it is, the load() method will handle destroying it.
1908+ // Adding a standard load PreloadManager to the createdPreloadManagers_
1909+ // array runs the risk that the user will call destroyAllPreloads and
1910+ // destroy that PreloadManager mid-load.
1911+ preloadManagerPromise = preloadManagerPromise . then ( ( preloadManager ) => {
1912+ this . createdPreloadManagers_ . push ( preloadManager ) ;
1913+ return preloadManager ;
1914+ } ) ;
1915+ }
1916+ return preloadManagerPromise ;
18961917 }
18971918
18981919 /**
@@ -2114,7 +2135,6 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
21142135 } ;
21152136 preloadManager = new shaka . media . PreloadManager (
21162137 assetUri , mimeType , startTimeOfLoad , startTime , playerInterface ) ;
2117- this . createdPreloadManagers_ . push ( preloadManager ) ;
21182138 return preloadManager ;
21192139 }
21202140
0 commit comments