Index: Source/core/rendering/RenderFlowThread.cpp |
diff --git a/Source/core/rendering/RenderFlowThread.cpp b/Source/core/rendering/RenderFlowThread.cpp |
index f8148f44e5f228e3dfba58e9f305752fca01068c..4fdffddee14ec1646890918b6cd850b102321f91 100644 |
--- a/Source/core/rendering/RenderFlowThread.cpp |
+++ b/Source/core/rendering/RenderFlowThread.cpp |
@@ -48,6 +48,7 @@ namespace WebCore { |
RenderFlowThread::RenderFlowThread() |
: RenderBlock(0) |
+ , m_previousRegionCount(0) |
, m_autoLogicalHeightRegionsCount(0) |
, m_regionsInvalidated(false) |
, m_regionsHaveUniformLogicalWidth(true) |
@@ -55,6 +56,7 @@ RenderFlowThread::RenderFlowThread() |
, m_overset(true) |
, m_hasRegionsWithStyling(false) |
, m_dispatchRegionLayoutUpdateEvent(false) |
+ , m_dispatchRegionOversetChangeEvent(false) |
, m_pageLogicalSizeChanged(false) |
, m_inConstrainedLayoutPhase(false) |
, m_needsTwoPhasesLayout(false) |
@@ -217,6 +219,9 @@ void RenderFlowThread::layout() |
if (shouldDispatchRegionLayoutUpdateEvent()) |
dispatchRegionLayoutUpdateEvent(); |
+ |
+ if (shouldDispatchRegionOversetChangeEvent()) |
+ dispatchRegionOversetChangeEvent(); |
} |
void RenderFlowThread::updateLogicalWidth() |
@@ -729,7 +734,7 @@ void RenderFlowThread::applyBreakAfterContent(LayoutUnit clientHeight) |
addForcedRegionBreak(clientHeight, this, false); |
} |
-void RenderFlowThread::computeOverflowStateForRegions(LayoutUnit oldClientAfterEdge) |
+void RenderFlowThread::computeOversetStateForRegions(LayoutUnit oldClientAfterEdge) |
{ |
LayoutUnit height = oldClientAfterEdge; |
@@ -747,25 +752,34 @@ void RenderFlowThread::computeOverflowStateForRegions(LayoutUnit oldClientAfterE |
RenderRegion* region = *iter; |
LayoutUnit flowMin = height - (isHorizontalWritingMode() ? region->flowThreadPortionRect().y() : region->flowThreadPortionRect().x()); |
LayoutUnit flowMax = height - (isHorizontalWritingMode() ? region->flowThreadPortionRect().maxY() : region->flowThreadPortionRect().maxX()); |
- RenderRegion::RegionState previousState = region->regionState(); |
- RenderRegion::RegionState state = RenderRegion::RegionFit; |
+ RegionOversetState previousState = region->regionOversetState(); |
+ RegionOversetState state = RegionFit; |
if (flowMin <= 0) |
- state = RenderRegion::RegionEmpty; |
+ state = RegionEmpty; |
if (flowMax > 0 && region == lastReg) |
- state = RenderRegion::RegionOverset; |
- region->setRegionState(state); |
+ 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 == RenderRegion::RegionFit |
- || state == RenderRegion::RegionOverset) |
+ || 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->regionState() == RenderRegion::RegionOverset : true; |
+ m_overset = lastReg ? lastReg->regionOversetState() == RegionOverset : true; |
} |
bool RenderFlowThread::regionInRange(const RenderRegion* targetRegion, const RenderRegion* startRegion, const RenderRegion* endRegion) const |