Changeset 207764 in webkit


Ignore:
Timestamp:
Oct 24, 2016 10:53:12 AM (8 years ago)
Author:
eric.carlson@apple.com
Message:

[MediaStream] Separate media capture and audio playback muting
https://bugs.webkit.org/show_bug.cgi?id=163855
<rdar://problem/28827186>

Reviewed by Darin Adler.

Source/WebCore:

Test: fast/mediastream/MediaStream-page-muted.html

Change page.muted from a bool to a bitfield so audio and media capture muted are independent.
Fix a couple of bugs in the mock media capture device uncovered by new test case.

  • Modules/mediastream/MediaStream.cpp:

(WebCore::MediaStream::pageMutedStateDidChange): page.isMuted -> page.mutedState.

  • Modules/webaudio/AudioContext.cpp:

(WebCore::AudioContext::pageMutedStateDidChange): Ditto.

  • html/HTMLMediaElement.cpp:

(WebCore::HTMLMediaElement::updateVolume): Ditto.
(WebCore::HTMLMediaElement::effectiveMuted): Ditto.

  • page/MediaProducer.h: Add MutedState enum.
  • page/Page.cpp:

(WebCore::Page::Page):
(WebCore::Page::setMuted): Take MutedStateFlags instead of bool. m_muted -> m_mutedState.

  • page/Page.h:
  • platform/mock/MockRealtimeMediaSource.cpp:

(WebCore::MockRealtimeMediaSource::startProducingData): Call setMuted.
(WebCore::MockRealtimeMediaSource::stopProducingData): Ditto.

  • platform/mock/MockRealtimeMediaSource.h:
  • platform/mock/MockRealtimeVideoSource.cpp:

(WebCore::MockRealtimeVideoSource::stopProducingData): Call correct base class method.

  • testing/Internals.cpp:

(WebCore::Internals::setPageMuted): Change parameter from a bool to a string.

  • testing/Internals.h:
  • testing/Internals.idl:

Source/WebKit2:

  • Shared/WebPageCreationParameters.h: Change 'muted' from bool to MutedStateFlags.
  • UIProcess/API/C/WKPage.cpp: Change parameter from bool to WKMediaMutedState.

(WKPageSetMuted):

  • UIProcess/API/C/WKPagePrivate.h: Define WKMediaMutedState.
  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::WebPageProxy):
(WebKit::WebPageProxy::setMuted): m_muted -> m_mutedState.
(WebKit::WebPageProxy::creationParameters): Ditto.

  • UIProcess/WebPageProxy.h:
  • WebProcess/Plugins/PluginView.cpp:

(WebKit::PluginView::isMuted): page.isMuted -> page.mutedState.

  • WebProcess/WebPage/WebPage.messages.in: Change SetMuted parameter.

LayoutTests:

  • fast/mediastream/MediaStream-page-muted-expected.txt: Added.
  • fast/mediastream/MediaStream-page-muted.html: Added.
  • media/video-muted-after-setting-page-muted-state.html: Updated.
