mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-21 01:05:45 +00:00
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:
parent
0d3d40fa97
commit
01e26ea3df
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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(
|
||||
|
@ -66,6 +66,8 @@ class TextTrackList final : public DOMEventTargetHelper {
|
||||
IMPL_EVENT_HANDLER(addtrack)
|
||||
IMPL_EVENT_HANDLER(removetrack)
|
||||
|
||||
bool mPendingTextTrackChange = false;
|
||||
|
||||
private:
|
||||
~TextTrackList();
|
||||
|
||||
|
@ -0,0 +1,4 @@
|
||||
[track-change-event.html]
|
||||
[A 'change' event is fired when a TextTrack's mode changes]
|
||||
expected: FAIL
|
||||
|
@ -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"');
|
||||
|
Loading…
Reference in New Issue
Block a user