Changeset 261409 in webkit
- Timestamp:
- May 8, 2020 1:27:45 PM (4 years ago)
- Location:
- trunk
- Files:
-
- 2 deleted
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r261406 r261409 1 2020-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 1 19 2020-05-08 Darin Adler <darin@apple.com> 2 20 -
trunk/LayoutTests/TestExpectations
r261392 r261409 278 278 279 279 webkit.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 ]282 280 283 281 # Requires BroadcastChannel. -
trunk/LayoutTests/imported/w3c/ChangeLog
r261399 r261409 1 2020-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 1 19 2020-05-08 Rob Buis <rbuis@igalia.com> 2 20 -
trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/the-video-element/intrinsic_sizes-expected.txt
r261341 r261409 6 6 PASS default height is half the width 7 7 PASS default width is twice the height 8 FAIL default object size after src is removed assert_equals: expected "3 00px" but got "320px"8 FAIL default object size after src is removed assert_equals: expected "320px" but got "300px" 9 9 FAIL default object size after poster is removed assert_equals: expected "102px" but got "300px" 10 10 -
trunk/Source/WebCore/ChangeLog
r261402 r261409 1 2020-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 1 19 2020-05-08 Alex Christensen <achristensen@webkit.org> 2 20 -
trunk/Source/WebCore/html/HTMLMediaElement.cpp
r261341 r261409 448 448 , m_haveSetUpCaptionContainer(false) 449 449 , m_isScrubbingRemotely(false) 450 , m_showPoster(true)451 450 #if ENABLE(VIDEO_TRACK) 452 451 , m_tracksAreReady(true) … … 1142 1141 m_completelyLoaded = false; 1143 1142 m_havePreparedToPlay = false; 1143 m_displayMode = Unknown; 1144 1144 m_currentSrc = URL(); 1145 1145 … … 1247 1247 1248 1248 // 2. Set the element’s show poster flag to true. 1249 set ShowPosterFlag(true);1249 setDisplayMode(Poster); 1250 1250 1251 1251 // 3. Set the media element’s delaying-the-load-event flag to true (this delays the load event). … … 1495 1495 m_player->setPrivateBrowsingMode(privateMode); 1496 1496 1497 // Reset display mode to force a recalculation of what to show because we are resetting the player. 1498 setDisplayMode(Unknown); 1499 1497 1500 if (!autoplay() && !m_havePreparedToPlay) 1498 1501 m_player->setPreload(m_mediaSession->effectivePreloadForElement()); … … 1548 1551 mediaLoadingFailed(MediaPlayer::NetworkState::FormatError); 1549 1552 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(); 1551 1558 } 1552 1559 … … 2041 2048 m_networkState = NETWORK_NO_SOURCE; 2042 2049 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. 2049 2051 setShouldDelayLoadEvent(false); 2050 2052 2053 updateDisplayState(); 2051 2054 updateRenderer(); 2052 2055 } … … 2077 2080 m_networkState = NETWORK_NO_SOURCE; 2078 2081 2079 // 6.4 - Set the element's show poster flag to true.2080 setShowPosterFlag(true);2081 2082 2082 // 7 - Queue a task to fire a simple event named error at the media element. 2083 2083 scheduleEvent(eventNames().errorEvent); … … 2095 2095 // the element won't attempt to load another resource. 2096 2096 2097 updateDisplayState(); 2097 2098 updateRenderer(); 2098 2099 } … … 2207 2208 else if ((error == MediaPlayer::NetworkState::FormatError || error == MediaPlayer::NetworkState::NetworkError) && m_loadState == LoadingFromSrcAttr) 2208 2209 noneSupported(); 2210 2211 updateDisplayState(); 2209 2212 2210 2213 ERROR_LOG(LOGIDENTIFIER, "error = ", static_cast<int>(error)); … … 2414 2417 } 2415 2418 2419 bool shouldUpdateDisplayState = false; 2420 2416 2421 if (m_readyState >= HAVE_CURRENT_DATA && oldState < HAVE_CURRENT_DATA) { 2417 2422 if (!m_haveFiredLoadedData) { … … 2421 2426 // because m_haveFiredLoadedData is already true. At one time we were skipping 2422 2427 // the call to setShouldDelayLoadEvent, which was definitely incorrect. 2428 shouldUpdateDisplayState = true; 2423 2429 applyMediaFragmentURI(); 2424 2430 } … … 2426 2432 } 2427 2433 2428 if (m_readyState == HAVE_FUTURE_DATA && oldState <= HAVE_CURRENT_DATA && tracksAreReady) 2434 if (m_readyState == HAVE_FUTURE_DATA && oldState <= HAVE_CURRENT_DATA && tracksAreReady) { 2429 2435 scheduleEvent(eventNames().canplayEvent); 2436 shouldUpdateDisplayState = true; 2437 } 2430 2438 2431 2439 if (m_readyState == HAVE_ENOUGH_DATA && oldState < HAVE_ENOUGH_DATA && tracksAreReady) { … … 2438 2446 if (success) { 2439 2447 m_paused = false; 2440 setShowPosterFlag(false);2441 2448 invalidateCachedTime(); 2442 2449 setAutoplayEventPlaybackState(AutoplayEventPlaybackState::StartedWithoutUserGesture); … … 2447 2454 setAutoplayEventPlaybackState(AutoplayEventPlaybackState::PreventedAutoplay); 2448 2455 } 2456 2457 shouldUpdateDisplayState = true; 2449 2458 } 2450 2459 … … 2459 2468 setAutoplayEventPlaybackState(AutoplayEventPlaybackState::PreventedAutoplay); 2460 2469 } 2470 2471 if (shouldUpdateDisplayState) 2472 updateDisplayState(); 2461 2473 2462 2474 updatePlayState(); … … 2883 2895 2884 2896 // 1 - Set the media element's show poster flag to false. 2885 set ShowPosterFlag(false);2897 setDisplayMode(Video); 2886 2898 2887 2899 // 2 - If the media element's readyState is HAVE_NOTHING, abort these steps. … … 2982 2994 // poster display), or 2) if there is a pending fast seek, or 3) if this seek is not an exact seek 2983 2995 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) 2985 2997 noSeekRequired = true; 2986 2998 … … 3463 3475 if (m_paused) { 3464 3476 m_paused = false; 3465 setShowPosterFlag(false);3466 3477 invalidateCachedTime(); 3467 3478 … … 4929 4940 { 4930 4941 beginProcessingMediaPlayerCallback(); 4942 updateDisplayState(); 4931 4943 if (auto* renderer = this->renderer()) 4932 4944 renderer->repaint(); … … 5053 5065 } 5054 5066 5067 void 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 5055 5079 void HTMLMediaElement::mediaPlayerCharacteristicChanged() 5056 5080 { … … 5064 5088 #endif 5065 5089 5066 if (potentiallyPlaying()) 5090 if (potentiallyPlaying() && displayMode() == PosterWaitingForVideo) { 5091 setDisplayMode(Video); 5067 5092 mediaPlayerRenderingModeChanged(); 5093 } 5068 5094 5069 5095 updateRenderer(); … … 5306 5332 schedulePlaybackControlsManagerUpdate(); 5307 5333 5334 setDisplayMode(Video); 5308 5335 invalidateCachedTime(); 5309 5336 … … 5442 5469 5443 5470 // 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. 5446 5474 if (m_readyState == HAVE_NOTHING) { 5447 5475 m_networkState = NETWORK_EMPTY; 5448 setShowPosterFlag(true);5449 5476 scheduleEvent(eventNames().emptiedEvent); 5450 5477 } -
trunk/Source/WebCore/html/HTMLMediaElement.h
r261341 r261409 600 600 void didMoveToNewDocument(Document& oldDocument, Document& newDocument) override; 601 601 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 602 606 bool isMediaElement() const final { return true; } 603 607 … … 611 615 612 616 void scheduleEvent(const AtomString&); 613 614 bool showPosterFlag() const { return m_showPoster; }615 void setShowPosterFlag(bool flag) { m_showPoster = flag; }616 617 617 618 private: … … 643 644 void visibilityStateChanged() final; 644 645 646 virtual void updateDisplayState() { } 647 645 648 void setReadyState(MediaPlayer::ReadyState); 646 649 void setNetworkState(MediaPlayer::NetworkState); … … 668 671 void mediaEngineWasUpdated(); 669 672 673 void mediaPlayerFirstVideoFrameAvailable() final; 670 674 void mediaPlayerCharacteristicChanged() final; 671 675 … … 1031 1035 MediaPlayer::Preload m_preload { Preload::Auto }; 1032 1036 1037 DisplayMode m_displayMode { Unknown }; 1038 1033 1039 // Counter incremented while processing a callback from the media player, so we can avoid 1034 1040 // calling the media engine recursively. … … 1108 1114 bool m_waitingToEnterFullscreen : 1; 1109 1115 1110 bool m_showPoster : 1;1111 1112 1116 #if ENABLE(VIDEO_TRACK) 1113 1117 bool m_tracksAreReady : 1; -
trunk/Source/WebCore/html/HTMLVideoElement.cpp
r261341 r261409 103 103 HTMLMediaElement::didAttachRenderers(); 104 104 105 updateDisplayState(); 105 106 if (shouldDisplayPosterImage()) { 106 107 if (!m_imageLoader) … … 132 133 { 133 134 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 134 139 if (shouldDisplayPosterImage()) { 135 140 if (!m_imageLoader) … … 137 142 m_imageLoader->updateFromElementIgnoringPreviousError(); 138 143 } else { 139 if (auto* renderer = this->renderer()) {144 if (auto* renderer = this->renderer()) 140 145 renderer->imageResource().setCachedImage(nullptr); 141 renderer->updateFromElement();142 }143 146 } 144 147 } … … 159 162 #endif 160 163 } 164 161 165 } 162 166 … … 248 252 } 249 253 250 bool HTMLVideoElement::shouldDisplayPosterImage() const 251 { 252 if (!showPosterFlag()) 253 return false; 254 254 void 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 279 void HTMLVideoElement::updateDisplayState() 280 { 255 281 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); 279 285 } 280 286 -
trunk/Source/WebCore/html/HTMLVideoElement.h
r261341 r261409 77 77 bool copyVideoTextureToPlatformTexture(GraphicsContextGLOpenGL*, PlatformGLObject texture, GCGLenum target, GCGLint level, GCGLenum internalFormat, GCGLenum format, GCGLenum type, bool premultiplyAlpha, bool flipY); 78 78 79 WEBCORE_EXPORT bool shouldDisplayPosterImage() const;79 bool shouldDisplayPosterImage() const { return displayMode() == Poster || displayMode() == PosterWaitingForVideo; } 80 80 81 81 URL posterImageURL() const; … … 123 123 const AtomString& imageSourceURL() const final; 124 124 125 bool hasAvailableVideoFrame() const; 126 void updateDisplayState() final; 125 127 void didMoveToNewDocument(Document& oldDocument, Document& newDocument) final; 126 127 bool hasAvailableVideoFrame() const; 128 void mediaPlayerFirstVideoFrameAvailable() final; 128 void setDisplayMode(DisplayMode) final; 129 129 130 130 PlatformMediaSession::MediaType presentationType() const final { return PlatformMediaSession::MediaType::Video; } -
trunk/Source/WebCore/rendering/RenderVideo.cpp
r261341 r261409 180 180 } 181 181 182 bool RenderVideo::failedToLoadPosterImage() const183 {184 return imageResource().errorOccurred();185 }186 187 182 void RenderVideo::paintReplaced(PaintInfo& paintInfo, const LayoutPoint& paintOffset) 188 183 { -
trunk/Source/WebCore/rendering/RenderVideo.h
r261341 r261409 51 51 52 52 bool shouldDisplayVideo() const; 53 bool failedToLoadPosterImage() const;54 53 55 54 void updateFromElement() final; -
trunk/Source/WebCore/testing/Internals.cpp
r261368 r261409 4339 4339 } 4340 4340 4341 ExceptionOr<bool> Internals::elementShouldDisplayPosterImage(HTMLVideoElement& element) const4342 {4343 #if ENABLE(VIDEO)4344 return element.shouldDisplayPosterImage();4345 #else4346 UNUSED_PARAM(element);4347 return Exception { InvalidAccessError };4348 #endif4349 }4350 4341 4351 4342 #if ENABLE(WIRELESS_PLAYBACK_TARGET) -
trunk/Source/WebCore/testing/Internals.h
r261341 r261409 865 865 ExceptionOr<MediaUsageState> mediaUsageState(HTMLMediaElement&) const; 866 866 867 ExceptionOr<bool> elementShouldDisplayPosterImage(HTMLVideoElement&) const;868 869 867 #if ENABLE(VIDEO) 870 868 using PlaybackControlsPurpose = MediaElementSession::PlaybackControlsPurpose; -
trunk/Source/WebCore/testing/Internals.idl
r261341 r261409 841 841 842 842 [Conditional=VIDEO, MayThrowException] MediaUsageState mediaUsageState(HTMLMediaElement element); 843 [Conditional=VIDEO, MayThrowException] boolean elementShouldDisplayPosterImage(HTMLVideoElement element);844 843 845 844 DOMString ongoingLoadsDescriptions();
Note: See TracChangeset
for help on using the changeset viewer.