Title: [293878] trunk
Revision
293878
Author
jer.no...@apple.com
Date
2022-05-05 19:23:22 -0700 (Thu, 05 May 2022)

Log Message

Removing x-webkit-wirelessvideoplaybackdisabled attribute from video does not enable AirPlay.
https://bugs.webkit.org/show_bug.cgi?id=239031

Reviewed by Jer Noble.

* Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.cpp:
(WebKit::RemoteMediaPlayerProxy::setWirelessVideoPlaybackDisabled):
* Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp:
(WebKit::MediaPlayerPrivateRemote::setWirelessVideoPlaybackDisabled):
Test: media/airplay-wirelessvideoplaybackdisabled.html
* Source/WebCore/html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::attributeChanged):
* Source/WebCore/html/HTMLMediaElement.h:
* Source/WebCore/html/HTMLVideoElement.cpp:
(WebCore::HTMLVideoElement::parseAttribute):
* LayoutTests/media/airplay-wirelessvideoplaybackdisabled-expected.txt: Added.
* LayoutTests/media/airplay-wirelessvideoplaybackdisabled.html: Added.

Canonical link: https://commits.webkit.org/250336@main

Modified Paths

Added Paths

Diff

Added: trunk/LayoutTests/media/airplay-wirelessvideoplaybackdisabled-expected.txt (0 => 293878)


--- trunk/LayoutTests/media/airplay-wirelessvideoplaybackdisabled-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/airplay-wirelessvideoplaybackdisabled-expected.txt	2022-05-06 02:23:22 UTC (rev 293878)
@@ -0,0 +1,19 @@
+
+Test that 'wirelessvideoplaybackdisabled' attribute is set correctly after removing the 'x-webkit-wirelessvideoplaybackdisabled' attribute.
+
+Test a video element without a source.
+EXPECTED (video.hasAttribute("x-webkit-wirelessvideoplaybackdisabled") == 'true') OK
+EXPECTED (video.webkitWirelessVideoPlaybackDisabled == 'true') OK
+RUN(video.removeAttribute("x-webkit-wirelessvideoplaybackdisabled"))
+EXPECTED (video.hasAttribute("x-webkit-wirelessvideoplaybackdisabled") == 'false') OK
+EXPECTED (video.webkitWirelessVideoPlaybackDisabled == 'true') OK
+Test a video element with a source.
+EVENT(canplaythrough)
+RUN(video.setAttribute("x-webkit-wirelessvideoplaybackdisabled", ""))
+EXPECTED (video.hasAttribute("x-webkit-wirelessvideoplaybackdisabled") == 'true') OK
+EXPECTED (video.webkitWirelessVideoPlaybackDisabled == 'true') OK
+RUN(video.removeAttribute("x-webkit-wirelessvideoplaybackdisabled"))
+EXPECTED (video.hasAttribute("x-webkit-wirelessvideoplaybackdisabled") == 'false') OK
+EXPECTED (video.webkitWirelessVideoPlaybackDisabled == 'false') OK
+END OF TEST
+

Added: trunk/LayoutTests/media/airplay-wirelessvideoplaybackdisabled.html (0 => 293878)


--- trunk/LayoutTests/media/airplay-wirelessvideoplaybackdisabled.html	                        (rev 0)
+++ trunk/LayoutTests/media/airplay-wirelessvideoplaybackdisabled.html	2022-05-06 02:23:22 UTC (rev 293878)
@@ -0,0 +1,53 @@
+<html>
+    <head>
+        <script src=''></script>
+        <script src=''></script>
+        <script>
+
+            async function start()
+            {
+                findMediaElement();
+                
+                consoleWrite('Test a video element without a source.');
+
+                testExpected('video.hasAttribute("x-webkit-wirelessvideoplaybackdisabled")', true);
+                testExpected('video.webkitWirelessVideoPlaybackDisabled', true);
+                
+            
+                run('video.removeAttribute("x-webkit-wirelessvideoplaybackdisabled")');
+                
+                testExpected('video.hasAttribute("x-webkit-wirelessvideoplaybackdisabled")', false);
+                testExpected('video.webkitWirelessVideoPlaybackDisabled', true);
+        
+                
+                consoleWrite('Test a video element with a source.');
+                
+                video.src = "" 'content/test');
+                
+                await waitFor(video, 'canplaythrough');
+                
+                run('video.setAttribute("x-webkit-wirelessvideoplaybackdisabled", "")');
+                
+                
+                testExpected('video.hasAttribute("x-webkit-wirelessvideoplaybackdisabled")', true);
+                testExpected('video.webkitWirelessVideoPlaybackDisabled', true);
+                
+            
+                run('video.removeAttribute("x-webkit-wirelessvideoplaybackdisabled")');
+                
+                testExpected('video.hasAttribute("x-webkit-wirelessvideoplaybackdisabled")', false);
+                testExpected('video.webkitWirelessVideoPlaybackDisabled', false);
+                
+                
+                endTest();
+            }
+
+        </script>
+    </head>
+
+    <body _onload_='start()'>
+        <video x-webkit-wirelessvideoplaybackdisabled></video>
+        <p>Test that 'wirelessvideoplaybackdisabled' attribute is set correctly after
+        removing the 'x-webkit-wirelessvideoplaybackdisabled' attribute.</p>
+    </body>
+</html>

Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (293877 => 293878)


