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

Reply via email to