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
--- 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;