summaryrefslogtreecommitdiff
path: root/Source/WebCore/rendering/RenderView.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/rendering/RenderView.cpp')
-rw-r--r--Source/WebCore/rendering/RenderView.cpp105
1 files changed, 69 insertions, 36 deletions
diff --git a/Source/WebCore/rendering/RenderView.cpp b/Source/WebCore/rendering/RenderView.cpp
index 94da27703..ef27b370f 100644
--- a/Source/WebCore/rendering/RenderView.cpp
+++ b/Source/WebCore/rendering/RenderView.cpp
@@ -65,6 +65,7 @@ RenderView::RenderView(Node* node, FrameView* view)
, m_layoutStateDisableCount(0)
, m_renderQuoteHead(0)
, m_renderCounterCount(0)
+ , m_layoutPhase(RenderViewNormalLayout)
{
// Clear our anonymous bit, set because RenderObject assumes
// any renderer with document as the node is anonymous.
@@ -100,10 +101,9 @@ bool RenderView::hitTest(const HitTestRequest& request, const HitTestLocation& l
return inside;
}
-void RenderView::updateLogicalHeight()
+void RenderView::computeLogicalHeight(LayoutUnit logicalHeight, LayoutUnit, LogicalExtentComputedValues& computedValues) const
{
- if (!shouldUsePrintingLayout() && m_frameView)
- setLogicalHeight(viewLogicalHeight());
+ computedValues.m_extent = (!shouldUsePrintingLayout() && m_frameView) ? LayoutUnit(viewLogicalHeight()) : logicalHeight;
}
void RenderView::updateLogicalWidth()
@@ -132,6 +132,28 @@ bool RenderView::isChildAllowed(RenderObject* child, RenderStyle*) const
return child->isBox();
}
+void RenderView::layoutContent(const LayoutState& state)
+{
+ UNUSED_PARAM(state);
+ ASSERT(needsLayout());
+
+ RenderBlock::layout();
+ if (hasRenderNamedFlowThreads())
+ flowThreadController()->layoutRenderNamedFlowThreads();
+#ifndef NDEBUG
+ checkLayoutState(state);
+#endif
+}
+
+#ifndef NDEBUG
+void RenderView::checkLayoutState(const LayoutState& state)
+{
+ ASSERT(layoutDelta() == LayoutSize());
+ ASSERT(!m_layoutStateDisableCount);
+ ASSERT(m_layoutState == &state);
+}
+#endif
+
void RenderView::layout()
{
if (!document()->paginated())
@@ -154,6 +176,9 @@ void RenderView::layout()
}
ASSERT(!m_layoutState);
+ if (!needsLayout())
+ return;
+
LayoutState state;
// FIXME: May be better to push a clip and avoid issuing offscreen repaints.
state.m_clipped = false;
@@ -163,20 +188,28 @@ void RenderView::layout()
m_pageLogicalHeightChanged = false;
m_layoutState = &state;
- if (needsLayout()) {
- RenderBlock::layout();
- if (hasRenderNamedFlowThreads())
- flowThreadController()->layoutRenderNamedFlowThreads();
+ m_layoutPhase = RenderViewNormalLayout;
+ bool needsTwoPassLayoutForAutoLogicalHeightRegions = hasRenderNamedFlowThreads() && flowThreadController()->hasAutoLogicalHeightRegions();
+
+ if (needsTwoPassLayoutForAutoLogicalHeightRegions)
+ flowThreadController()->resetRegionsOverrideLogicalContentHeight();
+
+ layoutContent(state);
+
+ if (needsTwoPassLayoutForAutoLogicalHeightRegions) {
+ m_layoutPhase = ConstrainedFlowThreadsLayoutInAutoLogicalHeightRegions;
+ flowThreadController()->markAutoLogicalHeightRegionsForLayout();
+ layoutContent(state);
}
- ASSERT(layoutDelta() == LayoutSize());
- ASSERT(m_layoutStateDisableCount == 0);
- ASSERT(m_layoutState == &state);
+#ifndef NDEBUG
+ checkLayoutState(state);
+#endif
m_layoutState = 0;
setNeedsLayout(false);
}
-void RenderView::mapLocalToContainer(RenderBoxModelObject* repaintContainer, TransformState& transformState, MapLocalToContainerFlags mode, bool* wasFixed) const
+void RenderView::mapLocalToContainer(RenderLayerModelObject* repaintContainer, TransformState& transformState, MapCoordinatesFlags mode, bool* wasFixed) const
{
// If a container was specified, and was not 0 or the RenderView,
// then we should have found it by now.
@@ -193,7 +226,7 @@ void RenderView::mapLocalToContainer(RenderBoxModelObject* repaintContainer, Tra
transformState.move(m_frameView->scrollOffsetForFixedPosition());
}
-const RenderObject* RenderView::pushMappingToContainer(const RenderBoxModelObject* ancestorToStopAt, RenderGeometryMap& geometryMap) const
+const RenderObject* RenderView::pushMappingToContainer(const RenderLayerModelObject* ancestorToStopAt, RenderGeometryMap& geometryMap) const
{
// If a container was specified, and was not 0 or the RenderView,
// then we should have found it by now.
@@ -214,12 +247,12 @@ const RenderObject* RenderView::pushMappingToContainer(const RenderBoxModelObjec
return 0;
}
-void RenderView::mapAbsoluteToLocalPoint(bool fixed, bool useTransforms, TransformState& transformState) const
+void RenderView::mapAbsoluteToLocalPoint(MapCoordinatesFlags mode, TransformState& transformState) const
{
- if (fixed && m_frameView)
+ if (mode & IsFixed && m_frameView)
transformState.move(m_frameView->scrollOffsetForFixedPosition());
- if (useTransforms && shouldUseTransformFromContainer(0)) {
+ if (mode & UseTransforms && shouldUseTransformFromContainer(0)) {
TransformationMatrix t;
getTransformFromContainer(0, LayoutSize(), t);
transformState.applyTransform(t);
@@ -268,7 +301,7 @@ void RenderView::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
static inline bool isComposited(RenderObject* object)
{
- return object->hasLayer() && toRenderBoxModelObject(object)->layer()->isComposited();
+ return object->hasLayer() && toRenderLayerModelObject(object)->layer()->isComposited();
}
static inline bool rendererObscuresBackground(RenderObject* object)
@@ -391,7 +424,7 @@ void RenderView::repaintRectangleInViewAndCompositedLayers(const LayoutRect& ur,
#endif
}
-void RenderView::computeRectForRepaint(RenderBoxModelObject* repaintContainer, LayoutRect& rect, bool fixed) const
+void RenderView::computeRectForRepaint(RenderLayerModelObject* repaintContainer, LayoutRect& rect, bool fixed) const
{
// If a container was specified, and was not 0 or the RenderView,
// then we should have found it by now.
@@ -413,20 +446,20 @@ void RenderView::computeRectForRepaint(RenderBoxModelObject* repaintContainer, L
rect.move(m_frameView->scrollOffsetForFixedPosition());
// Apply our transform if we have one (because of full page zooming).
- if (!repaintContainer && m_layer && m_layer->transform())
- rect = m_layer->transform()->mapRect(rect);
+ if (!repaintContainer && layer() && layer()->transform())
+ rect = layer()->transform()->mapRect(rect);
}
void RenderView::absoluteRects(Vector<IntRect>& rects, const LayoutPoint& accumulatedOffset) const
{
- rects.append(pixelSnappedIntRect(accumulatedOffset, m_layer->size()));
+ rects.append(pixelSnappedIntRect(accumulatedOffset, layer()->size()));
}
void RenderView::absoluteQuads(Vector<FloatQuad>& quads, bool* wasFixed) const
{
if (wasFixed)
*wasFixed = false;
- quads.append(FloatRect(FloatPoint(), m_layer->size()));
+ quads.append(FloatRect(FloatPoint(), layer()->size()));
}
static RenderObject* rendererAfterPosition(RenderObject* object, unsigned offset)
@@ -453,7 +486,7 @@ IntRect RenderView::selectionBounds(bool clipToVisibleContent) const
selectedObjects.set(os, adoptPtr(new RenderSelectionInfo(os, clipToVisibleContent)));
RenderBlock* cb = os->containingBlock();
while (cb && !cb->isRenderView()) {
- OwnPtr<RenderSelectionInfo>& blockInfo = selectedObjects.add(cb, nullptr).iterator->second;
+ OwnPtr<RenderSelectionInfo>& blockInfo = selectedObjects.add(cb, nullptr).iterator->value;
if (blockInfo)
break;
blockInfo = adoptPtr(new RenderSelectionInfo(cb, clipToVisibleContent));
@@ -468,11 +501,11 @@ IntRect RenderView::selectionBounds(bool clipToVisibleContent) const
LayoutRect selRect;
SelectionMap::iterator end = selectedObjects.end();
for (SelectionMap::iterator i = selectedObjects.begin(); i != end; ++i) {
- RenderSelectionInfo* info = i->second.get();
+ RenderSelectionInfo* info = i->value.get();
// RenderSelectionInfo::rect() is in the coordinates of the repaintContainer, so map to page coordinates.
LayoutRect currRect = info->rect();
- if (RenderBoxModelObject* repaintContainer = info->repaintContainer()) {
- FloatQuad absQuad = repaintContainer->localToAbsoluteQuad(FloatRect(currRect));
+ if (RenderLayerModelObject* repaintContainer = info->repaintContainer()) {
+ FloatQuad absQuad = repaintContainer->localToAbsoluteQuad(FloatRect(currRect), SnapOffsetForTransforms);
currRect = absQuad.enclosingBoundingBox();
}
selRect.unite(currRect);
@@ -533,7 +566,7 @@ void RenderView::setSelection(RenderObject* start, int startPos, RenderObject* e
if (blockRepaintMode == RepaintNewXOROld) {
RenderBlock* cb = os->containingBlock();
while (cb && !cb->isRenderView()) {
- OwnPtr<RenderBlockSelectionInfo>& blockInfo = oldSelectedBlocks.add(cb, nullptr).iterator->second;
+ OwnPtr<RenderBlockSelectionInfo>& blockInfo = oldSelectedBlocks.add(cb, nullptr).iterator->value;
if (blockInfo)
break;
blockInfo = adoptPtr(new RenderBlockSelectionInfo(cb));
@@ -548,7 +581,7 @@ void RenderView::setSelection(RenderObject* start, int startPos, RenderObject* e
// Now clear the selection.
SelectedObjectMap::iterator oldObjectsEnd = oldSelectedObjects.end();
for (SelectedObjectMap::iterator i = oldSelectedObjects.begin(); i != oldObjectsEnd; ++i)
- i->first->setSelectionStateIfNeeded(SelectionNone);
+ i->key->setSelectionStateIfNeeded(SelectionNone);
// set selection start and end
m_selectionStart = start;
@@ -576,7 +609,7 @@ void RenderView::setSelection(RenderObject* start, int startPos, RenderObject* e
}
if (blockRepaintMode != RepaintNothing)
- m_layer->clearBlockSelectionGapsBounds();
+ layer()->clearBlockSelectionGapsBounds();
// Now that the selection state has been updated for the new objects, walk them again and
// put them in the new objects list.
@@ -586,7 +619,7 @@ void RenderView::setSelection(RenderObject* start, int startPos, RenderObject* e
newSelectedObjects.set(o, adoptPtr(new RenderSelectionInfo(o, true)));
RenderBlock* cb = o->containingBlock();
while (cb && !cb->isRenderView()) {
- OwnPtr<RenderBlockSelectionInfo>& blockInfo = newSelectedBlocks.add(cb, nullptr).iterator->second;
+ OwnPtr<RenderBlockSelectionInfo>& blockInfo = newSelectedBlocks.add(cb, nullptr).iterator->value;
if (blockInfo)
break;
blockInfo = adoptPtr(new RenderBlockSelectionInfo(cb));
@@ -604,9 +637,9 @@ void RenderView::setSelection(RenderObject* start, int startPos, RenderObject* e
// Have any of the old selected objects changed compared to the new selection?
for (SelectedObjectMap::iterator i = oldSelectedObjects.begin(); i != oldObjectsEnd; ++i) {
- RenderObject* obj = i->first;
+ RenderObject* obj = i->key;
RenderSelectionInfo* newInfo = newSelectedObjects.get(obj);
- RenderSelectionInfo* oldInfo = i->second.get();
+ RenderSelectionInfo* oldInfo = i->value.get();
if (!newInfo || oldInfo->rect() != newInfo->rect() || oldInfo->state() != newInfo->state() ||
(m_selectionStart == obj && oldStartPos != m_selectionStartPos) ||
(m_selectionEnd == obj && oldEndPos != m_selectionEndPos)) {
@@ -621,14 +654,14 @@ void RenderView::setSelection(RenderObject* start, int startPos, RenderObject* e
// Any new objects that remain were not found in the old objects dict, and so they need to be updated.
SelectedObjectMap::iterator newObjectsEnd = newSelectedObjects.end();
for (SelectedObjectMap::iterator i = newSelectedObjects.begin(); i != newObjectsEnd; ++i)
- i->second->repaint();
+ i->value->repaint();
// Have any of the old blocks changed?
SelectedBlockMap::iterator oldBlocksEnd = oldSelectedBlocks.end();
for (SelectedBlockMap::iterator i = oldSelectedBlocks.begin(); i != oldBlocksEnd; ++i) {
- RenderBlock* block = i->first;
+ RenderBlock* block = i->key;
RenderBlockSelectionInfo* newInfo = newSelectedBlocks.get(block);
- RenderBlockSelectionInfo* oldInfo = i->second.get();
+ RenderBlockSelectionInfo* oldInfo = i->value.get();
if (!newInfo || oldInfo->rects() != newInfo->rects() || oldInfo->state() != newInfo->state()) {
oldInfo->repaint();
if (newInfo) {
@@ -641,7 +674,7 @@ void RenderView::setSelection(RenderObject* start, int startPos, RenderObject* e
// Any new blocks that remain were not found in the old blocks dict, and so they need to be updated.
SelectedBlockMap::iterator newBlocksEnd = newSelectedBlocks.end();
for (SelectedBlockMap::iterator i = newSelectedBlocks.begin(); i != newBlocksEnd; ++i)
- i->second->repaint();
+ i->value->repaint();
m_frameView->endDeferredRepaints();
}
@@ -656,7 +689,7 @@ void RenderView::getSelection(RenderObject*& startRenderer, int& startOffset, Re
void RenderView::clearSelection()
{
- m_layer->repaintBlockSelectionGaps();
+ layer()->repaintBlockSelectionGaps();
setSelection(0, -1, 0, -1, RepaintNewMinusOld);
}