Skip to content

Commit b500799

Browse files
authored
feat(preload): Add new method destroyAllPreloads (#6756)
1 parent c3e6450 commit b500799

File tree

2 files changed

+31
-10
lines changed

2 files changed

+31
-10
lines changed

lib/player.js

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

test/cast/cast_utils_unit.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ describe('CastUtils', () => {
3131
'detachAndSavePreload',
3232
'unloadAndSavePreload',
3333
'preload',
34+
'destroyAllPreloads',
3435
'getNonDefaultConfiguration',
3536

3637
// Test helper methods (not @export'd)

0 commit comments

Comments
 (0)