Changeset 245467 in webkit


Ignore:
Timestamp:
May 17, 2019 9:39:09 AM (5 years ago)
Author:
eric.carlson@apple.com
Message:

Allow sequential playback of media files when initial playback started with a user gesture
https://bugs.webkit.org/show_bug.cgi?id=197959
<rdar://problem/50655207>

Reviewed by Youenn Fablet.

Source/WebCore:

Test: media/playlist-inherits-user-gesture.html

  • dom/Document.cpp:

(WebCore::Document::processingUserGestureForMedia const): Return true if it is within
one second of the last HTMLMediaElement 'ended' event.

  • dom/Document.h:

(WebCore::Document::mediaFinishedPlaying):

  • html/HTMLMediaElement.cpp:

(WebCore::HTMLMediaElement::parseAttribute): removeBehaviorsRestrictionsAfterFirstUserGesture ->
removeBehaviorRestrictionsAfterFirstUserGesture.
(WebCore::HTMLMediaElement::load): Ditto. Don't call removeBehaviorsRestrictionsAfterFirstUserGesture,
it will be done in prepareForLoad.
(WebCore::HTMLMediaElement::prepareForLoad): removeBehaviorsRestrictionsAfterFirstUserGesture ->
removeBehaviorRestrictionsAfterFirstUserGesture.
(WebCore::HTMLMediaElement::audioTrackEnabledChanged): Ditto.
(WebCore::HTMLMediaElement::play): Ditto.
(WebCore::HTMLMediaElement::pause): Ditto.
(WebCore::HTMLMediaElement::setVolume): Ditto.
(WebCore::HTMLMediaElement::setMuted): Ditto.
(WebCore::HTMLMediaElement::webkitShowPlaybackTargetPicker): Ditto.
(WebCore::HTMLMediaElement::dispatchEvent): Call document().mediaFinishedPlaying()
when dispatching the 'ended' event.
(WebCore::HTMLMediaElement::removeBehaviorRestrictionsAfterFirstUserGesture): Rename. Set
m_removedBehaviorRestrictionsAfterFirstUserGesture.
(WebCore::HTMLMediaElement::removeBehaviorsRestrictionsAfterFirstUserGesture): Deleted.

  • html/HTMLMediaElement.h:
  • html/HTMLVideoElement.cpp:

(WebCore:HTMLVideoElement::nativeImageForCurrentTime): Convert to runtime logging.
(WebCore:HTMLVideoElement::webkitEnterFullscreen): Ditto.
(WebCore:HTMLVideoElement::webkitSetPresentationMode): Ditto.
(WebCore:HTMLVideoElement::fullscreenModeChanged): Ditto.

  • html/MediaElementSession.cpp:

(WebCore::MediaElementSession::removeBehaviorRestriction): Update log message.

LayoutTests:

  • media/media-fullscreen.js: Insert a pause between tests to clear the user gesture

used in the first test.

  • media/playlist-inherits-user-gesture-expected.txt: Added.
  • media/playlist-inherits-user-gesture.html: Added.
