void StickyScrollContainer::UpdatePositions(nsPoint aScrollPosition, nsIFrame* aSubtreeRoot) { #ifdef DEBUG { nsIFrame* scrollFrameAsFrame = do_QueryFrame(mScrollFrame); NS_ASSERTION(!aSubtreeRoot || aSubtreeRoot == scrollFrameAsFrame, "If reflowing, should be reflowing the scroll frame"); } #endif mScrollPosition = aScrollPosition; OverflowChangedTracker oct; oct.SetSubtreeRoot(aSubtreeRoot); for (nsTArray<nsIFrame*>::size_type i = 0; i < mFrames.Length(); i++) { nsIFrame* f = mFrames[i]; if (aSubtreeRoot) { // Reflowing the scroll frame, so recompute offsets. ComputeStickyOffsets(f); } // mFrames will only contain first continuations, because we filter in // nsIFrame::Init. PositionContinuations(f); for (nsIFrame* cont = f; cont; cont = cont->GetNextContinuation()) { oct.AddFrame(cont); } } oct.Flush(); }
void StickyScrollContainer::UpdatePositions(nsPoint aScrollPosition, nsIFrame* aSubtreeRoot) { #ifdef DEBUG { nsIFrame* scrollFrameAsFrame = do_QueryFrame(mScrollFrame); NS_ASSERTION(!aSubtreeRoot || aSubtreeRoot == scrollFrameAsFrame, "If reflowing, should be reflowing the scroll frame"); } #endif mScrollPosition = aScrollPosition; OverflowChangedTracker oct; oct.SetSubtreeRoot(aSubtreeRoot); for (nsTArray<nsIFrame*>::size_type i = 0; i < mFrames.Length(); i++) { nsIFrame* f = mFrames[i]; if (!nsLayoutUtils::IsFirstContinuationOrIBSplitSibling(f)) { // This frame was added in nsFrame::Init before we knew it wasn't // the first ib-split-sibling. mFrames.RemoveElementAt(i); --i; continue; } if (aSubtreeRoot) { // Reflowing the scroll frame, so recompute offsets. ComputeStickyOffsets(f); } // mFrames will only contain first continuations, because we filter in // nsIFrame::Init. PositionContinuations(f); f = f->GetParent(); if (f != aSubtreeRoot) { for (nsIFrame* cont = f; cont; cont = nsLayoutUtils::GetNextContinuationOrIBSplitSibling(cont)) { oct.AddFrame(cont, OverflowChangedTracker::CHILDREN_CHANGED); } } } oct.Flush(); }