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

Reply via email to