Title: [240643] trunk/Source/WebCore
- Revision
- 240643
- Author
- jer.no...@apple.com
- Date
- 2019-01-28 22:11:43 -0800 (Mon, 28 Jan 2019)
Log Message
webkitcurrentplaybacktargetiswirelesschanged and webkitCurrentPlaybackIsWireless are non-deterministic.
https://bugs.webkit.org/show_bug.cgi?id=193923
<rdar://problem/45956595>
Reviewed by Eric Carlson.
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:
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (240642 => 240643)
--- trunk/Source/WebCore/ChangeLog 2019-01-29 06:01:17 UTC (rev 240642)
+++ trunk/Source/WebCore/ChangeLog 2019-01-29 06:11:43 UTC (rev 240643)
@@ -1,3 +1,22 @@
+2019-01-28 Jer Noble <jer.no...@apple.com>
+
+ webkitcurrentplaybacktargetiswirelesschanged and webkitCurrentPlaybackIsWireless are non-deterministic.
+ https://bugs.webkit.org/show_bug.cgi?id=193923
+ <rdar://problem/45956595>
+
+ Reviewed by Eric Carlson.
+
+ 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-28 Ross Kirsling <ross.kirsl...@sony.com>
Remove unnecessary `using namespace WTF`s (or at least restrict their scope).
Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (240642 => 240643)
--- trunk/Source/WebCore/html/HTMLMediaElement.cpp 2019-01-29 06:01:17 UTC (rev 240642)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp 2019-01-29 06:11:43 UTC (rev 240643)
@@ -5600,10 +5600,8 @@
enqueuePlaybackTargetAvailabilityChangedEvent();
}
- if (m_isPlayingToWirelessTarget) {
- m_isPlayingToWirelessTarget = false;
- scheduleEvent(eventNames().webkitcurrentplaybacktargetiswirelesschangedEvent);
- }
+ if (m_isPlayingToWirelessTarget)
+ setIsPlayingToWirelessTarget(false);
#endif
if (m_isWaitingUntilMediaCanStart) {
@@ -5843,25 +5841,32 @@
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);
+ 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);
@@ -6643,6 +6648,12 @@
#if ENABLE(VIDEO_TRACK)
forgetResourceSpecificTracks();
#endif
+
+#if ENABLE(WIRELESS_PLAYBACK_TARGET)
+ if (m_isPlayingToWirelessTarget)
+ setIsPlayingToWirelessTarget(false);
+#endif
+
m_player = MediaPlayer::create(*this);
m_player->setShouldBufferData(m_shouldBufferData);
schedulePlaybackControlsManagerUpdate();
Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (240642 => 240643)
--- trunk/Source/WebCore/html/HTMLMediaElement.h 2019-01-29 06:01:17 UTC (rev 240642)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h 2019-01-29 06:11:43 UTC (rev 240643)
@@ -412,6 +412,7 @@
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 @@
GenericTaskQueue<Timer> m_resourceSelectionTaskQueue;
GenericTaskQueue<Timer> m_visibilityChangeTaskQueue;
GenericTaskQueue<Timer> m_fullscreenTaskQueue;
+ GenericTaskQueue<Timer> m_playbackTargetIsWirelessQueue;
RefPtr<TimeRanges> m_playedTimeRanges;
GenericEventQueue m_asyncEventQueue;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes