OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Adobe Systems Incorporated. All rights reserved. | 2 * Copyright (C) 2011 Adobe Systems Incorporated. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above | 8 * 1. Redistributions of source code must retain the above |
9 * copyright notice, this list of conditions and the following | 9 * copyright notice, this list of conditions and the following |
10 * disclaimer. | 10 * disclaimer. |
(...skipping 30 matching lines...) Expand all Loading... |
41 #include "core/rendering/RenderBoxRegionInfo.h" | 41 #include "core/rendering/RenderBoxRegionInfo.h" |
42 #include "core/rendering/RenderInline.h" | 42 #include "core/rendering/RenderInline.h" |
43 #include "core/rendering/RenderLayer.h" | 43 #include "core/rendering/RenderLayer.h" |
44 #include "core/rendering/RenderRegion.h" | 44 #include "core/rendering/RenderRegion.h" |
45 #include "core/rendering/RenderView.h" | 45 #include "core/rendering/RenderView.h" |
46 | 46 |
47 namespace WebCore { | 47 namespace WebCore { |
48 | 48 |
49 RenderFlowThread::RenderFlowThread() | 49 RenderFlowThread::RenderFlowThread() |
50 : RenderBlock(0) | 50 : RenderBlock(0) |
| 51 , m_previousRegionCount(0) |
51 , m_autoLogicalHeightRegionsCount(0) | 52 , m_autoLogicalHeightRegionsCount(0) |
52 , m_regionsInvalidated(false) | 53 , m_regionsInvalidated(false) |
53 , m_regionsHaveUniformLogicalWidth(true) | 54 , m_regionsHaveUniformLogicalWidth(true) |
54 , m_regionsHaveUniformLogicalHeight(true) | 55 , m_regionsHaveUniformLogicalHeight(true) |
55 , m_overset(true) | 56 , m_overset(true) |
56 , m_hasRegionsWithStyling(false) | 57 , m_hasRegionsWithStyling(false) |
57 , m_dispatchRegionLayoutUpdateEvent(false) | 58 , m_dispatchRegionLayoutUpdateEvent(false) |
| 59 , m_dispatchRegionOversetChangeEvent(false) |
58 , m_pageLogicalSizeChanged(false) | 60 , m_pageLogicalSizeChanged(false) |
59 , m_inConstrainedLayoutPhase(false) | 61 , m_inConstrainedLayoutPhase(false) |
60 , m_needsTwoPhasesLayout(false) | 62 , m_needsTwoPhasesLayout(false) |
61 { | 63 { |
62 setFlowThreadState(InsideOutOfFlowThread); | 64 setFlowThreadState(InsideOutOfFlowThread); |
63 } | 65 } |
64 | 66 |
65 PassRefPtr<RenderStyle> RenderFlowThread::createFlowThreadStyle(RenderStyle* par
entStyle) | 67 PassRefPtr<RenderStyle> RenderFlowThread::createFlowThreadStyle(RenderStyle* par
entStyle) |
66 { | 68 { |
67 RefPtr<RenderStyle> newStyle(RenderStyle::create()); | 69 RefPtr<RenderStyle> newStyle(RenderStyle::create()); |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 CurrentRenderFlowThreadMaintainer currentFlowThreadSetter(this); | 212 CurrentRenderFlowThreadMaintainer currentFlowThreadSetter(this); |
211 RenderBlock::layout(); | 213 RenderBlock::layout(); |
212 | 214 |
213 m_pageLogicalSizeChanged = false; | 215 m_pageLogicalSizeChanged = false; |
214 | 216 |
215 if (lastRegion()) | 217 if (lastRegion()) |
216 lastRegion()->expandToEncompassFlowThreadContentsIfNeeded(); | 218 lastRegion()->expandToEncompassFlowThreadContentsIfNeeded(); |
217 | 219 |
218 if (shouldDispatchRegionLayoutUpdateEvent()) | 220 if (shouldDispatchRegionLayoutUpdateEvent()) |
219 dispatchRegionLayoutUpdateEvent(); | 221 dispatchRegionLayoutUpdateEvent(); |
| 222 |
| 223 if (shouldDispatchRegionOversetChangeEvent()) |
| 224 dispatchRegionOversetChangeEvent(); |
220 } | 225 } |
221 | 226 |
222 void RenderFlowThread::updateLogicalWidth() | 227 void RenderFlowThread::updateLogicalWidth() |
223 { | 228 { |
224 LayoutUnit logicalWidth = initialLogicalWidth(); | 229 LayoutUnit logicalWidth = initialLogicalWidth(); |
225 for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regio
nList.end(); ++iter) { | 230 for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regio
nList.end(); ++iter) { |
226 RenderRegion* region = *iter; | 231 RenderRegion* region = *iter; |
227 ASSERT(!region->needsLayout() || region->isRenderRegionSet()); | 232 ASSERT(!region->needsLayout() || region->isRenderRegionSet()); |
228 logicalWidth = max(region->pageLogicalWidth(), logicalWidth); | 233 logicalWidth = max(region->pageLogicalWidth(), logicalWidth); |
229 } | 234 } |
(...skipping 492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
722 ASSERT(m_regionList.contains(startRegion) && m_regionList.contains(endRegion
)); | 727 ASSERT(m_regionList.contains(startRegion) && m_regionList.contains(endRegion
)); |
723 } | 728 } |
724 | 729 |
725 void RenderFlowThread::applyBreakAfterContent(LayoutUnit clientHeight) | 730 void RenderFlowThread::applyBreakAfterContent(LayoutUnit clientHeight) |
726 { | 731 { |
727 // Simulate a region break at height. If it points inside an auto logical he
ight region, | 732 // Simulate a region break at height. If it points inside an auto logical he
ight region, |
728 // then it may determine the region override logical content height. | 733 // then it may determine the region override logical content height. |
729 addForcedRegionBreak(clientHeight, this, false); | 734 addForcedRegionBreak(clientHeight, this, false); |
730 } | 735 } |
731 | 736 |
732 void RenderFlowThread::computeOverflowStateForRegions(LayoutUnit oldClientAfterE
dge) | 737 void RenderFlowThread::computeOversetStateForRegions(LayoutUnit oldClientAfterEd
ge) |
733 { | 738 { |
734 LayoutUnit height = oldClientAfterEdge; | 739 LayoutUnit height = oldClientAfterEdge; |
735 | 740 |
736 // FIXME: the visual overflow of middle region (if it is the last one to con
tain any content in a render flow thread) | 741 // FIXME: the visual overflow of middle region (if it is the last one to con
tain any content in a render flow thread) |
737 // might not be taken into account because the render flow thread height is
greater that that regions height + its visual overflow | 742 // might not be taken into account because the render flow thread height is
greater that that regions height + its visual overflow |
738 // because of how computeLogicalHeight is implemented for RenderFlowThread (
as a sum of all regions height). | 743 // because of how computeLogicalHeight is implemented for RenderFlowThread (
as a sum of all regions height). |
739 // This means that the middle region will be marked as fit (even if it has v
isual overflow flowing into the next region) | 744 // This means that the middle region will be marked as fit (even if it has v
isual overflow flowing into the next region) |
740 if (hasRenderOverflow() | 745 if (hasRenderOverflow() |
741 && ( (isHorizontalWritingMode() && visualOverflowRect().maxY() > clientB
oxRect().maxY()) | 746 && ( (isHorizontalWritingMode() && visualOverflowRect().maxY() > clientB
oxRect().maxY()) |
742 || (!isHorizontalWritingMode() && visualOverflowRect().maxX() > clie
ntBoxRect().maxX()))) | 747 || (!isHorizontalWritingMode() && visualOverflowRect().maxX() > clie
ntBoxRect().maxX()))) |
743 height = isHorizontalWritingMode() ? visualOverflowRect().maxY() : visua
lOverflowRect().maxX(); | 748 height = isHorizontalWritingMode() ? visualOverflowRect().maxY() : visua
lOverflowRect().maxX(); |
744 | 749 |
745 RenderRegion* lastReg = lastRegion(); | 750 RenderRegion* lastReg = lastRegion(); |
746 for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regio
nList.end(); ++iter) { | 751 for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regio
nList.end(); ++iter) { |
747 RenderRegion* region = *iter; | 752 RenderRegion* region = *iter; |
748 LayoutUnit flowMin = height - (isHorizontalWritingMode() ? region->flowT
hreadPortionRect().y() : region->flowThreadPortionRect().x()); | 753 LayoutUnit flowMin = height - (isHorizontalWritingMode() ? region->flowT
hreadPortionRect().y() : region->flowThreadPortionRect().x()); |
749 LayoutUnit flowMax = height - (isHorizontalWritingMode() ? region->flowT
hreadPortionRect().maxY() : region->flowThreadPortionRect().maxX()); | 754 LayoutUnit flowMax = height - (isHorizontalWritingMode() ? region->flowT
hreadPortionRect().maxY() : region->flowThreadPortionRect().maxX()); |
750 RenderRegion::RegionState previousState = region->regionState(); | 755 RegionOversetState previousState = region->regionOversetState(); |
751 RenderRegion::RegionState state = RenderRegion::RegionFit; | 756 RegionOversetState state = RegionFit; |
752 if (flowMin <= 0) | 757 if (flowMin <= 0) |
753 state = RenderRegion::RegionEmpty; | 758 state = RegionEmpty; |
754 if (flowMax > 0 && region == lastReg) | 759 if (flowMax > 0 && region == lastReg) |
755 state = RenderRegion::RegionOverset; | 760 state = RegionOverset; |
756 region->setRegionState(state); | 761 region->setRegionOversetState(state); |
757 // determine whether the NamedFlow object should dispatch a regionLayout
Update event | 762 // determine whether the NamedFlow object should dispatch a regionLayout
Update event |
758 // FIXME: currently it cannot determine whether a region whose regionOve
rset state remained either "fit" or "overset" has actually | 763 // FIXME: currently it cannot determine whether a region whose regionOve
rset state remained either "fit" or "overset" has actually |
759 // changed, so it just assumes that the NamedFlow should dispatch the ev
ent | 764 // changed, so it just assumes that the NamedFlow should dispatch the ev
ent |
760 if (previousState != state | 765 if (previousState != state |
761 || state == RenderRegion::RegionFit | 766 || state == RegionFit |
762 || state == RenderRegion::RegionOverset) | 767 || state == RegionOverset) |
763 setDispatchRegionLayoutUpdateEvent(true); | 768 setDispatchRegionLayoutUpdateEvent(true); |
| 769 |
| 770 if (previousState != state) |
| 771 setDispatchRegionOversetChangeEvent(true); |
| 772 } |
| 773 |
| 774 // If the number of regions has changed since we last computed the overset p
roperty, schedule the regionOversetChange event. |
| 775 if (previousRegionCountChanged()) { |
| 776 setDispatchRegionOversetChangeEvent(true); |
| 777 updatePreviousRegionCount(); |
764 } | 778 } |
765 | 779 |
766 // With the regions overflow state computed we can also set the overset flag
for the named flow. | 780 // With the regions overflow state computed we can also set the overset flag
for the named flow. |
767 // If there are no valid regions in the chain, overset is true. | 781 // If there are no valid regions in the chain, overset is true. |
768 m_overset = lastReg ? lastReg->regionState() == RenderRegion::RegionOverset
: true; | 782 m_overset = lastReg ? lastReg->regionOversetState() == RegionOverset : true; |
769 } | 783 } |
770 | 784 |
771 bool RenderFlowThread::regionInRange(const RenderRegion* targetRegion, const Ren
derRegion* startRegion, const RenderRegion* endRegion) const | 785 bool RenderFlowThread::regionInRange(const RenderRegion* targetRegion, const Ren
derRegion* startRegion, const RenderRegion* endRegion) const |
772 { | 786 { |
773 ASSERT(targetRegion); | 787 ASSERT(targetRegion); |
774 | 788 |
775 for (RenderRegionList::const_iterator it = m_regionList.find(const_cast<Rend
erRegion*>(startRegion)); it != m_regionList.end(); ++it) { | 789 for (RenderRegionList::const_iterator it = m_regionList.find(const_cast<Rend
erRegion*>(startRegion)); it != m_regionList.end(); ++it) { |
776 const RenderRegion* currRegion = *it; | 790 const RenderRegion* currRegion = *it; |
777 if (targetRegion == currRegion) | 791 if (targetRegion == currRegion) |
778 return true; | 792 return true; |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1078 { | 1092 { |
1079 if (!m_renderFlowThread) | 1093 if (!m_renderFlowThread) |
1080 return; | 1094 return; |
1081 RenderView* view = m_renderFlowThread->view(); | 1095 RenderView* view = m_renderFlowThread->view(); |
1082 ASSERT(view->flowThreadController()->currentRenderFlowThread() == m_renderFl
owThread); | 1096 ASSERT(view->flowThreadController()->currentRenderFlowThread() == m_renderFl
owThread); |
1083 view->flowThreadController()->setCurrentRenderFlowThread(m_previousRenderFlo
wThread); | 1097 view->flowThreadController()->setCurrentRenderFlowThread(m_previousRenderFlo
wThread); |
1084 } | 1098 } |
1085 | 1099 |
1086 | 1100 |
1087 } // namespace WebCore | 1101 } // namespace WebCore |
OLD | NEW |