Bug 1143570 - Part 2: Update the block frame's line cursor every time that nsBlockInFlowLineIterator's constructor finds a new line; r=roc
authorEhsan Akhgari <ehsan@mozilla.com>
Mon, 11 May 2015 13:52:24 -0400
changeset 247741 f6a0792e62591363b96683fc2d3c157096994f43
parent 247740 fafce41ffcee0d907bb0be74c78cb6607b4fb70b
child 247742 72c67850a705f986ef14b6a037f0a043196b3ad0
push id28881
push userkwierso@gmail.com
push dateWed, 10 Jun 2015 01:59:03 +0000
treeherdermozilla-central@d9156ad9b7a2 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersroc
bugs1143570
milestone41.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1143570 - Part 2: Update the block frame's line cursor every time that nsBlockInFlowLineIterator's constructor finds a new line; r=roc
layout/generic/nsBlockFrame.cpp
layout/generic/nsBlockFrame.h
--- a/layout/generic/nsBlockFrame.cpp
+++ b/layout/generic/nsBlockFrame.cpp
@@ -5354,24 +5354,26 @@ nsBlockInFlowLineIterator::nsBlockInFlow
     // rline_end. So we can safely increment it (i.e. move it to one line
     // earlier) to start searching there.
     ++rline;
     while (line != line_end || rline != rline_end) {
       if (line != line_end) {
         if (line->Contains(child)) {
           *aFoundValidLine = true;
           mLine = line;
+          aFrame->SetLineCursor(line.get());
           return;
         }
         ++line;
       }
       if (rline != rline_end) {
         if (rline->Contains(child)) {
           *aFoundValidLine = true;
           mLine = rline;
+          aFrame->SetLineCursor(rline.get());
           return;
         }
         ++rline;
       }
     }
     // Didn't find the line
   }
 
@@ -6519,19 +6521,18 @@ void nsBlockFrame::ClearLineCursor()
 }
 
 void nsBlockFrame::SetupLineCursor()
 {
   if (GetStateBits() & NS_BLOCK_HAS_LINE_CURSOR
       || mLines.empty()) {
     return;
   }
-   
-  Properties().Set(LineCursorProperty(), mLines.front());
-  AddStateBits(NS_BLOCK_HAS_LINE_CURSOR);
+
+  SetLineCursor(mLines.front());
 }
 
 nsLineBox* nsBlockFrame::GetFirstLineContaining(nscoord y)
 {
   if (!(GetStateBits() & NS_BLOCK_HAS_LINE_CURSOR)) {
     return nullptr;
   }
 
@@ -6549,17 +6550,17 @@ nsLineBox* nsBlockFrame::GetFirstLineCon
   }
   while ((cursorArea.IsEmpty() || cursorArea.YMost() <= y)
          && cursor != mLines.back()) {
     cursor = cursor.next();
     cursorArea = cursor->GetVisualOverflowArea();
   }
 
   if (cursor.get() != property) {
-    props.Set(LineCursorProperty(), cursor.get());
+    SetLineCursor(cursor.get());
   }
 
   return cursor.get();
 }
 
 /* virtual */ void
 nsBlockFrame::ChildIsDirty(nsIFrame* aChild)
 {
--- a/layout/generic/nsBlockFrame.h
+++ b/layout/generic/nsBlockFrame.h
@@ -372,16 +372,20 @@ protected:
   }
 #endif
 
   NS_DECLARE_FRAME_PROPERTY(LineCursorProperty, nullptr)
   nsLineBox* GetLineCursor() {
     return (GetStateBits() & NS_BLOCK_HAS_LINE_CURSOR) ?
       static_cast<nsLineBox*>(Properties().Get(LineCursorProperty())) : nullptr;
   }
+  void SetLineCursor(nsLineBox* aCursor) {
+    Properties().Set(LineCursorProperty(), aCursor);
+    AddStateBits(NS_BLOCK_HAS_LINE_CURSOR);
+  }
 
   nsLineBox* NewLineBox(nsIFrame* aFrame, bool aIsBlock) {
     return NS_NewLineBox(PresContext()->PresShell(), aFrame, aIsBlock);
   }
   nsLineBox* NewLineBox(nsLineBox* aFromLine, nsIFrame* aFrame, int32_t aCount) {
     return NS_NewLineBox(PresContext()->PresShell(), aFromLine, aFrame, aCount);
   }
   void FreeLineBox(nsLineBox* aLine) {