Changeset 151843 in webkit
- Timestamp:
- Jun 21, 2013 10:42:52 AM (11 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r151842 r151843 1 2013-06-21 Radu Stavila <stavila@adobe.com> 2 3 [CSS Regions] Move overset compute code from flow thread to named flow thread 4 https://bugs.webkit.org/show_bug.cgi?id=117835 5 6 Reviewed by Andreas Kling. 7 8 Moved computeOversetStateForRegions() and overset() methods from RenderFlowThread to RenderNamedFlowThread. 9 Added ASSERTS in RenderRegion::regionOversetState and RenderRegion::setRegionOversetState to ensure 10 the region was created from an element. 11 12 * rendering/RenderBlock.cpp: 13 (WebCore::RenderBlock::computeOverflow): 14 * rendering/RenderFlowThread.cpp: 15 (WebCore::RenderFlowThread::RenderFlowThread): 16 * rendering/RenderFlowThread.h: 17 * rendering/RenderNamedFlowThread.cpp: 18 (WebCore::RenderNamedFlowThread::RenderNamedFlowThread): 19 (WebCore::RenderNamedFlowThread::computeOversetStateForRegions): 20 * rendering/RenderNamedFlowThread.h: 21 (WebCore::RenderNamedFlowThread::overset): 22 * rendering/RenderRegion.cpp: 23 (WebCore::RenderRegion::regionOversetState): 24 (WebCore::RenderRegion::setRegionOversetState): 25 1 26 2013-06-21 Commit Queue <commit-queue@webkit.org> 2 27 -
trunk/Source/WebCore/rendering/RenderBlock.cpp
r151777 r151843 1816 1816 addVisualOverflowFromTheme(); 1817 1817 1818 if (isRender FlowThread())1819 toRender FlowThread(this)->computeOversetStateForRegions(oldClientAfterEdge);1818 if (isRenderNamedFlowThread()) 1819 toRenderNamedFlowThread(this)->computeOversetStateForRegions(oldClientAfterEdge); 1820 1820 } 1821 1821 -
trunk/Source/WebCore/rendering/RenderFlowThread.cpp
r151777 r151843 56 56 , m_regionsHaveUniformLogicalWidth(true) 57 57 , m_regionsHaveUniformLogicalHeight(true) 58 , m_overset(true)59 58 , m_hasRegionsWithStyling(false) 60 59 , m_dispatchRegionLayoutUpdateEvent(false) … … 741 740 } 742 741 743 void RenderFlowThread::computeOversetStateForRegions(LayoutUnit oldClientAfterEdge)744 {745 LayoutUnit height = oldClientAfterEdge;746 747 // FIXME: the visual overflow of middle region (if it is the last one to contain any content in a render flow thread)748 // might not be taken into account because the render flow thread height is greater that that regions height + its visual overflow749 // because of how computeLogicalHeight is implemented for RenderFlowThread (as a sum of all regions height).750 // This means that the middle region will be marked as fit (even if it has visual overflow flowing into the next region)751 if (hasRenderOverflow()752 && ( (isHorizontalWritingMode() && visualOverflowRect().maxY() > clientBoxRect().maxY())753 || (!isHorizontalWritingMode() && visualOverflowRect().maxX() > clientBoxRect().maxX())))754 height = isHorizontalWritingMode() ? visualOverflowRect().maxY() : visualOverflowRect().maxX();755 756 RenderRegion* lastReg = lastRegion();757 for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) {758 RenderRegion* region = *iter;759 LayoutUnit flowMin = height - (isHorizontalWritingMode() ? region->flowThreadPortionRect().y() : region->flowThreadPortionRect().x());760 LayoutUnit flowMax = height - (isHorizontalWritingMode() ? region->flowThreadPortionRect().maxY() : region->flowThreadPortionRect().maxX());761 RegionOversetState previousState = region->regionOversetState();762 RegionOversetState state = RegionFit;763 if (flowMin <= 0)764 state = RegionEmpty;765 if (flowMax > 0 && region == lastReg)766 state = RegionOverset;767 region->setRegionOversetState(state);768 // determine whether the NamedFlow object should dispatch a regionLayoutUpdate event769 // FIXME: currently it cannot determine whether a region whose regionOverset state remained either "fit" or "overset" has actually770 // changed, so it just assumes that the NamedFlow should dispatch the event771 if (previousState != state772 || state == RegionFit773 || state == RegionOverset)774 setDispatchRegionLayoutUpdateEvent(true);775 776 if (previousState != state)777 setDispatchRegionOversetChangeEvent(true);778 }779 780 // If the number of regions has changed since we last computed the overset property, schedule the regionOversetChange event.781 if (previousRegionCountChanged()) {782 setDispatchRegionOversetChangeEvent(true);783 updatePreviousRegionCount();784 }785 786 // With the regions overflow state computed we can also set the overset flag for the named flow.787 // If there are no valid regions in the chain, overset is true.788 m_overset = lastReg ? lastReg->regionOversetState() == RegionOverset : true;789 }790 791 742 bool RenderFlowThread::regionInRange(const RenderRegion* targetRegion, const RenderRegion* startRegion, const RenderRegion* endRegion) const 792 743 { -
trunk/Source/WebCore/rendering/RenderFlowThread.h
r151777 r151843 137 137 const RenderRegion* oldStartRegion = 0, const RenderRegion* oldEndRegion = 0, 138 138 const RenderRegion* newStartRegion = 0, const RenderRegion* newEndRegion = 0); 139 140 void computeOversetStateForRegions(LayoutUnit oldClientAfterEdge);141 142 bool overset() const { return m_overset; }143 139 144 140 // Check if the object is in region and the region is part of this flow thread. … … 280 276 bool m_regionsHaveUniformLogicalWidth : 1; 281 277 bool m_regionsHaveUniformLogicalHeight : 1; 282 bool m_overset : 1;283 278 bool m_hasRegionsWithStyling : 1; 284 279 bool m_dispatchRegionLayoutUpdateEvent : 1; -
trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp
r151835 r151843 53 53 54 54 RenderNamedFlowThread::RenderNamedFlowThread(PassRefPtr<WebKitNamedFlow> namedFlow) 55 : m_namedFlow(namedFlow) 55 : m_overset(true) 56 , m_namedFlow(namedFlow) 56 57 , m_regionLayoutUpdateEventTimer(this, &RenderNamedFlowThread::regionLayoutUpdateEventTimerFired) 57 58 , m_regionOversetChangeEventTimer(this, &RenderNamedFlowThread::regionOversetChangeEventTimerFired) … … 292 293 293 294 invalidateRegions(); 295 } 296 297 void RenderNamedFlowThread::computeOversetStateForRegions(LayoutUnit oldClientAfterEdge) 298 { 299 LayoutUnit height = oldClientAfterEdge; 300 301 // FIXME: the visual overflow of middle region (if it is the last one to contain any content in a render flow thread) 302 // might not be taken into account because the render flow thread height is greater that that regions height + its visual overflow 303 // because of how computeLogicalHeight is implemented for RenderNamedFlowThread (as a sum of all regions height). 304 // This means that the middle region will be marked as fit (even if it has visual overflow flowing into the next region) 305 if (hasRenderOverflow() 306 && ( (isHorizontalWritingMode() && visualOverflowRect().maxY() > clientBoxRect().maxY()) 307 || (!isHorizontalWritingMode() && visualOverflowRect().maxX() > clientBoxRect().maxX()))) 308 height = isHorizontalWritingMode() ? visualOverflowRect().maxY() : visualOverflowRect().maxX(); 309 310 RenderRegion* lastReg = lastRegion(); 311 for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) { 312 RenderRegion* region = *iter; 313 LayoutUnit flowMin = height - (isHorizontalWritingMode() ? region->flowThreadPortionRect().y() : region->flowThreadPortionRect().x()); 314 LayoutUnit flowMax = height - (isHorizontalWritingMode() ? region->flowThreadPortionRect().maxY() : region->flowThreadPortionRect().maxX()); 315 RegionOversetState previousState = region->regionOversetState(); 316 RegionOversetState state = RegionFit; 317 if (flowMin <= 0) 318 state = RegionEmpty; 319 if (flowMax > 0 && region == lastReg) 320 state = RegionOverset; 321 region->setRegionOversetState(state); 322 // determine whether the NamedFlow object should dispatch a regionLayoutUpdate event 323 // FIXME: currently it cannot determine whether a region whose regionOverset state remained either "fit" or "overset" has actually 324 // changed, so it just assumes that the NamedFlow should dispatch the event 325 if (previousState != state 326 || state == RegionFit 327 || state == RegionOverset) 328 setDispatchRegionLayoutUpdateEvent(true); 329 330 if (previousState != state) 331 setDispatchRegionOversetChangeEvent(true); 332 } 333 334 // If the number of regions has changed since we last computed the overset property, schedule the regionOversetChange event. 335 if (previousRegionCountChanged()) { 336 setDispatchRegionOversetChangeEvent(true); 337 updatePreviousRegionCount(); 338 } 339 340 // With the regions overflow state computed we can also set the overset flag for the named flow. 341 // If there are no valid regions in the chain, overset is true. 342 m_overset = lastReg ? lastReg->regionOversetState() == RegionOverset : true; 294 343 } 295 344 -
trunk/Source/WebCore/rendering/RenderNamedFlowThread.h
r151777 r151843 69 69 virtual void removeRegionFromThread(RenderRegion*) OVERRIDE; 70 70 71 bool overset() const { return m_overset; } 72 void computeOversetStateForRegions(LayoutUnit oldClientAfterEdge); 73 71 74 void registerNamedFlowContentNode(Node*); 72 75 void unregisterNamedFlowContentNode(Node*); … … 122 125 RenderRegionList m_invalidRegionList; 123 126 127 bool m_overset : 1; 128 124 129 // The DOM Object that represents a named flow. 125 130 RefPtr<WebKitNamedFlow> m_namedFlow; -
trunk/Source/WebCore/rendering/RenderRegion.cpp
r151777 r151843 134 134 RegionOversetState RenderRegion::regionOversetState() const 135 135 { 136 if (isValid() && node() && node()->isElementNode())137 return toElement(node())->regionOversetState();136 if (isValid() && element()) 137 return element()->regionOversetState(); 138 138 139 139 return RegionUndefined; … … 142 142 void RenderRegion::setRegionOversetState(RegionOversetState state) 143 143 { 144 if (node() && node()->isElementNode()) 145 toElement(node())->setRegionOversetState(state); 144 if (element()) 145 element()->setRegionOversetState(state); 146 } 147 148 Element* RenderRegion::element() const 149 { 150 ASSERT(node() && node()->isElementNode()); 151 return toElement(node()); 146 152 } 147 153 -
trunk/Source/WebCore/rendering/RenderRegion.h
r151777 r151843 85 85 RegionOversetState regionOversetState() const; 86 86 void setRegionOversetState(RegionOversetState); 87 88 Element* element() const; 87 89 88 90 // These methods represent the width and height of a "page" and for a RenderRegion they are just the
Note: See TracChangeset
for help on using the changeset viewer.