Title: [151843] trunk/Source/WebCore
Revision
151843
Author
[email protected]
Date
2013-06-21 10:42:52 -0700 (Fri, 21 Jun 2013)

Log Message

[CSS Regions] Move overset compute code from flow thread to named flow thread
https://bugs.webkit.org/show_bug.cgi?id=117835

Patch by Radu Stavila <[email protected]> on 2013-06-21
Reviewed by Andreas Kling.

Moved computeOversetStateForRegions() and overset() methods from RenderFlowThread to RenderNamedFlowThread.
Added ASSERTS in RenderRegion::regionOversetState and RenderRegion::setRegionOversetState to ensure
the region was created from an element.

* rendering/RenderBlock.cpp:
(WebCore::RenderBlock::computeOverflow):
* rendering/RenderFlowThread.cpp:
(WebCore::RenderFlowThread::RenderFlowThread):
* rendering/RenderFlowThread.h:
* rendering/RenderNamedFlowThread.cpp:
(WebCore::RenderNamedFlowThread::RenderNamedFlowThread):
(WebCore::RenderNamedFlowThread::computeOversetStateForRegions):
* rendering/RenderNamedFlowThread.h:
(WebCore::RenderNamedFlowThread::overset):
* rendering/RenderRegion.cpp:
(WebCore::RenderRegion::regionOversetState):
(WebCore::RenderRegion::setRegionOversetState):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (151842 => 151843)


--- trunk/Source/WebCore/ChangeLog	2013-06-21 16:48:31 UTC (rev 151842)
+++ trunk/Source/WebCore/ChangeLog	2013-06-21 17:42:52 UTC (rev 151843)
@@ -1,3 +1,28 @@
+2013-06-21  Radu Stavila  <[email protected]>
+
+        [CSS Regions] Move overset compute code from flow thread to named flow thread
+        https://bugs.webkit.org/show_bug.cgi?id=117835
+
+        Reviewed by Andreas Kling.
+
+        Moved computeOversetStateForRegions() and overset() methods from RenderFlowThread to RenderNamedFlowThread. 
+        Added ASSERTS in RenderRegion::regionOversetState and RenderRegion::setRegionOversetState to ensure
+        the region was created from an element.
+
+        * rendering/RenderBlock.cpp:
+        (WebCore::RenderBlock::computeOverflow):
+        * rendering/RenderFlowThread.cpp:
+        (WebCore::RenderFlowThread::RenderFlowThread):
+        * rendering/RenderFlowThread.h:
+        * rendering/RenderNamedFlowThread.cpp:
+        (WebCore::RenderNamedFlowThread::RenderNamedFlowThread):
+        (WebCore::RenderNamedFlowThread::computeOversetStateForRegions):
+        * rendering/RenderNamedFlowThread.h:
+        (WebCore::RenderNamedFlowThread::overset):
+        * rendering/RenderRegion.cpp:
+        (WebCore::RenderRegion::regionOversetState):
+        (WebCore::RenderRegion::setRegionOversetState):
+
 2013-06-21  Commit Queue  <[email protected]>
 
         Unreviewed, rolling out r151838.

Modified: trunk/Source/WebCore/rendering/RenderBlock.cpp (151842 => 151843)


--- trunk/Source/WebCore/rendering/RenderBlock.cpp	2013-06-21 16:48:31 UTC (rev 151842)
+++ trunk/Source/WebCore/rendering/RenderBlock.cpp	2013-06-21 17:42:52 UTC (rev 151843)
@@ -1815,8 +1815,8 @@
     // Add visual overflow from theme.
     addVisualOverflowFromTheme();
 
-    if (isRenderFlowThread())
-        toRenderFlowThread(this)->computeOversetStateForRegions(oldClientAfterEdge);
+    if (isRenderNamedFlowThread())
+        toRenderNamedFlowThread(this)->computeOversetStateForRegions(oldClientAfterEdge);
 }
 
 void RenderBlock::clearLayoutOverflow()

