Changeset 186016 in webkit


Ignore:
Timestamp:
Jun 26, 2015, 4:33:21 PM (10 years ago)
Author:
eric.carlson@apple.com
Message:

[Mac] Muted videos should not automatically play to AppleTV
https://bugs.webkit.org/show_bug.cgi?id=146366

Reviewed by Dean Jackson.

  • html/HTMLMediaElement.cpp:

(WebCore::HTMLMediaElement::HTMLMediaElement): Initialize m_initiallyMuted.
(WebCore::HTMLMediaElement::scheduleDelayedAction): Support CheckMediaState.
(WebCore::HTMLMediaElement::setReadyState): Set m_initiallyMuted to true if the element is

muted or the volume is less than 5%.

(WebCore::HTMLMediaElement::setMuted): Update media state asynchronously so multiple state

changes can be coalesced.

(WebCore::HTMLMediaElement::mediaPlayerEngineUpdated): Ditto.
(WebCore::HTMLMediaElement::setPlaying): Ditto.
(WebCore::HTMLMediaElement::mediaPlayerCurrentPlaybackTargetIsWirelessChanged): Ditto.
(WebCore::HTMLMediaElement::removeEventListener): Ditto.
(WebCore::HTMLMediaElement::enqueuePlaybackTargetAvailabilityChangedEvent): Ditto.
(WebCore::HTMLMediaElement::updateMediaState): Update after a timer when passed UpdateMediaState::Asynchronously.
(WebCore::HTMLMediaElement::mediaState): Don't set the ExternalDeviceAutoPlayCandidate flag if

