void FlowThreadController::updateFlowThreadsIntoOverflowPhase() { for (auto iter = m_renderNamedFlowThreadList->rbegin(), end = m_renderNamedFlowThreadList->rend(); iter != end; ++iter) { RenderNamedFlowThread* flowRenderer = *iter; ASSERT(!flowRenderer->hasRegions() || flowRenderer->hasValidRegionInfo()); ASSERT(!flowRenderer->needsTwoPhasesLayout()); // In the overflow computation phase the flow threads start in the constrained phase even though optimizations didn't set the state before. flowRenderer->setLayoutPhase(RenderFlowThread::LayoutPhaseConstrained); flowRenderer->layoutIfNeeded(); flowRenderer->markRegionsForOverflowLayoutIfNeeded(); flowRenderer->setLayoutPhase(RenderFlowThread::LayoutPhaseOverflow); } }
void FlowThreadController::updateFlowThreadsIntoConstrainedPhase() { // Walk the flow chain in reverse order to update the auto-height regions and compute correct sizes for the containing regions. Only after this we can // set the flow in the constrained layout phase. for (RenderNamedFlowThreadList::reverse_iterator iter = m_renderNamedFlowThreadList->rbegin(); iter != m_renderNamedFlowThreadList->rend(); ++iter) { RenderNamedFlowThread* flowRenderer = *iter; ASSERT(!flowRenderer->hasRegions() || flowRenderer->hasValidRegionInfo()); flowRenderer->layoutIfNeeded(); if (flowRenderer->hasAutoLogicalHeightRegions()) { ASSERT(flowRenderer->needsTwoPhasesLayout()); flowRenderer->markAutoLogicalHeightRegionsForLayout(); } flowRenderer->setInConstrainedLayoutPhase(true); flowRenderer->clearNeedsTwoPhasesLayout(); } }
// Collect the fixed positioned layers that have the named flows as containing block // These layers are painted and hit-tested starting from RenderView not from regions. void FlowThreadController::collectFixedPositionedLayers(Vector<RenderLayer*>& fixedPosLayers) const { for (auto iter = m_renderNamedFlowThreadList->begin(), end = m_renderNamedFlowThreadList->end(); iter != end; ++iter) { RenderNamedFlowThread* flowRenderer = *iter; // If the named flow does not have any regions attached, a fixed element should not be // displayed even if the fixed element is positioned/sized by the viewport. if (!flowRenderer->hasRegions()) continue; // Iterate over the fixed positioned elements in the flow thread TrackedRendererListHashSet* positionedDescendants = flowRenderer->positionedObjects(); if (positionedDescendants) { for (auto it = positionedDescendants->begin(), end = positionedDescendants->end(); it != end; ++it) { RenderBox* box = *it; if (!box->fixedPositionedWithNamedFlowContainingBlock()) continue; fixedPosLayers.append(box->layer()); } } } }