Modified: trunk/Source/WebCore/rendering/RenderFlowThread.cpp (151842 => 151843)


--- trunk/Source/WebCore/rendering/RenderFlowThread.cpp	2013-06-21 16:48:31 UTC (rev 151842)
+++ trunk/Source/WebCore/rendering/RenderFlowThread.cpp	2013-06-21 17:42:52 UTC (rev 151843)
@@ -55,7 +55,6 @@
     , m_regionsInvalidated(false)
     , m_regionsHaveUniformLogicalWidth(true)
     , m_regionsHaveUniformLogicalHeight(true)
-    , m_overset(true)
     , m_hasRegionsWithStyling(false)
     , m_dispatchRegionLayoutUpdateEvent(false)
     , m_dispatchRegionOversetChangeEvent(false)
@@ -740,54 +739,6 @@
     addForcedRegionBreak(clientHeight, this, false);
 }
 
-void RenderFlowThread::computeOversetStateForRegions(LayoutUnit oldClientAfterEdge)
-{
-    LayoutUnit height = oldClientAfterEdge;
-
-    // FIXME: the visual overflow of middle region (if it is the last one to contain any content in a render flow thread)
-    // might not be taken into account because the render flow thread height is greater that that regions height + its visual overflow
-    // because of how computeLogicalHeight is implemented for RenderFlowThread (as a sum of all regions height).
-    // This means that the middle region will be marked as fit (even if it has visual overflow flowing into the next region)
-    if (hasRenderOverflow()
-        && ( (isHorizontalWritingMode() && visualOverflowRect().maxY() > clientBoxRect().maxY())
-            || (!isHorizontalWritingMode() && visualOverflowRect().maxX() > clientBoxRect().maxX())))
-        height = isHorizontalWritingMode() ? visualOverflowRect().maxY() : visualOverflowRect().maxX();
-
-    RenderRegion* lastReg = lastRegion();
-    for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) {
-        RenderRegion* region = *iter;
-        LayoutUnit flowMin = height - (isHorizontalWritingMode() ? region->flowThreadPortionRect().y() : region->flowThreadPortionRect().x());
-        LayoutUnit flowMax = height - (isHorizontalWritingMode() ? region->flowThreadPortionRect().maxY() : region->flowThreadPortionRect().maxX());
-        RegionOversetState previousState = region->regionOversetState();
-        RegionOversetState state = RegionFit;
-        if (flowMin <= 0)
-            state = RegionEmpty;
-        if (flowMax > 0 && region == lastReg)
-            state = RegionOverset;
-        region->setRegionOversetState(state);
-        // determine whether the NamedFlow object should dispatch a regionLayoutUpdate event
-        // FIXME: currently it cannot determine whether a region whose regionOverset state remained either "fit" or "overset" has actually
-        // changed, so it just assumes that the NamedFlow should dispatch the event
-        if (previousState != state
-            || state == RegionFit
-            || state == RegionOverset)
-            setDispatchRegionLayoutUpdateEvent(true);
-        
-        if (previousState != state)
-            setDispatchRegionOversetChangeEvent(true);
-    }
-    
-    // If the number of regions has changed since we last computed the overset property, schedule the regionOversetChange event.
-    if (previousRegionCountChanged()) {
-        setDispatchRegionOversetChangeEvent(true);
-        updatePreviousRegionCount();
-    }
-
-    // With the regions overflow state computed we can also set the overset flag for the named flow.
-    // If there are no valid regions in the chain, overset is true.
-    m_overset = lastReg ? lastReg->regionOversetState() == RegionOverset : true;
-}
-
 bool RenderFlowThread::regionInRange(const RenderRegion* targetRegion, const RenderRegion* startRegion, const RenderRegion* endRegion) const
 {
     ASSERT(targetRegion);

Modified: trunk/Source/WebCore/rendering/RenderFlowThread.h (151842 => 151843)


--- trunk/Source/WebCore/rendering/RenderFlowThread.h	2013-06-21 16:48:31 UTC (rev 151842)
+++ trunk/Source/WebCore/rendering/RenderFlowThread.h	2013-06-21 17:42:52 UTC (rev 151843)
@@ -136,11 +136,7 @@
     void clearRenderObjectCustomStyle(const RenderObject*,
         const RenderRegion* oldStartRegion = 0, const RenderRegion* oldEndRegion = 0,
         const RenderRegion* newStartRegion = 0, const RenderRegion* newEndRegion = 0);
-    
-    void computeOversetStateForRegions(LayoutUnit oldClientAfterEdge);
 
-    bool overset() const { return m_overset; }
-
     // Check if the object is in region and the region is part of this flow thread.
     bool objectInFlowRegion(const RenderObject*, const RenderRegion*) const;
 
@@ -279,7 +275,6 @@
     bool m_regionsInvalidated : 1;
     bool m_regionsHaveUniformLogicalWidth : 1;
     bool m_regionsHaveUniformLogicalHeight : 1;
-    bool m_overset : 1;
     bool m_hasRegionsWithStyling : 1;
     bool m_dispatchRegionLayoutUpdateEvent : 1;
     bool m_dispatchRegionOversetChangeEvent : 1;

Modified: trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp (151842 => 151843)


--- trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp	2013-06-21 16:48:31 UTC (rev 151842)
+++ trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp	2013-06-21 17:42:52 UTC (rev 151843)
@@ -52,7 +52,8 @@
 }
 
 RenderNamedFlowThread::RenderNamedFlowThread(PassRefPtr<WebKitNamedFlow> namedFlow)
