Backed out changeset ccde95bd3c7e (bug 1074165) for bustage
authorCarsten "Tomcat" Book <cbook@mozilla.com>
Thu, 09 Oct 2014 10:59:44 +0200
changeset 209549 3da679acadb8ca9553956d3cbca718815b1edb0f
parent 209548 f50d71868097efd302004e78989aeb9fc8a1dadf
child 209550 99444136ae7688d324accc36b42df10cee5fe2d3
push idunknown
push userunknown
push dateunknown
bugs1074165
milestone35.0a1
backs outccde95bd3c7e76a10ce5f192bbead2646463a847
Backed out changeset ccde95bd3c7e (bug 1074165) for bustage
layout/xul/nsListBoxBodyFrame.cpp
layout/xul/nsListBoxBodyFrame.h
layout/xul/nsScrollbarFrame.h
--- a/layout/xul/nsListBoxBodyFrame.cpp
+++ b/layout/xul/nsListBoxBodyFrame.cpp
@@ -2,17 +2,16 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "nsListBoxBodyFrame.h"
 
 #include "nsListBoxLayout.h"
 
-#include "nsAlgorithm.h"
 #include "nsCOMPtr.h"
 #include "nsGridRowGroupLayout.h"
 #include "nsIServiceManager.h"
 #include "nsGkAtoms.h"
 #include "nsIContent.h"
 #include "nsNameSpaceManager.h"
 #include "nsIDocument.h"
 #include "nsIDOMMouseEvent.h"