m_initiallyMuted is true.

  • html/HTMLMediaElement.h:
  • html/HTMLMediaElementEnums.h:
Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r186012 r186016  
     12015-06-26  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [Mac] Muted videos should not automatically play to AppleTV
     4        https://bugs.webkit.org/show_bug.cgi?id=146366
     5
     6        Reviewed by Dean Jackson.
     7
     8        * html/HTMLMediaElement.cpp:
     9        (WebCore::HTMLMediaElement::HTMLMediaElement): Initialize m_initiallyMuted.
     10        (WebCore::HTMLMediaElement::scheduleDelayedAction): Support CheckMediaState.
     11        (WebCore::HTMLMediaElement::setReadyState): Set m_initiallyMuted to true if the element is
     12          muted or the volume is less than 5%.
     13        (WebCore::HTMLMediaElement::setMuted): Update media state asynchronously so multiple state
     14          changes can be coalesced.
     15        (WebCore::HTMLMediaElement::mediaPlayerEngineUpdated): Ditto.
     16        (WebCore::HTMLMediaElement::setPlaying): Ditto.
     17        (WebCore::HTMLMediaElement::mediaPlayerCurrentPlaybackTargetIsWirelessChanged): Ditto.
     18        (WebCore::HTMLMediaElement::removeEventListener): Ditto.
     19        (WebCore::HTMLMediaElement::enqueuePlaybackTargetAvailabilityChangedEvent): Ditto.
     20        (WebCore::HTMLMediaElement::updateMediaState): Update after a timer when passed UpdateMediaState::Asynchronously.
     21        (WebCore::HTMLMediaElement::mediaState): Don't set the ExternalDeviceAutoPlayCandidate flag if
     22          m_initiallyMuted is true.
     23        * html/HTMLMediaElement.h:
     24        * html/HTMLMediaElementEnums.h:
     25
    1262015-06-26  Daniel Bates  <dabates@apple.com>
    227
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r186009 r186016  
    327327    , m_muted(false)
    328328    , m_explicitlyMuted(false)
     329    , m_initiallyMuted(false)
    329330    , m_paused(true)
    330331    , m_seeking(false)
     
    759760#endif
    760761
     762    if (actionType & CheckMediaState)
     763        setFlags(m_pendingActionFlags, CheckMediaState);
     764
    761765    m_pendingActionTimer.startOneShot(0);
    762766}
     
    808812        m_player->setShouldPlayToPlaybackTarget(false);
    809813    }
     814
     815    if (m_pendingActionFlags & CheckMediaState)
     816        updateMediaState();
    810817#endif
    811818
     
    20692076            enqueuePlaybackTargetAvailabilityChangedEvent();
    20702077#endif
    2071        
     2078        m_initiallyMuted = m_volume < 0.05 || muted();
     2079
    20722080        if (hasMediaControls())
    20732081            mediaControls()->loadedMetadata();
     
    30883096
    30893097#if ENABLE(WIRELESS_PLAYBACK_TARGET)
    3090         updateMediaState();
     3098        updateMediaState(UpdateMediaState::Asynchronously);
    30913099#endif
    30923100    }
     
    44034411#endif
    44044412#if ENABLE(WIRELESS_PLAYBACK_TARGET)
    4405     updateMediaState();
     4413    updateMediaState(UpdateMediaState::Asynchronously);
    44064414#endif
    44074415}
     
    47014709
    47024710#if ENABLE(WIRELESS_PLAYBACK_TARGET)
    4703     updateMediaState();
     4711    updateMediaState(UpdateMediaState::Asynchronously);
    47044712#endif
    47054713}
     
    49644972    configureMediaControls();
    49654973    scheduleEvent(eventNames().webkitcurrentplaybacktargetiswirelesschangedEvent);
    4966     updateMediaState();
     4974    updateMediaState(UpdateMediaState::Asynchronously);
    49674975}
    49684976
     
    50085016        m_hasPlaybackTargetAvailabilityListeners = false;
    50095017        m_mediaSession->setHasPlaybackTargetAvailabilityListeners(*this, false);
    5010         updateMediaState();
     5018        updateMediaState(UpdateMediaState::Asynchronously);
    50115019    }
    50125020
     
    50215029    event->setTarget(this);
    50225030    m_asyncEventQueue.enqueueEvent(event.release());
    5023     updateMediaState();
     5031    updateMediaState(UpdateMediaState::Asynchronously);
    50245032}
    50255033
     
    62966304
    62976305#if ENABLE(WIRELESS_PLAYBACK_TARGET)
    6298 void HTMLMediaElement::updateMediaState()
    6299 {
     6306void HTMLMediaElement::updateMediaState(UpdateMediaState updateState)
     6307{
     6308    if (updateState == UpdateMediaState::Asynchronously) {
     6309        scheduleDelayedAction(CheckMediaState);
     6310        return;
     6311    }
     6312
    63006313    MediaProducer::MediaStateFlags state = mediaState();
    63016314    if (m_mediaState == state)
     
    63226335
    63236336    bool requireUserGesture = m_mediaSession->hasBehaviorRestriction(MediaElementSession::RequireUserGestureToAutoplayToExternalDevice);
    6324     if (hasActiveVideo && (!requireUserGesture || (hasAudio && !loop())))
     6337    if (hasActiveVideo && (!requireUserGesture || (hasAudio && !m_initiallyMuted && !loop())))
    63256338        state |= ExternalDeviceAutoPlayCandidate;
    63266339#endif
  • trunk/Source/WebCore/html/HTMLMediaElement.h

    r185472 r186016  
    726726    virtual void documentWillSuspendForPageCache() override final;
    727727    virtual void documentDidResumeFromPageCache() override final;
    728     void updateMediaState();
     728
     729    enum class UpdateMediaState {
     730        Asynchronously,
     731        Synchronously,
     732    };
     733    void updateMediaState(UpdateMediaState updateState = UpdateMediaState::Synchronously);
    729734#endif
    730735
     
    838843    bool m_muted : 1;
    839844    bool m_explicitlyMuted : 1;
     845    bool m_initiallyMuted : 1;
    840846    bool m_paused : 1;
    841847    bool m_seeking : 1;
  • trunk/Source/WebCore/html/HTMLMediaElementEnums.h

    r184670 r186016  
    4141        ConfigureTextTrackDisplay = 1 << 3,
    4242        CheckPlaybackTargetCompatablity = 1 << 4,
     43        CheckMediaState = 1 << 5,
    4344
    44         EveryDelayedAction = LoadMediaResource | ConfigureTextTracks | TextTrackChangesNotification | ConfigureTextTrackDisplay | CheckPlaybackTargetCompatablity,
     45        EveryDelayedAction = LoadMediaResource | ConfigureTextTracks | TextTrackChangesNotification | ConfigureTextTrackDisplay | CheckPlaybackTargetCompatablity | CheckMediaState,
    4546    };
    4647
Note: See TracChangeset for help on using the changeset viewer.