Bug 1435637: Minimally tidy nsRefreshDriver. r?hiro draft
authorEmilio Cobos Álvarez <emilio@crisal.io>
Sun, 04 Feb 2018 23:15:53 +0100
changeset 751042 184e3c9928f5fd9cc15a197244ef1406e809b407
parent 751040 1dfea5c642753a78c30e0e042657575f8e5ae009
push id97829
push userbmo:emilio@crisal.io
push dateSun, 04 Feb 2018 22:23:32 +0000
reviewershiro
bugs1435637
milestone60.0a1
Bug 1435637: Minimally tidy nsRefreshDriver. r?hiro All the arrays we're switching to ranged loops can't mutate during the loop since are locals or not referenced from other places. MozReview-Commit-ID: C2N73HMMeNW
layout/base/nsRefreshDriver.cpp
--- a/layout/base/nsRefreshDriver.cpp
+++ b/layout/base/nsRefreshDriver.cpp
@@ -295,17 +295,17 @@ protected:
   }
 
   void TickRefreshDrivers(int64_t aJsNow, TimeStamp aNow, nsTArray<RefPtr<nsRefreshDriver>>& aDrivers)
   {
     if (aDrivers.IsEmpty()) {
       return;
     }
 
-    nsTArray<RefPtr<nsRefreshDriver> > drivers(aDrivers);
+    nsTArray<RefPtr<nsRefreshDriver>> drivers(aDrivers);
     for (nsRefreshDriver* driver : drivers) {
       // don't poke this driver if it's in test mode
       if (driver->IsTestControllingRefreshesEnabled()) {
         continue;
       }
 
       TickDriver(driver, aJsNow, aNow);
 
@@ -340,18 +340,18 @@ protected:
     driver->Tick(jsnow, now);
   }
 
   int64_t mLastFireEpoch;
   bool mLastFireSkipped;
   TimeStamp mLastFireTime;
   TimeStamp mTargetTime;
 
-  nsTArray<RefPtr<nsRefreshDriver> > mContentRefreshDrivers;
-  nsTArray<RefPtr<nsRefreshDriver> > mRootRefreshDrivers;
+  nsTArray<RefPtr<nsRefreshDriver>> mContentRefreshDrivers;
+  nsTArray<RefPtr<nsRefreshDriver>> mRootRefreshDrivers;
 
   // useful callback for nsITimer-based derived classes, here
   // bacause of c++ protected shenanigans
   static void TimerTick(nsITimer* aTimer, void* aClosure)
   {
     RefreshDriverTimer *timer = static_cast<RefreshDriverTimer*>(aClosure);
     timer->Tick();
   }
@@ -946,17 +946,17 @@ protected:
     TimeStamp now = TimeStamp::Now();
 
     ScheduleNextTick(now);
 
     mLastFireEpoch = jsnow;
     mLastFireTime = now;
     mLastFireSkipped = false;
 
-    nsTArray<RefPtr<nsRefreshDriver> > drivers(mContentRefreshDrivers);
+    nsTArray<RefPtr<nsRefreshDriver>> drivers(mContentRefreshDrivers);
     drivers.AppendElements(mRootRefreshDrivers);
     size_t index = mNextDriverIndex;
 
     if (index < drivers.Length() &&
         !drivers[index]->IsTestControllingRefreshesEnabled())
     {
       TickDriver(drivers[index], jsnow, now);
       mLastFireSkipped = mLastFireSkipped || drivers[index]->SkippedPaints();
@@ -1419,18 +1419,18 @@ nsRefreshDriver::StopTimer()
   mActiveTimer->RemoveRefreshDriver(this);
   mActiveTimer = nullptr;
 }
 
 uint32_t
 nsRefreshDriver::ObserverCount() const
 {
   uint32_t sum = 0;
-  for (uint32_t i = 0; i < ArrayLength(mObservers); ++i) {
-    sum += mObservers[i].Length();
+  for (const ObserverArray& array : mObservers) {
+    sum += array.Length();
   }
 
   // Even while throttled, we need to process layout and style changes.  Style
   // changes can trigger transitions which fire events when they complete, and
   // layout changes can affect media queries on child documents, triggering
   // style changes, etc.
   sum += mAnimationEventFlushObservers.Length();
   sum += mResizeEventFlushObservers.Length();
@@ -1442,18 +1442,18 @@ nsRefreshDriver::ObserverCount() const
   sum += mViewManagerFlushIsPending;
   sum += mEarlyRunners.Length();
   return sum;
 }
 
 bool
 nsRefreshDriver::HasObservers() const
 {
-  for (uint32_t i = 0; i < ArrayLength(mObservers); ++i) {
-    if (!mObservers[i].IsEmpty()) {
+  for (const ObserverArray& array : mObservers) {
+    if (!array.IsEmpty()) {
       return true;
     }
   }
 
   return mViewManagerFlushIsPending ||
          !mStyleFlushObservers.IsEmpty() ||
          !mLayoutFlushObservers.IsEmpty() ||
          !mAnimationEventFlushObservers.IsEmpty() ||
@@ -1632,22 +1632,18 @@ nsRefreshDriver::DispatchAnimationEvents
 {
   if (!mPresContext) {
     return;
   }
 
   // Hold all AnimationEventDispatcher in mAnimationEventFlushObservers as
   // a RefPtr<> array since each AnimationEventDispatcher might be destroyed
   // during processing the previous dispatcher.
-  size_t len = mAnimationEventFlushObservers.Length();
   AutoTArray<RefPtr<AnimationEventDispatcher>, 16> dispatchers;
-  RefPtr<AnimationEventDispatcher>* elems = dispatchers.AppendElements(len);
-  for (size_t i = 0; i < len; i++) {
-    elems[i] = mAnimationEventFlushObservers[i];
-  }
+  dispatchers.AppendElements(mAnimationEventFlushObservers);
   mAnimationEventFlushObservers.Clear();
 
   for (auto& dispatcher : dispatchers) {
     dispatcher->DispatchEvents();
   }
 }
 
 void
@@ -1851,31 +1847,30 @@ nsRefreshDriver::Tick(int64_t aNowEpoch,
   // in the queue. This will prevent us from spending precious time
   // painting a stale displayport.
   if (gfxPrefs::APZPeekMessages()) {
     nsLayoutUtils::UpdateDisplayPortMarginsFromPendingMessages();
   }
 
   AutoTArray<nsCOMPtr<nsIRunnable>, 16> earlyRunners;
   earlyRunners.SwapElements(mEarlyRunners);
-  for (uint32_t i = 0; i < earlyRunners.Length(); ++i) {
-    earlyRunners[i]->Run();
+  for (auto& runner : earlyRunners) {
+    runner->Run();
   }
 
   // Resize events should be fired before layout flushes or
   // calling animation frame callbacks.
   AutoTArray<nsIPresShell*, 16> observers;
   observers.AppendElements(mResizeEventFlushObservers);
-  for (uint32_t i = observers.Length(); i; --i) {
+  for (nsIPresShell* shell : Reversed(observers)) {
     if (!mPresContext || !mPresContext->GetPresShell()) {
       break;
     }
     // Make sure to not process observers which might have been removed
     // during previous iterations.
-    nsIPresShell* shell = observers[i - 1];
     if (!mResizeEventFlushObservers.RemoveElement(shell)) {
       continue;
     }
     shell->FireResizeEvent();
   }
 
   /*
    * The timer holds a reference to |this| while calling |Notify|.
@@ -1972,18 +1967,17 @@ nsRefreshDriver::Tick(int64_t aNowEpoch,
     mNeedToRecomputeVisibility = false;
 
     presShell->ScheduleApproximateFrameVisibilityUpdateNow();
   }
 
 #ifdef MOZ_XUL
   // Update any popups that may need to be moved or hidden due to their
   // anchor changing.
-  nsXULPopupManager* pm = nsXULPopupManager::GetInstance();
-  if (pm) {
+  if (nsXULPopupManager* pm = nsXULPopupManager::GetInstance()) {
     pm->UpdatePopupPositions(this);
   }
 #endif
 
   UpdateIntersectionObservations();
 
   /*
    * Perform notification to imgIRequests subscribed to listen
@@ -2098,19 +2092,19 @@ nsRefreshDriver::Tick(int64_t aNowEpoch,
 
   if (mPresContext->IsRoot() && XRE_IsContentProcess() && gfxPrefs::AlwaysPaint()) {
     ScheduleViewManagerFlush();
   }
 
   if (dispatchRunnablesAfterTick && sPendingIdleRunnables) {
     AutoTArray<RunnableWithDelay, 8>* runnables = sPendingIdleRunnables;
     sPendingIdleRunnables = nullptr;
-    for (uint32_t i = 0; i < runnables->Length(); ++i) {
-      NS_IdleDispatchToCurrentThread((*runnables)[i].mRunnable.forget(),
-                                     (*runnables)[i].mDelay);
+    for (RunnableWithDelay& runnableWithDelay : *runnables) {
+      NS_IdleDispatchToCurrentThread(runnableWithDelay.mRunnable.forget(),
+                                     runnableWithDelay.mDelay);
     }
     delete runnables;
   }
 }
 
 void
 nsRefreshDriver::BeginRefreshingImages(RequestTable& aEntries,
                                        mozilla::TimeStamp aDesired)