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