diff --git a/dom/html/HTMLInputElement.cpp b/dom/html/HTMLInputElement.cpp index 5935fef13..617c764e2 100644 --- a/dom/html/HTMLInputElement.cpp +++ b/dom/html/HTMLInputElement.cpp @@ -602,14 +602,14 @@ HTMLInputElement::IsPopupBlocked() const /* Time and date picker implementations from TenFourFox issue 405. */ nsresult -HTMLInputElement::InitTimePicker() +HTMLInputElement::InitTimePicker(bool aNoMatterWhat) { NS_WARNING("InitTimePicker NYI"); return NS_ERROR_FAILURE; } nsresult -HTMLInputElement::InitDatePicker() +HTMLInputElement::InitDatePicker(bool aNoMatterWhat) { if (mPickerRunning) { NS_WARNING("Just one nsIDatePicker is allowed"); @@ -623,7 +623,7 @@ HTMLInputElement::InitDatePicker() return NS_ERROR_FAILURE; } - if (IsPopupBlocked()) { + if (!aNoMatterWhat && IsPopupBlocked()) { win->FirePopupBlockedEvent(doc, nullptr, EmptyString(), EmptyString()); return NS_OK; } @@ -2293,13 +2293,6 @@ HTMLInputElement::MozSetFileNameArray(const char16_t** aFileNames, uint32_t aLen bool HTMLInputElement::MozIsTextField(bool aExcludePassword) { -/* - // TODO: temporary until bug 773205 is fixed. - if (IsExperimentalMobileType(mType)) { - return false; - } -*/ - return IsSingleLineTextControl(aExcludePassword); } @@ -3183,6 +3176,28 @@ HTMLInputElement::PreHandleEvent(EventChainPreVisitor& aVisitor) return NS_OK; } + // Do not process keyboard events on a date or time picker + // text field, except for TAB, DELETE, BACKSPACE, RETURN/ENTER or + // SPACE, or Command/FN keys. Because such a field is actually a + // "hopped up" text field with special handling, we need to preempt + // the line editor here before it has a chance to handle the key. + // TenFourFox issue 405 + if (mType == NS_FORM_INPUT_DATE || mType == NS_FORM_INPUT_TIME) { + if (aVisitor.mEvent->mMessage == eKeyPress && aVisitor.mEvent->mFlags.mIsTrusted) { + WidgetKeyboardEvent* keyEvent = aVisitor.mEvent->AsKeyboardEvent(); + if (!(keyEvent->IsMeta() || + keyEvent->IsFn() || + keyEvent->IsOS()) && + keyEvent->keyCode != NS_VK_TAB && + keyEvent->keyCode != NS_VK_BACK && + keyEvent->keyCode != NS_VK_SPACE && + keyEvent->keyCode != NS_VK_DELETE && + keyEvent->keyCode != NS_VK_RETURN) { + return NS_OK; + } + } + } + // Initialize the editor if needed. if (NeedToInitializeEditorForEvent(aVisitor)) { nsITextControlFrame* textControlFrame = do_QueryFrame(GetPrimaryFrame()); @@ -3861,6 +3876,22 @@ HTMLInputElement::PostHandleEvent(EventChainPostVisitor& aVisitor) if (NS_SUCCEEDED(rv)) { WidgetKeyboardEvent* keyEvent = aVisitor.mEvent->AsKeyboardEvent(); + + if ((mType == NS_FORM_INPUT_DATE || mType == NS_FORM_INPUT_TIME) && + keyEvent && keyEvent->mMessage == eKeyPress && + aVisitor.mEvent->mFlags.mIsTrusted && + (keyEvent->keyCode == NS_VK_BACK || keyEvent->keyCode == NS_VK_DELETE) && + !(keyEvent->IsShift() || keyEvent->IsControl() || + keyEvent->IsAlt() || keyEvent->IsMeta() || + keyEvent->IsAltGraph() || keyEvent->IsFn() || + keyEvent->IsOS())) { + // Backspace/delete on a date or time picker field should + // just clear it. TenFourFox issue 405. Otherwise, defer + // to the handler in PreHandleEvent. + aVisitor.mEventStatus = nsEventStatus_eConsumeNoDefault; + SetValue(EmptyString()); + } + if (mType == NS_FORM_INPUT_NUMBER && keyEvent && keyEvent->mMessage == eKeyPress && aVisitor.mEvent->mFlags.mIsTrusted && @@ -6344,13 +6375,6 @@ HTMLInputElement::PlaceholderApplies() const bool HTMLInputElement::DoesPatternApply() const { -/* - // TODO: temporary until bug 773205 is fixed. - if (IsExperimentalMobileType(mType)) { - return false; - } -*/ - return IsSingleLineTextControl(false); } diff --git a/dom/html/HTMLInputElement.h b/dom/html/HTMLInputElement.h index f2912ccc0..8c6efb1f3 100644 --- a/dom/html/HTMLInputElement.h +++ b/dom/html/HTMLInputElement.h @@ -1258,8 +1258,8 @@ protected: nsresult InitColorPicker(); // TenFourFox issue 405 - nsresult InitDatePicker(); - nsresult InitTimePicker(); + nsresult InitDatePicker(bool aNoMatterWhat = false); + nsresult InitTimePicker(bool aNoMatterWhat = false); /** * Use this function before trying to open a picker. diff --git a/dom/html/nsIFormControl.h b/dom/html/nsIFormControl.h index 4c1515061..b4d37380f 100644 --- a/dom/html/nsIFormControl.h +++ b/dom/html/nsIFormControl.h @@ -250,7 +250,8 @@ nsIFormControl::IsSingleLineTextControl(bool aExcludePassword, uint32_t aType) aType == NS_FORM_INPUT_SEARCH || aType == NS_FORM_INPUT_TEL || aType == NS_FORM_INPUT_URL || - // TODO: those are temporary until bug 773205 is fixed. + // This is used as a hack. There is special handling in + // HTMLInputElement.cpp. TenFourFox issue 405. aType == NS_FORM_INPUT_DATE || aType == NS_FORM_INPUT_TIME || (!aExcludePassword && aType == NS_FORM_INPUT_PASSWORD);