Source code

Revision control

Copy as Markdown

Other Tools

/* -*- 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;
StringToNumberResult ConvertStringToNumber(const nsAString&) 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;
StringToNumberResult ConvertStringToNumber(const nsAString&) 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) {}
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;
StringToNumberResult ConvertStringToNumber(const nsAString&) 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;
StringToNumberResult ConvertStringToNumber(const nsAString&) 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;
StringToNumberResult ConvertStringToNumber(const nsAString&) 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__ */