Bug 1273045 Part 1 - Convert UpdateCaretsHint to use EnumSet. r?mtseng draft
authorTing-Yu Lin <tlin@mozilla.com>
Tue, 14 Mar 2017 15:25:16 +0800
changeset 498106 04ce7ba5114f8e7b5a8c61b760de30b6fbc730c1
parent 497875 6d38ad302429c98115c354d643e81987ecec5d3c
child 498107 83e109ebb7ea8d54f01029f01384f9b42b94b18a
push id49117
push userbmo:tlin@mozilla.com
push dateTue, 14 Mar 2017 10:23:19 +0000
reviewersmtseng
bugs1273045
milestone55.0a1
Bug 1273045 Part 1 - Convert UpdateCaretsHint to use EnumSet. r?mtseng Part 2 is going to add a new hint which will use with RespectOldAppearance. Hence this patch. Remove #include "mozilla/WeakPtr.h" and "nsWeakReference.h" because they're not used in the header. MozReview-Commit-ID: KiNv0M0v8iO
layout/base/AccessibleCaretManager.cpp
layout/base/AccessibleCaretManager.h
--- a/layout/base/AccessibleCaretManager.cpp
+++ b/layout/base/AccessibleCaretManager.cpp
@@ -218,17 +218,17 @@ AccessibleCaretManager::HideCarets()
     mFirstCaret->SetAppearance(Appearance::None);
     mSecondCaret->SetAppearance(Appearance::None);
     DispatchCaretStateChangedEvent(CaretChangedReason::Visibilitychange);
     CancelCaretTimeoutTimer();
   }
 }
 
 void
