Title: [210145] trunk/Source/WebCore
Revision
210145
Author
[email protected]
Date
2016-12-24 10:00:00 -0800 (Sat, 24 Dec 2016)

Log Message

RenderBlockFlow::moveFloatsTo does not move floats.
https://bugs.webkit.org/show_bug.cgi?id=166467

Reviewed by Darin Adler.

RenderBlockFlow::moveFloatsTo name is misleading. Floats are not moved from "this" to
the new RenderBlockFlow parent, but rather they are copied so that overhanging floats
don't get lost.

Covered by existing tests.

* rendering/FloatingObjects.cpp:
(WebCore::FloatingObject::cloneForNewParent):
(WebCore::FloatingObject::unsafeClone): Deleted.
* rendering/FloatingObjects.h:
* rendering/RenderBlockFlow.cpp:
(WebCore::RenderBlockFlow::addFloatsToNewParent):
(WebCore::RenderBlockFlow::moveAllChildrenIncludingFloatsTo):
(WebCore::RenderBlockFlow::moveFloatsTo): Deleted.
* rendering/RenderBlockFlow.h:
* rendering/RenderRubyBase.cpp:
(WebCore::RenderRubyBase::mergeChildrenWithBase):
* rendering/RenderRubyBase.h:
* rendering/RenderRubyRun.cpp:
(WebCore::RenderRubyRun::removeChild):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (210144 => 210145)


--- trunk/Source/WebCore/ChangeLog	2016-12-24 04:39:52 UTC (rev 210144)
+++ trunk/Source/WebCore/ChangeLog	2016-12-24 18:00:00 UTC (rev 210145)
@@ -1,3 +1,31 @@
+2016-12-24  Zalan Bujtas  <[email protected]>
+
+        RenderBlockFlow::moveFloatsTo does not move floats.
+        https://bugs.webkit.org/show_bug.cgi?id=166467
+
+        Reviewed by Darin Adler.
+
+        RenderBlockFlow::moveFloatsTo name is misleading. Floats are not moved from "this" to
+        the new RenderBlockFlow parent, but rather they are copied so that overhanging floats
+        don't get lost.
+
+        Covered by existing tests.
+
+        * rendering/FloatingObjects.cpp:
+        (WebCore::FloatingObject::cloneForNewParent):
+        (WebCore::FloatingObject::unsafeClone): Deleted.
+        * rendering/FloatingObjects.h:
+        * rendering/RenderBlockFlow.cpp:
+        (WebCore::RenderBlockFlow::addFloatsToNewParent):
+        (WebCore::RenderBlockFlow::moveAllChildrenIncludingFloatsTo):
+        (WebCore::RenderBlockFlow::moveFloatsTo): Deleted.
+        * rendering/RenderBlockFlow.h:
+        * rendering/RenderRubyBase.cpp:
+        (WebCore::RenderRubyBase::mergeChildrenWithBase):
+        * rendering/RenderRubyBase.h:
+        * rendering/RenderRubyRun.cpp:
+        (WebCore::RenderRubyRun::removeChild):
+
 2016-12-23  Andreas Kling  <[email protected]>
 
         REGRESSION(r209865): Crash when navigating back to some pages with compositing layers.

Modified: trunk/Source/WebCore/rendering/FloatingObjects.cpp (210144 => 210145)


--- trunk/Source/WebCore/rendering/FloatingObjects.cpp	2016-12-24 04:39:52 UTC (rev 210144)
+++ trunk/Source/WebCore/rendering/FloatingObjects.cpp	2016-12-24 18:00:00 UTC (rev 210145)
@@ -88,10 +88,9 @@
     return std::make_unique<FloatingObject>(renderer(), type(), LayoutRect(frameRect().location() - offset, frameRect().size()), shouldPaint, isDescendant);
 }
 
