|
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/. */ |
|
5 |
|
6 /* atom list for CSS pseudo-classes */ |
|
7 |
|
8 #include "mozilla/ArrayUtils.h" |
|
9 |
|
10 #include "nsCSSPseudoClasses.h" |
|
11 #include "nsStaticAtom.h" |
|
12 #include "mozilla/Preferences.h" |
|
13 #include "nsString.h" |
|
14 |
|
15 using namespace mozilla; |
|
16 |
|
17 // define storage for all atoms |
|
18 #define CSS_PSEUDO_CLASS(_name, _value, _pref) \ |
|
19 static nsIAtom* sPseudoClass_##_name; |
|
20 #include "nsCSSPseudoClassList.h" |
|
21 #undef CSS_PSEUDO_CLASS |
|
22 |
|
23 #define CSS_PSEUDO_CLASS(name_, value_, pref_) \ |
|
24 NS_STATIC_ATOM_BUFFER(name_##_pseudo_class_buffer, value_) |
|
25 #include "nsCSSPseudoClassList.h" |
|
26 #undef CSS_PSEUDO_CLASS |
|
27 |
|
28 static const nsStaticAtom CSSPseudoClasses_info[] = { |
|
29 #define CSS_PSEUDO_CLASS(name_, value_, pref_) \ |
|
30 NS_STATIC_ATOM(name_##_pseudo_class_buffer, &sPseudoClass_##name_), |
|
31 #include "nsCSSPseudoClassList.h" |
|
32 #undef CSS_PSEUDO_CLASS |
|
33 }; |
|
34 |
|
35 static bool sPseudoClassEnabled[] = { |
|
36 #define CSS_PSEUDO_CLASS(name_, value_, pref_) \ |
|
37 true, |
|
38 #include "nsCSSPseudoClassList.h" |
|
39 #undef CSS_PSEUDO_CLASS |
|
40 }; |
|
41 |
|
42 void nsCSSPseudoClasses::AddRefAtoms() |
|
43 { |
|
44 NS_RegisterStaticAtoms(CSSPseudoClasses_info); |
|
45 |
|
46 #define CSS_PSEUDO_CLASS(name_, value_, pref_) \ |
|
47 if (pref_[0]) { \ |
|
48 Preferences::AddBoolVarCache(&sPseudoClassEnabled[ePseudoClass_##name_], \ |
|
49 pref_); \ |
|
50 } |
|
51 #include "nsCSSPseudoClassList.h" |
|
52 #undef CSS_PSEUDO_CLASS |
|
53 } |
|
54 |
|
55 bool |
|
56 nsCSSPseudoClasses::HasStringArg(Type aType) |
|
57 { |
|
58 return aType == ePseudoClass_lang || |
|
59 aType == ePseudoClass_mozEmptyExceptChildrenWithLocalname || |
|
60 aType == ePseudoClass_mozSystemMetric || |
|
61 aType == ePseudoClass_mozLocaleDir || |
|
62 aType == ePseudoClass_dir; |
|
63 } |
|
64 |
|
65 bool |
|
66 nsCSSPseudoClasses::HasNthPairArg(Type aType) |
|
67 { |
|
68 return aType == ePseudoClass_nthChild || |
|
69 aType == ePseudoClass_nthLastChild || |
|
70 aType == ePseudoClass_nthOfType || |
|
71 aType == ePseudoClass_nthLastOfType; |
|
72 } |
|
73 |
|
74 void |
|
75 nsCSSPseudoClasses::PseudoTypeToString(Type aType, nsAString& aString) |
|
76 { |
|
77 NS_ABORT_IF_FALSE(aType < ePseudoClass_Count, "Unexpected type"); |
|
78 NS_ABORT_IF_FALSE(aType >= 0, "Very unexpected type"); |
|
79 (*CSSPseudoClasses_info[aType].mAtom)->ToString(aString); |
|
80 } |
|
81 |
|
82 nsCSSPseudoClasses::Type |
|
83 nsCSSPseudoClasses::GetPseudoType(nsIAtom* aAtom) |
|
84 { |
|
85 for (uint32_t i = 0; i < ArrayLength(CSSPseudoClasses_info); ++i) { |
|
86 if (*CSSPseudoClasses_info[i].mAtom == aAtom) { |
|
87 return sPseudoClassEnabled[i] ? Type(i) : ePseudoClass_NotPseudoClass; |
|
88 } |
|
89 } |
|
90 |
|
91 return nsCSSPseudoClasses::ePseudoClass_NotPseudoClass; |
|
92 } |
|
93 |
|
94 /* static */ bool |
|
95 nsCSSPseudoClasses::IsUserActionPseudoClass(Type aType) |
|
96 { |
|
97 // See http://dev.w3.org/csswg/selectors4/#useraction-pseudos |
|
98 return aType == ePseudoClass_hover || |
|
99 aType == ePseudoClass_active || |
|
100 aType == ePseudoClass_focus; |
|
101 } |