Backed out 4 changesets (bug 1531863) for mochitest failures at test_videocontrols_vtt.html. CLOSED TREE

Backed out changeset e2e2b325344f (bug 1531863)
Backed out changeset 5be609c16665 (bug 1531863)
Backed out changeset 21bafd01b438 (bug 1531863)
Backed out changeset c9628b2b89b2 (bug 1531863)

--HG--
extra : histedit_source : 869452c42d3539867f34e64be52b7afba5463235
This commit is contained in:
Brindusan Cristian 2019-03-08 02:34:45 +02:00
parent 0d3d40fa97
commit 01e26ea3df
8 changed files with 88 additions and 112 deletions

View File

@ -2710,10 +2710,6 @@ already_AddRefed<Promise> HTMLMediaElement::Seek(double aTime,
// aTime should be non-NaN.
MOZ_ASSERT(!mozilla::IsNaN(aTime));
// Seeking step1, Set the media element's show poster flag to false.
// https://html.spec.whatwg.org/multipage/media.html#dom-media-seek
mShowPoster = false;
RefPtr<Promise> promise = CreateDOMPromise(aRv);
if (NS_WARN_IF(aRv.Failed())) {
return nullptr;
@ -3507,8 +3503,7 @@ HTMLMediaElement::HTMLMediaElement(
mPaused(true, "HTMLMediaElement::mPaused"),
mErrorSink(new ErrorSink(this)),
mAudioChannelWrapper(new AudioChannelAgentCallback(this)),
mSink(MakePair(nsString(), RefPtr<AudioDeviceInfo>())),
mShowPoster(IsVideo()) {
mSink(MakePair(nsString(), RefPtr<AudioDeviceInfo>())) {
MOZ_ASSERT(mMainThreadEventTarget);
MOZ_ASSERT(mAbstractMainThread);
// Please don't add anything to this constructor or the initialization
@ -3813,12 +3808,6 @@ void HTMLMediaElement::PlayInternal(bool aHandlingUserInput) {
// 6.2. If the show poster flag is true, set the element's show poster flag
// to false and run the time marches on steps.
if (mShowPoster) {
mShowPoster = false;
if (mTextTrackManager) {
mTextTrackManager->TimeMarchesOn();
}
}
// 6.3. Queue a task to fire a simple event named play at the element.
DispatchAsyncEvent(NS_LITERAL_STRING("play"));
@ -5594,13 +5583,6 @@ void HTMLMediaElement::ChangeNetworkState(nsMediaNetworkState aState) {
DispatchAsyncEvent(NS_LITERAL_STRING("suspend"));
}
// According to the resource selection (step2, step9-18), dedicated media
// source failure step (step4) and aborting existing load (step4), set show
// poster flag to true. https://html.spec.whatwg.org/multipage/media.html
if (mNetworkState == NETWORK_NO_SOURCE || mNetworkState == NETWORK_EMPTY) {
mShowPoster = true;
}
// Changing mNetworkState affects AddRemoveSelfReference().
AddRemoveSelfReference();
}
@ -5686,14 +5668,6 @@ void HTMLMediaElement::CheckAutoplayDataReady() {
SetPlayedOrSeeked(true);
}
// https://html.spec.whatwg.org/multipage/media.html#ready-states:show-poster-flag
if (mShowPoster) {
mShowPoster = false;
if (mTextTrackManager) {
mTextTrackManager->TimeMarchesOn();
}
}
// For blocked media, the event would be pending until it is resumed.
DispatchAsyncEvent(NS_LITERAL_STRING("play"));
@ -7401,26 +7375,6 @@ already_AddRefed<Promise> HTMLMediaElement::SetSinkId(const nsAString& aSinkId,
return promise.forget();
}
void HTMLMediaElement::NotifyTextTrackModeChanged() {
if (mPendingTextTrackChanged) {
return;
}
mPendingTextTrackChanged = true;
mAbstractMainThread->Dispatch(
NS_NewRunnableFunction("HTMLMediaElement::NotifyTextTrackModeChanged",
[this, self = RefPtr<HTMLMediaElement>(this)]() {
mPendingTextTrackChanged = false;
if (!mTextTrackManager) {
return;
}
GetTextTracks()->CreateAndDispatchChangeEvent();
// https://html.spec.whatwg.org/multipage/media.html#text-track-model:show-poster-flag
if (!mShowPoster) {
mTextTrackManager->TimeMarchesOn();
}
}));
}
} // namespace dom
} // namespace mozilla

View File

@ -1674,16 +1674,6 @@ class HTMLMediaElement : public nsGenericHTMLElement,
// bfcache.
bool mHasEverBeenBlockedForAutoplay = false;
// True if we have dispatched a task for text track changed, will be unset
// when we starts processing text track changed.
// https://html.spec.whatwg.org/multipage/media.html#pending-text-track-change-notification-flag
bool mPendingTextTrackChanged = false;
public:
// This function will be called whenever a text track that is in a media
// element's list of text tracks has its text track mode change value
void NotifyTextTrackModeChanged();
public:
// Helper class to measure times for playback telemetry stats
class TimeDurationAccumulator {
@ -1831,11 +1821,6 @@ class HTMLMediaElement : public nsGenericHTMLElement,
// https://w3c.github.io/mediacapture-output/#htmlmediaelement-extensions
// Read/Write from the main thread only.
Pair<nsString, RefPtr<AudioDeviceInfo>> mSink;
// This flag is used to control when the user agent is to show a poster frame
// for a video element instead of showing the video contents.
// https://html.spec.whatwg.org/multipage/media.html#show-poster-flag
bool mShowPoster;
};
// Check if the context is chrome or has the debugger or tabs permission

View File

@ -73,28 +73,37 @@ JSObject* TextTrack::WrapObject(JSContext* aCx,
}
void TextTrack::SetMode(TextTrackMode aValue) {
if (mMode == aValue) {
return;
}
mMode = aValue;
HTMLMediaElement* mediaElement = GetMediaElement();
if (aValue == TextTrackMode::Disabled) {
for (size_t i = 0; i < mCueList->Length() && mediaElement; ++i) {
mediaElement->NotifyCueRemoved(*(*mCueList)[i]);
if (mMode != aValue) {
mMode = aValue;
if (aValue == TextTrackMode::Disabled) {
// Remove all the cues in MediaElement.
if (mTextTrackList) {
HTMLMediaElement* mediaElement = mTextTrackList->GetMediaElement();
if (mediaElement) {
for (size_t i = 0; i < mCueList->Length(); ++i) {
mediaElement->NotifyCueRemoved(*(*mCueList)[i]);
}
}
}
SetCuesInactive();
} else {
// Add all the cues into MediaElement.
if (mTextTrackList) {
HTMLMediaElement* mediaElement = mTextTrackList->GetMediaElement();
if (mediaElement) {
for (size_t i = 0; i < mCueList->Length(); ++i) {
mediaElement->NotifyCueAdded(*(*mCueList)[i]);
}
}
}
}
SetCuesInactive();
} else {
for (size_t i = 0; i < mCueList->Length() && mediaElement; ++i) {
mediaElement->NotifyCueAdded(*(*mCueList)[i]);
if (mTextTrackList) {
mTextTrackList->CreateAndDispatchChangeEvent();
}
// Ensure the TimeMarchesOn is called in case that the mCueList
// is empty.
NotifyCueUpdated(nullptr);
}
if (mediaElement) {
mediaElement->NotifyTextTrackModeChanged();
}
// Ensure the TimeMarchesOn is called in case that the mCueList
// is empty.
NotifyCueUpdated(nullptr);
}
void TextTrack::GetId(nsAString& aId) const {
@ -113,9 +122,11 @@ void TextTrack::AddCue(TextTrackCue& aCue) {
}
mCueList->AddCue(aCue);
aCue.SetTrack(this);
HTMLMediaElement* mediaElement = GetMediaElement();
if (mediaElement && (mMode != TextTrackMode::Disabled)) {
mediaElement->NotifyCueAdded(aCue);
if (mTextTrackList) {
HTMLMediaElement* mediaElement = mTextTrackList->GetMediaElement();
if (mediaElement && (mMode != TextTrackMode::Disabled)) {
mediaElement->NotifyCueAdded(aCue);
}
}
SetDirty();
}
@ -128,9 +139,11 @@ void TextTrack::RemoveCue(TextTrackCue& aCue, ErrorResult& aRv) {
}
aCue.SetActive(false);
aCue.SetTrack(nullptr);
HTMLMediaElement* mediaElement = GetMediaElement();
if (mediaElement) {
mediaElement->NotifyCueRemoved(aCue);
if (mTextTrackList) {
HTMLMediaElement* mediaElement = mTextTrackList->GetMediaElement();
if (mediaElement) {
mediaElement->NotifyCueRemoved(aCue);
}
}
SetDirty();
}
@ -142,7 +155,11 @@ void TextTrack::SetCuesDirty() {
}
void TextTrack::UpdateActiveCueList() {
HTMLMediaElement* mediaElement = GetMediaElement();
if (!mTextTrackList) {
return;
}
HTMLMediaElement* mediaElement = mTextTrackList->GetMediaElement();
if (!mediaElement) {
return;
}
@ -200,7 +217,12 @@ void TextTrack::SetReadyState(uint32_t aReadyState) {
void TextTrack::SetReadyState(TextTrackReadyState aState) {
mReadyState = aState;
HTMLMediaElement* mediaElement = GetMediaElement();
if (!mTextTrackList) {
return;
}
HTMLMediaElement* mediaElement = mTextTrackList->GetMediaElement();
if (mediaElement && (mReadyState == TextTrackReadyState::Loaded ||
mReadyState == TextTrackReadyState::FailedToLoad)) {
mediaElement->RemoveTextTrack(this, true);
@ -224,9 +246,11 @@ void TextTrack::SetCuesInactive() { mCueList->SetCuesInactive(); }
void TextTrack::NotifyCueUpdated(TextTrackCue* aCue) {
mCueList->NotifyCueUpdated(aCue);
HTMLMediaElement* mediaElement = GetMediaElement();
if (mediaElement) {
mediaElement->NotifyCueUpdated(aCue);
if (mTextTrackList) {
HTMLMediaElement* mediaElement = mTextTrackList->GetMediaElement();
if (mediaElement) {
mediaElement->NotifyCueUpdated(aCue);
}
}
SetDirty();
}
@ -274,9 +298,5 @@ bool TextTrack::IsLoaded() {
return (mReadyState >= Loaded);
}
HTMLMediaElement* TextTrack::GetMediaElement() {
return mTextTrackList ? mTextTrackList->GetMediaElement() : nullptr;
}
} // namespace dom
} // namespace mozilla

View File

@ -20,7 +20,6 @@ class TextTrackList;
class TextTrackCue;
class TextTrackCueList;
class HTMLTrackElement;
class HTMLMediaElement;
enum TextTrackSource { Track, AddTextTrack, MediaResourceSpecific };
@ -103,8 +102,6 @@ class TextTrack final : public DOMEventTargetHelper {
private:
~TextTrack();
HTMLMediaElement* GetMediaElement();
RefPtr<TextTrackList> mTextTrackList;
TextTrackKind mKind;

View File

@ -124,25 +124,39 @@ class TrackEventRunner : public Runnable {
RefPtr<Event> mEvent;
};
class ChangeEventRunner final : public TrackEventRunner {
public:
ChangeEventRunner(TextTrackList* aList, Event* aEvent)
: TrackEventRunner(aList, aEvent) {}
NS_IMETHOD Run() override {
mList->mPendingTextTrackChange = false;
return TrackEventRunner::Run();
}
};
nsresult TextTrackList::DispatchTrackEvent(Event* aEvent) {
return DispatchTrustedEvent(aEvent);
}
void TextTrackList::CreateAndDispatchChangeEvent() {
MOZ_ASSERT(NS_IsMainThread());
nsPIDOMWindowInner* win = GetOwner();
if (!win) {
return;
if (!mPendingTextTrackChange) {
nsPIDOMWindowInner* win = GetOwner();
if (!win) {
return;
}
mPendingTextTrackChange = true;
RefPtr<Event> event = NS_NewDOMEvent(this, nullptr, nullptr);
event->InitEvent(NS_LITERAL_STRING("change"), false, false);
event->SetTrusted(true);
nsCOMPtr<nsIRunnable> eventRunner = new ChangeEventRunner(this, event);
nsGlobalWindowInner::Cast(win)->Dispatch(TaskCategory::Other,
eventRunner.forget());
}
RefPtr<Event> event = NS_NewDOMEvent(this, nullptr, nullptr);
event->InitEvent(NS_LITERAL_STRING("change"), false, false);
event->SetTrusted(true);
nsCOMPtr<nsIRunnable> eventRunner = new TrackEventRunner(this, event);
nsGlobalWindowInner::Cast(win)->Dispatch(TaskCategory::Other,
eventRunner.forget());
}
void TextTrackList::CreateAndDispatchTrackEventRunner(

View File

@ -66,6 +66,8 @@ class TextTrackList final : public DOMEventTargetHelper {
IMPL_EVENT_HANDLER(addtrack)
IMPL_EVENT_HANDLER(removetrack)
bool mPendingTextTrackChange = false;
private:
~TextTrackList();

View File

@ -0,0 +1,4 @@
[track-change-event.html]
[A 'change' event is fired when a TextTrack's mode changes]
expected: FAIL

View File

@ -12,7 +12,7 @@ async_test(function(t) {
track.mode = 'showing';
assert_equals(video.textTracks.length, 1);
video.textTracks.onchange = t.step_func_done(function(event) {
video.textTracks.onchange = t.step_func_done(function() {
assert_equals(event.target, video.textTracks);
assert_true(event instanceof Event, 'instanceof');
assert_false(event.hasOwnProperty('track'), 'unexpected property found: "track"');