WebKit Bugzilla
Attachment 360375 Details for
Bug 193923
: webkitcurrentplaybacktargetiswirelesschanged and webkitCurrentPlaybackIsWireless are non-deterministic.
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-193923-20190128142656.patch (text/plain), 4.99 KB, created by
Jer Noble
on 2019-01-28 14:26:57 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Jer Noble
Created:
2019-01-28 14:26:57 PST
Size:
4.99 KB
patch
obsolete
>Subversion Revision: 240299 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 3d029a521d6ea9024ff38166bd489435498a52c7..9ce4bf495fafe379e9f360d4576c43e60f7bae5c 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,22 @@ >+2019-01-28 Jer Noble <jer.noble@apple.com> >+ >+ webkitcurrentplaybacktargetiswirelesschanged and webkitCurrentPlaybackIsWireless are non-deterministic. >+ https://bugs.webkit.org/show_bug.cgi?id=193923 >+ <rdar://problem/45956595> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ The value of webkitCurrentPlaybackTargetIsWireless can change in between when the event is scheduled >+ and when it's actually dispatched. To make this more deterministic, use a GenericTaskQueue to enqueue >+ setting m_isPlayingToWirelessTarget and dispatch the changed event in the same run-loop. >+ >+ * html/HTMLMediaElement.cpp: >+ (WebCore::HTMLMediaElement::clearMediaPlayer): >+ (WebCore::HTMLMediaElement::mediaPlayerCurrentPlaybackTargetIsWirelessChanged): >+ (WebCore::HTMLMediaElement::setIsPlayingToWirelessTarget): >+ (WebCore::HTMLMediaElement::dispatchEvent): >+ * html/HTMLMediaElement.h: >+ > 2019-01-25 Jer Noble <jer.noble@apple.com> > > <video> elements not in the DOM should be allowed to AirPlay >diff --git a/Source/WebCore/html/HTMLMediaElement.cpp b/Source/WebCore/html/HTMLMediaElement.cpp >index 5e09f09b282cb782f87225c56db7565212e36162..c31b3a4e907bc18afec30939856f345f13a71ce0 100644 >--- a/Source/WebCore/html/HTMLMediaElement.cpp >+++ b/Source/WebCore/html/HTMLMediaElement.cpp >@@ -5604,10 +5604,8 @@ void HTMLMediaElement::clearMediaPlayer() > enqueuePlaybackTargetAvailabilityChangedEvent(); > } > >- if (m_isPlayingToWirelessTarget) { >- m_isPlayingToWirelessTarget = false; >- scheduleEvent(eventNames().webkitcurrentplaybacktargetiswirelesschangedEvent); >- } >+ if (m_isPlayingToWirelessTarget) >+ setIsPlayingToWirelessTarget(false); > #endif > > if (m_isWaitingUntilMediaCanStart) { >@@ -5847,25 +5845,33 @@ void HTMLMediaElement::wirelessRoutesAvailableDidChange() > > void HTMLMediaElement::mediaPlayerCurrentPlaybackTargetIsWirelessChanged(MediaPlayer*) > { >- m_isPlayingToWirelessTarget = m_player && m_player->isCurrentPlaybackTargetWireless(); >- >- ALWAYS_LOG(LOGIDENTIFIER, m_isPlayingToWirelessTarget); >- ASSERT(m_player); >- configureMediaControls(); >- scheduleEvent(eventNames().webkitcurrentplaybacktargetiswirelesschangedEvent); >- m_mediaSession->isPlayingToWirelessPlaybackTargetChanged(m_isPlayingToWirelessTarget); >- m_mediaSession->canProduceAudioChanged(); >- scheduleUpdateMediaState(); >- updateSleepDisabling(); >+ setIsPlayingToWirelessTarget(m_player && m_player->isCurrentPlaybackTargetWireless()); > } > >-void HTMLMediaElement::dispatchEvent(Event& event) >+void HTMLMediaElement::setIsPlayingToWirelessTarget(bool isPlayingToWirelessTarget) > { >- if (event.type() == eventNames().webkitcurrentplaybacktargetiswirelesschangedEvent) { >+ m_playbackTargetIsWirelessQueue.enqueueTask([this, isPlayingToWirelessTarget] { >+ if (isPlayingToWirelessTarget == m_isPlayingToWirelessTarget) >+ return; >+ m_isPlayingToWirelessTarget = m_player && m_player->isCurrentPlaybackTargetWireless(); >+ >+ ALWAYS_LOG(LOGIDENTIFIER, m_isPlayingToWirelessTarget); >+ ASSERT(m_player); >+ configureMediaControls(); >+ m_mediaSession->isPlayingToWirelessPlaybackTargetChanged(m_isPlayingToWirelessTarget); >+ m_mediaSession->canProduceAudioChanged(); >+ scheduleUpdateMediaState(); >+ updateSleepDisabling(); >+ > m_failedToPlayToWirelessTarget = false; > scheduleCheckPlaybackTargetCompatability(); >- } > >+ dispatchEvent(Event::create(eventNames().webkitcurrentplaybacktargetiswirelesschangedEvent, Event::CanBubble::No, Event::IsCancelable::Yes)); >+ }); >+} >+ >+void HTMLMediaElement::dispatchEvent(Event& event) >+{ > DEBUG_LOG(LOGIDENTIFIER, "dispatching '", event.type(), "'"); > > HTMLElement::dispatchEvent(event); >diff --git a/Source/WebCore/html/HTMLMediaElement.h b/Source/WebCore/html/HTMLMediaElement.h >index 23f2293ed48ad936466a694ca9c018c81666bc64..b90dc29efaa3d242f0b31f586b7e7a0ef0385d73 100644 >--- a/Source/WebCore/html/HTMLMediaElement.h >+++ b/Source/WebCore/html/HTMLMediaElement.h >@@ -412,6 +412,7 @@ public: > void setShouldPlayToPlaybackTarget(bool) override; > #endif > bool isPlayingToWirelessPlaybackTarget() const override { return m_isPlayingToWirelessTarget; }; >+ void setIsPlayingToWirelessTarget(bool); > bool webkitCurrentPlaybackTargetIsWireless() const; > > void setPlayingOnSecondScreen(bool value); >@@ -963,6 +964,7 @@ private: > GenericTaskQueue<Timer> m_resourceSelectionTaskQueue; > GenericTaskQueue<Timer> m_visibilityChangeTaskQueue; > GenericTaskQueue<Timer> m_fullscreenTaskQueue; >+ GenericTaskQueue<Timer> m_playbackTargetIsWirelessQueue; > RefPtr<TimeRanges> m_playedTimeRanges; > GenericEventQueue m_asyncEventQueue; >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 193923
:
360375
|
360388
|
360392
|
360397
|
360398