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);
}