⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 280664 in webkit


Ignore:
Timestamp:
Aug 4, 2021, 2:36:38 PM (5 years ago)
Author:
Peng Liu
Message:

[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):

Location:
trunk
Files:
18 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r280654 r280664  
     12021-08-04  Peng Liu  <peng.liu6@apple.com>
     2
     3        [Catalina][GPUP] Some API tests fail after GPU Process features are enabled
     4        https://bugs.webkit.org/show_bug.cgi?id=228589
     5
     6        Reviewed by Jer Noble.
     7
     8        When "Media in GPU Process" is enabled, `AudioSession[IOS|Mac]` runs in
     9        the GPU process. `HTMLMediaElement`, which is an observer of audio session,
     10        runs in a WebContent process. It cannot get its AudioSession's configuration
     11        directly. We need a mechanism to "push" the latest audio session configuration
     12        from the GPU process to the WebContent process.
     13
     14        This patch replaces the `MutedStateObserver` with an audio session configuration
     15        change observer interface, so that an audio session will notify its observers
     16        after changing its configurations, including buffer size, muted state, sample rate.
     17        Currently, this observer interface is used on macOS only.
     18
     19        No new tests. Fix an API test failure.
     20
     21        * html/HTMLMediaElement.cpp:
     22        (WebCore::HTMLMediaElement::initializeMediaSession):
     23        (WebCore::HTMLMediaElement::~HTMLMediaElement):
     24        (WebCore::HTMLMediaElement::hardwareMutedStateDidChange):
     25        * html/HTMLMediaElement.h:
     26
     27        * platform/audio/AudioSession.cpp:
     28        (WebCore::AudioSession::addConfigurationChangeObserver):
     29        (WebCore::AudioSession::removeConfigurationChangeObserver):
     30        * platform/audio/AudioSession.h:
     31        * platform/audio/ios/AudioSessionIOS.h:
     32        Move `m_interruptionObservers` to this class because only `AudioSessionIOS`
     33        supports interruption observers.
     34        * platform/audio/mac/AudioSessionMac.h:
     35        * platform/audio/mac/AudioSessionMac.mm:
     36        (WebCore::AudioSessionMac::handleSampleRateChange):
     37        (WebCore::AudioSessionMac::handleSampleRateChange const):
     38        (WebCore::AudioSessionMac::handleBufferSizeChange):
     39        (WebCore::AudioSessionMac::handleBufferSizeChange const):
     40        (WebCore::AudioSessionMac::sampleRate const):
     41        (WebCore::AudioSessionMac::setPreferredBufferSize):
     42        (WebCore::AudioSessionMac::handleMutedStateChange):
     43        (WebCore::AudioSessionMac::addConfigurationChangeObserver):
     44        (WebCore::AudioSessionMac::removeConfigurationChangeObserver):
     45        (WebCore::AudioSessionMac::addMutedStateObserver): Deleted.
     46        (WebCore::AudioSessionMac::removeMutedStateObserver): Deleted.
     47
    1482021-08-04  Miguel Gomez  <magomez@igalia.com>
    249
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r280624 r280664  
    514514
    515515#if USE(AUDIO_SESSION) && PLATFORM(MAC)
    516     AudioSession::sharedSession().addMutedStateObserver(this);
     516    AudioSession::sharedSession().addConfigurationChangeObserver(*this);
    517517#endif
    518518
     
    531531
    532532#if USE(AUDIO_SESSION) && PLATFORM(MAC)
    533     AudioSession::sharedSession().removeMutedStateObserver(this);
     533    AudioSession::sharedSession().removeConfigurationChangeObserver(*this);
    534534#endif
    535535
     
    38093809
    38103810#if USE(AUDIO_SESSION) && PLATFORM(MAC)
    3811 void HTMLMediaElement::hardwareMutedStateDidChange(AudioSession* session)
    3812 {
    3813     if (!session->isMuted())
     3811void HTMLMediaElement::hardwareMutedStateDidChange(const AudioSession& session)
     3812{
     3813    if (!session.isMuted())
    38143814        return;
    38153815
  • trunk/Source/WebCore/html/HTMLMediaElement.h

    r280330 r280664  
    129129    , private VideoTrackClient
    130130#if USE(AUDIO_SESSION) && PLATFORM(MAC)
    131     , private AudioSession::MutedStateObserver
     131    , private AudioSession::ConfigurationChangeObserver
    132132#endif
    133133#if ENABLE(ENCRYPTED_MEDIA)
     
    883883
    884884#if USE(AUDIO_SESSION) && PLATFORM(MAC)
    885     void hardwareMutedStateDidChange(AudioSession*) final;
     885    void hardwareMutedStateDidChange(const AudioSession&) final;
    886886#endif
    887887
  • trunk/Source/WebCore/platform/audio/AudioSession.cpp

    r280462 r280664  
    202202}
    203203
     204void AudioSession::addConfigurationChangeObserver(ConfigurationChangeObserver&)
     205{
     206    notImplemented();
     207}
     208
     209void AudioSession::removeConfigurationChangeObserver(ConfigurationChangeObserver&)
     210{
     211    notImplemented();
     212}
     213
    204214void AudioSession::setIsPlayingToBluetoothOverride(std::optional<bool>)
    205215{
  • trunk/Source/WebCore/platform/audio/AudioSession.h

    r280462 r280664  
    9292    virtual void setPreferredBufferSize(size_t);
    9393
    94     class MutedStateObserver {
     94    class ConfigurationChangeObserver : public CanMakeWeakPtr<ConfigurationChangeObserver> {
    9595    public:
    96         virtual ~MutedStateObserver() = default;
    97 
    98         virtual void hardwareMutedStateDidChange(AudioSession*) = 0;
     96        virtual ~ConfigurationChangeObserver() = default;
     97
     98        virtual void hardwareMutedStateDidChange(const AudioSession&) = 0;
     99        virtual void bufferSizeDidChange(const AudioSession&) { }
     100        virtual void sampleRateDidChange(const AudioSession&) { }
    99101    };
    100102
    101     virtual void addMutedStateObserver(MutedStateObserver*) { }
    102     virtual void removeMutedStateObserver(MutedStateObserver*) { }
     103    virtual void addConfigurationChangeObserver(ConfigurationChangeObserver&);
     104    virtual void removeConfigurationChangeObserver(ConfigurationChangeObserver&);
    103105
    104106    virtual void audioOutputDeviceChanged();
     
    134136
    135137    virtual bool tryToSetActiveInternal(bool);
    136 
    137     HashSet<MutedStateObserver*> m_observers;
    138 #if PLATFORM(IOS_FAMILY)
    139     WeakHashSet<InterruptionObserver> m_interruptionObservers;
    140 #endif
    141138
    142139    WeakPtr<AudioSessionRoutingArbitrationClient> m_routingArbitrationClient;
  • trunk/Source/WebCore/platform/audio/ios/AudioSessionIOS.h

    r279119 r280664  
    6767    AudioSession::CategoryType m_categoryOverride { AudioSession::CategoryType::None };
    6868    Ref<WTF::WorkQueue> m_workQueue;
     69    WeakHashSet<InterruptionObserver> m_interruptionObservers;
    6970    RetainPtr<WebInterruptionObserverHelper> m_interruptionObserverHelper;
    7071};
  • trunk/Source/WebCore/platform/audio/mac/AudioSessionMac.h

    r278253 r280664  
    4545
    4646    static OSStatus handleSampleRateChange(AudioObjectID, UInt32, const AudioObjectPropertyAddress*, void* inClientData);
     47    void handleSampleRateChange() const;
    4748    static OSStatus handleBufferSizeChange(AudioObjectID, UInt32, const AudioObjectPropertyAddress*, void* inClientData);
     49    void handleBufferSizeChange() const;
    4850
    4951    // AudioSession
     
    6567    bool isMuted() const final;
    6668    void handleMutedStateChange() final;
    67     void addMutedStateObserver(MutedStateObserver*) final;
    68     void removeMutedStateObserver(MutedStateObserver*) final;
     69    void addConfigurationChangeObserver(ConfigurationChangeObserver&) final;
     70    void removeConfigurationChangeObserver(ConfigurationChangeObserver&) final;
    6971
    7072    std::optional<bool> m_lastMutedState;
     73    mutable WeakHashSet<ConfigurationChangeObserver> m_configurationChangeObservers;
    7174    AudioSession::CategoryType m_category { AudioSession::CategoryType::None };
    7275#if ENABLE(ROUTING_ARBITRATION)
  • trunk/Source/WebCore/platform/audio/mac/AudioSessionMac.mm

    r278253 r280664  
    126126
    127127    session->m_sampleRate = narrowPrecisionToFloat(nominalSampleRate);
     128
     129    callOnMainThread([session] {
     130        session->handleSampleRateChange();
     131    });
     132
    128133    return noErr;
     134}
     135
     136void AudioSessionMac::handleSampleRateChange() const
     137{
     138    m_configurationChangeObservers.forEach([this](auto& observer) {
     139        observer.sampleRateDidChange(*this);
     140    });
    129141}
    130142
     
    164176
    165177    session->m_bufferSize = bufferSize;
     178
     179    callOnMainThread([session] {
     180        session->handleBufferSizeChange();
     181    });
     182
    166183    return noErr;
     184}
     185
     186void AudioSessionMac::handleBufferSizeChange() const
     187{
     188    m_configurationChangeObservers.forEach([this](auto& observer) {
     189        observer.bufferSizeDidChange(*this);
     190    });
    167191}
    168192
     
    273297            m_sampleRate = 44100;
    274298        }
     299
     300        handleSampleRateChange();
    275301    }
    276302    return *m_sampleRate;
     
    407433    result = AudioObjectSetPropertyData(defaultDevice(), &preferredBufferSizeAddress, 0, 0, sizeof(bufferSizeOut), (void*)&bufferSizeOut);
    408434
    409     if (!result)
     435    if (!result) {
    410436        m_bufferSize = bufferSizeOut;
     437        handleBufferSizeChange();
     438    }
    411439
    412440#if !LOG_DISABLED
     
    460488        return;
    461489
    462     for (auto* observer : m_observers)
    463         observer->hardwareMutedStateDidChange(this);
    464 
    465490    m_lastMutedState = isCurrentlyMuted;
    466 }
    467 
    468 void AudioSessionMac::addMutedStateObserver(MutedStateObserver* observer)
    469 {
    470     m_observers.add(observer);
    471 
    472     if (m_observers.size() > 1)
     491
     492    m_configurationChangeObservers.forEach([this](auto& observer) {
     493        observer.hardwareMutedStateDidChange(*this);
     494    });
     495}
     496
     497void AudioSessionMac::addConfigurationChangeObserver(ConfigurationChangeObserver& observer)
     498{
     499    m_configurationChangeObservers.add(observer);
     500
     501    if (m_configurationChangeObservers.computeSize() > 1)
    473502        return;
    474503
     
    487516}
    488517
    489 void AudioSessionMac::removeMutedStateObserver(MutedStateObserver* observer)
    490 {
    491     if (m_observers.size() == 1) {
     518void AudioSessionMac::removeConfigurationChangeObserver(ConfigurationChangeObserver& observer)
     519{
     520    if (m_configurationChangeObservers.computeSize() == 1) {
    492521        AudioObjectPropertyAddress muteAddress = {
    493522            kAudioDevicePropertyMute,
     
    504533    }
    505534
    506     m_observers.remove(observer);
     535    m_configurationChangeObservers.remove(observer);
    507536}
    508537
  • trunk/Source/WebKit/ChangeLog

    r280653 r280664  
     12021-08-04  Peng Liu  <peng.liu6@apple.com>
     2
     3        [Catalina][GPUP] Some API tests fail after GPU Process features are enabled
     4        https://bugs.webkit.org/show_bug.cgi?id=228589
     5
     6        Reviewed by Jer Noble.
     7
     8        When an audio session's configuration changes, let `RemoteAudioSessionProxy`
     9        in the GPU process send the latest audio session configuration to `RemoteAudioSession`
     10        in the WebContent process through an IPC message (`RemoteAudioSession::ConfigurationChanged`).
     11
     12        * GPUProcess/media/RemoteAudioSessionProxy.cpp:
     13        (WebKit::RemoteAudioSessionProxy::configurationChanged):
     14        * GPUProcess/media/RemoteAudioSessionProxy.h:
     15
     16        * GPUProcess/media/RemoteAudioSessionProxyManager.cpp:
     17        (WebKit::RemoteAudioSessionProxyManager::RemoteAudioSessionProxyManager):
     18        (WebKit::RemoteAudioSessionProxyManager::~RemoteAudioSessionProxyManager):
     19        (WebKit::RemoteAudioSessionProxyManager::beginAudioSessionInterruption):
     20        (WebKit::RemoteAudioSessionProxyManager::endAudioSessionInterruption):
     21        (WebKit::RemoteAudioSessionProxyManager::hardwareMutedStateDidChange):
     22        (WebKit::RemoteAudioSessionProxyManager::bufferSizeDidChange):
     23        (WebKit::RemoteAudioSessionProxyManager::sampleRateDidChange):
     24        (WebKit::RemoteAudioSessionProxyManager::configurationDidChange):
     25
     26        * GPUProcess/media/RemoteAudioSessionProxyManager.h:
     27        * WebProcess/GPU/media/RemoteAudioSession.cpp:
     28        (WebKit::RemoteAudioSession::addConfigurationChangeObserver):
     29        (WebKit::RemoteAudioSession::removeConfigurationChangeObserver):
     30        (WebKit::RemoteAudioSession::configurationChanged):
     31        * WebProcess/GPU/media/RemoteAudioSession.h:
     32        * WebProcess/GPU/media/RemoteAudioSession.messages.in:
     33
    1342021-08-04  Simon Fraser  <simon.fraser@apple.com>
    235
  • trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.cpp

    r277584 r280664  
    9494}
    9595
     96void RemoteAudioSessionProxy::configurationChanged()
     97{
     98    connection().send(Messages::RemoteAudioSession::ConfigurationChanged(configuration()), { });
     99}
     100
    96101void RemoteAudioSessionProxy::beginInterruption()
    97102{
  • trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.h

    r277584 r280664  
    5858    bool isActive() const { return m_active; }
    5959
     60    void configurationChanged();
    6061    void beginInterruption();
    6162    void endInterruption(WebCore::AudioSession::MayResume);
  • trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.cpp

    r277584 r280664  
    4848{
    4949    m_session->addInterruptionObserver(*this);
     50    m_session->addConfigurationChangeObserver(*this);
    5051}
    5152
     
    5354{
    5455    m_session->removeInterruptionObserver(*this);
     56    m_session->removeConfigurationChangeObserver(*this);
    5557}
    5658
     
    174176void RemoteAudioSessionProxyManager::beginAudioSessionInterruption()
    175177{
    176     for (auto& proxy : m_proxies) {
     178    m_proxies.forEach([](auto& proxy) {
    177179        if (proxy.isActive())
    178180            proxy.beginInterruption();
    179     }
     181    });
    180182}
    181183
    182184void RemoteAudioSessionProxyManager::endAudioSessionInterruption(AudioSession::MayResume mayResume)
    183185{
    184     for (auto& proxy : m_proxies) {
     186    m_proxies.forEach([mayResume](auto& proxy) {
    185187        if (proxy.isActive())
    186188            proxy.endInterruption(mayResume);
    187     }
     189    });
     190}
     191
     192void RemoteAudioSessionProxyManager::hardwareMutedStateDidChange(const AudioSession& session)
     193{
     194    configurationDidChange(session);
     195}
     196
     197void RemoteAudioSessionProxyManager::bufferSizeDidChange(const AudioSession& session)
     198{
     199    configurationDidChange(session);
     200}
     201
     202void RemoteAudioSessionProxyManager::sampleRateDidChange(const AudioSession& session)
     203{
     204    configurationDidChange(session);
     205}
     206
     207void RemoteAudioSessionProxyManager::configurationDidChange(const WebCore::AudioSession&)
     208{
     209    m_proxies.forEach([](auto& proxy) {
     210        proxy.configurationChanged();
     211    });
    188212}
    189213
  • trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.h

    r278374 r280664  
    3838
    3939class RemoteAudioSessionProxyManager
    40     : public WebCore::AudioSession::InterruptionObserver {
     40    : private WebCore::AudioSession::InterruptionObserver
     41    , private WebCore::AudioSession::ConfigurationChangeObserver {
    4142    WTF_MAKE_FAST_ALLOCATED;
    4243public:
     
    5960    void endAudioSessionInterruption(WebCore::AudioSession::MayResume) final;
    6061
     62    void hardwareMutedStateDidChange(const WebCore::AudioSession&) final;
     63    void bufferSizeDidChange(const WebCore::AudioSession&) final;
     64    void sampleRateDidChange(const WebCore::AudioSession&) final;
     65    void configurationDidChange(const WebCore::AudioSession&);
     66
    6167    UniqueRef<WebCore::AudioSession> m_session;
    6268    WeakHashSet<RemoteAudioSessionProxy> m_proxies;
  • trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.cpp

    r280576 r280664  
    123123}
    124124
     125void RemoteAudioSession::addConfigurationChangeObserver(ConfigurationChangeObserver& observer)
     126{
     127    m_configurationChangeObservers.add(observer);
     128}
     129
     130void RemoteAudioSession::removeConfigurationChangeObserver(ConfigurationChangeObserver& observer)
     131{
     132    m_configurationChangeObservers.remove(observer);
     133}
     134
    125135AudioSession::CategoryType RemoteAudioSession::category() const
    126136{
     
    132142}
    133143
     144void RemoteAudioSession::configurationChanged(RemoteAudioSessionConfiguration&& configuration)
     145{
     146    bool mutedStateChanged = !m_configuration || configuration.isMuted != (*m_configuration).isMuted;
     147    bool bufferSizeChanged = !m_configuration || configuration.bufferSize != (*m_configuration).bufferSize;
     148    bool sampleRateCahnged = !m_configuration || configuration.sampleRate != (*m_configuration).sampleRate;
     149
     150    m_configuration = WTFMove(configuration);
     151
     152    m_configurationChangeObservers.forEach([&](auto& observer) {
     153        if (mutedStateChanged)
     154            observer.hardwareMutedStateDidChange(*this);
     155
     156        if (bufferSizeChanged)
     157            observer.bufferSizeDidChange(*this);
     158
     159        if (sampleRateCahnged)
     160            observer.sampleRateDidChange(*this);
     161    });
     162}
     163
    134164}
    135165
  • trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.h

    r278253 r280664  
    6969    void setPreferredBufferSize(size_t) final;
    7070    bool tryToSetActiveInternal(bool) final;
     71    void addConfigurationChangeObserver(ConfigurationChangeObserver&);
     72    void removeConfigurationChangeObserver(ConfigurationChangeObserver&);
    7173
    7274    const RemoteAudioSessionConfiguration& configuration() const;
     
    8789    WebProcess& m_process;
    8890
     91    WeakHashSet<ConfigurationChangeObserver> m_configurationChangeObservers;
    8992    CategoryType m_category { CategoryType::None };
    9093    WebCore::RouteSharingPolicy m_routeSharingPolicy { WebCore::RouteSharingPolicy::Default };
  • trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.messages.in

    r277584 r280664  
    2727
    2828messages -> RemoteAudioSession NotRefCounted {
     29    ConfigurationChanged(struct WebKit::RemoteAudioSessionConfiguration configuration)
    2930    BeginInterruption()
    3031    EndInterruption(WebCore::AudioSession::MayResume flags)
  • trunk/Tools/ChangeLog

    r280663 r280664  
     12021-08-04  Peng Liu  <peng.liu6@apple.com>
     2
     3        [Catalina][GPUP] Some API tests fail after GPU Process features are enabled
     4        https://bugs.webkit.org/show_bug.cgi?id=228589
     5
     6        Reviewed by Jer Noble.
     7
     8        * TestWebKitAPI/Tests/WebKitCocoa/AudioBufferSize.mm:
     9        (TestWebKitAPI::TEST):
     10
    1112021-08-04  Jonathan Bedard  <jbedard@apple.com>
    212
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/AudioBufferSize.mm

    r280439 r280664  
    5757}
    5858
    59 TEST(WebKit, DISABLED_AudioBufferSize)
     59TEST(WebKit, AudioBufferSize)
    6060{
    6161    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
Note: See TracChangeset for help on using the changeset viewer.