Bug 1336388 - Use overlapping tilt mechanism in always tilt mode. r=mtseng
MozReview-Commit-ID: LwWnAbHiTBH
--- 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()) {