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:
Boris Zbarsky 2017-03-09 14:44:06 -05:00
Родитель ccb5c104a6
Коммит c97142b029
4 изменённых файлов: 41 добавлений и 37 удалений

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

@ -6539,22 +6539,8 @@ HTMLInputElement::SetSelectionDirection(const nsAString& aDirection, ErrorResult
} }
nsTextEditorState* state = GetEditorState(); nsTextEditorState* state = GetEditorState();
if (state && state->IsSelectionCached()) { MOZ_ASSERT(state, "SupportsTextSelection came back true!");
nsITextControlFrame::SelectionDirection dir = nsITextControlFrame::eNone; state->SetSelectionDirection(aDirection, aRv);
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);
}
} }
NS_IMETHODIMP NS_IMETHODIMP

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

@ -765,27 +765,7 @@ void
HTMLTextAreaElement::SetSelectionDirection(const nsAString& aDirection, HTMLTextAreaElement::SetSelectionDirection(const nsAString& aDirection,
ErrorResult& aError) ErrorResult& aError)
{ {
if (mState.IsSelectionCached()) { mState.SetSelectionDirection(aDirection, aError);
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);
}
} }
NS_IMETHODIMP NS_IMETHODIMP

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

@ -1762,6 +1762,38 @@ nsTextEditorState::SetSelectionEnd(const mozilla::dom::Nullable<uint32_t>& aEnd,
SetSelectionRange(start, end, dir, aRv); 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* HTMLInputElement*
nsTextEditorState::GetParentNumberControl(nsFrame* aFrame) const nsTextEditorState::GetParentNumberControl(nsFrame* aFrame) const
{ {

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

@ -310,6 +310,12 @@ public:
void SetSelectionEnd(const mozilla::dom::Nullable<uint32_t>& aEnd, void SetSelectionEnd(const mozilla::dom::Nullable<uint32_t>& aEnd,
mozilla::ErrorResult& aRv); 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) { void UpdateEditableState(bool aNotify) {
if (mRootNode) { if (mRootNode) {
mRootNode->UpdateEditableState(aNotify); mRootNode->UpdateEditableState(aNotify);