Bug 1677253 - Part 2: Detect direction change in SelectionChangeEventDispatcher r=masayuki

Differential Revision: https://phabricator.services.mozilla.com/D101246
This commit is contained in:
Kagami Sascha Rosylight 2021-06-21 00:58:36 +00:00
Родитель 7bb3355218
Коммит 1a8150e79d
3 изменённых файлов: 13 добавлений и 12 удалений

Просмотреть файл

@ -86,12 +86,13 @@ void SelectionChangeEventDispatcher::OnSelectionChange(Document* aDoc,
// Don't bother checking this if we are hiding changes.
if (mOldRanges.Length() == aSel->RangeCount() &&
!aSel->IsBlockingSelectionChangeEvents()) {
bool changed = false;
for (size_t i = 0; i < mOldRanges.Length(); i++) {
if (!mOldRanges[i].Equals(aSel->GetRangeAt(i))) {
changed = true;
break;
bool changed = mOldDirection != aSel->GetDirection();
if (!changed) {
for (size_t i = 0; i < mOldRanges.Length(); i++) {
if (!mOldRanges[i].Equals(aSel->GetRangeAt(static_cast<int32_t>(i)))) {
changed = true;
break;
}
}
}
@ -105,6 +106,7 @@ void SelectionChangeEventDispatcher::OnSelectionChange(Document* aDoc,
for (size_t i = 0; i < aSel->RangeCount(); i++) {
mOldRanges.AppendElement(RawRangeData(aSel->GetRangeAt(i)));
}
mOldDirection = aSel->GetDirection();
if (doc) {
nsPIDOMWindowInner* inner = doc->GetInnerWindow();

Просмотреть файл

@ -11,6 +11,7 @@
#include "nsCycleCollectionParticipant.h"
#include "nsTArray.h"
#include "nsCOMPtr.h"
#include "nsDirection.h"
class nsINode;
class nsRange;
@ -58,6 +59,7 @@ class SelectionChangeEventDispatcher final {
private:
nsTArray<RawRangeData> mOldRanges;
nsDirection mOldDirection;
~SelectionChangeEventDispatcher() = default;
};

Просмотреть файл

@ -876,12 +876,9 @@ nsresult nsTextControlFrame::SetSelectionInternal(
direction = (aDirection == eBackward) ? eDirPrevious : eDirNext;
}
ErrorResult error;
selection->SetStartAndEndInLimiter(*aStartNode, aStartOffset, *aEndNode,
aEndOffset, error);
MOZ_TRY(error.StealNSResult());
selection->SetDirection(direction);
MOZ_TRY(selection->SetStartAndEndInLimiter(*aStartNode, aStartOffset,
*aEndNode, aEndOffset, direction,
nsISelectionListener::JS_REASON));
return NS_OK;
}