-AccessibleCaretManager::UpdateCarets(UpdateCaretsHint aHint)
+AccessibleCaretManager::UpdateCarets(UpdateCaretsHintSet aHint)
 {
   FlushLayout();
   if (IsTerminated()) {
     return;
   }
 
   mLastUpdateCaretMode = GetCaretMode();
 
@@ -279,17 +279,17 @@ AccessibleCaretManager::IsCaretDisplayab
 bool
 AccessibleCaretManager::HasNonEmptyTextContent(nsINode* aNode) const
 {
   return nsContentUtils::HasNonEmptyTextContent(
            aNode, nsContentUtils::eRecurseIntoChildren);
 }
 
 void
-AccessibleCaretManager::UpdateCaretsForCursorMode(UpdateCaretsHint aHint)
+AccessibleCaretManager::UpdateCaretsForCursorMode(UpdateCaretsHintSet aHints)
 {
   AC_LOG("%s, selection: %p", __FUNCTION__, GetSelection());
 
   int32_t offset = 0;
   nsIFrame* frame = nullptr;
   if (!IsCaretDisplayableInCursorMode(&frame, &offset)) {
     HideCarets();
     return;
@@ -299,45 +299,41 @@ AccessibleCaretManager::UpdateCaretsForC
   PositionChangedResult result = mFirstCaret->SetPosition(frame, offset);
 
   switch (result) {
     case PositionChangedResult::NotChanged:
       // Do nothing
       break;
 
     case PositionChangedResult::Changed:
-      switch (aHint) {
-        case UpdateCaretsHint::Default:
-          if (HasNonEmptyTextContent(GetEditingHostForFrame(frame))) {
+      if (aHints == UpdateCaretsHint::Default) {
+        if (HasNonEmptyTextContent(GetEditingHostForFrame(frame))) {
+          mFirstCaret->SetAppearance(Appearance::Normal);
+        } else if (sCaretShownWhenLongTappingOnEmptyContent) {
+          if (mFirstCaret->IsLogicallyVisible()) {
+            // Possible cases are: 1) SelectWordOrShortcut() sets the
+            // appearance to Normal. 2) When the caret is out of viewport and
+            // now scrolling into viewport, it has appearance NormalNotShown.
             mFirstCaret->SetAppearance(Appearance::Normal);
-          } else if (sCaretShownWhenLongTappingOnEmptyContent) {
-            if (mFirstCaret->IsLogicallyVisible()) {
-              // Possible cases are: 1) SelectWordOrShortcut() sets the
-              // appearance to Normal. 2) When the caret is out of viewport and
-              // now scrolling into viewport, it has appearance NormalNotShown.
-              mFirstCaret->SetAppearance(Appearance::Normal);
-            } else {
-              // Possible cases are: a) Single tap on current empty content;
-              // OnSelectionChanged() sets the appearance to None due to
-              // MOUSEDOWN_REASON. b) Single tap on other empty content;
-              // OnBlur() sets the appearance to None.
-              //
-              // Do nothing to make the appearance remains None so that it can
-              // be distinguished from case 2). Also do not set the appearance
-              // to NormalNotShown here like the default update behavior.
-            }
           } else {
-            mFirstCaret->SetAppearance(Appearance::NormalNotShown);
+            // Possible cases are: a) Single tap on current empty content;
+            // OnSelectionChanged() sets the appearance to None due to
+            // MOUSEDOWN_REASON. b) Single tap on other empty content;
+            // OnBlur() sets the appearance to None.
+            //
+            // Do nothing to make the appearance remains None so that it can
+            // be distinguished from case 2). Also do not set the appearance
+            // to NormalNotShown here like the default update behavior.
           }
-          break;
-
-        case UpdateCaretsHint::RespectOldAppearance:
-          // Do nothing to preserve the appearance of the caret set by the
-          // caller.
-          break;
+        } else {
+          mFirstCaret->SetAppearance(Appearance::NormalNotShown);
+        }
+      } else if (aHints.contains(UpdateCaretsHint::RespectOldAppearance)) {
+        // Do nothing to preserve the appearance of the caret set by the
+        // caller.
       }
       break;
 
     case PositionChangedResult::Invisible:
       mFirstCaret->SetAppearance(Appearance::NormalNotShown);
       break;
   }
 
@@ -348,17 +344,17 @@ AccessibleCaretManager::UpdateCaretsForC
 
   if ((result != PositionChangedResult::NotChanged || oldSecondCaretVisible) &&
       !mActiveCaret) {
     DispatchCaretStateChangedEvent(CaretChangedReason::Updateposition);
   }
 }
 
 void
-AccessibleCaretManager::UpdateCaretsForSelectionMode(UpdateCaretsHint aHint)
+AccessibleCaretManager::UpdateCaretsForSelectionMode(UpdateCaretsHintSet aHints)
 {
   AC_LOG("%s: selection: %p", __FUNCTION__, GetSelection());
 
   int32_t startOffset = 0;
   nsIFrame* startFrame =
     GetFrameForFirstRangeStartOrLastRangeEnd(eDirNext, &startOffset);
 
   int32_t endOffset = 0;
@@ -366,37 +362,33 @@ AccessibleCaretManager::UpdateCaretsForS
     GetFrameForFirstRangeStartOrLastRangeEnd(eDirPrevious, &endOffset);
 
   if (!CompareTreePosition(startFrame, endFrame)) {
     // XXX: Do we really have to hide carets if this condition isn't satisfied?
     HideCarets();
     return;
   }
 
-  auto updateSingleCaret = [aHint](AccessibleCaret* aCaret, nsIFrame* aFrame,
-                                   int32_t aOffset) -> PositionChangedResult
+  auto updateSingleCaret = [aHints](AccessibleCaret* aCaret, nsIFrame* aFrame,
+                                    int32_t aOffset) -> PositionChangedResult
   {
     PositionChangedResult result = aCaret->SetPosition(aFrame, aOffset);
     aCaret->SetSelectionBarEnabled(sSelectionBarEnabled);
 
     switch (result) {
       case PositionChangedResult::NotChanged:
         // Do nothing
         break;
 
       case PositionChangedResult::Changed:
-        switch (aHint) {
-          case UpdateCaretsHint::Default:
-            aCaret->SetAppearance(Appearance::Normal);
-            break;
-
-          case UpdateCaretsHint::RespectOldAppearance:
-            // Do nothing to preserve the appearance of the caret set by the
-            // caller.
-            break;
+        if (aHints == UpdateCaretsHint::Default) {
+          aCaret->SetAppearance(Appearance::Normal);
+        } else if (aHints.contains(UpdateCaretsHint::RespectOldAppearance)) {
+          // Do nothing to preserve the appearance of the caret set by the
+          // caller.
         }
         break;
 
       case PositionChangedResult::Invisible:
         aCaret->SetAppearance(Appearance::NormalNotShown);
         break;
     }
     return result;
@@ -411,17 +403,17 @@ AccessibleCaretManager::UpdateCaretsForS
       secondCaretResult == PositionChangedResult::Changed) {
     // Flush layout to make the carets intersection correct.
     FlushLayout();
     if (IsTerminated()) {
       return;
     }
   }
 
-  if (aHint == UpdateCaretsHint::Default) {
+  if (aHints == UpdateCaretsHint::Default) {
     // Only check for tilt carets with default update hint. Otherwise we might
     // override the appearance set by the caller.
     if (sCaretsAlwaysTilt) {
       UpdateCaretsForAlwaysTilt(startFrame, endFrame);
     } else {
       UpdateCaretsForOverlappingTilt();
     }
   }
--- a/layout/base/AccessibleCaretManager.h
+++ b/layout/base/AccessibleCaretManager.h
@@ -3,27 +3,27 @@
 /* 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/. */
 
 #ifndef AccessibleCaretManager_h
 #define AccessibleCaretManager_h
 
 #include "AccessibleCaret.h"
+
+#include "mozilla/dom/CaretStateChangedEvent.h"
+#include "mozilla/EnumSet.h"
+#include "mozilla/EventForwards.h"
+#include "mozilla/RefPtr.h"
+#include "mozilla/UniquePtr.h"
 #include "nsCOMPtr.h"
 #include "nsCoord.h"
 #include "nsIDOMMouseEvent.h"
 #include "nsIFrame.h"
 #include "nsISelectionListener.h"
-#include "mozilla/RefPtr.h"
-#include "nsWeakReference.h"
-#include "mozilla/dom/CaretStateChangedEvent.h"
-#include "mozilla/EventForwards.h"
-#include "mozilla/UniquePtr.h"
-#include "mozilla/WeakPtr.h"
 
 class nsFrameSelection;
 class nsIContent;
 class nsIPresShell;
 struct nsPoint;
 
 namespace mozilla {
 
@@ -128,29 +128,31 @@ protected:
     Default,
 
     // Update everything while respecting the old appearance. For example, if
     // the caret in cursor mode is hidden due to timeout, do not change its
     // appearance to Normal.
     RespectOldAppearance
   };
 
+  using UpdateCaretsHintSet = mozilla::EnumSet<UpdateCaretsHint>;
+
   friend std::ostream& operator<<(std::ostream& aStream,
                                   const UpdateCaretsHint& aResult);
 
   // Update carets based on current selection status. This function will flush
   // layout, so caller must ensure the PresShell is still valid after calling
   // this method.
-  void UpdateCarets(UpdateCaretsHint aHint = UpdateCaretsHint::Default);
+  void UpdateCarets(UpdateCaretsHintSet aHints = UpdateCaretsHint::Default);
 
   // Force hiding all carets regardless of the current selection status.
   void HideCarets();
 
-  void UpdateCaretsForCursorMode(UpdateCaretsHint aHint);
-  void UpdateCaretsForSelectionMode(UpdateCaretsHint aHint);
+  void UpdateCaretsForCursorMode(UpdateCaretsHintSet aHints);
+  void UpdateCaretsForSelectionMode(UpdateCaretsHintSet aHints);
 
   // Provide haptic / touch feedback, primarily for select on longpress.
   void ProvideHapticFeedback();
 
   // Get the nearest enclosing focusable frame of aFrame.
   // @return focusable frame if there is any; nullptr otherwise.
   nsIFrame* GetFocusableFrame(nsIFrame* aFrame) const;