1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 /* atom list for CSS pseudo-classes */
8 #include "mozilla/ArrayUtils.h"
10 #include "nsCSSPseudoClasses.h"
11 #include "nsStaticAtom.h"
12 #include "mozilla/Preferences.h"
15 using namespace mozilla
;
17 // define storage for all atoms
18 #define CSS_PSEUDO_CLASS(_name, _value, _flags, _pref) \
19 static nsIAtom* sPseudoClass_##_name;
20 #include "nsCSSPseudoClassList.h"
21 #undef CSS_PSEUDO_CLASS
23 #define CSS_PSEUDO_CLASS(name_, value_, flags_, pref_) \
24 NS_STATIC_ATOM_BUFFER(name_##_pseudo_class_buffer, value_)
25 #include "nsCSSPseudoClassList.h"
26 #undef CSS_PSEUDO_CLASS
28 // Array of nsStaticAtom for each of the pseudo-classes.
29 static const nsStaticAtom CSSPseudoClasses_info
[] = {
30 #define CSS_PSEUDO_CLASS(name_, value_, flags_, pref_) \
31 NS_STATIC_ATOM(name_##_pseudo_class_buffer, &sPseudoClass_##name_),
32 #include "nsCSSPseudoClassList.h"
33 #undef CSS_PSEUDO_CLASS
36 // Flags data for each of the pseudo-classes, which must be separate
37 // from the previous array since there's no place for it in
39 static const uint32_t CSSPseudoClasses_flags
[] = {
40 #define CSS_PSEUDO_CLASS(name_, value_, flags_, pref_) \
42 #include "nsCSSPseudoClassList.h"
43 #undef CSS_PSEUDO_CLASS
46 static bool sPseudoClassEnabled
[] = {
47 #define CSS_PSEUDO_CLASS(name_, value_, flags_, pref_) \
49 #include "nsCSSPseudoClassList.h"
50 #undef CSS_PSEUDO_CLASS
53 void nsCSSPseudoClasses::AddRefAtoms()
55 NS_RegisterStaticAtoms(CSSPseudoClasses_info
);
57 #define CSS_PSEUDO_CLASS(name_, value_, flags_, pref_) \
59 Preferences::AddBoolVarCache(&sPseudoClassEnabled[ePseudoClass_##name_], \
62 #include "nsCSSPseudoClassList.h"
63 #undef CSS_PSEUDO_CLASS
67 nsCSSPseudoClasses::HasStringArg(Type aType
)
69 return aType
== ePseudoClass_lang
||
70 aType
== ePseudoClass_mozEmptyExceptChildrenWithLocalname
||
71 aType
== ePseudoClass_mozSystemMetric
||
72 aType
== ePseudoClass_mozLocaleDir
||
73 aType
== ePseudoClass_dir
;
77 nsCSSPseudoClasses::HasNthPairArg(Type aType
)
79 return aType
== ePseudoClass_nthChild
||
80 aType
== ePseudoClass_nthLastChild
||
81 aType
== ePseudoClass_nthOfType
||
82 aType
== ePseudoClass_nthLastOfType
;
86 nsCSSPseudoClasses::PseudoTypeToString(Type aType
, nsAString
& aString
)
88 NS_ABORT_IF_FALSE(aType
< ePseudoClass_Count
, "Unexpected type");
89 NS_ABORT_IF_FALSE(aType
>= 0, "Very unexpected type");
90 (*CSSPseudoClasses_info
[aType
].mAtom
)->ToString(aString
);
93 nsCSSPseudoClasses::Type
94 nsCSSPseudoClasses::GetPseudoType(nsIAtom
* aAtom
)
96 for (uint32_t i
= 0; i
< ArrayLength(CSSPseudoClasses_info
); ++i
) {
97 if (*CSSPseudoClasses_info
[i
].mAtom
== aAtom
) {
98 return sPseudoClassEnabled
[i
] ? Type(i
) : ePseudoClass_NotPseudoClass
;
102 return nsCSSPseudoClasses::ePseudoClass_NotPseudoClass
;
106 nsCSSPseudoClasses::IsUserActionPseudoClass(Type aType
)
108 // See http://dev.w3.org/csswg/selectors4/#useraction-pseudos
109 return aType
== ePseudoClass_hover
||
110 aType
== ePseudoClass_active
||
111 aType
== ePseudoClass_focus
;
114 /* static */ uint32_t
115 nsCSSPseudoClasses::FlagsForPseudoClass(const Type aType
)
117 size_t index
= static_cast<size_t>(aType
);
118 NS_ASSERTION(index
< ArrayLength(CSSPseudoClasses_flags
),
119 "argument must be a pseudo-class");
120 return CSSPseudoClasses_flags
[index
];