Bumping manifests a=b2g-bump
[gecko.git] / layout / style / nsCSSPseudoClasses.cpp
blob72321369c49510cfafec7cc92e59ea6062144b24
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"
13 #include "nsString.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
38 // nsStaticAtom.
39 static const uint32_t CSSPseudoClasses_flags[] = {
40 #define CSS_PSEUDO_CLASS(name_, value_, flags_, pref_) \
41 flags_,
42 #include "nsCSSPseudoClassList.h"
43 #undef CSS_PSEUDO_CLASS
46 static bool sPseudoClassEnabled[] = {
47 #define CSS_PSEUDO_CLASS(name_, value_, flags_, pref_) \
48 true,
49 #include "nsCSSPseudoClassList.h"
50 #undef CSS_PSEUDO_CLASS
51 };
53 void nsCSSPseudoClasses::AddRefAtoms()
55 NS_RegisterStaticAtoms(CSSPseudoClasses_info);
57 #define CSS_PSEUDO_CLASS(name_, value_, flags_, pref_) \
58 if (pref_[0]) { \
59 Preferences::AddBoolVarCache(&sPseudoClassEnabled[ePseudoClass_##name_], \
60 pref_); \
62 #include "nsCSSPseudoClassList.h"
63 #undef CSS_PSEUDO_CLASS
66 bool
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;
76 bool
77 nsCSSPseudoClasses::HasNthPairArg(Type aType)
79 return aType == ePseudoClass_nthChild ||
80 aType == ePseudoClass_nthLastChild ||
81 aType == ePseudoClass_nthOfType ||
82 aType == ePseudoClass_nthLastOfType;
85 void
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;
105 /* static */ bool
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];