summaryrefslogtreecommitdiffstats
path: root/dom/html/input/DateTimeInputTypes.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/html/input/DateTimeInputTypes.h')
-rw-r--r--dom/html/input/DateTimeInputTypes.h159
1 files changed, 159 insertions, 0 deletions
diff --git a/dom/html/input/DateTimeInputTypes.h b/dom/html/input/DateTimeInputTypes.h
new file mode 100644
index 0000000000..fc46ef4606
--- /dev/null
+++ b/dom/html/input/DateTimeInputTypes.h
@@ -0,0 +1,159 @@
+/* -*- 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_DateTimeInputTypes_h__
+#define mozilla_dom_DateTimeInputTypes_h__
+
+#include "mozilla/dom/InputType.h"
+
+namespace mozilla::dom {
+
+class DateTimeInputTypeBase : public InputType {
+ public:
+ ~DateTimeInputTypeBase() override = default;
+
+ bool IsValueMissing() const override;
+ bool IsRangeOverflow() const override;
+ bool IsRangeUnderflow() const override;
+ bool HasStepMismatch() const override;
+ bool HasBadInput() const override;
+
+ nsresult GetRangeOverflowMessage(nsAString& aMessage) override;
+ nsresult GetRangeUnderflowMessage(nsAString& aMessage) override;
+
+ void MinMaxStepAttrChanged() override;
+
+ protected:
+ explicit DateTimeInputTypeBase(HTMLInputElement* aInputElement)
+ : InputType(aInputElement) {}
+
+ bool IsMutable() const override;
+
+ nsresult GetBadInputMessage(nsAString& aMessage) override = 0;
+
+ /**
+ * This method converts aValue (milliseconds within a day) to hours, minutes,
+ * seconds and milliseconds.
+ */
+ bool GetTimeFromMs(double aValue, uint16_t* aHours, uint16_t* aMinutes,
+ uint16_t* aSeconds, uint16_t* aMilliseconds) const;
+
+ // Minimum year limited by HTML standard, year >= 1.
+ static const double kMinimumYear;
+ // Maximum year limited by ECMAScript date object range, year <= 275760.
+ static const double kMaximumYear;
+ // Maximum valid month is 275760-09.
+ static const double kMaximumMonthInMaximumYear;
+ // Maximum valid week is 275760-W37.
+ static const double kMaximumWeekInMaximumYear;
+ // Milliseconds in a day.
+ static const double kMsPerDay;
+};
+
+// input type=date
+class DateInputType : public DateTimeInputTypeBase {
+ public:
+ static InputType* Create(HTMLInputElement* aInputElement, void* aMemory) {
+ return new (aMemory) DateInputType(aInputElement);
+ }
+
+ nsresult GetBadInputMessage(nsAString& aMessage) override;
+
+ bool ConvertStringToNumber(nsAString& aValue,
+ Decimal& aResultValue) const override;
+ bool ConvertNumberToString(Decimal aValue,
+ nsAString& aResultString) const override;
+
+ private:
+ explicit DateInputType(HTMLInputElement* aInputElement)
+ : DateTimeInputTypeBase(aInputElement) {}
+};
+
+// input type=time
+class TimeInputType : public DateTimeInputTypeBase {
+ public:
+ static InputType* Create(HTMLInputElement* aInputElement, void* aMemory) {
+ return new (aMemory) TimeInputType(aInputElement);
+ }
+
+ nsresult GetBadInputMessage(nsAString& aMessage) override;
+
+ bool ConvertStringToNumber(nsAString& aValue,
+ Decimal& aResultValue) const override;
+ bool ConvertNumberToString(Decimal aValue,
+ nsAString& aResultString) const override;
+ bool IsRangeOverflow() const override;
+ bool IsRangeUnderflow() const override;
+ nsresult GetRangeOverflowMessage(nsAString& aMessage) override;
+ nsresult GetRangeUnderflowMessage(nsAString& aMessage) override;
+
+ private:
+ explicit TimeInputType(HTMLInputElement* aInputElement)
+ : DateTimeInputTypeBase(aInputElement) {}
+
+ // https://html.spec.whatwg.org/multipage/input.html#has-a-reversed-range
+ bool HasReversedRange() const;
+ bool IsReversedRangeUnderflowAndOverflow() const;
+ nsresult GetReversedRangeUnderflowAndOverflowMessage(nsAString& aMessage);
+};
+
+// input type=week
+class WeekInputType : public DateTimeInputTypeBase {
+ public:
+ static InputType* Create(HTMLInputElement* aInputElement, void* aMemory) {
+ return new (aMemory) WeekInputType(aInputElement);
+ }
+
+ nsresult GetBadInputMessage(nsAString& aMessage) override;
+ bool ConvertStringToNumber(nsAString& aValue,
+ Decimal& aResultValue) const override;
+ bool ConvertNumberToString(Decimal aValue,
+ nsAString& aResultString) const override;
+
+ private:
+ explicit WeekInputType(HTMLInputElement* aInputElement)
+ : DateTimeInputTypeBase(aInputElement) {}
+};
+
+// input type=month
+class MonthInputType : public DateTimeInputTypeBase {
+ public:
+ static InputType* Create(HTMLInputElement* aInputElement, void* aMemory) {
+ return new (aMemory) MonthInputType(aInputElement);
+ }
+
+ nsresult GetBadInputMessage(nsAString& aMessage) override;
+ bool ConvertStringToNumber(nsAString& aValue,
+ Decimal& aResultValue) const override;
+ bool ConvertNumberToString(Decimal aValue,
+ nsAString& aResultString) const override;
+
+ private:
+ explicit MonthInputType(HTMLInputElement* aInputElement)
+ : DateTimeInputTypeBase(aInputElement) {}
+};
+
+// input type=datetime-local
+class DateTimeLocalInputType : public DateTimeInputTypeBase {
+ public:
+ static InputType* Create(HTMLInputElement* aInputElement, void* aMemory) {
+ return new (aMemory) DateTimeLocalInputType(aInputElement);
+ }
+
+ nsresult GetBadInputMessage(nsAString& aMessage) override;
+ bool ConvertStringToNumber(nsAString& aValue,
+ Decimal& aResultValue) const override;
+ bool ConvertNumberToString(Decimal aValue,
+ nsAString& aResultString) const override;
+
+ private:
+ explicit DateTimeLocalInputType(HTMLInputElement* aInputElement)
+ : DateTimeInputTypeBase(aInputElement) {}
+};
+
+} // namespace mozilla::dom
+
+#endif /* mozilla_dom_DateTimeInputTypes_h__ */