@@ -918,6 +918,9 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
918
918
/** @private {boolean} */
919
919
this . preloadDueAdManagerVideoEnded_ = false ;
920
920
921
+ /** @private {!Array<HTMLTrackElement>} */
922
+ this . externalSrcEqualsTextTracks_ = [ ] ;
923
+
921
924
/** @private {shaka.util.Timer} */
922
925
this . preloadDueAdManagerTimer_ = new shaka . util . Timer ( async ( ) => {
923
926
if ( this . preloadDueAdManager_ ) {
@@ -1529,17 +1532,23 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
1529
1532
}
1530
1533
1531
1534
if ( this . video_ ) {
1532
- // Remove all track nodes
1533
- shaka . util . Dom . removeAllChildren ( this . video_ ) ;
1535
+ // The life cycle of tracks that created by addTextTrackAsync() and
1536
+ // their associated resources should be the same as the loaded video.
1537
+ for ( const trackNode of this . externalSrcEqualsTextTracks_ ) {
1538
+ if ( trackNode . src . startsWith ( 'blob:' ) ) {
1539
+ URL . revokeObjectURL ( trackNode . src ) ;
1540
+ }
1541
+ trackNode . remove ( ) ;
1542
+ }
1543
+ this . externalSrcEqualsTextTracks_ = [ ] ;
1534
1544
1535
1545
// In order to unload a media element, we need to remove the src
1536
1546
// attribute and then load again. When we destroy media source engine,
1537
1547
// this will be done for us, but for src=, we need to do it here.
1538
1548
//
1539
1549
// DrmEngine requires this to be done before we destroy DrmEngine
1540
1550
// itself.
1541
- if ( this . video_ . src ) {
1542
- this . video_ . removeAttribute ( 'src' ) ;
1551
+ if ( shaka . util . Dom . clearSourceFromVideo ( this . video_ ) ) {
1543
1552
this . video_ . load ( ) ;
1544
1553
}
1545
1554
}
@@ -2518,8 +2527,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
2518
2527
2519
2528
// Remove children if we had any, i.e. from previously used src= mode.
2520
2529
if ( this . config_ . mediaSource . useSourceElements ) {
2521
- this . video_ . removeAttribute ( 'src' ) ;
2522
- shaka . util . Dom . removeAllChildren ( this . video_ ) ;
2530
+ shaka . util . Dom . clearSourceFromVideo ( this . video_ ) ;
2523
2531
}
2524
2532
2525
2533
this . createTextDisplayer_ ( ) ;
@@ -3188,7 +3196,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
3188
3196
await this . mediaSourceEngine_ . destroy ( ) ;
3189
3197
this . mediaSourceEngine_ = null ;
3190
3198
}
3191
- shaka . util . Dom . removeAllChildren ( mediaElement ) ;
3199
+ shaka . util . Dom . clearSourceFromVideo ( mediaElement ) ;
3192
3200
3193
3201
mediaElement . src = playbackUri ;
3194
3202
@@ -6669,25 +6677,15 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
6669
6677
}
6670
6678
6671
6679
if ( this . loadMode_ == shaka . Player . LoadMode . SRC_EQUALS ) {
6672
- if ( forced ) {
6680
+ if ( forced && shaka . util . Platform . isApple ( ) ) {
6673
6681
// See: https://github.com/whatwg/html/issues/4472
6674
6682
kind = 'forced' ;
6675
6683
}
6676
- await this . addSrcTrackElement_ ( uri , language , kind , mimeType , label || '' ,
6677
- adCuePoints ) ;
6678
-
6679
- const LanguageUtils = shaka . util . LanguageUtils ;
6680
- const languageNormalized = LanguageUtils . normalize ( language ) ;
6681
-
6682
- const textTracks = this . getTextTracks ( ) ;
6683
- const srcTrack = textTracks . find ( ( t ) => {
6684
- return LanguageUtils . normalize ( t . language ) == languageNormalized &&
6685
- t . label == ( label || '' ) &&
6686
- t . kind == kind ;
6687
- } ) ;
6688
- if ( srcTrack ) {
6684
+ const trackNode = await this . addSrcTrackElement_ ( uri , language , kind ,
6685
+ mimeType , label || '' , adCuePoints ) ;
6686
+ if ( trackNode . track ) {
6689
6687
this . onTracksChanged_ ( ) ;
6690
- return srcTrack ;
6688
+ return shaka . util . StreamUtils . html5TextTrackToTrack ( trackNode . track ) ;
6691
6689
}
6692
6690
// This should not happen, but there are browser implementations that may
6693
6691
// not support the Track element.
@@ -7136,6 +7134,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
7136
7134
}
7137
7135
7138
7136
this . video_ . appendChild ( trackElement ) ;
7137
+ this . externalSrcEqualsTextTracks_ . push ( trackElement ) ;
7139
7138
return trackElement ;
7140
7139
}
7141
7140
0 commit comments