RenderVideo should always update the intrinsic size before layout.
authorzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 22 Apr 2016 01:13:33 +0000 (01:13 +0000)
committerzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 22 Apr 2016 01:13:33 +0000 (01:13 +0000)
https://bugs.webkit.org/show_bug.cgi?id=156878

Reviewed by Simon Fraser.

In order to layout video element properly we need to know the correct intrinsic size.
This patch also asserts if we end up updating the intrinsic size right after finishing video renderer layout.

This issues was discovered as part of webkit.org/b/156245. (hence covered by existing tests)

* rendering/RenderVideo.cpp:
(WebCore::RenderVideo::updateIntrinsicSize):
(WebCore::RenderVideo::layout):
(WebCore::RenderVideo::updatePlayer):
* rendering/RenderVideo.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@199856 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/rendering/RenderVideo.cpp
Source/WebCore/rendering/RenderVideo.h

index 3a8aa88..cf631d9 100644 (file)
@@ -1,3 +1,21 @@
+2016-04-21  Zalan Bujtas  <zalan@apple.com>
+
+        RenderVideo should always update the intrinsic size before layout.
+        https://bugs.webkit.org/show_bug.cgi?id=156878
+
+        Reviewed by Simon Fraser.
+
+        In order to layout video element properly we need to know the correct intrinsic size.
+        This patch also asserts if we end up updating the intrinsic size right after finishing video renderer layout.
+
+        This issues was discovered as part of webkit.org/b/156245. (hence covered by existing tests)
+
+        * rendering/RenderVideo.cpp:
+        (WebCore::RenderVideo::updateIntrinsicSize):
+        (WebCore::RenderVideo::layout):
+        (WebCore::RenderVideo::updatePlayer):
+        * rendering/RenderVideo.h:
+
 2016-04-21  Brady Eidson  <beidson@apple.com>
 
         Modern IDB (Workers): Get the IDBConnectionProxy from the Document to the WorkerGlobalScope.
index 976621d..a91acc3 100644 (file)
@@ -76,21 +76,22 @@ void RenderVideo::intrinsicSizeChanged()
     updateIntrinsicSize(); 
 }
 
-void RenderVideo::updateIntrinsicSize()
+bool RenderVideo::updateIntrinsicSize()
 {
     LayoutSize size = calculateIntrinsicSize();
     size.scale(style().effectiveZoom());
 
     // Never set the element size to zero when in a media document.
     if (size.isEmpty() && document().isMediaDocument())
-        return;
+        return false;
 
     if (size == intrinsicSize())
-        return;
+        return false;
 
     setIntrinsicSize(size);
     setPreferredLogicalWidthsDirty(true);
     setNeedsLayout();
+    return true;
 }
     
 LayoutSize RenderVideo::calculateIntrinsicSize()
@@ -199,6 +200,7 @@ void RenderVideo::paintReplaced(PaintInfo& paintInfo, const LayoutPoint& paintOf
 void RenderVideo::layout()
 {
     StackStats::LayoutCheckPoint layoutCheckPoint;
+    updateIntrinsicSize();
     RenderMedia::layout();
     updatePlayer();
 }
@@ -219,7 +221,9 @@ void RenderVideo::updatePlayer()
     if (documentBeingDestroyed())
         return;
 
-    updateIntrinsicSize();
+    bool intrinsicSizeChanged;
+    intrinsicSizeChanged = updateIntrinsicSize();
+    ASSERT_UNUSED(intrinsicSizeChanged, !intrinsicSizeChanged || !view().frameView().isInRenderTreeLayout());
 
     MediaPlayer* mediaPlayer = videoElement().player();
     if (!mediaPlayer)
index 11d0f39..fcfd9d3 100644 (file)
@@ -59,7 +59,7 @@ private:
 
     void intrinsicSizeChanged() override;
     LayoutSize calculateIntrinsicSize();
-    void updateIntrinsicSize();
+    bool updateIntrinsicSize();
 
     void imageChanged(WrappedImagePtr, const IntRect*) override;