зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1343037 part 14. Implement nsTextEditorState::SetSelectionDirection. r=ehsan
This introduces two behavior changes: 1) In cached mode, we used to treat unknown selection directions as "none". Now we treat it like "forward", consistently with the "have an editor" mode. 2) Before this change, in cached mode, we did not fire "select" events on selectionDirection changes. MozReview-Commit-ID: 4nBCAm3mAiz
This commit is contained in:
Родитель
ccb5c104a6
Коммит
c97142b029
|
@ -6539,22 +6539,8 @@ HTMLInputElement::SetSelectionDirection(const nsAString& aDirection, ErrorResult
|
|||
}
|
||||
|
||||
nsTextEditorState* state = GetEditorState();
|
||||
if (state && state->IsSelectionCached()) {
|
||||
nsITextControlFrame::SelectionDirection dir = nsITextControlFrame::eNone;
|
||||
if (aDirection.EqualsLiteral("forward")) {
|
||||
dir = nsITextControlFrame::eForward;
|
||||
} else if (aDirection.EqualsLiteral("backward")) {
|
||||
dir = nsITextControlFrame::eBackward;
|
||||
}
|
||||
state->GetSelectionProperties().SetDirection(dir);
|
||||
return;
|
||||
}
|
||||
|
||||
int32_t start, end;
|
||||
GetSelectionRange(&start, &end, aRv);
|
||||
if (!aRv.Failed()) {
|
||||
aRv = SetSelectionRange(start, end, aDirection);
|
||||
}
|
||||
MOZ_ASSERT(state, "SupportsTextSelection came back true!");
|
||||
state->SetSelectionDirection(aDirection, aRv);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
|
|
@ -765,27 +765,7 @@ void
|
|||
HTMLTextAreaElement::SetSelectionDirection(const nsAString& aDirection,
|
||||
ErrorResult& aError)
|
||||
{
|
||||
if (mState.IsSelectionCached()) {
|
||||
nsITextControlFrame::SelectionDirection dir = nsITextControlFrame::eNone;
|
||||
if (aDirection.EqualsLiteral("forward")) {
|
||||
dir = nsITextControlFrame::eForward;
|
||||
} else if (aDirection.EqualsLiteral("backward")) {
|
||||
dir = nsITextControlFrame::eBackward;
|
||||
}
|
||||
mState.GetSelectionProperties().SetDirection(dir);
|
||||
return;
|
||||
}
|
||||
|
||||
int32_t start, end;
|
||||
GetSelectionRange(&start, &end, aError);
|
||||
if (aError.Failed()) {
|
||||
return;
|
||||
}
|
||||
|
||||
nsresult rv = SetSelectionRange(start, end, aDirection);
|
||||
if (NS_FAILED(rv)) {
|
||||
aError.Throw(rv);
|
||||
}
|
||||
mState.SetSelectionDirection(aDirection, aError);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
|
|
@ -1762,6 +1762,38 @@ nsTextEditorState::SetSelectionEnd(const mozilla::dom::Nullable<uint32_t>& aEnd,
|
|||
SetSelectionRange(start, end, dir, aRv);
|
||||
}
|
||||
|
||||
static nsITextControlFrame::SelectionDirection
|
||||
DirectionStringToSelectionDirection(const nsAString& aDirection)
|
||||
{
|
||||
if (aDirection.EqualsLiteral("backward")) {
|
||||
return nsITextControlFrame::eBackward;
|
||||
}
|
||||
|
||||
// We don't support directionless selections.
|
||||
return nsITextControlFrame::eForward;
|
||||
}
|
||||
|
||||
void
|
||||
nsTextEditorState::SetSelectionDirection(const nsAString& aDirection,
|
||||
ErrorResult& aRv)
|
||||
{
|
||||
nsITextControlFrame::SelectionDirection dir =
|
||||
DirectionStringToSelectionDirection(aDirection);
|
||||
|
||||
if (IsSelectionCached()) {
|
||||
GetSelectionProperties().SetDirection(dir);
|
||||
return;
|
||||
}
|
||||
|
||||
int32_t start, end;
|
||||
GetSelectionRange(&start, &end, aRv);
|
||||
if (aRv.Failed()) {
|
||||
return;
|
||||
}
|
||||
|
||||
SetSelectionRange(start, end, dir, aRv);
|
||||
}
|
||||
|
||||
HTMLInputElement*
|
||||
nsTextEditorState::GetParentNumberControl(nsFrame* aFrame) const
|
||||
{
|
||||
|
|
|
@ -310,6 +310,12 @@ public:
|
|||
void SetSelectionEnd(const mozilla::dom::Nullable<uint32_t>& aEnd,
|
||||
mozilla::ErrorResult& aRv);
|
||||
|
||||
// Set the selection direction. This basically implements the
|
||||
// https://html.spec.whatwg.org/multipage/forms.html#dom-textarea/input-selectiondirection
|
||||
// setter.
|
||||
void SetSelectionDirection(const nsAString& aDirection,
|
||||
mozilla::ErrorResult& aRv);
|
||||
|
||||
void UpdateEditableState(bool aNotify) {
|
||||
if (mRootNode) {
|
||||
mRootNode->UpdateEditableState(aNotify);
|
||||
|
|
Загрузка…
Ссылка в новой задаче