-std::unique_ptr<FloatingObject> FloatingObject::unsafeClone() const
+std::unique_ptr<FloatingObject> FloatingObject::cloneForNewParent() const
 {
-    // FIXME: Use make_unique here, once we can get it to compile on all platforms we support.
-    std::unique_ptr<FloatingObject> cloneObject(new FloatingObject(renderer(), type(), m_frameRect, m_shouldPaint, m_isDescendant));
+    auto cloneObject = std::make_unique<FloatingObject>(renderer(), type(), m_frameRect, m_shouldPaint, m_isDescendant);
     cloneObject->m_paginationStrut = m_paginationStrut;
     cloneObject->m_isPlaced = m_isPlaced;
     return cloneObject;

Modified: trunk/Source/WebCore/rendering/FloatingObjects.h (210144 => 210145)


--- trunk/Source/WebCore/rendering/FloatingObjects.h	2016-12-24 04:39:52 UTC (rev 210144)
+++ trunk/Source/WebCore/rendering/FloatingObjects.h	2016-12-24 18:00:00 UTC (rev 210145)
@@ -40,7 +40,7 @@
 
     static std::unique_ptr<FloatingObject> create(RenderBox&);
     std::unique_ptr<FloatingObject> copyToNewContainer(LayoutSize, bool shouldPaint = false, bool isDescendant = false) const;
-    std::unique_ptr<FloatingObject> unsafeClone() const;
+    std::unique_ptr<FloatingObject> cloneForNewParent() const;
 
     explicit FloatingObject(RenderBox&);
     FloatingObject(RenderBox&, Type, const LayoutRect&, bool shouldPaint, bool isDescendant);

Modified: trunk/Source/WebCore/rendering/RenderBlockFlow.cpp (210144 => 210145)


--- trunk/Source/WebCore/rendering/RenderBlockFlow.cpp	2016-12-24 04:39:52 UTC (rev 210144)
+++ trunk/Source/WebCore/rendering/RenderBlockFlow.cpp	2016-12-24 18:00:00 UTC (rev 210145)
@@ -2118,7 +2118,7 @@
     RenderBlock::deleteLines();
 }
 
-void RenderBlockFlow::moveFloatsTo(RenderBlockFlow* toBlockFlow)
+void RenderBlockFlow::addFloatsToNewParent(RenderBlockFlow& toBlockFlow) const
 {
     // When a portion of the render tree is being detached, anonymous blocks
     // will be combined as their children are deleted. In this process, the
@@ -2137,30 +2137,21 @@
     // all be wrong, but since toBlockFlow is already marked for layout, this
     // will get fixed before anything gets displayed.
     // See bug https://bugs.webkit.org/show_bug.cgi?id=115566
-    if (m_floatingObjects) {
-        if (!toBlockFlow->m_floatingObjects)
-            toBlockFlow->createFloatingObjects();
+    if (!m_floatingObjects)
+        return;
 
-        const FloatingObjectSet& fromFloatingObjectSet = m_floatingObjects->set();
-        auto end = fromFloatingObjectSet.end();
+    if (!toBlockFlow.m_floatingObjects)
+        toBlockFlow.createFloatingObjects();
 
-        for (auto it = fromFloatingObjectSet.begin(); it != end; ++it) {
-            FloatingObject* floatingObject = it->get();
-
-            // Don't insert the object again if it's already in the list
-            if (toBlockFlow->containsFloat(floatingObject->renderer()))
-                continue;
-
-            toBlockFlow->m_floatingObjects->add(floatingObject->unsafeClone());
-        }
-    }
+    for (auto& floatingObject : m_floatingObjects->set())
+        toBlockFlow.m_floatingObjects->add(floatingObject->cloneForNewParent());
 }
 
 void RenderBlockFlow::moveAllChildrenIncludingFloatsTo(RenderBlock& toBlock, bool fullRemoveInsert)
 {
-    RenderBlockFlow& toBlockFlow = downcast<RenderBlockFlow>(toBlock);
+    auto& toBlockFlow = downcast<RenderBlockFlow>(toBlock);
     moveAllChildrenTo(&toBlockFlow, fullRemoveInsert);
-    moveFloatsTo(&toBlockFlow);
+    addFloatsToNewParent(toBlockFlow);
 }
 
 void RenderBlockFlow::addOverflowFromFloats()

