1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4  * License, v. 2.0. If a copy of the MPL was not distributed with this
5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 
7 #ifndef mozilla_dom_ValidityState_h
8 #define mozilla_dom_ValidityState_h
9 
10 #include "nsCOMPtr.h"
11 #include "nsIConstraintValidation.h"
12 #include "nsWrapperCache.h"
13 #include "js/TypeDecls.h"
14 
15 namespace mozilla {
16 namespace dom {
17 
18 class ValidityState final : public nsISupports, public nsWrapperCache {
19   ~ValidityState() = default;
20 
21  public:
22   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
23   NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(ValidityState)
24 
25   friend class ::nsIConstraintValidation;
26 
GetParentObject()27   nsIConstraintValidation* GetParentObject() const {
28     return mConstraintValidation;
29   }
30 
31   virtual JSObject* WrapObject(JSContext* aCx,
32                                JS::Handle<JSObject*> aGivenProto) override;
33 
34   // Web IDL methods
ValueMissing()35   bool ValueMissing() const {
36     return GetValidityState(
37         nsIConstraintValidation::VALIDITY_STATE_VALUE_MISSING);
38   }
TypeMismatch()39   bool TypeMismatch() const {
40     return GetValidityState(
41         nsIConstraintValidation::VALIDITY_STATE_TYPE_MISMATCH);
42   }
PatternMismatch()43   bool PatternMismatch() const {
44     return GetValidityState(
45         nsIConstraintValidation::VALIDITY_STATE_PATTERN_MISMATCH);
46   }
TooLong()47   bool TooLong() const {
48     return GetValidityState(nsIConstraintValidation::VALIDITY_STATE_TOO_LONG);
49   }
TooShort()50   bool TooShort() const {
51     return GetValidityState(nsIConstraintValidation::VALIDITY_STATE_TOO_SHORT);
52   }
RangeUnderflow()53   bool RangeUnderflow() const {
54     return GetValidityState(
55         nsIConstraintValidation::VALIDITY_STATE_RANGE_UNDERFLOW);
56   }
RangeOverflow()57   bool RangeOverflow() const {
58     return GetValidityState(
59         nsIConstraintValidation::VALIDITY_STATE_RANGE_OVERFLOW);
60   }
StepMismatch()61   bool StepMismatch() const {
62     return GetValidityState(
63         nsIConstraintValidation::VALIDITY_STATE_STEP_MISMATCH);
64   }
BadInput()65   bool BadInput() const {
66     return GetValidityState(nsIConstraintValidation::VALIDITY_STATE_BAD_INPUT);
67   }
CustomError()68   bool CustomError() const {
69     return GetValidityState(
70         nsIConstraintValidation::VALIDITY_STATE_CUSTOM_ERROR);
71   }
Valid()72   bool Valid() const {
73     return !mConstraintValidation || mConstraintValidation->IsValid();
74   }
75 
76  protected:
77   explicit ValidityState(nsIConstraintValidation* aConstraintValidation);
78 
79   /**
80    * Helper function to get a validity state from constraint validation
81    * instance.
82    */
GetValidityState(nsIConstraintValidation::ValidityStateType aState)83   inline bool GetValidityState(
84       nsIConstraintValidation::ValidityStateType aState) const {
85     return mConstraintValidation &&
86            mConstraintValidation->GetValidityState(aState);
87   }
88 
89   nsCOMPtr<nsIConstraintValidation> mConstraintValidation;
90 };
91 
92 }  // namespace dom
93 }  // namespace mozilla
94 
95 #endif  // mozilla_dom_ValidityState_h
96