Bug 1336388 - Use overlapping tilt mechanism in always tilt mode. r=mtseng draft
authorTing-Yu Lin <tlin@mozilla.com>
Wed, 08 Feb 2017 15:51:28 +0800
changeset 480452 5133468b5bc9efeb8b153d59f6625a5324d272ac
parent 479141 20a8536b0bfac74389d3a57bd8dd957d98779ce1
child 544957 e946a787ad68d81bcb33ea1d52caecdf93fbb8fa
push id44547
push userbmo:tlin@mozilla.com
push dateWed, 08 Feb 2017 08:33:34 +0000
reviewersmtseng
bugs1336388
milestone54.0a1
Bug 1336388 - Use overlapping tilt mechanism in always tilt mode. r=mtseng MozReview-Commit-ID: LwWnAbHiTBH
layout/base/AccessibleCaretManager.cpp
layout/base/AccessibleCaretManager.h
layout/base/gtest/TestAccessibleCaretManager.cpp
--- a/layout/base/AccessibleCaretManager.cpp
+++ b/layout/base/AccessibleCaretManager.cpp
@@ -424,40 +424,51 @@ AccessibleCaretManager::UpdateCaretsForS
     }
   }
 
   if (!mActiveCaret) {
     DispatchCaretStateChangedEvent(CaretChangedReason::Updateposition);
   }
 }
 
-void
+bool
 AccessibleCaretManager::UpdateCaretsForOverlappingTilt()
 {
-  if (mFirstCaret->IsVisuallyVisible() && mSecondCaret->IsVisuallyVisible()) {
-    if (mFirstCaret->Intersects(*mSecondCaret)) {
-      if (mFirstCaret->LogicalPosition().x <=
-          mSecondCaret->LogicalPosition().x) {
-        mFirstCaret->SetAppearance(Appearance::Left);
-        mSecondCaret->SetAppearance(Appearance::Right);
-      } else {
-        mFirstCaret->SetAppearance(Appearance::Right);
-        mSecondCaret->SetAppearance(Appearance::Left);
-      }
-    } else {
-      mFirstCaret->SetAppearance(Appearance::Normal);
-      mSecondCaret->SetAppearance(Appearance::Normal);
-    }
+  if (!mFirstCaret->IsVisuallyVisible() || !mSecondCaret->IsVisuallyVisible()) {
+    return false;
+  }
+
+  if (!mFirstCaret->Intersects(*mSecondCaret)) {
+    mFirstCaret->SetAppearance(Appearance::Normal);
+    mSecondCaret->SetAppearance(Appearance::Normal);
+    return false;
   }
+
+  if (mFirstCaret->LogicalPosition().x <=
+      mSecondCaret->LogicalPosition().x) {
+    mFirstCaret->SetAppearance(Appearance::Left);
+    mSecondCaret->SetAppearance(Appearance::Right);
+  } else {
+    mFirstCaret->SetAppearance(Appearance::Right);
+    mSecondCaret->SetAppearance(Appearance::Left);
+  }
+
+  return true;
 }
 
 void
 AccessibleCaretManager::UpdateCaretsForAlwaysTilt(nsIFrame* aStartFrame,
                                                   nsIFrame* aEndFrame)
 {
+  // When a short LTR word in RTL environment is selected, the two carets
+  // tilted inward might be overlapped. Make them tilt outward.
+  if (UpdateCaretsForOverlappingTilt()) {
+    return;
+  }
+
   if (mFirstCaret->IsVisuallyVisible()) {
     auto startFrameWritingMode = aStartFrame->GetWritingMode();
     mFirstCaret->SetAppearance(startFrameWritingMode.IsBidiLTR() ?
                                Appearance::Left : Appearance::Right);
   }
   if (mSecondCaret->IsVisuallyVisible()) {
     auto endFrameWritingMode = aEndFrame->GetWritingMode();
     mSecondCaret->SetAppearance(endFrameWritingMode.IsBidiLTR() ?
--- a/layout/base/AccessibleCaretManager.h
+++ b/layout/base/AccessibleCaretManager.h
@@ -221,17 +221,18 @@ protected:
   // Get caret mode based on current selection.
   virtual CaretMode GetCaretMode() const;
 
   // @return true if aStartFrame comes before aEndFrame.
   virtual bool CompareTreePosition(nsIFrame* aStartFrame,
                                    nsIFrame* aEndFrame) const;
 
   // Check if the two carets is overlapping to become tilt.
-  virtual void UpdateCaretsForOverlappingTilt();
+  // @return true if the two carets become tilt; false, otherwise.
+  virtual bool UpdateCaretsForOverlappingTilt();
 
   // Make the two carets always tilt.
   virtual void UpdateCaretsForAlwaysTilt(nsIFrame* aStartFrame,
                                          nsIFrame* aEndFrame);
 
   // Check whether AccessibleCaret is displayable in cursor mode or not.
   // @param aOutFrame returns frame of the cursor if it's displayable.
   // @param aOutOffset returns frame offset as well.
--- a/layout/base/gtest/TestAccessibleCaretManager.cpp
+++ b/layout/base/gtest/TestAccessibleCaretManager.cpp
@@ -87,17 +87,17 @@ public:
     }
 
     virtual bool IsCaretDisplayableInCursorMode(
       nsIFrame** aOutFrame = nullptr, int32_t* aOutOffset = nullptr) const override
     {
       return true;
     }
 
-    virtual void UpdateCaretsForOverlappingTilt() override {}
+    virtual bool UpdateCaretsForOverlappingTilt() override { return true; }
 
     virtual void UpdateCaretsForAlwaysTilt(nsIFrame* aStartFrame,
                                            nsIFrame* aEndFrame)
     {
       if (mFirstCaret->IsVisuallyVisible()) {
         mFirstCaret->SetAppearance(Appearance::Left);
       }
       if (mSecondCaret->IsVisuallyVisible()) {