void RenderView::layout() { StackStats::LayoutCheckPoint layoutCheckPoint; if (!document()->paginated()) setPageLogicalHeight(0); if (shouldUsePrintingLayout()) m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = logicalWidth(); // Use calcWidth/Height to get the new width/height, since this will take the full page zoom factor into account. bool relayoutChildren = !shouldUsePrintingLayout() && (!m_frameView || width() != viewWidth() || height() != viewHeight()); if (relayoutChildren) { setChildNeedsLayout(true, MarkOnlyThis); for (RenderObject* child = firstChild(); child; child = child->nextSibling()) { if ((child->isBox() && toRenderBox(child)->hasRelativeLogicalHeight()) || child->style()->logicalHeight().isPercent() || child->style()->logicalMinHeight().isPercent() || child->style()->logicalMaxHeight().isPercent()) child->setChildNeedsLayout(true, MarkOnlyThis); } } 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; state.m_pageLogicalHeight = m_pageLogicalHeight; state.m_pageLogicalHeightChanged = m_pageLogicalHeightChanged; state.m_isPaginated = state.m_pageLogicalHeight; m_pageLogicalHeightChanged = false; m_layoutState = &state; m_layoutPhase = RenderViewNormalLayout; bool needsTwoPassLayoutForAutoLogicalHeightRegions = hasRenderNamedFlowThreads() && flowThreadController()->hasAutoLogicalHeightRegions() && flowThreadController()->hasRenderNamedFlowThreadsNeedingLayout(); if (needsTwoPassLayoutForAutoLogicalHeightRegions) flowThreadController()->resetRegionsOverrideLogicalContentHeight(); layoutContent(state); if (needsTwoPassLayoutForAutoLogicalHeightRegions) { m_layoutPhase = ConstrainedFlowThreadsLayoutInAutoLogicalHeightRegions; flowThreadController()->markAutoLogicalHeightRegionsForLayout(); layoutContent(state); } #ifndef NDEBUG checkLayoutState(state); #endif m_layoutState = 0; setNeedsLayout(false); }
bool FlowThreadController::isAutoLogicalHeightRegionsCountConsistent() const { if (!hasRenderNamedFlowThreads()) return !hasFlowThreadsWithAutoLogicalHeightRegions(); for (RenderNamedFlowThreadList::iterator iter = m_renderNamedFlowThreadList->begin(); iter != m_renderNamedFlowThreadList->end(); ++iter) { if (!(*iter)->isAutoLogicalHeightRegionsCountConsistent()) return false; } return true; }
void RenderView::layoutContent(const LayoutState& state) { UNUSED_PARAM(state); ASSERT(needsLayout()); RenderBlock::layout(); if (hasRenderNamedFlowThreads()) flowThreadController()->layoutRenderNamedFlowThreads(); #ifndef NDEBUG checkLayoutState(state); #endif }
bool FlowThreadController::isAutoLogicalHeightRegionsFlagConsistent() const { if (!hasRenderNamedFlowThreads()) return !hasAutoLogicalHeightRegions(); // Count the number of auto height regions unsigned autoLogicalHeightRegions = 0; for (RenderNamedFlowThreadList::iterator iter = m_renderNamedFlowThreadList->begin(); iter != m_renderNamedFlowThreadList->end(); ++iter) { RenderNamedFlowThread* flowRenderer = *iter; autoLogicalHeightRegions += flowRenderer->autoLogicalHeightRegionsCount(); } return autoLogicalHeightRegions == m_autoLogicalHeightRegionsCount; }
void RenderView::layout() { if (!document()->paginated()) setPageLogicalHeight(0); if (shouldUsePrintingLayout()) m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = logicalWidth(); // Use calcWidth/Height to get the new width/height, since this will take the full page zoom factor into account. bool relayoutChildren = !shouldUsePrintingLayout() && (!m_frameView || width() != viewWidth() || height() != viewHeight()); if (relayoutChildren) { setChildNeedsLayout(true, MarkOnlyThis); for (RenderObject* child = firstChild(); child; child = child->nextSibling()) { if ((child->isBox() && toRenderBox(child)->hasRelativeLogicalHeight()) || child->style()->logicalHeight().isPercent() || child->style()->logicalMinHeight().isPercent() || child->style()->logicalMaxHeight().isPercent()) child->setChildNeedsLayout(true, MarkOnlyThis); } } ASSERT(!m_layoutState); LayoutState state; // FIXME: May be better to push a clip and avoid issuing offscreen repaints. state.m_clipped = false; state.m_pageLogicalHeight = m_pageLogicalHeight; state.m_pageLogicalHeightChanged = m_pageLogicalHeightChanged; state.m_isPaginated = state.m_pageLogicalHeight; m_pageLogicalHeightChanged = false; m_layoutState = &state; if (needsLayout()) { RenderBlock::layout(); if (hasRenderNamedFlowThreads()) flowThreadController()->layoutRenderNamedFlowThreads(); } ASSERT(layoutDelta() == LayoutSize()); ASSERT(m_layoutStateDisableCount == 0); ASSERT(m_layoutState == &state); m_layoutState = 0; setNeedsLayout(false); }
void RenderView::layoutContentToComputeOverflowInRegions(const LayoutState& state) { if (!hasRenderNamedFlowThreads()) return; // First pass through the flow threads and mark the regions as needing a simple layout. // The regions extract the overflow from the flow thread and pass it to their containg // block chain. flowThreadController().updateFlowThreadsIntoOverflowPhase(); if (needsLayout()) layoutContent(state); // In case scrollbars resized the regions a new pass is necessary to update the flow threads // and recompute the overflow on regions. This is the final state of the flow threads. flowThreadController().updateFlowThreadsIntoFinalPhase(); if (needsLayout()) layoutContent(state); // Finally reset the layout state of the flow threads. flowThreadController().updateFlowThreadsIntoMeasureContentPhase(); }
void RenderView::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle) { RenderBlock::styleDidChange(diff, oldStyle); if (hasRenderNamedFlowThreads()) flowThreadController()->styleDidChange(); }
bool RenderView::checkTwoPassLayoutForAutoHeightRegions() const { return hasRenderNamedFlowThreads() && m_flowThreadController->hasFlowThreadsWithAutoLogicalHeightRegions(); }