<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[280664] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/280664">280664</a></dd>
<dt>Author</dt> <dd>peng.liu6@apple.com</dd>
<dt>Date</dt> <dd>2021-08-04 14:36:38 -0700 (Wed, 04 Aug 2021)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Catalina][GPUP] Some API tests fail after GPU Process features are enabled
https://bugs.webkit.org/show_bug.cgi?id=228589

Reviewed by Jer Noble.

Source/WebCore:

When "Media in GPU Process" is enabled, `AudioSession[IOS|Mac]` runs in
the GPU process. `HTMLMediaElement`, which is an observer of audio session,
runs in a WebContent process. It cannot get its AudioSession's configuration
directly. We need a mechanism to "push" the latest audio session configuration
from the GPU process to the WebContent process.

This patch replaces the `MutedStateObserver` with an audio session configuration
change observer interface, so that an audio session will notify its observers
after changing its configurations, including buffer size, muted state, sample rate.
Currently, this observer interface is used on macOS only.

No new tests. Fix an API test failure.

* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::initializeMediaSession):
(WebCore::HTMLMediaElement::~HTMLMediaElement):
(WebCore::HTMLMediaElement::hardwareMutedStateDidChange):
* html/HTMLMediaElement.h:

* platform/audio/AudioSession.cpp:
(WebCore::AudioSession::addConfigurationChangeObserver):
(WebCore::AudioSession::removeConfigurationChangeObserver):
* platform/audio/AudioSession.h:
* platform/audio/ios/AudioSessionIOS.h:
Move `m_interruptionObservers` to this class because only `AudioSessionIOS`
supports interruption observers.
* platform/audio/mac/AudioSessionMac.h:
* platform/audio/mac/AudioSessionMac.mm:
(WebCore::AudioSessionMac::handleSampleRateChange):
(WebCore::AudioSessionMac::handleSampleRateChange const):
(WebCore::AudioSessionMac::handleBufferSizeChange):
(WebCore::AudioSessionMac::handleBufferSizeChange const):
(WebCore::AudioSessionMac::sampleRate const):
(WebCore::AudioSessionMac::setPreferredBufferSize):
(WebCore::AudioSessionMac::handleMutedStateChange):
(WebCore::AudioSessionMac::addConfigurationChangeObserver):
(WebCore::AudioSessionMac::removeConfigurationChangeObserver):
(WebCore::AudioSessionMac::addMutedStateObserver): Deleted.
(WebCore::AudioSessionMac::removeMutedStateObserver): Deleted.

Source/WebKit:

When an audio session's configuration changes, let `RemoteAudioSessionProxy`
in the GPU process send the latest audio session configuration to `RemoteAudioSession`
in the WebContent process through an IPC message (`RemoteAudioSession::ConfigurationChanged`).

* GPUProcess/media/RemoteAudioSessionProxy.cpp:
(WebKit::RemoteAudioSessionProxy::configurationChanged):
* GPUProcess/media/RemoteAudioSessionProxy.h:

* GPUProcess/media/RemoteAudioSessionProxyManager.cpp:
(WebKit::RemoteAudioSessionProxyManager::RemoteAudioSessionProxyManager):
(WebKit::RemoteAudioSessionProxyManager::~RemoteAudioSessionProxyManager):
(WebKit::RemoteAudioSessionProxyManager::beginAudioSessionInterruption):
(WebKit::RemoteAudioSessionProxyManager::endAudioSessionInterruption):
(WebKit::RemoteAudioSessionProxyManager::hardwareMutedStateDidChange):
(WebKit::RemoteAudioSessionProxyManager::bufferSizeDidChange):
(WebKit::RemoteAudioSessionProxyManager::sampleRateDidChange):
(WebKit::RemoteAudioSessionProxyManager::configurationDidChange):

* GPUProcess/media/RemoteAudioSessionProxyManager.h:
* WebProcess/GPU/media/RemoteAudioSession.cpp:
(WebKit::RemoteAudioSession::addConfigurationChangeObserver):
(WebKit::RemoteAudioSession::removeConfigurationChangeObserver):
(WebKit::RemoteAudioSession::configurationChanged):
* WebProcess/GPU/media/RemoteAudioSession.h:
* WebProcess/GPU/media/RemoteAudioSession.messages.in:

Tools:

