void nsLineBox::DeleteLineList(nsPresContext* aPresContext, nsLineList& aLines, nsIFrame* aDestructRoot, nsFrameList* aFrames) { nsIPresShell* shell = aPresContext->PresShell(); // Keep our line list and frame list up to date as we // remove frames, in case something wants to traverse the // frame tree while we're destroying. while (!aLines.empty()) { nsLineBox* line = aLines.front(); if (MOZ_UNLIKELY(line->mFlags.mHasHashedFrames)) { line->SwitchToCounter(); // Avoid expensive has table removals. } while (line->GetChildCount() > 0) { nsIFrame* child = aFrames->RemoveFirstChild(); MOZ_ASSERT(child == line->mFirstChild, "Lines out of sync"); line->mFirstChild = aFrames->FirstChild(); line->NoteFrameRemoved(child); child->DestroyFrom(aDestructRoot); } aLines.pop_front(); line->Destroy(shell); } }
nsresult nsLineIterator::Init(nsLineList& aLines, PRBool aRightToLeft) { mRightToLeft = aRightToLeft; // Count the lines PRInt32 numLines = aLines.size(); if (0 == numLines) { // Use gDummyLines so that we don't need null pointer checks in // the accessor methods mLines = gDummyLines; return NS_OK; } // Make a linear array of the lines mLines = new nsLineBox*[numLines]; if (!mLines) { // Use gDummyLines so that we don't need null pointer checks in // the accessor methods mLines = gDummyLines; return NS_ERROR_OUT_OF_MEMORY; } nsLineBox** lp = mLines; for (nsLineList::iterator line = aLines.begin(), line_end = aLines.end() ; line != line_end; ++line) { *lp++ = line; } mNumLines = numLines; return NS_OK; }
void nsLineBox::DeleteLineList(nsPresContext* aPresContext, nsLineList& aLines, nsIFrame* aDestructRoot) { if (! aLines.empty()) { // Delete our child frames before doing anything else. In particular // we do all of this before our base class releases it's hold on the // view. #ifdef DEBUG PRInt32 numFrames = 0; #endif for (nsIFrame* child = aLines.front()->mFirstChild; child; ) { nsIFrame* nextChild = child->GetNextSibling(); child->SetNextSibling(nullptr); child->DestroyFrom((aDestructRoot) ? aDestructRoot : child); child = nextChild; #ifdef DEBUG numFrames++; #endif } nsIPresShell *shell = aPresContext->PresShell(); do { nsLineBox* line = aLines.front(); #ifdef DEBUG numFrames -= line->GetChildCount(); #endif aLines.pop_front(); line->Destroy(shell); } while (! aLines.empty()); #ifdef DEBUG NS_ASSERTION(numFrames == 0, "number of frames deleted does not match"); #endif } }