Bug 1550633 - part6 : clear track's cues list whenever track element's src attribute set, changed or removed. r=jya,baku

According to the spec [1], we should empty track's cue list whenever a track element has its src attribute set, changed, or removed.

[1] https://html.spec.whatwg.org/multipage/media.html#sourcing-out-of-band-text-tracks:attr-track-src

Differential Revision: https://phabricator.services.mozilla.com/D31552
This commit is contained in:
alwu
2019-05-24 00:41:29 +00:00
parent 036443470f
commit b4f03fd78a
4 changed files with 41 additions and 7 deletions

View File

@@ -214,17 +214,11 @@ bool HTMLTrackElement::ParseAttribute(int32_t aNamespaceID, nsAtom* aAttribute,
void HTMLTrackElement::SetSrc(const nsAString& aSrc, ErrorResult& aError) {
SetHTMLAttr(nsGkAtoms::src, aSrc, aError);
uint16_t oldReadyState = ReadyState();
SetReadyState(TextTrackReadyState::NotLoaded);
if (!mMediaParent) {
return;
}
if (mTrack && (oldReadyState != TextTrackReadyState::NotLoaded)) {
// Remove all the cues in MediaElement.
mMediaParent->RemoveTextTrack(mTrack);
// Recreate mTrack.
CreateTextTrack();
}
// Stop WebVTTListener.
mListener = nullptr;
if (mChannel) {
@@ -235,6 +229,16 @@ void HTMLTrackElement::SetSrc(const nsAString& aSrc, ErrorResult& aError) {
MaybeDispatchLoadResource();
}
void HTMLTrackElement::MaybeClearAllCues() {
// Empty track's cue list whenever the track element's `src` attribute set,
// changed, or removed,
// https://html.spec.whatwg.org/multipage/media.html#sourcing-out-of-band-text-tracks:attr-track-src
if (!mTrack) {
return;
}
mTrack->ClearAllCues();
}
// This function will run partial steps from `start-the-track-processing-model`
// and finish the rest of steps in `LoadResource()` during the stable state.
// https://html.spec.whatwg.org/multipage/media.html#start-the-track-processing-model
@@ -463,5 +467,17 @@ void HTMLTrackElement::NotifyShutdown() {
mListener = nullptr;
}
nsresult HTMLTrackElement::AfterSetAttr(int32_t aNameSpaceID, nsAtom* aName,
const nsAttrValue* aValue,
const nsAttrValue* aOldValue,
nsIPrincipal* aMaybeScriptedPrincipal,
bool aNotify) {
if (aNameSpaceID == kNameSpaceID_None && aName == nsGkAtoms::src) {
MaybeClearAllCues();
}
return nsGenericHTMLElement::AfterSetAttr(
aNameSpaceID, aName, aValue, aOldValue, aMaybeScriptedPrincipal, aNotify);
}
} // namespace dom
} // namespace mozilla