diff options
Diffstat (limited to 'dom/html/input/SingleLineTextInputTypes.h')
-rw-r--r-- | dom/html/input/SingleLineTextInputTypes.h | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/dom/html/input/SingleLineTextInputTypes.h b/dom/html/input/SingleLineTextInputTypes.h new file mode 100644 index 0000000000..afacc917a3 --- /dev/null +++ b/dom/html/input/SingleLineTextInputTypes.h @@ -0,0 +1,158 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_dom_SingleLineTextInputTypes_h__ +#define mozilla_dom_SingleLineTextInputTypes_h__ + +#include "mozilla/dom/InputType.h" + +namespace mozilla::dom { + +class SingleLineTextInputTypeBase : public InputType { + public: + ~SingleLineTextInputTypeBase() override = default; + + bool MinAndMaxLengthApply() const final { return true; } + bool IsTooLong() const final; + bool IsTooShort() const final; + bool IsValueMissing() const final; + // Can return Nothing() if the JS engine failed to evaluate the pattern. + Maybe<bool> HasPatternMismatch() const final; + + protected: + explicit SingleLineTextInputTypeBase(HTMLInputElement* aInputElement) + : InputType(aInputElement) {} + + bool IsMutable() const override; +}; + +// input type=text +class TextInputType : public SingleLineTextInputTypeBase { + public: + static InputType* Create(HTMLInputElement* aInputElement, void* aMemory) { + return new (aMemory) TextInputType(aInputElement); + } + + private: + explicit TextInputType(HTMLInputElement* aInputElement) + : SingleLineTextInputTypeBase(aInputElement) {} +}; + +// input type=search +class SearchInputType : public SingleLineTextInputTypeBase { + public: + static InputType* Create(HTMLInputElement* aInputElement, void* aMemory) { + return new (aMemory) SearchInputType(aInputElement); + } + + private: + explicit SearchInputType(HTMLInputElement* aInputElement) + : SingleLineTextInputTypeBase(aInputElement) {} +}; + +// input type=tel +class TelInputType : public SingleLineTextInputTypeBase { + public: + static InputType* Create(HTMLInputElement* aInputElement, void* aMemory) { + return new (aMemory) TelInputType(aInputElement); + } + + private: + explicit TelInputType(HTMLInputElement* aInputElement) + : SingleLineTextInputTypeBase(aInputElement) {} +}; + +// input type=url +class URLInputType : public SingleLineTextInputTypeBase { + public: + static InputType* Create(HTMLInputElement* aInputElement, void* aMemory) { + return new (aMemory) URLInputType(aInputElement); + } + + bool HasTypeMismatch() const override; + + nsresult GetTypeMismatchMessage(nsAString& aMessage) override; + + private: + explicit URLInputType(HTMLInputElement* aInputElement) + : SingleLineTextInputTypeBase(aInputElement) {} +}; + +// input type=email +class EmailInputType : public SingleLineTextInputTypeBase { + public: + static InputType* Create(HTMLInputElement* aInputElement, void* aMemory) { + return new (aMemory) EmailInputType(aInputElement); + } + + bool HasTypeMismatch() const override; + bool HasBadInput() const override; + + nsresult GetTypeMismatchMessage(nsAString& aMessage) override; + nsresult GetBadInputMessage(nsAString& aMessage) override; + + private: + explicit EmailInputType(HTMLInputElement* aInputElement) + : SingleLineTextInputTypeBase(aInputElement) {} + + /** + * This helper method returns true if aValue is a valid email address. + * This is following the HTML5 specification: + * http://dev.w3.org/html5/spec/forms.html#valid-e-mail-address + * + * @param aValue the email address to check. + * @result whether the given string is a valid email address. + */ + static bool IsValidEmailAddress(const nsAString& aValue); + + /** + * This helper method returns true if aValue is a valid email address list. + * Email address list is a list of email address separated by comas (,) which + * can be surrounded by space charecters. + * This is following the HTML5 specification: + * http://dev.w3.org/html5/spec/forms.html#valid-e-mail-address-list + * + * @param aValue the email address list to check. + * @result whether the given string is a valid email address list. + */ + static bool IsValidEmailAddressList(const nsAString& aValue); + + /** + * Takes aEmail and attempts to convert everything after the first "@" + * character (if anything) to punycode before returning the complete result + * via the aEncodedEmail out-param. The aIndexOfAt out-param is set to the + * index of the "@" character. + * + * If no "@" is found in aEmail, aEncodedEmail is simply set to aEmail and + * the aIndexOfAt out-param is set to kNotFound. + * + * Returns true in all cases unless an attempt to punycode encode fails. If + * false is returned, aEncodedEmail has not been set. + * + * This function exists because ConvertUTF8toACE() splits on ".", meaning that + * for 'user.name@sld.tld' it would treat "name@sld" as a label. We want to + * encode the domain part only. + */ + static bool PunycodeEncodeEmailAddress(const nsAString& aEmail, + nsAutoCString& aEncodedEmail, + uint32_t* aIndexOfAt); +}; + +// input type=password +class PasswordInputType : public SingleLineTextInputTypeBase { + public: + static InputType* Create(HTMLInputElement* aInputElement, void* aMemory) { + return new (aMemory) PasswordInputType(aInputElement); + } + + private: + explicit PasswordInputType(HTMLInputElement* aInputElement) + : SingleLineTextInputTypeBase(aInputElement) {} +}; + +} // namespace mozilla::dom + +#endif /* mozilla_dom_SingleLineTextInputTypes_h__ */ |