Bug 1481400 - Centralize keyboard activation code. r=masayuki

Differential Revision: https://phabricator.services.mozilla.com/D116584
This commit is contained in:
Emilio Cobos Álvarez
2021-06-03 08:15:24 +00:00
parent 652f2a2408
commit 680ad75223
5 changed files with 79 additions and 97 deletions

View File

@@ -3593,6 +3593,22 @@ bool HTMLInputElement::StepsInputValue(
return true;
}
static bool ActivatesWithKeyboard(uint8_t aType) {
switch (aType) {
case NS_FORM_INPUT_CHECKBOX:
case NS_FORM_INPUT_RADIO:
case NS_FORM_INPUT_BUTTON:
case NS_FORM_INPUT_RESET:
case NS_FORM_INPUT_SUBMIT:
case NS_FORM_INPUT_FILE:
case NS_FORM_INPUT_IMAGE: // Bug 34418
case NS_FORM_INPUT_COLOR:
return true;
default:
return false;
}
}
nsresult HTMLInputElement::PostHandleEvent(EventChainPostVisitor& aVisitor) {
if (aVisitor.mEvent->mMessage == eFocus ||
aVisitor.mEvent->mMessage == eBlur) {
@@ -3733,6 +3749,16 @@ nsresult HTMLInputElement::PostHandleEvent(EventChainPostVisitor& aVisitor) {
FireChangeEventIfNeeded();
aVisitor.mEventStatus = nsEventStatus_eConsumeNoDefault;
} else if (!preventDefault) {
// Checkbox and Radio try to submit on Enter press
if (aVisitor.mEvent->mMessage == eKeyPress &&
(mType == NS_FORM_INPUT_CHECKBOX || mType == NS_FORM_INPUT_RADIO) &&
keyEvent->mKeyCode == NS_VK_RETURN && aVisitor.mPresContext) {
MaybeSubmitForm(aVisitor.mPresContext);
} else if (ActivatesWithKeyboard(mType)) {
// Otherwise we maybe dispatch a synthesized click.
HandleKeyboardActivation(aVisitor);
}
switch (aVisitor.mEvent->mMessage) {
case eFocus: {
// see if we should select the contents of the textbox. This happens
@@ -3761,43 +3787,8 @@ nsresult HTMLInputElement::PostHandleEvent(EventChainPostVisitor& aVisitor) {
}
break;
}
case eKeyPress:
case eKeyUp: {
// For backwards compat, trigger checks/radios/buttons with
// space or enter (bug 25300)
WidgetKeyboardEvent* keyEvent = aVisitor.mEvent->AsKeyboardEvent();
if ((aVisitor.mEvent->mMessage == eKeyPress &&
keyEvent->mKeyCode == NS_VK_RETURN) ||
(aVisitor.mEvent->mMessage == eKeyUp &&
keyEvent->mKeyCode == NS_VK_SPACE)) {
switch (mType) {
case NS_FORM_INPUT_CHECKBOX:
case NS_FORM_INPUT_RADIO: {
// Checkbox and Radio try to submit on Enter press
if (keyEvent->mKeyCode != NS_VK_SPACE &&
aVisitor.mPresContext) {
MaybeSubmitForm(aVisitor.mPresContext);
break; // If we are submitting, do not send click event
}
// else fall through and treat Space like click...
[[fallthrough]];
}
case NS_FORM_INPUT_BUTTON:
case NS_FORM_INPUT_RESET:
case NS_FORM_INPUT_SUBMIT:
case NS_FORM_INPUT_FILE:
case NS_FORM_INPUT_IMAGE: // Bug 34418
case NS_FORM_INPUT_COLOR: {
DispatchSimulatedClick(this, aVisitor.mEvent->IsTrusted(),
aVisitor.mPresContext);
aVisitor.mEventStatus = nsEventStatus_eConsumeNoDefault;
} // case
} // switch
}
if (aVisitor.mEvent->mMessage == eKeyPress &&
mType == NS_FORM_INPUT_RADIO && !keyEvent->IsAlt() &&
case eKeyPress: {
if (mType == NS_FORM_INPUT_RADIO && !keyEvent->IsAlt() &&
!keyEvent->IsControl() && !keyEvent->IsMeta()) {
bool isMovingBack = false;
switch (keyEvent->mKeyCode) {
@@ -3849,8 +3840,7 @@ nsresult HTMLInputElement::PostHandleEvent(EventChainPostVisitor& aVisitor) {
* not submit, period.
*/
if (aVisitor.mEvent->mMessage == eKeyPress &&
keyEvent->mKeyCode == NS_VK_RETURN &&
if (keyEvent->mKeyCode == NS_VK_RETURN &&
(IsSingleLineTextControl(false, mType) ||
mType == NS_FORM_INPUT_NUMBER || IsDateTimeInputType(mType))) {
FireChangeEventIfNeeded();
@@ -3860,8 +3850,7 @@ nsresult HTMLInputElement::PostHandleEvent(EventChainPostVisitor& aVisitor) {
}
}
if (aVisitor.mEvent->mMessage == eKeyPress &&
mType == NS_FORM_INPUT_RANGE && !keyEvent->IsAlt() &&
if (mType == NS_FORM_INPUT_RANGE && !keyEvent->IsAlt() &&
!keyEvent->IsControl() && !keyEvent->IsMeta() &&
(keyEvent->mKeyCode == NS_VK_LEFT ||
keyEvent->mKeyCode == NS_VK_RIGHT ||
@@ -3924,7 +3913,7 @@ nsresult HTMLInputElement::PostHandleEvent(EventChainPostVisitor& aVisitor) {
}
}
} break; // eKeyPress || eKeyUp
} break; // eKeyPress
case eMouseDown:
case eMouseUp: