Title: [241058] branches/safari-607-branch/Source/WebCore
- Revision
- 241058
- Author
- alanc...@apple.com
- Date
- 2019-02-06 14:16:22 -0800 (Wed, 06 Feb 2019)
Log Message
Cherry-pick r240643. rdar://problem/47774515
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:
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@240643 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Modified Paths
Diff
Modified: branches/safari-607-branch/Source/WebCore/ChangeLog (241057 => 241058)
--- branches/safari-607-branch/Source/WebCore/ChangeLog 2019-02-06 22:16:19 UTC (rev 241057)
+++ branches/safari-607-branch/Source/WebCore/ChangeLog 2019-02-06 22:16:22 UTC (rev 241058)
@@ -1,5 +1,48 @@
2019-02-05 Alan Coon <alanc...@apple.com>
+ Cherry-pick r240643. rdar://problem/47774515
+
+ 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:
+
+
+ git-svn-id: https://svn.webkit.org/repository/webkit/trunk@240643 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+ 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-02-05 Alan Coon <alanc...@apple.com>
+
Cherry-pick r240537. rdar://problem/47774500
<video> elements not in the DOM should be allowed to AirPlay
Modified: branches/safari-607-branch/Source/WebCore/html/HTMLMediaElement.cpp (241057 => 241058)
--- branches/safari-607-branch/Source/WebCore/html/HTMLMediaElement.cpp 2019-02-06 22:16:19 UTC (rev 241057)
+++ branches/safari-607-branch/Source/WebCore/html/HTMLMediaElement.cpp 2019-02-06 22:16:22 UTC (rev 241058)
@@ -5604,10 +5604,8 @@
enqueuePlaybackTargetAvailabilityChangedEvent();
}
- if (m_isPlayingToWirelessTarget) {
- m_isPlayingToWirelessTarget = false;
- scheduleEvent(eventNames().webkitcurrentplaybacktargetiswirelesschangedEvent);
- }
+ if (m_isPlayingToWirelessTarget)
+ setIsPlayingToWirelessTarget(false);
#endif
if (m_isWaitingUntilMediaCanStart) {
@@ -5847,25 +5845,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);
@@ -6647,6 +6652,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: branches/safari-607-branch/Source/WebCore/html/HTMLMediaElement.h (241057 => 241058)
--- branches/safari-607-branch/Source/WebCore/html/HTMLMediaElement.h 2019-02-06 22:16:19 UTC (rev 241057)
+++ branches/safari-607-branch/Source/WebCore/html/HTMLMediaElement.h 2019-02-06 22:16:22 UTC (rev 241058)
@@ -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