diff options
Diffstat (limited to 'Source/WebCore/rendering/RenderView.cpp')
| -rw-r--r-- | Source/WebCore/rendering/RenderView.cpp | 105 |
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); } |
