Changeset 261409 in webkit


Ignore:
Timestamp:
May 8, 2020 1:27:45 PM (4 years ago)
Author:
Ryan Haddad
Message:

Unreviewed, reverting r261341 and r261392.

Caused multiple regression test failures

Reverted changesets:

"Poster set after playback begins should be ignored"
https://bugs.webkit.org/show_bug.cgi?id=211464
https://trac.webkit.org/changeset/261341

"REGRESSION(r261341): imported/w3c/web-platform-
tests/html/semantics/embedded-content/the-video-
element/intrinsic_sizes.htm is failing"
https://bugs.webkit.org/show_bug.cgi?id=211612
https://trac.webkit.org/changeset/261392

Location:
trunk
Files:
2 deleted
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r261406 r261409  
     12020-05-08  Ryan Haddad  <ryanhaddad@apple.com>
     2
     3        Unreviewed, reverting r261341 and r261392.
     4
     5        Caused multiple regression test failures
     6
     7        Reverted changesets:
     8
     9        "Poster set after playback begins should be ignored"
     10        https://bugs.webkit.org/show_bug.cgi?id=211464
     11        https://trac.webkit.org/changeset/261341
     12
     13        "REGRESSION(r261341): imported/w3c/web-platform-
     14        tests/html/semantics/embedded-content/the-video-
     15        element/intrinsic_sizes.htm is failing"
     16        https://bugs.webkit.org/show_bug.cgi?id=211612
     17        https://trac.webkit.org/changeset/261392
     18
    1192020-05-08  Darin Adler  <darin@apple.com>
    220
  • trunk/LayoutTests/TestExpectations

    r261392 r261409  
    278278
    279279webkit.org/b/176929 imported/w3c/web-platform-tests/html/semantics/embedded-content/media-elements/ready-states/autoplay-with-slow-text-tracks.html [ Pass Failure ]
    280 
    281 webkit.org/b/211630 imported/w3c/web-platform-tests/html/semantics/embedded-content/the-video-element/intrinsic_sizes.htm [ Pass Failure ]
    282280
    283281# Requires BroadcastChannel.
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r261399 r261409  
     12020-05-08  Ryan Haddad  <ryanhaddad@apple.com>
     2
     3        Unreviewed, reverting r261341 and r261392.
     4
     5        Caused multiple regression test failures
     6
     7        Reverted changesets:
     8
     9        "Poster set after playback begins should be ignored"
     10        https://bugs.webkit.org/show_bug.cgi?id=211464
     11        https://trac.webkit.org/changeset/261341
     12
     13        "REGRESSION(r261341): imported/w3c/web-platform-
     14        tests/html/semantics/embedded-content/the-video-
     15        element/intrinsic_sizes.htm is failing"
     16        https://bugs.webkit.org/show_bug.cgi?id=211612
     17        https://trac.webkit.org/changeset/261392
     18
    1192020-05-08  Rob Buis  <rbuis@igalia.com>
    220
  • trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/the-video-element/intrinsic_sizes-expected.txt

    r261341 r261409  
    66PASS default height is half the width
    77PASS default width is twice the height
    8 FAIL default object size after src is removed assert_equals: expected "300px" but got "320px"
     8FAIL default object size after src is removed assert_equals: expected "320px" but got "300px"
    99FAIL default object size after poster is removed assert_equals: expected "102px" but got "300px"
    1010
  • trunk/Source/WebCore/ChangeLog

    r261402 r261409  
     12020-05-08  Ryan Haddad  <ryanhaddad@apple.com>
     2
     3        Unreviewed, reverting r261341 and r261392.
     4
     5        Caused multiple regression test failures
     6
     7        Reverted changesets:
     8
     9        "Poster set after playback begins should be ignored"
     10        https://bugs.webkit.org/show_bug.cgi?id=211464
     11        https://trac.webkit.org/changeset/261341
     12
     13        "REGRESSION(r261341): imported/w3c/web-platform-
     14        tests/html/semantics/embedded-content/the-video-
     15        element/intrinsic_sizes.htm is failing"
     16        https://bugs.webkit.org/show_bug.cgi?id=211612
     17        https://trac.webkit.org/changeset/261392
     18
    1192020-05-08  Alex Christensen  <achristensen@webkit.org>
    220
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r261341 r261409  
    448448    , m_haveSetUpCaptionContainer(false)
    449449    , m_isScrubbingRemotely(false)
    450     , m_showPoster(true)
    451450#if ENABLE(VIDEO_TRACK)
    452451    , m_tracksAreReady(true)
     
    11421141    m_completelyLoaded = false;
    11431142    m_havePreparedToPlay = false;
     1143    m_displayMode = Unknown;
    11441144    m_currentSrc = URL();
    11451145
     
    12471247
    12481248    // 2. Set the element’s show poster flag to true.
    1249     setShowPosterFlag(true);
     1249    setDisplayMode(Poster);
    12501250
    12511251    // 3. Set the media element’s delaying-the-load-event flag to true (this delays the load event).
     
    14951495    m_player->setPrivateBrowsingMode(privateMode);
    14961496
     1497    // Reset display mode to force a recalculation of what to show because we are resetting the player.
     1498    setDisplayMode(Unknown);
     1499
    14971500    if (!autoplay() && !m_havePreparedToPlay)
    14981501        m_player->setPreload(m_mediaSession->effectivePreloadForElement());
     
    15481551        mediaLoadingFailed(MediaPlayer::NetworkState::FormatError);
    15491552
    1550     mediaPlayerRenderingModeChanged();
     1553    // If there is no poster to display, allow the media engine to render video frames as soon as
     1554    // they are available.
     1555    updateDisplayState();
     1556
     1557    updateRenderer();
    15511558}
    15521559
     
    20412048    m_networkState = NETWORK_NO_SOURCE;
    20422049
    2043     // 6.18 - Set the element's show poster flag to true.
    2044     setShowPosterFlag(true);
    2045 
    2046     // 6.19 -  Queue a media element task given the media element given the element to set the
    2047     // element's delaying-the-load-event flag to false. This stops delaying the load event.
    2048     // FIXME: this should be done in a task queue
     2050    // 6.18 - Set the element's delaying-the-load-event flag to false. This stops delaying the load event.
    20492051    setShouldDelayLoadEvent(false);
    20502052
     2053    updateDisplayState();
    20512054    updateRenderer();
    20522055}
     
    20772080    m_networkState = NETWORK_NO_SOURCE;
    20782081
    2079     // 6.4 - Set the element's show poster flag to true.
    2080     setShowPosterFlag(true);
    2081 
    20822082    // 7 - Queue a task to fire a simple event named error at the media element.
    20832083    scheduleEvent(eventNames().errorEvent);
     
    20952095    // the element won't attempt to load another resource.
    20962096
     2097    updateDisplayState();
    20972098    updateRenderer();
    20982099}
     
    22072208    else if ((error == MediaPlayer::NetworkState::FormatError || error == MediaPlayer::NetworkState::NetworkError) && m_loadState == LoadingFromSrcAttr)
    22082209        noneSupported();
     2210
     2211    updateDisplayState();
    22092212
    22102213    ERROR_LOG(LOGIDENTIFIER, "error = ", static_cast<int>(error));
     
    24142417    }
    24152418
     2419    bool shouldUpdateDisplayState = false;
     2420
    24162421    if (m_readyState >= HAVE_CURRENT_DATA && oldState < HAVE_CURRENT_DATA) {
    24172422        if (!m_haveFiredLoadedData) {
     
    24212426            // because m_haveFiredLoadedData is already true. At one time we were skipping
    24222427            // the call to setShouldDelayLoadEvent, which was definitely incorrect.
     2428            shouldUpdateDisplayState = true;
    24232429            applyMediaFragmentURI();
    24242430        }
     
    24262432    }
    24272433
    2428     if (m_readyState == HAVE_FUTURE_DATA && oldState <= HAVE_CURRENT_DATA && tracksAreReady)
     2434    if (m_readyState == HAVE_FUTURE_DATA && oldState <= HAVE_CURRENT_DATA && tracksAreReady) {
    24292435        scheduleEvent(eventNames().canplayEvent);
     2436        shouldUpdateDisplayState = true;
     2437    }
    24302438
    24312439    if (m_readyState == HAVE_ENOUGH_DATA && oldState < HAVE_ENOUGH_DATA && tracksAreReady) {
     
    24382446        if (success) {
    24392447            m_paused = false;
    2440             setShowPosterFlag(false);
    24412448            invalidateCachedTime();
    24422449            setAutoplayEventPlaybackState(AutoplayEventPlaybackState::StartedWithoutUserGesture);
     
    24472454            setAutoplayEventPlaybackState(AutoplayEventPlaybackState::PreventedAutoplay);
    24482455        }
     2456
     2457        shouldUpdateDisplayState = true;
    24492458    }
    24502459
     
    24592468        setAutoplayEventPlaybackState(AutoplayEventPlaybackState::PreventedAutoplay);
    24602469    }
     2470
     2471    if (shouldUpdateDisplayState)
     2472        updateDisplayState();
    24612473
    24622474    updatePlayState();
     
    28832895
    28842896    // 1 - Set the media element's show poster flag to false.
    2885     setShowPosterFlag(false);
     2897    setDisplayMode(Video);
    28862898
    28872899    // 2 - If the media element's readyState is HAVE_NOTHING, abort these steps.
     
    29822994    // poster display), or 2) if there is a pending fast seek, or 3) if this seek is not an exact seek
    29832995    SeekType thisSeekType = (negativeTolerance == MediaTime::zeroTime() && positiveTolerance == MediaTime::zeroTime()) ? Precise : Fast;
    2984     if (!noSeekRequired && time == now && thisSeekType == Precise && m_pendingSeekType != Fast && !showPosterFlag())
     2996    if (!noSeekRequired && time == now && thisSeekType == Precise && m_pendingSeekType != Fast && displayMode() != Poster)
    29852997        noSeekRequired = true;
    29862998
     
    34633475    if (m_paused) {
    34643476        m_paused = false;
    3465         setShowPosterFlag(false);
    34663477        invalidateCachedTime();
    34673478
     
    49294940{
    49304941    beginProcessingMediaPlayerCallback();
     4942    updateDisplayState();
    49314943    if (auto* renderer = this->renderer())
    49324944        renderer->repaint();
     
    50535065}
    50545066
     5067void HTMLMediaElement::mediaPlayerFirstVideoFrameAvailable()
     5068{
     5069    INFO_LOG(LOGIDENTIFIER, "current display mode = ", (int)displayMode());
     5070
     5071    beginProcessingMediaPlayerCallback();
     5072    if (displayMode() == PosterWaitingForVideo) {
     5073        setDisplayMode(Video);
     5074        mediaPlayerRenderingModeChanged();
     5075    }
     5076    endProcessingMediaPlayerCallback();
     5077}
     5078
    50555079void HTMLMediaElement::mediaPlayerCharacteristicChanged()
    50565080{
     
    50645088#endif
    50655089
    5066     if (potentiallyPlaying())
     5090    if (potentiallyPlaying() && displayMode() == PosterWaitingForVideo) {
     5091        setDisplayMode(Video);
    50675092        mediaPlayerRenderingModeChanged();
     5093    }
    50685094
    50695095    updateRenderer();
     
    53065332        schedulePlaybackControlsManagerUpdate();
    53075333
     5334        setDisplayMode(Video);
    53085335        invalidateCachedTime();
    53095336
     
    54425469
    54435470    // 4 - If the media element's readyState attribute has a value equal to HAVE_NOTHING, set the
    5444     // element's networkState attribute to the NETWORK_EMPTY value, set the element's show poster
    5445     // flag to true, and fire an event named emptied at the element.
     5471    // element's networkState attribute to the NETWORK_EMPTY value and queue a task to fire a
     5472    // simple event named emptied at the element. Otherwise, set the element's networkState
     5473    // attribute to the NETWORK_IDLE value.
    54465474    if (m_readyState == HAVE_NOTHING) {
    54475475        m_networkState = NETWORK_EMPTY;
    5448         setShowPosterFlag(true);
    54495476        scheduleEvent(eventNames().emptiedEvent);
    54505477    }
  • trunk/Source/WebCore/html/HTMLMediaElement.h

    r261341 r261409  
    600600    void didMoveToNewDocument(Document& oldDocument, Document& newDocument) override;
    601601
     602    enum DisplayMode { Unknown, None, Poster, PosterWaitingForVideo, Video };
     603    DisplayMode displayMode() const { return m_displayMode; }
     604    virtual void setDisplayMode(DisplayMode mode) { m_displayMode = mode; }
     605   
    602606    bool isMediaElement() const final { return true; }
    603607
     
    611615
    612616    void scheduleEvent(const AtomString&);
    613 
    614     bool showPosterFlag() const { return m_showPoster; }
    615     void setShowPosterFlag(bool flag) { m_showPoster = flag; }
    616617
    617618private:
     
    643644    void visibilityStateChanged() final;
    644645
     646    virtual void updateDisplayState() { }
     647   
    645648    void setReadyState(MediaPlayer::ReadyState);
    646649    void setNetworkState(MediaPlayer::NetworkState);
     
    668671    void mediaEngineWasUpdated();
    669672
     673    void mediaPlayerFirstVideoFrameAvailable() final;
    670674    void mediaPlayerCharacteristicChanged() final;
    671675
     
    10311035    MediaPlayer::Preload m_preload { Preload::Auto };
    10321036
     1037    DisplayMode m_displayMode { Unknown };
     1038
    10331039    // Counter incremented while processing a callback from the media player, so we can avoid
    10341040    // calling the media engine recursively.
     
    11081114    bool m_waitingToEnterFullscreen : 1;
    11091115
    1110     bool m_showPoster : 1;
    1111 
    11121116#if ENABLE(VIDEO_TRACK)
    11131117    bool m_tracksAreReady : 1;
  • trunk/Source/WebCore/html/HTMLVideoElement.cpp

    r261341 r261409  
    103103    HTMLMediaElement::didAttachRenderers();
    104104
     105    updateDisplayState();
    105106    if (shouldDisplayPosterImage()) {
    106107        if (!m_imageLoader)
     
    132133{
    133134    if (name == posterAttr) {
     135        // Force a poster recalc by setting m_displayMode to Unknown directly before calling updateDisplayState.
     136        HTMLMediaElement::setDisplayMode(Unknown);
     137        updateDisplayState();
     138
    134139        if (shouldDisplayPosterImage()) {
    135140            if (!m_imageLoader)
     
    137142            m_imageLoader->updateFromElementIgnoringPreviousError();
    138143        } else {
    139             if (auto* renderer = this->renderer()) {
     144            if (auto* renderer = this->renderer())
    140145                renderer->imageResource().setCachedImage(nullptr);
    141                 renderer->updateFromElement();
    142             }
    143146        }
    144147    }
     
    159162#endif
    160163    }
     164
    161165}
    162166
     
    248252}
    249253
    250 bool HTMLVideoElement::shouldDisplayPosterImage() const
    251 {
    252     if (!showPosterFlag())
    253         return false;
    254 
     254void HTMLVideoElement::setDisplayMode(DisplayMode mode)
     255{
     256    DisplayMode oldMode = displayMode();
     257    URL poster = posterImageURL();
     258
     259    if (!poster.isEmpty()) {
     260        // We have a poster path, but only show it until the user triggers display by playing or seeking and the
     261        // media engine has something to display.
     262        if (mode == Video) {
     263            if (oldMode != Video && player())
     264                player()->prepareForRendering();
     265            if (!hasAvailableVideoFrame())
     266                mode = PosterWaitingForVideo;
     267        }
     268    } else if (oldMode != Video && player())
     269        player()->prepareForRendering();
     270
     271    HTMLMediaElement::setDisplayMode(mode);
     272
     273    if (auto* renderer = this->renderer()) {
     274        if (displayMode() != oldMode)
     275            renderer->updateFromElement();
     276    }
     277}
     278
     279void HTMLVideoElement::updateDisplayState()
     280{
    255281    if (posterImageURL().isEmpty())
    256         return false;
    257 
    258     auto* renderer = this->renderer();
    259     if (renderer && renderer->failedToLoadPosterImage())
    260         return false;
    261 
    262     return true;
    263 }
    264 
    265 void HTMLVideoElement::mediaPlayerFirstVideoFrameAvailable()
    266 {
    267     INFO_LOG(LOGIDENTIFIER, "m_showPoster = ", showPosterFlag());
    268 
    269     if (showPosterFlag())
    270         return;
    271 
    272     invalidateStyleAndLayerComposition();
    273 
    274     if (auto player = this->player())
    275         player->prepareForRendering();
    276 
    277     if (auto* renderer = this->renderer())
    278         renderer->updateFromElement();
     282        setDisplayMode(Video);
     283    else if (displayMode() < Poster)
     284        setDisplayMode(Poster);
    279285}
    280286
  • trunk/Source/WebCore/html/HTMLVideoElement.h

    r261341 r261409  
    7777    bool copyVideoTextureToPlatformTexture(GraphicsContextGLOpenGL*, PlatformGLObject texture, GCGLenum target, GCGLint level, GCGLenum internalFormat, GCGLenum format, GCGLenum type, bool premultiplyAlpha, bool flipY);
    7878
    79     WEBCORE_EXPORT bool shouldDisplayPosterImage() const;
     79    bool shouldDisplayPosterImage() const { return displayMode() == Poster || displayMode() == PosterWaitingForVideo; }
    8080
    8181    URL posterImageURL() const;
     
    123123    const AtomString& imageSourceURL() const final;
    124124
     125    bool hasAvailableVideoFrame() const;
     126    void updateDisplayState() final;
    125127    void didMoveToNewDocument(Document& oldDocument, Document& newDocument) final;
    126 
    127     bool hasAvailableVideoFrame() const;
    128     void mediaPlayerFirstVideoFrameAvailable() final;
     128    void setDisplayMode(DisplayMode) final;
    129129
    130130    PlatformMediaSession::MediaType presentationType() const final { return PlatformMediaSession::MediaType::Video; }
  • trunk/Source/WebCore/rendering/RenderVideo.cpp

    r261341 r261409  
    180180}
    181181
    182 bool RenderVideo::failedToLoadPosterImage() const
    183 {
    184     return imageResource().errorOccurred();
    185 }
    186 
    187182void RenderVideo::paintReplaced(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
    188183{
  • trunk/Source/WebCore/rendering/RenderVideo.h

    r261341 r261409  
    5151
    5252    bool shouldDisplayVideo() const;
    53     bool failedToLoadPosterImage() const;
    5453
    5554    void updateFromElement() final;
  • trunk/Source/WebCore/testing/Internals.cpp

    r261368 r261409  
    43394339}
    43404340
    4341 ExceptionOr<bool> Internals::elementShouldDisplayPosterImage(HTMLVideoElement& element) const
    4342 {
    4343 #if ENABLE(VIDEO)
    4344     return element.shouldDisplayPosterImage();
    4345 #else
    4346     UNUSED_PARAM(element);
    4347     return Exception { InvalidAccessError };
    4348 #endif
    4349 }
    43504341
    43514342#if ENABLE(WIRELESS_PLAYBACK_TARGET)
  • trunk/Source/WebCore/testing/Internals.h

    r261341 r261409  
    865865    ExceptionOr<MediaUsageState> mediaUsageState(HTMLMediaElement&) const;
    866866
    867     ExceptionOr<bool> elementShouldDisplayPosterImage(HTMLVideoElement&) const;
    868 
    869867#if ENABLE(VIDEO)
    870868    using PlaybackControlsPurpose = MediaElementSession::PlaybackControlsPurpose;
  • trunk/Source/WebCore/testing/Internals.idl

    r261341 r261409  
    841841
    842842    [Conditional=VIDEO, MayThrowException] MediaUsageState mediaUsageState(HTMLMediaElement element);
    843     [Conditional=VIDEO, MayThrowException] boolean elementShouldDisplayPosterImage(HTMLVideoElement element);
    844843
    845844    DOMString ongoingLoadsDescriptions();
Note: See TracChangeset for help on using the changeset viewer.