Location:
trunk
Files:
2 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r245466 r245467  
     12019-05-17  Eric Carlson  <eric.carlson@apple.com>
     2
     3        Allow sequential playback of media files when initial playback started with a user gesture
     4        https://bugs.webkit.org/show_bug.cgi?id=197959
     5        <rdar://problem/50655207>
     6
     7        Reviewed by Youenn Fablet.
     8
     9        * media/media-fullscreen.js: Insert a pause between tests to clear the user gesture
     10        used in the first test.
     11        * media/playlist-inherits-user-gesture-expected.txt: Added.
     12        * media/playlist-inherits-user-gesture.html: Added.
     13
    1142019-05-17  Truitt Savell  <tsavell@apple.com>
    215
  • trunk/LayoutTests/media/media-fullscreen.js

    r220974 r245467  
    1515        if (movie.type == 'video')
    1616            testDOMException("mediaElement.webkitEnterFullScreen()", "DOMException.INVALID_STATE_ERR");
    17         openNextMovie();
     17
     18        // A user gesture will transfer across setTimeout for 1 second, so pause to let that
     19        // expire before opening the next movie.
     20        setTimeout(openNextMovie, 1010);
    1821    }
    1922}
     
    6366
    6467    consoleWrite("* event handler NOT triggered by a user gesture");
    65 
    6668    if (movie.type == 'video') {
    6769        testExpected("mediaElement.webkitSupportsFullscreen", movie.supportsFS);
     
    8183
    8284    // Click on the button
    83     if (window.testRunner)
    84         setTimeout(clickEnterFullscreenButton, 10);
    85     else
    86         openNextMovie();
     85    runWithKeyDown(clickEnterFullscreenButton);
    8786}
    8887
  • trunk/Source/WebCore/ChangeLog

    r245464 r245467  
     12019-05-17  Eric Carlson  <eric.carlson@apple.com>
     2
     3        Allow sequential playback of media files when initial playback started with a user gesture
     4        https://bugs.webkit.org/show_bug.cgi?id=197959
     5        <rdar://problem/50655207>
     6
     7        Reviewed by Youenn Fablet.
     8
     9        Test: media/playlist-inherits-user-gesture.html
     10
     11        * dom/Document.cpp:
     12        (WebCore::Document::processingUserGestureForMedia const): Return true if it is within
     13        one second of the last HTMLMediaElement 'ended' event.
     14        * dom/Document.h:
     15        (WebCore::Document::mediaFinishedPlaying):
     16
     17        * html/HTMLMediaElement.cpp:
     18        (WebCore::HTMLMediaElement::parseAttribute): removeBehaviorsRestrictionsAfterFirstUserGesture ->
     19        removeBehaviorRestrictionsAfterFirstUserGesture.
     20        (WebCore::HTMLMediaElement::load): Ditto. Don't call removeBehaviorsRestrictionsAfterFirstUserGesture,
     21        it will be done in prepareForLoad.
     22        (WebCore::HTMLMediaElement::prepareForLoad): removeBehaviorsRestrictionsAfterFirstUserGesture ->
     23        removeBehaviorRestrictionsAfterFirstUserGesture.
     24        (WebCore::HTMLMediaElement::audioTrackEnabledChanged): Ditto.
     25        (WebCore::HTMLMediaElement::play): Ditto.
     26        (WebCore::HTMLMediaElement::pause): Ditto.
     27        (WebCore::HTMLMediaElement::setVolume): Ditto.
     28        (WebCore::HTMLMediaElement::setMuted): Ditto.
     29        (WebCore::HTMLMediaElement::webkitShowPlaybackTargetPicker): Ditto.
     30        (WebCore::HTMLMediaElement::dispatchEvent): Call document().mediaFinishedPlaying()
     31        when dispatching the 'ended' event.
     32        (WebCore::HTMLMediaElement::removeBehaviorRestrictionsAfterFirstUserGesture): Rename. Set
     33        m_removedBehaviorRestrictionsAfterFirstUserGesture.
     34        (WebCore::HTMLMediaElement::removeBehaviorsRestrictionsAfterFirstUserGesture): Deleted.
     35        * html/HTMLMediaElement.h:
     36       
     37        * html/HTMLVideoElement.cpp:
     38        (WebCore:HTMLVideoElement::nativeImageForCurrentTime): Convert to runtime logging.
     39        (WebCore:HTMLVideoElement::webkitEnterFullscreen): Ditto.
     40        (WebCore:HTMLVideoElement::webkitSetPresentationMode): Ditto.
     41        (WebCore:HTMLVideoElement::fullscreenModeChanged): Ditto.
     42
     43        * html/MediaElementSession.cpp:
     44        (WebCore::MediaElementSession::removeBehaviorRestriction): Update log message.
     45
    1462019-05-17  Brent Fulgham  <bfulgham@apple.com>
    247
  • trunk/Source/WebCore/dom/Document.cpp

    r245368 r245467  
    329329static const unsigned cMaxWriteRecursionDepth = 21;
    330330bool Document::hasEverCreatedAnAXObjectCache = false;
     331static const Seconds maxIntervalForUserGestureForwardingAfterMediaFinishesPlaying { 1_s };
    331332
    332333// DOM Level 2 says (letters added):
     
    65776578        return true;
    65786579
     6580    if (m_userActivatedMediaFinishedPlayingTimestamp + maxIntervalForUserGestureForwardingAfterMediaFinishesPlaying >= MonotonicTime::now())
     6581        return true;
     6582
    65796583    if (settings().mediaUserGestureInheritsFromDocument())
    65806584        return topDocument().hasHadUserInteraction();
  • trunk/Source/WebCore/dom/Document.h

    r245368 r245467  
    12221222    void updateLastHandledUserGestureTimestamp(MonotonicTime);
    12231223    bool processingUserGestureForMedia() const;
     1224    void userActivatedMediaFinishedPlaying() { m_userActivatedMediaFinishedPlayingTimestamp = MonotonicTime::now(); }
    12241225
    12251226    void setUserDidInteractWithPage(bool userDidInteractWithPage) { ASSERT(&topDocument() == this); m_userDidInteractWithPage = userDidInteractWithPage; }
     
    18361837
    18371838    MonotonicTime m_lastHandledUserGestureTimestamp;
     1839    MonotonicTime m_userActivatedMediaFinishedPlayingTimestamp;
    18381840
    18391841    void clearScriptedAnimationController();
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r245039 r245467  
    840840    else if (name == autoplayAttr) {
    841841        if (processingUserGestureForMedia())
    842             removeBehaviorsRestrictionsAfterFirstUserGesture();
     842            removeBehaviorRestrictionsAfterFirstUserGesture();
    843843    } else if (name == titleAttr) {
    844844        if (m_mediaSession)
     
    11791179    INFO_LOG(LOGIDENTIFIER);
    11801180
    1181     if (processingUserGestureForMedia())
    1182         removeBehaviorsRestrictionsAfterFirstUserGesture();
    1183 
    11841181    prepareForLoad();
    11851182    m_resourceSelectionTaskQueue.enqueueTask([this] {
     
    11941191    // 12 February 2017
    11951192
    1196     INFO_LOG(LOGIDENTIFIER);
     1193    ALWAYS_LOG(LOGIDENTIFIER, "gesture = ", processingUserGestureForMedia());
     1194
     1195    if (processingUserGestureForMedia())
     1196        removeBehaviorRestrictionsAfterFirstUserGesture();
    11971197
    11981198    // 1 - Abort any already-running instance of the resource selection algorithm for this element.
     
    19521952        m_audioTracks->scheduleChangeEvent();
    19531953    if (processingUserGestureForMedia())
    1954         removeBehaviorsRestrictionsAfterFirstUserGesture(MediaElementSession::AllRestrictions & ~MediaElementSession::RequireUserGestureToControlControlsManager);
     1954        removeBehaviorRestrictionsAfterFirstUserGesture(MediaElementSession::AllRestrictions & ~MediaElementSession::RequireUserGestureToControlControlsManager);
    19551955}
    19561956
     
    35163516
    35173517    if (processingUserGestureForMedia())
    3518         removeBehaviorsRestrictionsAfterFirstUserGesture();
     3518        removeBehaviorRestrictionsAfterFirstUserGesture();
    35193519
    35203520    m_pendingPlayPromises.append(WTFMove(promise));
     
    35333533    }
    35343534    if (processingUserGestureForMedia())
    3535         removeBehaviorsRestrictionsAfterFirstUserGesture();
     3535        removeBehaviorRestrictionsAfterFirstUserGesture();
    35363536
    35373537    playInternal();
     
    36343634
    36353635    if (processingUserGestureForMedia())
    3636         removeBehaviorsRestrictionsAfterFirstUserGesture(MediaElementSession::RequireUserGestureToControlControlsManager);
     3636        removeBehaviorRestrictionsAfterFirstUserGesture(MediaElementSession::RequireUserGestureToControlControlsManager);
    36373637
    36383638    pauseInternal();
     
    37453745#if !PLATFORM(IOS_FAMILY)
    37463746    if (volume && processingUserGestureForMedia())
    3747         removeBehaviorsRestrictionsAfterFirstUserGesture(MediaElementSession::AllRestrictions & ~MediaElementSession::RequireUserGestureToControlControlsManager);
     3747        removeBehaviorRestrictionsAfterFirstUserGesture(MediaElementSession::AllRestrictions & ~MediaElementSession::RequireUserGestureToControlControlsManager);
    37483748
    37493749    m_volume = volume;
     
    37843784    if (mutedStateChanged || !m_explicitlyMuted) {
    37853785        if (processingUserGestureForMedia()) {
    3786             removeBehaviorsRestrictionsAfterFirstUserGesture(MediaElementSession::AllRestrictions & ~MediaElementSession::RequireUserGestureToControlControlsManager);
     3786            removeBehaviorRestrictionsAfterFirstUserGesture(MediaElementSession::AllRestrictions & ~MediaElementSession::RequireUserGestureToControlControlsManager);
    37873787
    37883788            if (hasAudio() && muted)
     
    58795879    ALWAYS_LOG(LOGIDENTIFIER);
    58805880    if (processingUserGestureForMedia())
    5881         removeBehaviorsRestrictionsAfterFirstUserGesture();
     5881        removeBehaviorRestrictionsAfterFirstUserGesture();
    58825882    m_mediaSession->showPlaybackTargetPicker();
    58835883}
     
    59175917{
    59185918    DEBUG_LOG(LOGIDENTIFIER, event.type());
     5919
     5920    if (m_removedBehaviorRestrictionsAfterFirstUserGesture && event.type() == eventNames().endedEvent)
     5921        document().userActivatedMediaFinishedPlaying();
    59195922
    59205923    HTMLElement::dispatchEvent(event);
     
    72087211#endif
    72097212
    7210 void HTMLMediaElement::removeBehaviorsRestrictionsAfterFirstUserGesture(MediaElementSession::BehaviorRestrictions mask)
     7213void HTMLMediaElement::removeBehaviorRestrictionsAfterFirstUserGesture(MediaElementSession::BehaviorRestrictions mask)
    72117214{
    72127215    MediaElementSession::BehaviorRestrictions restrictionsToRemove = mask &
     
    72227225        | MediaElementSession::InvisibleAutoplayNotPermitted
    72237226        | MediaElementSession::RequireUserGestureToControlControlsManager);
     7227
     7228    m_removedBehaviorRestrictionsAfterFirstUserGesture = true;
    72247229
    72257230    m_mediaSession->removeBehaviorRestriction(restrictionsToRemove);
  • trunk/Source/WebCore/html/HTMLMediaElement.h

    r245039 r245467  
    563563    const Logger& logger() const final { return *m_logger.get(); }
    564564    const void* logIdentifier() const final { return m_logIdentifier; }
     565    const char* logClassName() const final { return "HTMLMediaElement"; }
    565566    WTFLogChannel& logChannel() const final;
    566567#endif
     
    852853    void changeNetworkStateFromLoadingToIdle();
    853854
    854     void removeBehaviorsRestrictionsAfterFirstUserGesture(MediaElementSession::BehaviorRestrictions mask = MediaElementSession::AllRestrictions);
     855    void removeBehaviorRestrictionsAfterFirstUserGesture(MediaElementSession::BehaviorRestrictions mask = MediaElementSession::AllRestrictions);
    855856
    856857    void updateMediaController();
     
    943944
    944945#if !RELEASE_LOG_DISABLED
    945     const char* logClassName() const final { return "HTMLMediaElement"; }
    946 
    947946    const void* mediaPlayerLogIdentifier() final { return logIdentifier(); }
    948947    const Logger& mediaPlayerLogger() final { return logger(); }
     
    12021201    bool m_isPlayingToWirelessTarget { false };
    12031202    bool m_playingOnSecondScreen { false };
     1203    bool m_removedBehaviorRestrictionsAfterFirstUserGesture { false };
    12041204};
    12051205
  • trunk/Source/WebCore/html/HTMLVideoElement.cpp

    r237266 r245467  
    319319ExceptionOr<void> HTMLVideoElement::webkitEnterFullscreen()
    320320{
    321     LOG(Media, "HTMLVideoElement::webkitEnterFullscreen(%p)", this);
     321    ALWAYS_LOG(LOGIDENTIFIER);
    322322    if (isFullscreen())
    323323        return { };
     
    334334void HTMLVideoElement::webkitExitFullscreen()
    335335{
    336     LOG(Media, "HTMLVideoElement::webkitExitFullscreen(%p)", this);
     336    ALWAYS_LOG(LOGIDENTIFIER);
    337337    if (isFullscreen())
    338338        exitFullscreen();
     
    444444void HTMLVideoElement::webkitSetPresentationMode(VideoPresentationMode mode)
    445445{
    446     LOG(Media, "HTMLVideoElement::webkitSetPresentationMode(%p) - %d", this, mode);
     446    ALWAYS_LOG(LOGIDENTIFIER, mode);
    447447    setFullscreenMode(toFullscreenMode(mode));
    448448}
     
    484484{
    485485    if (mode != fullscreenMode()) {
    486         LOG(Media, "HTMLVideoElement::fullscreenModeChanged(%p) - mode changed from %i to %i", this, fullscreenMode(), mode);
     486        ALWAYS_LOG(LOGIDENTIFIER, "changed from ", fullscreenMode(), ", to ", mode);
    487487        scheduleEvent(eventNames().webkitpresentationmodechangedEvent);
    488488    }
  • trunk/Source/WebCore/html/MediaElementSession.cpp

    r245199 r245467  
    243243        return;
    244244
    245     INFO_LOG(LOGIDENTIFIER, "removing ", restrictionNames(m_restrictions & restriction));
     245    INFO_LOG(LOGIDENTIFIER, "removed ", restrictionNames(m_restrictions & restriction));
    246246    m_restrictions &= ~restriction;
    247247}
Note: See TracChangeset for help on using the changeset viewer.