* TestWebKitAPI/Tests/WebKitCocoa/AudioBufferSize.mm:
(TestWebKitAPI::TEST):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLMediaElementcpp">trunk/Source/WebCore/html/HTMLMediaElement.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLMediaElementh">trunk/Source/WebCore/html/HTMLMediaElement.h</a></li>
<li><a href="#trunkSourceWebCoreplatformaudioAudioSessioncpp">trunk/Source/WebCore/platform/audio/AudioSession.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformaudioAudioSessionh">trunk/Source/WebCore/platform/audio/AudioSession.h</a></li>
<li><a href="#trunkSourceWebCoreplatformaudioiosAudioSessionIOSh">trunk/Source/WebCore/platform/audio/ios/AudioSessionIOS.h</a></li>
<li><a href="#trunkSourceWebCoreplatformaudiomacAudioSessionMach">trunk/Source/WebCore/platform/audio/mac/AudioSessionMac.h</a></li>
<li><a href="#trunkSourceWebCoreplatformaudiomacAudioSessionMacmm">trunk/Source/WebCore/platform/audio/mac/AudioSessionMac.mm</a></li>
<li><a href="#trunkSourceWebKitChangeLog">trunk/Source/WebKit/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitGPUProcessmediaRemoteAudioSessionProxycpp">trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.cpp</a></li>
<li><a href="#trunkSourceWebKitGPUProcessmediaRemoteAudioSessionProxyh">trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.h</a></li>
<li><a href="#trunkSourceWebKitGPUProcessmediaRemoteAudioSessionProxyManagercpp">trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.cpp</a></li>
<li><a href="#trunkSourceWebKitGPUProcessmediaRemoteAudioSessionProxyManagerh">trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.h</a></li>
<li><a href="#trunkSourceWebKitWebProcessGPUmediaRemoteAudioSessioncpp">trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.cpp</a></li>
<li><a href="#trunkSourceWebKitWebProcessGPUmediaRemoteAudioSessionh">trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.h</a></li>
<li><a href="#trunkSourceWebKitWebProcessGPUmediaRemoteAudioSessionmessagesin">trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.messages.in</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebKitCocoaAudioBufferSizemm">trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/AudioBufferSize.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (280663 => 280664)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog   2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebCore/ChangeLog      2021-08-04 21:36:38 UTC (rev 280664)
</span><span class="lines">@@ -1,3 +1,50 @@
</span><ins>+2021-08-04  Peng Liu  <peng.liu6@apple.com>
+
+        [Catalina][GPUP] Some API tests fail after GPU Process features are enabled
+        https://bugs.webkit.org/show_bug.cgi?id=228589
+
+        Reviewed by Jer Noble.
+
+        When "Media in GPU Process" is enabled, `AudioSession[IOS|Mac]` runs in
+        the GPU process. `HTMLMediaElement`, which is an observer of audio session,
+        runs in a WebContent process. It cannot get its AudioSession's configuration
+        directly. We need a mechanism to "push" the latest audio session configuration
+        from the GPU process to the WebContent process.
+
+        This patch replaces the `MutedStateObserver` with an audio session configuration
+        change observer interface, so that an audio session will notify its observers
+        after changing its configurations, including buffer size, muted state, sample rate.
+        Currently, this observer interface is used on macOS only.
+
+        No new tests. Fix an API test failure.
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::initializeMediaSession):
+        (WebCore::HTMLMediaElement::~HTMLMediaElement):
+        (WebCore::HTMLMediaElement::hardwareMutedStateDidChange):
+        * html/HTMLMediaElement.h:
+
+        * platform/audio/AudioSession.cpp:
+        (WebCore::AudioSession::addConfigurationChangeObserver):
+        (WebCore::AudioSession::removeConfigurationChangeObserver):
+        * platform/audio/AudioSession.h:
+        * platform/audio/ios/AudioSessionIOS.h:
+        Move `m_interruptionObservers` to this class because only `AudioSessionIOS`
+        supports interruption observers.
+        * platform/audio/mac/AudioSessionMac.h:
+        * platform/audio/mac/AudioSessionMac.mm:
+        (WebCore::AudioSessionMac::handleSampleRateChange):
+        (WebCore::AudioSessionMac::handleSampleRateChange const):
+        (WebCore::AudioSessionMac::handleBufferSizeChange):
+        (WebCore::AudioSessionMac::handleBufferSizeChange const):
+        (WebCore::AudioSessionMac::sampleRate const):
+        (WebCore::AudioSessionMac::setPreferredBufferSize):
+        (WebCore::AudioSessionMac::handleMutedStateChange):
+        (WebCore::AudioSessionMac::addConfigurationChangeObserver):
+        (WebCore::AudioSessionMac::removeConfigurationChangeObserver):
+        (WebCore::AudioSessionMac::addMutedStateObserver): Deleted.
+        (WebCore::AudioSessionMac::removeMutedStateObserver): Deleted.
+
</ins><span class="cx"> 2021-08-04  Miguel Gomez  <magomez@igalia.com>
</span><span class="cx"> 
</span><span class="cx">         [GTK][WPE] Elliptic radial gradients are not working
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (280663 => 280664)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.cpp   2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp      2021-08-04 21:36:38 UTC (rev 280664)
</span><span class="lines">@@ -513,7 +513,7 @@
</span><span class="cx">     registerWithDocument(document);
</span><span class="cx"> 
</span><span class="cx"> #if USE(AUDIO_SESSION) && PLATFORM(MAC)
</span><del>-    AudioSession::sharedSession().addMutedStateObserver(this);
</del><ins>+    AudioSession::sharedSession().addConfigurationChangeObserver(*this);
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     m_mediaSession->clientWillBeginAutoplaying();
</span><span class="lines">@@ -530,7 +530,7 @@
</span><span class="cx">     unregisterWithDocument(document());
</span><span class="cx"> 
</span><span class="cx"> #if USE(AUDIO_SESSION) && PLATFORM(MAC)
</span><del>-    AudioSession::sharedSession().removeMutedStateObserver(this);
</del><ins>+    AudioSession::sharedSession().removeConfigurationChangeObserver(*this);
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     if (m_audioTracks)
</span><span class="lines">@@ -3808,9 +3808,9 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if USE(AUDIO_SESSION) && PLATFORM(MAC)
</span><del>-void HTMLMediaElement::hardwareMutedStateDidChange(AudioSession* session)
</del><ins>+void HTMLMediaElement::hardwareMutedStateDidChange(const AudioSession& session)
</ins><span class="cx"> {
</span><del>-    if (!session->isMuted())
</del><ins>+    if (!session.isMuted())
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     if (!hasAudio())
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (280663 => 280664)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.h     2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h        2021-08-04 21:36:38 UTC (rev 280664)
</span><span class="lines">@@ -128,7 +128,7 @@
</span><span class="cx">     , private TextTrackClient
</span><span class="cx">     , private VideoTrackClient
</span><span class="cx"> #if USE(AUDIO_SESSION) && PLATFORM(MAC)
</span><del>-    , private AudioSession::MutedStateObserver
</del><ins>+    , private AudioSession::ConfigurationChangeObserver
</ins><span class="cx"> #endif
</span><span class="cx"> #if ENABLE(ENCRYPTED_MEDIA)
</span><span class="cx">     , private CDMClient
</span><span class="lines">@@ -882,7 +882,7 @@
</span><span class="cx">     void pageMutedStateDidChange() override;
</span><span class="cx"> 
</span><span class="cx"> #if USE(AUDIO_SESSION) && PLATFORM(MAC)
</span><del>-    void hardwareMutedStateDidChange(AudioSession*) final;
</del><ins>+    void hardwareMutedStateDidChange(const AudioSession&) final;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     bool processingUserGestureForMedia() const;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformaudioAudioSessioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/audio/AudioSession.cpp (280663 => 280664)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/audio/AudioSession.cpp     2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebCore/platform/audio/AudioSession.cpp        2021-08-04 21:36:38 UTC (rev 280664)
</span><span class="lines">@@ -201,6 +201,16 @@
</span><span class="cx">     notImplemented();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void AudioSession::addConfigurationChangeObserver(ConfigurationChangeObserver&)
+{
+    notImplemented();
+}
+
+void AudioSession::removeConfigurationChangeObserver(ConfigurationChangeObserver&)
+{
+    notImplemented();
+}
+
</ins><span class="cx"> void AudioSession::setIsPlayingToBluetoothOverride(std::optional<bool>)
</span><span class="cx"> {
</span><span class="cx">     notImplemented();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformaudioAudioSessionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/audio/AudioSession.h (280663 => 280664)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/audio/AudioSession.h       2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebCore/platform/audio/AudioSession.h  2021-08-04 21:36:38 UTC (rev 280664)
</span><span class="lines">@@ -91,15 +91,17 @@
</span><span class="cx">     virtual size_t preferredBufferSize() const;
</span><span class="cx">     virtual void setPreferredBufferSize(size_t);
</span><span class="cx"> 
</span><del>-    class MutedStateObserver {
</del><ins>+    class ConfigurationChangeObserver : public CanMakeWeakPtr<ConfigurationChangeObserver> {
</ins><span class="cx">     public:
</span><del>-        virtual ~MutedStateObserver() = default;
</del><ins>+        virtual ~ConfigurationChangeObserver() = default;
</ins><span class="cx"> 
</span><del>-        virtual void hardwareMutedStateDidChange(AudioSession*) = 0;
</del><ins>+        virtual void hardwareMutedStateDidChange(const AudioSession&) = 0;
+        virtual void bufferSizeDidChange(const AudioSession&) { }
+        virtual void sampleRateDidChange(const AudioSession&) { }
</ins><span class="cx">     };
</span><span class="cx"> 
</span><del>-    virtual void addMutedStateObserver(MutedStateObserver*) { }
-    virtual void removeMutedStateObserver(MutedStateObserver*) { }
</del><ins>+    virtual void addConfigurationChangeObserver(ConfigurationChangeObserver&);
+    virtual void removeConfigurationChangeObserver(ConfigurationChangeObserver&);
</ins><span class="cx"> 
</span><span class="cx">     virtual void audioOutputDeviceChanged();
</span><span class="cx">     virtual void setIsPlayingToBluetoothOverride(std::optional<bool>);
</span><span class="lines">@@ -134,11 +136,6 @@
</span><span class="cx"> 
</span><span class="cx">     virtual bool tryToSetActiveInternal(bool);
</span><span class="cx"> 
</span><del>-    HashSet<MutedStateObserver*> m_observers;
-#if PLATFORM(IOS_FAMILY)
-    WeakHashSet<InterruptionObserver> m_interruptionObservers;
-#endif
-
</del><span class="cx">     WeakPtr<AudioSessionRoutingArbitrationClient> m_routingArbitrationClient;
</span><span class="cx">     bool m_active { false }; // Used only for testing.
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformaudioiosAudioSessionIOSh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/audio/ios/AudioSessionIOS.h (280663 => 280664)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/audio/ios/AudioSessionIOS.h        2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebCore/platform/audio/ios/AudioSessionIOS.h   2021-08-04 21:36:38 UTC (rev 280664)
</span><span class="lines">@@ -66,6 +66,7 @@
</span><span class="cx"> 
</span><span class="cx">     AudioSession::CategoryType m_categoryOverride { AudioSession::CategoryType::None };
</span><span class="cx">     Ref<WTF::WorkQueue> m_workQueue;
</span><ins>+    WeakHashSet<InterruptionObserver> m_interruptionObservers;
</ins><span class="cx">     RetainPtr<WebInterruptionObserverHelper> m_interruptionObserverHelper;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformaudiomacAudioSessionMach"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/audio/mac/AudioSessionMac.h (280663 => 280664)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/audio/mac/AudioSessionMac.h        2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebCore/platform/audio/mac/AudioSessionMac.h   2021-08-04 21:36:38 UTC (rev 280664)
</span><span class="lines">@@ -44,7 +44,9 @@
</span><span class="cx">     void addBufferSizeObserverIfNeeded() const;
</span><span class="cx"> 
</span><span class="cx">     static OSStatus handleSampleRateChange(AudioObjectID, UInt32, const AudioObjectPropertyAddress*, void* inClientData);
</span><ins>+    void handleSampleRateChange() const;
</ins><span class="cx">     static OSStatus handleBufferSizeChange(AudioObjectID, UInt32, const AudioObjectPropertyAddress*, void* inClientData);
</span><ins>+    void handleBufferSizeChange() const;
</ins><span class="cx"> 
</span><span class="cx">     // AudioSession
</span><span class="cx">     CategoryType category() const final { return m_category; }
</span><span class="lines">@@ -64,10 +66,11 @@
</span><span class="cx">     void setPreferredBufferSize(size_t) final;
</span><span class="cx">     bool isMuted() const final;
</span><span class="cx">     void handleMutedStateChange() final;
</span><del>-    void addMutedStateObserver(MutedStateObserver*) final;
-    void removeMutedStateObserver(MutedStateObserver*) final;
</del><ins>+    void addConfigurationChangeObserver(ConfigurationChangeObserver&) final;
+    void removeConfigurationChangeObserver(ConfigurationChangeObserver&) final;
</ins><span class="cx"> 
</span><span class="cx">     std::optional<bool> m_lastMutedState;
</span><ins>+    mutable WeakHashSet<ConfigurationChangeObserver> m_configurationChangeObservers;
</ins><span class="cx">     AudioSession::CategoryType m_category { AudioSession::CategoryType::None };
</span><span class="cx"> #if ENABLE(ROUTING_ARBITRATION)
</span><span class="cx">     bool m_setupArbitrationOngoing { false };
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformaudiomacAudioSessionMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/audio/mac/AudioSessionMac.mm (280663 => 280664)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/audio/mac/AudioSessionMac.mm       2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebCore/platform/audio/mac/AudioSessionMac.mm  2021-08-04 21:36:38 UTC (rev 280664)
</span><span class="lines">@@ -125,9 +125,21 @@
</span><span class="cx">         return result;
</span><span class="cx"> 
</span><span class="cx">     session->m_sampleRate = narrowPrecisionToFloat(nominalSampleRate);
</span><ins>+
+    callOnMainThread([session] {
+        session->handleSampleRateChange();
+    });
+
</ins><span class="cx">     return noErr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void AudioSessionMac::handleSampleRateChange() const
+{
+    m_configurationChangeObservers.forEach([this](auto& observer) {
+        observer.sampleRateDidChange(*this);
+    });
+}
+
</ins><span class="cx"> void AudioSessionMac::addBufferSizeObserverIfNeeded() const
</span><span class="cx"> {
</span><span class="cx">     if (m_hasBufferSizeObserver)
</span><span class="lines">@@ -163,9 +175,21 @@
</span><span class="cx">         return result;
</span><span class="cx"> 
</span><span class="cx">     session->m_bufferSize = bufferSize;
</span><ins>+
+    callOnMainThread([session] {
+        session->handleBufferSizeChange();
+    });
+
</ins><span class="cx">     return noErr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void AudioSessionMac::handleBufferSizeChange() const
+{
+    m_configurationChangeObservers.forEach([this](auto& observer) {
+        observer.bufferSizeDidChange(*this);
+    });
+}
+
</ins><span class="cx"> void AudioSessionMac::audioOutputDeviceChanged()
</span><span class="cx"> {
</span><span class="cx"> #if ENABLE(ROUTING_ARBITRATION)
</span><span class="lines">@@ -272,6 +296,8 @@
</span><span class="cx">             RELEASE_LOG_ERROR(Media, "AudioSessionMac::sampleRate() - AudioObjectGetPropertyData() return an invalid sample rate");
</span><span class="cx">             m_sampleRate = 44100;
</span><span class="cx">         }
</span><ins>+
+        handleSampleRateChange();
</ins><span class="cx">     }
</span><span class="cx">     return *m_sampleRate;
</span><span class="cx"> }
</span><span class="lines">@@ -406,8 +432,10 @@
</span><span class="cx"> 
</span><span class="cx">     result = AudioObjectSetPropertyData(defaultDevice(), &preferredBufferSizeAddress, 0, 0, sizeof(bufferSizeOut), (void*)&bufferSizeOut);
</span><span class="cx"> 
</span><del>-    if (!result)
</del><ins>+    if (!result) {
</ins><span class="cx">         m_bufferSize = bufferSizeOut;
</span><ins>+        handleBufferSizeChange();
+    }
</ins><span class="cx"> 
</span><span class="cx"> #if !LOG_DISABLED
</span><span class="cx">     if (result)
</span><span class="lines">@@ -459,17 +487,18 @@
</span><span class="cx">     if (m_lastMutedState && *m_lastMutedState == isCurrentlyMuted)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    for (auto* observer : m_observers)
-        observer->hardwareMutedStateDidChange(this);
</del><ins>+    m_lastMutedState = isCurrentlyMuted;
</ins><span class="cx"> 
</span><del>-    m_lastMutedState = isCurrentlyMuted;
</del><ins>+    m_configurationChangeObservers.forEach([this](auto& observer) {
+        observer.hardwareMutedStateDidChange(*this);
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void AudioSessionMac::addMutedStateObserver(MutedStateObserver* observer)
</del><ins>+void AudioSessionMac::addConfigurationChangeObserver(ConfigurationChangeObserver& observer)
</ins><span class="cx"> {
</span><del>-    m_observers.add(observer);
</del><ins>+    m_configurationChangeObservers.add(observer);
</ins><span class="cx"> 
</span><del>-    if (m_observers.size() > 1)
</del><ins>+    if (m_configurationChangeObservers.computeSize() > 1)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     AudioObjectPropertyAddress muteAddress = {
</span><span class="lines">@@ -486,9 +515,9 @@
</span><span class="cx">     AudioObjectAddPropertyListener(defaultDevice(), &muteAddress, handleMutePropertyChange, this);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void AudioSessionMac::removeMutedStateObserver(MutedStateObserver* observer)
</del><ins>+void AudioSessionMac::removeConfigurationChangeObserver(ConfigurationChangeObserver& observer)
</ins><span class="cx"> {
</span><del>-    if (m_observers.size() == 1) {
</del><ins>+    if (m_configurationChangeObservers.computeSize() == 1) {
</ins><span class="cx">         AudioObjectPropertyAddress muteAddress = {
</span><span class="cx">             kAudioDevicePropertyMute,
</span><span class="cx">             kAudioDevicePropertyScopeOutput,
</span><span class="lines">@@ -503,7 +532,7 @@
</span><span class="cx">         AudioObjectRemovePropertyListener(defaultDevice(), &muteAddress, handleMutePropertyChange, this);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    m_observers.remove(observer);
</del><ins>+    m_configurationChangeObservers.remove(observer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKitChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/ChangeLog (280663 => 280664)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/ChangeLog    2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebKit/ChangeLog       2021-08-04 21:36:38 UTC (rev 280664)
</span><span class="lines">@@ -1,3 +1,36 @@
</span><ins>+2021-08-04  Peng Liu  <peng.liu6@apple.com>
+
+        [Catalina][GPUP] Some API tests fail after GPU Process features are enabled
+        https://bugs.webkit.org/show_bug.cgi?id=228589
+
+        Reviewed by Jer Noble.
+
+        When an audio session's configuration changes, let `RemoteAudioSessionProxy`
+        in the GPU process send the latest audio session configuration to `RemoteAudioSession`
+        in the WebContent process through an IPC message (`RemoteAudioSession::ConfigurationChanged`).
+
+        * GPUProcess/media/RemoteAudioSessionProxy.cpp:
+        (WebKit::RemoteAudioSessionProxy::configurationChanged):
+        * GPUProcess/media/RemoteAudioSessionProxy.h:
+
+        * GPUProcess/media/RemoteAudioSessionProxyManager.cpp:
+        (WebKit::RemoteAudioSessionProxyManager::RemoteAudioSessionProxyManager):
+        (WebKit::RemoteAudioSessionProxyManager::~RemoteAudioSessionProxyManager):
+        (WebKit::RemoteAudioSessionProxyManager::beginAudioSessionInterruption):
+        (WebKit::RemoteAudioSessionProxyManager::endAudioSessionInterruption):
+        (WebKit::RemoteAudioSessionProxyManager::hardwareMutedStateDidChange):
+        (WebKit::RemoteAudioSessionProxyManager::bufferSizeDidChange):
+        (WebKit::RemoteAudioSessionProxyManager::sampleRateDidChange):
+        (WebKit::RemoteAudioSessionProxyManager::configurationDidChange):
+
+        * GPUProcess/media/RemoteAudioSessionProxyManager.h:
+        * WebProcess/GPU/media/RemoteAudioSession.cpp:
+        (WebKit::RemoteAudioSession::addConfigurationChangeObserver):
+        (WebKit::RemoteAudioSession::removeConfigurationChangeObserver):
+        (WebKit::RemoteAudioSession::configurationChanged):
+        * WebProcess/GPU/media/RemoteAudioSession.h:
+        * WebProcess/GPU/media/RemoteAudioSession.messages.in:
+
</ins><span class="cx"> 2021-08-04  Simon Fraser  <simon.fraser@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Crash in DisplayLink::notifyObserversDisplayWasRefreshed() on macOS
</span></span></pre></div>
<a id="trunkSourceWebKitGPUProcessmediaRemoteAudioSessionProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.cpp (280663 => 280664)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.cpp 2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.cpp    2021-08-04 21:36:38 UTC (rev 280664)
</span><span class="lines">@@ -93,6 +93,11 @@
</span><span class="cx">     completion(m_active);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void RemoteAudioSessionProxy::configurationChanged()
+{
+    connection().send(Messages::RemoteAudioSession::ConfigurationChanged(configuration()), { });
+}
+
</ins><span class="cx"> void RemoteAudioSessionProxy::beginInterruption()
</span><span class="cx"> {
</span><span class="cx">     connection().send(Messages::RemoteAudioSession::BeginInterruption(), { });
</span></span></pre></div>
<a id="trunkSourceWebKitGPUProcessmediaRemoteAudioSessionProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.h (280663 => 280664)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.h   2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.h      2021-08-04 21:36:38 UTC (rev 280664)
</span><span class="lines">@@ -57,6 +57,7 @@
</span><span class="cx">     size_t preferredBufferSize() const { return m_preferredBufferSize; }
</span><span class="cx">     bool isActive() const { return m_active; }
</span><span class="cx"> 
</span><ins>+    void configurationChanged();
</ins><span class="cx">     void beginInterruption();
</span><span class="cx">     void endInterruption(WebCore::AudioSession::MayResume);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKitGPUProcessmediaRemoteAudioSessionProxyManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.cpp (280663 => 280664)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.cpp  2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.cpp     2021-08-04 21:36:38 UTC (rev 280664)
</span><span class="lines">@@ -47,11 +47,13 @@
</span><span class="cx">     : m_session(AudioSession::create())
</span><span class="cx"> {
</span><span class="cx">     m_session->addInterruptionObserver(*this);
</span><ins>+    m_session->addConfigurationChangeObserver(*this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> RemoteAudioSessionProxyManager::~RemoteAudioSessionProxyManager()
</span><span class="cx"> {
</span><span class="cx">     m_session->removeInterruptionObserver(*this);
</span><ins>+    m_session->removeConfigurationChangeObserver(*this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RemoteAudioSessionProxyManager::addProxy(RemoteAudioSessionProxy& proxy)
</span><span class="lines">@@ -173,20 +175,42 @@
</span><span class="cx"> 
</span><span class="cx"> void RemoteAudioSessionProxyManager::beginAudioSessionInterruption()
</span><span class="cx"> {
</span><del>-    for (auto& proxy : m_proxies) {
</del><ins>+    m_proxies.forEach([](auto& proxy) {
</ins><span class="cx">         if (proxy.isActive())
</span><span class="cx">             proxy.beginInterruption();
</span><del>-    }
</del><ins>+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RemoteAudioSessionProxyManager::endAudioSessionInterruption(AudioSession::MayResume mayResume)
</span><span class="cx"> {
</span><del>-    for (auto& proxy : m_proxies) {
</del><ins>+    m_proxies.forEach([mayResume](auto& proxy) {
</ins><span class="cx">         if (proxy.isActive())
</span><span class="cx">             proxy.endInterruption(mayResume);
</span><del>-    }
</del><ins>+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void RemoteAudioSessionProxyManager::hardwareMutedStateDidChange(const AudioSession& session)
+{
+    configurationDidChange(session);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void RemoteAudioSessionProxyManager::bufferSizeDidChange(const AudioSession& session)
+{
+    configurationDidChange(session);
+}
+
+void RemoteAudioSessionProxyManager::sampleRateDidChange(const AudioSession& session)
+{
+    configurationDidChange(session);
+}
+
+void RemoteAudioSessionProxyManager::configurationDidChange(const WebCore::AudioSession&)
+{
+    m_proxies.forEach([](auto& proxy) {
+        proxy.configurationChanged();
+    });
+}
+
+}
+
</ins><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebKitGPUProcessmediaRemoteAudioSessionProxyManagerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.h (280663 => 280664)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.h    2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.h       2021-08-04 21:36:38 UTC (rev 280664)
</span><span class="lines">@@ -37,7 +37,8 @@
</span><span class="cx"> class RemoteAudioSessionProxy;
</span><span class="cx"> 
</span><span class="cx"> class RemoteAudioSessionProxyManager
</span><del>-    : public WebCore::AudioSession::InterruptionObserver {
</del><ins>+    : private WebCore::AudioSession::InterruptionObserver
+    , private WebCore::AudioSession::ConfigurationChangeObserver {
</ins><span class="cx">     WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx"> public:
</span><span class="cx">     RemoteAudioSessionProxyManager();
</span><span class="lines">@@ -58,6 +59,11 @@
</span><span class="cx">     void beginAudioSessionInterruption() final;
</span><span class="cx">     void endAudioSessionInterruption(WebCore::AudioSession::MayResume) final;
</span><span class="cx"> 
</span><ins>+    void hardwareMutedStateDidChange(const WebCore::AudioSession&) final;
+    void bufferSizeDidChange(const WebCore::AudioSession&) final;
+    void sampleRateDidChange(const WebCore::AudioSession&) final;
+    void configurationDidChange(const WebCore::AudioSession&);
+
</ins><span class="cx">     UniqueRef<WebCore::AudioSession> m_session;
</span><span class="cx">     WeakHashSet<RemoteAudioSessionProxy> m_proxies;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebKitWebProcessGPUmediaRemoteAudioSessioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.cpp (280663 => 280664)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.cpp  2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.cpp     2021-08-04 21:36:38 UTC (rev 280664)
</span><span class="lines">@@ -122,6 +122,16 @@
</span><span class="cx">     return succeeded;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void RemoteAudioSession::addConfigurationChangeObserver(ConfigurationChangeObserver& observer)
+{
+    m_configurationChangeObservers.add(observer);
+}
+
+void RemoteAudioSession::removeConfigurationChangeObserver(ConfigurationChangeObserver& observer)
+{
+    m_configurationChangeObservers.remove(observer);
+}
+
</ins><span class="cx"> AudioSession::CategoryType RemoteAudioSession::category() const
</span><span class="cx"> {
</span><span class="cx"> #if PLATFORM(COCOA)
</span><span class="lines">@@ -131,6 +141,26 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void RemoteAudioSession::configurationChanged(RemoteAudioSessionConfiguration&& configuration)
+{
+    bool mutedStateChanged = !m_configuration || configuration.isMuted != (*m_configuration).isMuted;
+    bool bufferSizeChanged = !m_configuration || configuration.bufferSize != (*m_configuration).bufferSize;
+    bool sampleRateCahnged = !m_configuration || configuration.sampleRate != (*m_configuration).sampleRate;
+
+    m_configuration = WTFMove(configuration);
+
+    m_configurationChangeObservers.forEach([&](auto& observer) {
+        if (mutedStateChanged)
+            observer.hardwareMutedStateDidChange(*this);
+
+        if (bufferSizeChanged)
+            observer.bufferSizeDidChange(*this);
+
+        if (sampleRateCahnged)
+            observer.sampleRateDidChange(*this);
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+}
+
</ins><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebKitWebProcessGPUmediaRemoteAudioSessionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.h (280663 => 280664)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.h    2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.h       2021-08-04 21:36:38 UTC (rev 280664)
</span><span class="lines">@@ -68,6 +68,8 @@
</span><span class="cx">     void setCategory(CategoryType, WebCore::RouteSharingPolicy) final;
</span><span class="cx">     void setPreferredBufferSize(size_t) final;
</span><span class="cx">     bool tryToSetActiveInternal(bool) final;
</span><ins>+    void addConfigurationChangeObserver(ConfigurationChangeObserver&);
+    void removeConfigurationChangeObserver(ConfigurationChangeObserver&);
</ins><span class="cx"> 
</span><span class="cx">     const RemoteAudioSessionConfiguration& configuration() const;
</span><span class="cx">     RemoteAudioSessionConfiguration& configuration();
</span><span class="lines">@@ -86,6 +88,7 @@
</span><span class="cx"> 
</span><span class="cx">     WebProcess& m_process;
</span><span class="cx"> 
</span><ins>+    WeakHashSet<ConfigurationChangeObserver> m_configurationChangeObservers;
</ins><span class="cx">     CategoryType m_category { CategoryType::None };
</span><span class="cx">     WebCore::RouteSharingPolicy m_routeSharingPolicy { WebCore::RouteSharingPolicy::Default };
</span><span class="cx">     std::optional<RemoteAudioSessionConfiguration> m_configuration;
</span></span></pre></div>
<a id="trunkSourceWebKitWebProcessGPUmediaRemoteAudioSessionmessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.messages.in (280663 => 280664)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.messages.in  2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.messages.in     2021-08-04 21:36:38 UTC (rev 280664)
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> #if ENABLE(GPU_PROCESS) && USE(AUDIO_SESSION)
</span><span class="cx"> 
</span><span class="cx"> messages -> RemoteAudioSession NotRefCounted {
</span><ins>+    ConfigurationChanged(struct WebKit::RemoteAudioSessionConfiguration configuration)
</ins><span class="cx">     BeginInterruption()
</span><span class="cx">     EndInterruption(WebCore::AudioSession::MayResume flags)
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (280663 => 280664)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog    2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Tools/ChangeLog       2021-08-04 21:36:38 UTC (rev 280664)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2021-08-04  Peng Liu  <peng.liu6@apple.com>
+
+        [Catalina][GPUP] Some API tests fail after GPU Process features are enabled
+        https://bugs.webkit.org/show_bug.cgi?id=228589
+
+        Reviewed by Jer Noble.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/AudioBufferSize.mm:
+        (TestWebKitAPI::TEST):
+
</ins><span class="cx"> 2021-08-04  Jonathan Bedard  <jbedard@apple.com>
</span><span class="cx"> 
</span><span class="cx">         [check-github-mirror-integrity] Store remote cache in checkout
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebKitCocoaAudioBufferSizemm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/AudioBufferSize.mm (280663 => 280664)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/AudioBufferSize.mm   2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/AudioBufferSize.mm      2021-08-04 21:36:38 UTC (rev 280664)
</span><span class="lines">@@ -56,7 +56,7 @@
</span><span class="cx">     return 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TEST(WebKit, DISABLED_AudioBufferSize)
</del><ins>+TEST(WebKit, AudioBufferSize)
</ins><span class="cx"> {
</span><span class="cx">     auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
</span><span class="cx">     auto context = adoptWK(TestWebKitAPI::Util::createContextForInjectedBundleTest("InternalsInjectedBundleTest"));
</span></span></pre>
</div>
</div>

</body>
</html>