REGRESSION (r168046): Incorrect handling of object information in WebCore::RenderFlow...
authorstavila@adobe.com <stavila@adobe.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 23 Jun 2014 14:59:48 +0000 (14:59 +0000)
committerstavila@adobe.com <stavila@adobe.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 23 Jun 2014 14:59:48 +0000 (14:59 +0000)
https://bugs.webkit.org/show_bug.cgi?id=133587

Reviewed by Antti Koivisto.

When an object flowed in multicol is moved from in-flow positioning to out-of-flow positioning,
its information must be removed from the flowthread prior to the change being made.
Otherwise, the flow thread will no longer be its containing block and a reference to it
will not be possible to obtain.

No new tests can be added because the code still hits in an unrelated assertion followed by a null dereference.
The issue was discussed with Antti Koivisto and we decided its better to fix this problem first and
handle the following issue in a separate bug.

* rendering/RenderBlockFlow.cpp:
(WebCore::RenderBlockFlow::styleWillChange):
* rendering/RenderObject.h:
(WebCore::RenderObject::flowThreadContainingBlock):

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

Source/WebCore/ChangeLog
Source/WebCore/rendering/RenderBlockFlow.cpp
Source/WebCore/rendering/RenderObject.h

index e4a6fa3..a90e5fc 100644 (file)
@@ -1,3 +1,24 @@
+2014-06-23  Radu Stavila  <stavila@adobe.com>
+
+        REGRESSION (r168046): Incorrect handling of object information in WebCore::RenderFlowThread::removeLineRegionInfo
+        https://bugs.webkit.org/show_bug.cgi?id=133587
+
+        Reviewed by Antti Koivisto.
+
+        When an object flowed in multicol is moved from in-flow positioning to out-of-flow positioning,
+        its information must be removed from the flowthread prior to the change being made. 
+        Otherwise, the flow thread will no longer be its containing block and a reference to it
+        will not be possible to obtain.
+
+        No new tests can be added because the code still hits in an unrelated assertion followed by a null dereference.
+        The issue was discussed with Antti Koivisto and we decided its better to fix this problem first and
+        handle the following issue in a separate bug.
+
+        * rendering/RenderBlockFlow.cpp:
+        (WebCore::RenderBlockFlow::styleWillChange):
+        * rendering/RenderObject.h:
+        (WebCore::RenderObject::flowThreadContainingBlock):
+
 2014-06-23  Krzysztof Czech  <k.czech@samsung.com>
 
         [EFL] Platform support for WebSpeech feature.
index 4b0ea4a..71028df 100644 (file)
@@ -1981,9 +1981,22 @@ void RenderBlockFlow::styleWillChange(StyleDifference diff, const RenderStyle& n
     const RenderStyle* oldStyle = hasInitializedStyle() ? &style() : nullptr;
     s_canPropagateFloatIntoSibling = oldStyle ? !isFloatingOrOutOfFlowPositioned() && !avoidsFloats() : false;
 
-    if (oldStyle && parent() && diff == StyleDifferenceLayout && oldStyle->position() != newStyle.position()) {
-        if (containsFloats() && !isFloating() && !isOutOfFlowPositioned() && newStyle.hasOutOfFlowPosition())
-            markAllDescendantsWithFloatsForLayout();
+    if (oldStyle) {
+        EPosition oldPosition = oldStyle->position();
+        EPosition newPosition = newStyle.position();
+        
+        if (parent() && diff == StyleDifferenceLayout && oldPosition != newPosition) {
+            if (containsFloats() && !isFloating() && !isOutOfFlowPositioned() && newStyle.hasOutOfFlowPosition())
+                markAllDescendantsWithFloatsForLayout();
+
+            // If this block is inside a multicol and is moving from in-flow positioning to out-of-flow positioning,
+            // remove its info (such as lines-to-region mapping) from the flowthread because it won't be able to do it later.
+            // The flowthread will no longer be in its containing block chain and, as such, flowThreadContainingBlock will return null.
+            if (RenderFlowThread* flowThread = flowThreadContainingBlock(SkipFlowThreadCache)) {
+                if (flowThread->isRenderMultiColumnFlowThread() && !isOutOfFlowPositioned() && (newPosition == AbsolutePosition || newPosition == FixedPosition))
+                    flowThread->removeFlowChildInfo(this);
+            }
+        }
     }
 
     RenderBlock::styleWillChange(diff, newStyle);
index 11a42de..45d896f 100644 (file)
@@ -210,13 +210,19 @@ public:
     RenderBoxModelObject& enclosingBoxModelObject() const;
 
     bool fixedPositionedWithNamedFlowContainingBlock() const;
+
+    enum ShouldUseFlowThreadCache {
+        UseFlowThreadCache,
+        SkipFlowThreadCache
+    };
+
     // Function to return our enclosing flow thread if we are contained inside one. This
     // function follows the containing block chain.
-    RenderFlowThread* flowThreadContainingBlock() const
+    RenderFlowThread* flowThreadContainingBlock(ShouldUseFlowThreadCache useCache = UseFlowThreadCache) const
     {
         if (flowThreadState() == NotInsideFlowThread)
             return 0;
-        return locateFlowThreadContainingBlock();
+        return (useCache == SkipFlowThreadCache) ? locateFlowThreadContainingBlockNoCache() : locateFlowThreadContainingBlock();
     }
 
     RenderNamedFlowFragment* currentRenderNamedFlowFragment() const;