Location:
trunk
Files:
2 added
24 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r207762 r207764  
     12016-10-24  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [MediaStream] Separate media capture and audio playback muting
     4        https://bugs.webkit.org/show_bug.cgi?id=163855
     5        <rdar://problem/28827186>
     6
     7        Reviewed by Darin Adler.
     8
     9        * fast/mediastream/MediaStream-page-muted-expected.txt: Added.
     10        * fast/mediastream/MediaStream-page-muted.html: Added.
     11        * media/video-muted-after-setting-page-muted-state.html: Updated.
     12
    1132016-10-24  Youenn Fablet  <youenn@apple.com>
    214
  • trunk/LayoutTests/media/video-muted-after-setting-page-muted-state.html

    r175384 r207764  
    66    testExpected("video.muted", false);
    77    if (window.internals)
    8         internals.setPageMuted(true);
     8        internals.setPageMuted("audio");
    99    testExpected("video.muted", false);
    1010
     
    1212    testExpected("video.muted", true);
    1313    if (window.internals)
    14         internals.setPageMuted(false);
     14        internals.setPageMuted("");
    1515    testExpected("video.muted", true);
    1616    endTest();
  • trunk/Source/WebCore/ChangeLog

    r207763 r207764  
     12016-10-24  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [MediaStream] Separate media capture and audio playback muting
     4        https://bugs.webkit.org/show_bug.cgi?id=163855
     5        <rdar://problem/28827186>
     6
     7        Reviewed by Darin Adler.
     8
     9        Test: fast/mediastream/MediaStream-page-muted.html
     10
     11        Change page.muted from a bool to a bitfield so audio and media capture muted are independent.
     12        Fix a couple of bugs in the mock media capture device uncovered by new test case.
     13       
     14        * Modules/mediastream/MediaStream.cpp:
     15        (WebCore::MediaStream::pageMutedStateDidChange): page.isMuted -> page.mutedState.
     16
     17        * Modules/webaudio/AudioContext.cpp:
     18        (WebCore::AudioContext::pageMutedStateDidChange): Ditto.
     19
     20        * html/HTMLMediaElement.cpp:
     21        (WebCore::HTMLMediaElement::updateVolume): Ditto.
     22        (WebCore::HTMLMediaElement::effectiveMuted): Ditto.
     23
     24        * page/MediaProducer.h: Add MutedState enum.
     25
     26        * page/Page.cpp:
     27        (WebCore::Page::Page):
     28        (WebCore::Page::setMuted): Take MutedStateFlags instead of bool. m_muted -> m_mutedState.
     29        * page/Page.h:
     30
     31        * platform/mock/MockRealtimeMediaSource.cpp:
     32        (WebCore::MockRealtimeMediaSource::startProducingData): Call setMuted.
     33        (WebCore::MockRealtimeMediaSource::stopProducingData): Ditto.
     34        * platform/mock/MockRealtimeMediaSource.h:
     35
     36        * platform/mock/MockRealtimeVideoSource.cpp:
     37        (WebCore::MockRealtimeVideoSource::stopProducingData): Call correct base class method.
     38
     39        * testing/Internals.cpp:
     40        (WebCore::Internals::setPageMuted): Change parameter from a bool to a string.
     41        * testing/Internals.h:
     42
     43        * testing/Internals.idl:
     44
    1452016-10-24  Darin Adler  <darin@apple.com>
    246
  • trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp

    r204466 r207764  
    257257        return;
    258258
    259     bool pageMuted = document->page()->isMuted();
     259    bool pageMuted = document->page()->isMediaCaptureMuted();
    260260    if (m_externallyMuted == pageMuted)
    261261        return;
  • trunk/Source/WebCore/Modules/webaudio/AudioContext.cpp

    r207050 r207764  
    974974{
    975975    if (m_destinationNode && document()->page())
    976         m_destinationNode->setMuted(document()->page()->isMuted());
     976        m_destinationNode->setMuted(document()->page()->isAudioMuted());
    977977}
    978978
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r207706 r207764  
    48474847        if (m_mediaController) {
    48484848            volumeMultiplier *= m_mediaController->volume();
    4849             shouldMute = m_mediaController->muted() || (page && page->isMuted());
     4849            shouldMute = m_mediaController->muted() || (page && page->isAudioMuted());
    48504850        }
    48514851
     
    70087008bool HTMLMediaElement::effectiveMuted() const
    70097009{
    7010     return muted() || (document().page() && document().page()->isMuted());
     7010    return muted() || (document().page() && document().page()->isAudioMuted());
    70117011}
    70127012
  • trunk/Source/WebCore/page/MediaProducer.h

    r197929 r207764  
    4949
    5050    virtual MediaStateFlags mediaState() const = 0;
     51
     52    enum MutedState {
     53        NoneMuted = 0,
     54        AudioIsMuted = 1 << 0,
     55        CaptureDevicesAreMuted = 1 << 1,
     56    };
     57    typedef unsigned MutedStateFlags;
     58
    5159    virtual void pageMutedStateDidChange() = 0;
    5260
  • trunk/Source/WebCore/page/Page.cpp

    r207706 r207764  
    194194    , m_areMemoryCacheClientCallsEnabled(true)
    195195    , m_mediaVolume(1)
    196     , m_muted(false)
    197196    , m_pageScaleFactor(1)
    198197    , m_zoomedOutPageScaleFactor(0)
     
    13821381}
    13831382
    1384 void Page::setMuted(bool muted)
    1385 {
    1386     if (m_muted == muted)
    1387         return;
    1388 
    1389     m_muted = muted;
     1383void Page::setMuted(MediaProducer::MutedStateFlags muted)
     1384{
     1385    if (m_mutedState == muted)
     1386        return;
     1387
     1388    m_mutedState = muted;
    13901389
    13911390    for (Frame* frame = &mainFrame(); frame; frame = frame->tree().traverseNext()) {
  • trunk/Source/WebCore/page/Page.h

    r207706 r207764  
    481481    MediaProducer::MediaStateFlags mediaState() const { return m_mediaState; }
    482482    void updateIsPlayingMedia(uint64_t);
    483     bool isMuted() const { return m_muted; }
    484     WEBCORE_EXPORT void setMuted(bool);
     483    MediaProducer::MutedStateFlags mutedState() const { return m_mutedState; }
     484    bool isAudioMuted() const { return m_mutedState & MediaProducer::AudioIsMuted; }
     485    bool isMediaCaptureMuted() const { return m_mutedState & MediaProducer::CaptureDevicesAreMuted; };
     486    WEBCORE_EXPORT void setMuted(MediaProducer::MutedStateFlags);
    485487
    486488#if ENABLE(MEDIA_SESSION)
     
    610612    bool m_areMemoryCacheClientCallsEnabled;
    611613    float m_mediaVolume;
    612     bool m_muted;
     614    MediaProducer::MutedStateFlags m_mutedState { MediaProducer::NoneMuted };
    613615
    614616    float m_pageScaleFactor;
  • trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp

    r206445 r207764  
    8585void RealtimeMediaSource::setMuted(bool muted)
    8686{
    87     if (m_muted == muted)
     87    if (m_stopped || m_muted == muted)
    8888        return;
    8989
     
    151151}
    152152
    153 #if 1
    154153double RealtimeMediaSource::fitnessDistance(const MediaConstraint& constraint)
    155154{
     
    276275    return 0;
    277276}
    278 #endif
    279277
    280278template <typename ValueType>
  • trunk/Source/WebCore/platform/mock/MockRealtimeMediaSource.cpp

    r205961 r207764  
    125125}
    126126
     127void MockRealtimeMediaSource::startProducingData()
     128{
     129    m_isProducingData = true;
     130    setMuted(false);
     131}
     132
     133void MockRealtimeMediaSource::stopProducingData()
     134{
     135    m_isProducingData = false;
     136    setMuted(true);
     137}
     138
    127139} // namespace WebCore
    128140
  • trunk/Source/WebCore/platform/mock/MockRealtimeMediaSource.h

    r205961 r207764  
    7070    virtual void initializeSupportedConstraints(RealtimeMediaSourceSupportedConstraints&) = 0;
    7171
    72     void startProducingData() override { m_isProducingData = true; }
    73     void stopProducingData() override { m_isProducingData = false; }
     72    void startProducingData() override;
     73    void stopProducingData() override;
    7474
    7575    RefPtr<RealtimeMediaSourceCapabilities> capabilities() override;
  • trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp

    r207442 r207764  
    8686void MockRealtimeVideoSource::stopProducingData()
    8787{
    88     MockRealtimeMediaSource::startProducingData();
     88    MockRealtimeMediaSource::stopProducingData();
    8989    m_timer.stop();
    9090    m_elapsedTime += monotonicallyIncreasingTime() - m_startTime;
  • trunk/Source/WebCore/testing/Internals.cpp

    r207669 r207764  
    8787#include "MallocStatistics.h"
    8888#include "MediaPlayer.h"
     89#include "MediaProducer.h"
    8990#include "MemoryCache.h"
    9091#include "MemoryInfo.h"
     
    29462947}
    29472948
    2948 void Internals::setPageMuted(bool muted)
     2949void Internals::setPageMuted(const String& states)
    29492950{
    29502951    Document* document = contextDocument();
     
    29522953        return;
    29532954
     2955    WebCore::MediaProducer::MutedStateFlags state = MediaProducer::NoneMuted;
     2956    Vector<String> stateString;
     2957    states.split(',', false, stateString);
     2958    for (auto& muteString : stateString) {
     2959        if (equalLettersIgnoringASCIICase(muteString, "audio"))
     2960            state |= MediaProducer::AudioIsMuted;
     2961        if (equalLettersIgnoringASCIICase(muteString, "capturedevices"))
     2962            state |= MediaProducer::CaptureDevicesAreMuted;
     2963    }
     2964
    29542965    if (Page* page = document->page())
    2955         page->setMuted(muted);
     2966        page->setMuted(state);
    29562967}
    29572968
  • trunk/Source/WebCore/testing/Internals.h

    r207521 r207764  
    441441    ExceptionOr<String> pageOverlayLayerTreeAsText() const;
    442442
    443     void setPageMuted(bool);
     443    void setPageMuted(const String&);
    444444    bool isPagePlayingAudio();
    445445
  • trunk/Source/WebCore/testing/Internals.idl

    r207521 r207764  
    418418    [MayThrowException] DOMString pageOverlayLayerTreeAsText();
    419419
    420     void setPageMuted(boolean muted);
     420    void setPageMuted(DOMString mutedState);
    421421    boolean isPagePlayingAudio();
    422422
  • trunk/Source/WebKit2/ChangeLog

    r207762 r207764  
     12016-10-24  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [MediaStream] Separate media capture and audio playback muting
     4        https://bugs.webkit.org/show_bug.cgi?id=163855
     5        <rdar://problem/28827186>
     6
     7        Reviewed by Darin Adler.
     8
     9        * Shared/WebPageCreationParameters.h: Change 'muted' from bool to MutedStateFlags.
     10
     11        * UIProcess/API/C/WKPage.cpp: Change parameter from bool to WKMediaMutedState.
     12        (WKPageSetMuted):
     13        * UIProcess/API/C/WKPagePrivate.h: Define WKMediaMutedState.
     14
     15        * UIProcess/WebPageProxy.cpp:
     16        (WebKit::WebPageProxy::WebPageProxy):
     17        (WebKit::WebPageProxy::setMuted): m_muted -> m_mutedState.
     18        (WebKit::WebPageProxy::creationParameters): Ditto.
     19        * UIProcess/WebPageProxy.h:
     20
     21        * WebProcess/Plugins/PluginView.cpp:
     22        (WebKit::PluginView::isMuted): page.isMuted -> page.mutedState.
     23
     24        * WebProcess/WebPage/WebPage.messages.in: Change SetMuted parameter.
     25
    1262016-10-24  Youenn Fablet  <youenn@apple.com>
    227
  • trunk/Source/WebKit2/Shared/WebPageCreationParameters.h

    r204668 r207764  
    3636#include <WebCore/FloatSize.h>
    3737#include <WebCore/IntSize.h>
     38#include <WebCore/MediaProducer.h>
    3839#include <WebCore/Pagination.h>
    3940#include <WebCore/ScrollTypes.h>
     
    100101   
    101102    float mediaVolume;
    102     bool muted;
     103    WebCore::MediaProducer::MutedStateFlags muted;
    103104    bool mayStartMediaWhenInWindow;
    104105
  • trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp

    r207558 r207764  
    26022602}
    26032603
    2604 void WKPageSetMuted(WKPageRef page, bool muted)
     2604void WKPageSetMuted(WKPageRef page, WKMediaMutedState muted)
    26052605{
    26062606    toImpl(page)->setMuted(muted);
  • trunk/Source/WebKit2/UIProcess/API/C/WKPagePrivate.h

    r205822 r207764  
    121121
    122122WK_EXPORT bool WKPageIsPlayingAudio(WKPageRef page);
    123 WK_EXPORT void WKPageSetMuted(WKPageRef page, bool muted);
     123
     124enum {
     125    kWKMediaNoneMuted = 0,
     126    kWKMediaAudioMuted = 1 << 0,
     127    kWKMediaCaptureDevicesMuted = 1 << 1,
     128};
     129typedef uint32_t WKMediaMutedState;
     130WK_EXPORT void WKPageSetMuted(WKPageRef page, WKMediaMutedState muted);
    124131
    125132enum {
     
    130137};
    131138typedef uint32_t WKMediaState;
     139
    132140
    133141WK_EXPORT WKMediaState WKPageGetMediaState(WKPageRef page);
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp

    r207706 r207764  
    445445    , m_autoSizingShouldExpandToViewHeight(false)
    446446    , m_mediaVolume(1)
    447     , m_muted(false)
    448447    , m_mayStartMediaWhenInWindow(true)
    449448    , m_waitingForDidUpdateViewState(false)
     
    15891588    // We should suppress if the page is not active, is visually idle, and supression is enabled.
    15901589    bool isLoading = m_pageLoadState.isLoading();
    1591     bool isPlayingAudio = m_mediaState & MediaProducer::IsPlayingAudio && !m_muted;
     1590    bool isPlayingAudio = m_mediaState & MediaProducer::IsPlayingAudio && !(m_mutedState & MediaProducer::AudioIsMuted);
    15921591    bool pageShouldBeSuppressed = !isLoading && !isPlayingAudio && processSuppressionEnabled && (m_viewState & ViewState::IsVisuallyIdle);
    15931592    if (m_pageSuppressed != pageShouldBeSuppressed) {
     
    41534152}
    41544153
    4155 void WebPageProxy::setMuted(bool muted)
    4156 {
    4157     if (m_muted == muted)
    4158         return;
    4159 
    4160     m_muted = muted;
    4161 
    4162     if (!isValid())
    4163         return;
    4164 
    4165     m_process->send(Messages::WebPage::SetMuted(muted), m_pageID);
     4154void WebPageProxy::setMuted(WebCore::MediaProducer::MutedStateFlags state)
     4155{
     4156    if (m_mutedState == state)
     4157        return;
     4158
     4159    m_mutedState = state;
     4160
     4161    if (!isValid())
     4162        return;
     4163
     4164    m_process->send(Messages::WebPage::SetMuted(state), m_pageID);
    41664165
    41674166    updateThrottleState();
     
    54845483    parameters.topContentInset = m_topContentInset;
    54855484    parameters.mediaVolume = m_mediaVolume;
    5486     parameters.muted = m_muted;
     5485    parameters.muted = m_mutedState;
    54875486    parameters.mayStartMediaWhenInWindow = m_mayStartMediaWhenInWindow;
    54885487    parameters.minimumLayoutSize = m_minimumLayoutSize;
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.h

    r207706 r207764  
    938938   
    939939    void setMediaVolume(float);
    940     void setMuted(bool);
     940    void setMuted(WebCore::MediaProducer::MutedStateFlags);
    941941    void setMayStartMediaWhenInWindow(bool);
    942942    bool mayStartMediaWhenInWindow() const { return m_mayStartMediaWhenInWindow; }
     
    18531853
    18541854    float m_mediaVolume;
    1855     bool m_muted;
     1855    WebCore::MediaProducer::MutedStateFlags m_mutedState { WebCore::MediaProducer::NoneMuted };
    18561856    bool m_mayStartMediaWhenInWindow;
    18571857
  • trunk/Source/WebKit2/WebProcess/Plugins/PluginView.cpp

    r207458 r207764  
    15321532        return false;
    15331533
    1534     return frame()->page()->isMuted();
     1534    return frame()->page()->isAudioMuted();
    15351535}
    15361536#endif
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in

    r207704 r207764  
    315315    # Media
    316316    SetMediaVolume(float volume)
    317     SetMuted(bool muted)
     317    SetMuted(WebCore::MediaProducer::MutedStateFlags muted)
    318318    SetMayStartMediaWhenInWindow(bool mayStartMedia)
    319319
Note: See TracChangeset for help on using the changeset viewer.