@@ -324,107 +323,101 @@ nsListBoxBodyFrame::GetPrefSize(nsBoxLay
 }
 
 ///////////// nsIScrollbarMediator ///////////////
 
 void
 nsListBoxBodyFrame::ScrollByPage(nsScrollbarFrame* aScrollbar, int32_t aDirection)
 {
   MOZ_ASSERT(aScrollbar != nullptr);
+  UpdateIndex(aDirection);
   aScrollbar->SetIncrementToPage(aDirection);
-  nsWeakFrame weakFrame(this);
-  int32_t newPos = aScrollbar->MoveToNewPosition();
-  if (!weakFrame.IsAlive()) {
-    return;
-  }
-  UpdateIndex(newPos);
+  aScrollbar->MoveToNewPosition();
 }
 
 void
 nsListBoxBodyFrame::ScrollByWhole(nsScrollbarFrame* aScrollbar, int32_t aDirection)
 {
-  MOZ_ASSERT(aScrollbar != nullptr);
+  MOZ_ASSERT(aScrollbar != nullptr); 
+  UpdateIndex(aDirection);
   aScrollbar->SetIncrementToWhole(aDirection);
-  nsWeakFrame weakFrame(this);
-  int32_t newPos = aScrollbar->MoveToNewPosition();
-  if (!weakFrame.IsAlive()) {
-    return;
-  }
-  UpdateIndex(newPos);
+  aScrollbar->MoveToNewPosition();
 }
 
 void
 nsListBoxBodyFrame::ScrollByLine(nsScrollbarFrame* aScrollbar, int32_t aDirection)
 {
-  MOZ_ASSERT(aScrollbar != nullptr);
+  MOZ_ASSERT(aScrollbar != nullptr); 
+  UpdateIndex(aDirection);
   aScrollbar->SetIncrementToLine(aDirection);
-  nsWeakFrame weakFrame(this);
-  int32_t newPos = aScrollbar->MoveToNewPosition();
-  if (!weakFrame.IsAlive()) {
-    return;
-  }
-  UpdateIndex(newPos);
+  aScrollbar->MoveToNewPosition();
 }
 
 void
 nsListBoxBodyFrame::RepeatButtonScroll(nsScrollbarFrame* aScrollbar)
 {
-  nsWeakFrame weakFrame(this);
-  int32_t newPos = aScrollbar->MoveToNewPosition();
-  if (!weakFrame.IsAlive()) {
-    return;
+  int32_t increment = aScrollbar->GetIncrement();
+  if (increment < 0) {
+    UpdateIndex(-1);
+  } else if (increment > 0) {
+    UpdateIndex(1);
   }
-  UpdateIndex(newPos);
-}
-
-int32_t
-nsListBoxBodyFrame::ToRowIndex(nscoord aPos) const
-{
-  return NS_roundf(float(std::max(aPos, 0)) / mRowHeight);
+  aScrollbar->MoveToNewPosition();
 }
 
 void
 nsListBoxBodyFrame::ThumbMoved(nsScrollbarFrame* aScrollbar,
                                nscoord aOldPos,
                                nscoord aNewPos)
 { 
   if (mScrolling || mRowHeight == 0)
     return;
 
-  int32_t newIndex = ToRowIndex(aNewPos);
-  if (newIndex == mCurrentIndex) {
+  nscoord oldTwipIndex;
+  oldTwipIndex = mCurrentIndex*mRowHeight;
+  int32_t twipDelta = aNewPos > oldTwipIndex ? aNewPos - oldTwipIndex : oldTwipIndex - aNewPos;
+
+  int32_t rowDelta = twipDelta / mRowHeight;
+  int32_t remainder = twipDelta % mRowHeight;
+  if (remainder > (mRowHeight/2))
+    rowDelta++;
+
+  if (rowDelta == 0)
     return;
-  }
-  int32_t rowDelta = newIndex - mCurrentIndex;
+
+  // update the position to be row based.
+
+  int32_t newIndex = aNewPos > oldTwipIndex ? mCurrentIndex + rowDelta : mCurrentIndex - rowDelta;
+  //aNewIndex = newIndex*mRowHeight/mOnePixel;
 
   nsListScrollSmoother* smoother = GetSmoother();
 
   // if we can't scroll the rows in time then start a timer. We will eat
   // events until the user stops moving and the timer stops.
-  if (smoother->IsRunning() || Abs(rowDelta)*mTimePerRow > USER_TIME_THRESHOLD) {
+  if (smoother->IsRunning() || rowDelta*mTimePerRow > USER_TIME_THRESHOLD) {
 
      smoother->Stop();
 
-     smoother->mDelta = rowDelta;
+     smoother->mDelta = aNewPos > oldTwipIndex ? rowDelta : -rowDelta;
 
      smoother->Start();
 
      return;
   }
 
   smoother->Stop();
 
   mCurrentIndex = newIndex;
   smoother->mDelta = 0;
   
   if (mCurrentIndex < 0) {
     mCurrentIndex = 0;
     return;
   }
-  InternalPositionChanged(rowDelta < 0, Abs(rowDelta));
+  InternalPositionChanged(aNewPos < oldTwipIndex, rowDelta);
 }
 
 void
 nsListBoxBodyFrame::VisibilityChanged(bool aVisible)
 {
   if (mRowHeight == 0)
     return;
 
@@ -441,26 +434,28 @@ nsListBoxBodyFrame::VisibilityChanged(bo
 nsIFrame*
 nsListBoxBodyFrame::GetScrollbarBox(bool aVertical)
 {
   nsIScrollableFrame* scrollFrame = nsLayoutUtils::GetScrollableFrameFor(this);
   return scrollFrame ? scrollFrame->GetScrollbarBox(true) : nullptr;
 }
 
 void
-nsListBoxBodyFrame::UpdateIndex(int32_t aNewPos)
+nsListBoxBodyFrame::UpdateIndex(int32_t aDirection)
 {
-  int32_t newIndex = ToRowIndex(nsPresContext::CSSPixelsToAppUnits(aNewPos));
-  if (newIndex == mCurrentIndex) {
+  if (aDirection == 0)
+    return;
+  if (aDirection < 0)
+    mCurrentIndex--;
+  else mCurrentIndex++;
+  if (mCurrentIndex < 0) {
+    mCurrentIndex = 0;
     return;
   }
-  bool up = newIndex < mCurrentIndex;
-  int32_t indexDelta = Abs(newIndex - mCurrentIndex);
-  mCurrentIndex = newIndex;
-  InternalPositionChanged(up, indexDelta);
+  InternalPositionChanged(aDirection < 0, 1);
 }
  
 ///////////// nsIReflowCallback ///////////////
 
 bool
 nsListBoxBodyFrame::ReflowFinished()
 {
   nsAutoScriptBlocker scriptBlocker;
--- a/layout/xul/nsListBoxBodyFrame.h
+++ b/layout/xul/nsListBoxBodyFrame.h
@@ -93,18 +93,17 @@ public:
   nsresult InternalPositionChanged(bool aUp, int32_t aDelta);
   // Process pending position changed events, then do the position change.
   // This can wipe out the frametree.
   nsresult DoInternalPositionChangedSync(bool aUp, int32_t aDelta);
   // Actually do the internal position change.  This can wipe out the frametree
   nsresult DoInternalPositionChanged(bool aUp, int32_t aDelta);
   nsListScrollSmoother* GetSmoother();
   void VerticalScroll(int32_t aDelta);
-  // Update the scroll index given a position, in CSS pixels
-  void UpdateIndex(int32_t aNewPos);
+  void UpdateIndex(int32_t aDirection);
 
   // frames
   nsIFrame* GetFirstFrame();
   nsIFrame* GetLastFrame();
 
   // lazy row creation and destruction
   void CreateRows();
   void DestroyRows(int32_t& aRowsToLose);
@@ -162,17 +161,16 @@ protected:
     }
 
     nsListBoxBodyFrame* mFrame;
     bool mUp;
     int32_t mDelta;
   };
 
   void ComputeTotalRowCount();
-  int32_t ToRowIndex(nscoord aPos) const;
   void RemoveChildFrame(nsBoxLayoutState &aState, nsIFrame *aChild);
 
   nsTArray< nsRefPtr<nsPositionChangedEvent> > mPendingPositionChangeEvents;
   nsCOMPtr<nsPIBoxObject> mBoxObject;
 
   // frame markers
   nsWeakFrame mTopFrame;
   nsIFrame* mBottomFrame;
--- a/layout/xul/nsScrollbarFrame.h
+++ b/layout/xul/nsScrollbarFrame.h
@@ -88,17 +88,16 @@ public:
    * scrollbar button is pressed.
    */
   void SetIncrementToLine(int32_t aDirection);
   void SetIncrementToPage(int32_t aDirection);
   void SetIncrementToWhole(int32_t aDirection);
   /**
    * MoveToNewPosition() adds mIncrement to the current position and
    * updates the curpos attribute.
-   * @returns The new position after clamping, in CSS Pixels
    * @note This method might destroy the frame, pres shell, and other objects.
    */
   int32_t MoveToNewPosition();
   int32_t GetIncrement() { return mIncrement; }
 
 protected:
   int32_t mIncrement; // Amount to scroll, in CSSPixels
   bool mSmoothScroll;