--- trunk/Source/WebCore/html/HTMLMediaElement.cpp	2022-05-06 01:28:22 UTC (rev 293877)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp	2022-05-06 02:23:22 UTC (rev 293878)
@@ -749,6 +749,16 @@
     return controls();
 }
 
+void HTMLMediaElement::attributeChanged(const QualifiedName& name, const AtomString& oldValue, const AtomString& newValue, AttributeModificationReason reason)
+{
+#if ENABLE(WIRELESS_PLAYBACK_TARGET)
+    if (name == webkitwirelessvideoplaybackdisabledAttr)
+        mediaSession().setWirelessVideoPlaybackDisabled(newValue != nullAtom());
+    else
+#endif
+        HTMLElement::attributeChanged(name, oldValue, newValue, reason);
+}
+
 void HTMLMediaElement::parseAttribute(const QualifiedName& name, const AtomString& value)
 {
     if (name == idAttr)

Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (293877 => 293878)


--- trunk/Source/WebCore/html/HTMLMediaElement.h	2022-05-06 01:28:22 UTC (rev 293877)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h	2022-05-06 02:23:22 UTC (rev 293878)
@@ -616,6 +616,7 @@
     HTMLMediaElement(const QualifiedName&, Document&, bool createdByParser);
     virtual ~HTMLMediaElement();
 
+    void attributeChanged(const QualifiedName&, const AtomString& oldValue, const AtomString& newValue, AttributeModificationReason) final;
     void parseAttribute(const QualifiedName&, const AtomString&) override;
     void finishParsingChildren() override;
     bool isURLAttribute(const Attribute&) const override;

Modified: trunk/Source/WebCore/html/HTMLVideoElement.cpp (293877 => 293878)


--- trunk/Source/WebCore/html/HTMLVideoElement.cpp	2022-05-06 01:28:22 UTC (rev 293877)
+++ trunk/Source/WebCore/html/HTMLVideoElement.cpp	2022-05-06 02:23:22 UTC (rev 293878)
@@ -146,10 +146,6 @@
             }
         }
     }
-#if ENABLE(WIRELESS_PLAYBACK_TARGET)
-    else if (name == webkitwirelessvideoplaybackdisabledAttr)
-        mediaSession().setWirelessVideoPlaybackDisabled(true);
-#endif
     else {
         HTMLMediaElement::parseAttribute(name, value);    
 

Modified: trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.cpp (293877 => 293878)


--- trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.cpp	2022-05-06 01:28:22 UTC (rev 293877)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.cpp	2022-05-06 02:23:22 UTC (rev 293878)
@@ -743,6 +743,7 @@
 {
     m_player->setWirelessVideoPlaybackDisabled(disabled);
     m_cachedState.wirelessVideoPlaybackDisabled = m_player->wirelessVideoPlaybackDisabled();
+    sendCachedState();
 }
 
 void RemoteMediaPlayerProxy::setShouldPlayToPlaybackTarget(bool shouldPlay)

Modified: trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp (293877 => 293878)


--- trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp	2022-05-06 01:28:22 UTC (rev 293877)
+++ trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp	2022-05-06 02:23:22 UTC (rev 293878)
@@ -1079,6 +1079,9 @@
 
 void MediaPlayerPrivateRemote::setWirelessVideoPlaybackDisabled(bool disabled)
 {
+    // Update the cache state so we don't have to make this a synchronous message send to avoid a
+    // race condition with the web process fetching the new state immediately after change.
+    m_cachedState.wirelessVideoPlaybackDisabled = disabled;
     connection().send(Messages::RemoteMediaPlayerProxy::SetWirelessVideoPlaybackDisabled(disabled), m_id);
 }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to