-    : m_namedFlow(namedFlow)
+    : m_overset(true)
+    , m_namedFlow(namedFlow)
     , m_regionLayoutUpdateEventTimer(this, &RenderNamedFlowThread::regionLayoutUpdateEventTimerFired)
     , m_regionOversetChangeEventTimer(this, &RenderNamedFlowThread::regionOversetChangeEventTimerFired)
 {
@@ -293,6 +294,54 @@
     invalidateRegions();
 }
 
+void RenderNamedFlowThread::computeOversetStateForRegions(LayoutUnit oldClientAfterEdge)
+{
+    LayoutUnit height = oldClientAfterEdge;
+
+    // FIXME: the visual overflow of middle region (if it is the last one to contain any content in a render flow thread)
+    // might not be taken into account because the render flow thread height is greater that that regions height + its visual overflow
+    // because of how computeLogicalHeight is implemented for RenderNamedFlowThread (as a sum of all regions height).
+    // This means that the middle region will be marked as fit (even if it has visual overflow flowing into the next region)
+    if (hasRenderOverflow()
+        && ( (isHorizontalWritingMode() && visualOverflowRect().maxY() > clientBoxRect().maxY())
+            || (!isHorizontalWritingMode() && visualOverflowRect().maxX() > clientBoxRect().maxX())))
+        height = isHorizontalWritingMode() ? visualOverflowRect().maxY() : visualOverflowRect().maxX();
+
+    RenderRegion* lastReg = lastRegion();
+    for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) {
+        RenderRegion* region = *iter;
+        LayoutUnit flowMin = height - (isHorizontalWritingMode() ? region->flowThreadPortionRect().y() : region->flowThreadPortionRect().x());
+        LayoutUnit flowMax = height - (isHorizontalWritingMode() ? region->flowThreadPortionRect().maxY() : region->flowThreadPortionRect().maxX());
+        RegionOversetState previousState = region->regionOversetState();
+        RegionOversetState state = RegionFit;
+        if (flowMin <= 0)
+            state = RegionEmpty;
+        if (flowMax > 0 && region == lastReg)
+            state = RegionOverset;
+        region->setRegionOversetState(state);
+        // determine whether the NamedFlow object should dispatch a regionLayoutUpdate event
+        // FIXME: currently it cannot determine whether a region whose regionOverset state remained either "fit" or "overset" has actually
+        // changed, so it just assumes that the NamedFlow should dispatch the event
+        if (previousState != state
+            || state == RegionFit
+            || state == RegionOverset)
+            setDispatchRegionLayoutUpdateEvent(true);
+        
+        if (previousState != state)
+            setDispatchRegionOversetChangeEvent(true);
+    }
+    
+    // If the number of regions has changed since we last computed the overset property, schedule the regionOversetChange event.
+    if (previousRegionCountChanged()) {
+        setDispatchRegionOversetChangeEvent(true);
+        updatePreviousRegionCount();
+    }
+
+    // With the regions overflow state computed we can also set the overset flag for the named flow.
+    // If there are no valid regions in the chain, overset is true.
+    m_overset = lastReg ? lastReg->regionOversetState() == RegionOverset : true;
+}
+
 void RenderNamedFlowThread::checkInvalidRegions()
 {
     Vector<RenderRegion*> newValidRegions;

Modified: trunk/Source/WebCore/rendering/RenderNamedFlowThread.h (151842 => 151843)


--- trunk/Source/WebCore/rendering/RenderNamedFlowThread.h	2013-06-21 16:48:31 UTC (rev 151842)
+++ trunk/Source/WebCore/rendering/RenderNamedFlowThread.h	2013-06-21 17:42:52 UTC (rev 151843)
@@ -68,6 +68,9 @@
     virtual void addRegionToThread(RenderRegion*) OVERRIDE;
     virtual void removeRegionFromThread(RenderRegion*) OVERRIDE;
 
+    bool overset() const { return m_overset; }
+    void computeOversetStateForRegions(LayoutUnit oldClientAfterEdge);
+
     void registerNamedFlowContentNode(Node*);
     void unregisterNamedFlowContentNode(Node*);
     const NamedFlowContentNodes& contentNodes() const { return m_contentNodes; }
@@ -121,6 +124,8 @@
 
     RenderRegionList m_invalidRegionList;
 
+    bool m_overset : 1;
+
     // The DOM Object that represents a named flow.
     RefPtr<WebKitNamedFlow> m_namedFlow;
 

Modified: trunk/Source/WebCore/rendering/RenderRegion.cpp (151842 => 151843)


--- trunk/Source/WebCore/rendering/RenderRegion.cpp	2013-06-21 16:48:31 UTC (rev 151842)
+++ trunk/Source/WebCore/rendering/RenderRegion.cpp	2013-06-21 17:42:52 UTC (rev 151843)
@@ -133,18 +133,24 @@
 
 RegionOversetState RenderRegion::regionOversetState() const
 {
-    if (isValid() && node() && node()->isElementNode())
-        return toElement(node())->regionOversetState();
+    if (isValid() && element())
+        return element()->regionOversetState();
     
     return RegionUndefined;
 }
 
 void RenderRegion::setRegionOversetState(RegionOversetState state)
 {
-    if (node() && node()->isElementNode())
-        toElement(node())->setRegionOversetState(state);
+    if (element())
+        element()->setRegionOversetState(state);
 }
 
+Element* RenderRegion::element() const
+{
+    ASSERT(node() && node()->isElementNode());
+    return toElement(node());
+}
+
 LayoutUnit RenderRegion::pageLogicalTopForOffset(LayoutUnit /* offset */) const
 {
     return flowThread()->isHorizontalWritingMode() ? flowThreadPortionRect().y() : flowThreadPortionRect().x();

Modified: trunk/Source/WebCore/rendering/RenderRegion.h (151842 => 151843)


--- trunk/Source/WebCore/rendering/RenderRegion.h	2013-06-21 16:48:31 UTC (rev 151842)
+++ trunk/Source/WebCore/rendering/RenderRegion.h	2013-06-21 17:42:52 UTC (rev 151843)
@@ -84,6 +84,8 @@
 
     RegionOversetState regionOversetState() const;
     void setRegionOversetState(RegionOversetState);
+
+    Element* element() const;
     
     // These methods represent the width and height of a "page" and for a RenderRegion they are just the
     // content width and content height of a region. For RenderRegionSets, however, they will be the width and
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to