Modified: trunk/Source/WebCore/rendering/RenderBlockFlow.h (210144 => 210145)


--- trunk/Source/WebCore/rendering/RenderBlockFlow.h	2016-12-24 04:39:52 UTC (rev 210144)
+++ trunk/Source/WebCore/rendering/RenderBlockFlow.h	2016-12-24 18:00:00 UTC (rev 210145)
@@ -461,7 +461,7 @@
     bool isTopLayoutOverflowAllowed() const override;
     bool isLeftLayoutOverflowAllowed() const override;
 
-    void moveFloatsTo(RenderBlockFlow* toBlock);
+    void addFloatsToNewParent(RenderBlockFlow& toBlockFlow) const;
     
     virtual void computeColumnCountAndWidth();
     virtual bool requiresColumns(int) const;

Modified: trunk/Source/WebCore/rendering/RenderRubyBase.cpp (210144 => 210145)


--- trunk/Source/WebCore/rendering/RenderRubyBase.cpp	2016-12-24 04:39:52 UTC (rev 210144)
+++ trunk/Source/WebCore/rendering/RenderRubyBase.cpp	2016-12-24 18:00:00 UTC (rev 210145)
@@ -71,10 +71,10 @@
     toBase->setNeedsLayoutAndPrefWidthsRecalc();
 }
 
-void RenderRubyBase::mergeChildrenWithBase(RenderRubyBase* toBlock)
+void RenderRubyBase::mergeChildrenWithBase(RenderRubyBase& toBlock)
 {
-    moveChildren(toBlock);
-    moveFloatsTo(toBlock);
+    moveChildren(&toBlock);
+    addFloatsToNewParent(toBlock);
 }
 
 void RenderRubyBase::moveInlineChildren(RenderRubyBase* toBase, RenderObject* beforeChild)

Modified: trunk/Source/WebCore/rendering/RenderRubyBase.h (210144 => 210145)


--- trunk/Source/WebCore/rendering/RenderRubyBase.h	2016-12-24 04:39:52 UTC (rev 210144)
+++ trunk/Source/WebCore/rendering/RenderRubyBase.h	2016-12-24 18:00:00 UTC (rev 210145)
@@ -63,7 +63,7 @@
     bool isChildAllowed(const RenderObject&, const RenderStyle&) const override;
     ETextAlign textAlignmentForLine(bool endsWithSoftBreak) const override;
     void adjustInlineDirectionLineBounds(int expansionOpportunityCount, float& logicalLeft, float& logicalWidth) const override;
-    void mergeChildrenWithBase(RenderRubyBase* toBlock);
+    void mergeChildrenWithBase(RenderRubyBase& toBlock);
 
     void moveChildren(RenderRubyBase* toBase, RenderObject* beforeChild = 0);
     void moveInlineChildren(RenderRubyBase* toBase, RenderObject* beforeChild = 0);

Modified: trunk/Source/WebCore/rendering/RenderRubyRun.cpp (210144 => 210145)


--- trunk/Source/WebCore/rendering/RenderRubyRun.cpp	2016-12-24 04:39:52 UTC (rev 210144)
+++ trunk/Source/WebCore/rendering/RenderRubyRun.cpp	2016-12-24 18:00:00 UTC (rev 210145)
@@ -167,7 +167,7 @@
             if (rightRun.hasRubyBase()) {
                 RenderRubyBase* rightBase = rightRun.rubyBaseSafe();
                 // Collect all children in a single base, then swap the bases.
-                rightBase->mergeChildrenWithBase(base);
+                rightBase->mergeChildrenWithBase(*base);
                 moveChildTo(&rightRun, base);
                 rightRun.moveChildTo(this, rightBase);
                 // The now empty ruby base will be removed below.
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to