123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
- /* 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/. */
- /* atom list for CSS pseudo-classes */
- #ifndef nsCSSPseudoClasses_h___
- #define nsCSSPseudoClasses_h___
- #include "nsStringFwd.h"
- #include "mozilla/CSSEnabledState.h"
- #include "nsStyleStruct.h"
- // The following two flags along with the pref defines where this pseudo
- // class can be used:
- // * If none of the two flags is presented, the pref completely controls
- // the availability of this pseudo class. And in that case, if it has
- // no pref, this property is usable everywhere.
- // * If any of the flags is set, this pseudo class is always enabled in
- // the specific contexts regardless of the value of the pref. If there
- // is no pref for this pseudo class at all in this case, it is an
- // internal-only pseudo class, which cannot be used anywhere else.
- #define CSS_PSEUDO_CLASS_ENABLED_MASK (3<<0)
- #define CSS_PSEUDO_CLASS_ENABLED_IN_UA_SHEETS (1<<0)
- #define CSS_PSEUDO_CLASS_ENABLED_IN_CHROME (1<<1)
- #define CSS_PSEUDO_CLASS_ENABLED_IN_UA_SHEETS_AND_CHROME \
- (CSS_PSEUDO_CLASS_ENABLED_IN_UA_SHEETS | CSS_PSEUDO_CLASS_ENABLED_IN_CHROME)
- class nsIAtom;
- namespace mozilla {
- // The total count of CSSPseudoClassType is less than 256,
- // so use uint8_t as its underlying type.
- typedef uint8_t CSSPseudoClassTypeBase;
- enum class CSSPseudoClassType : CSSPseudoClassTypeBase
- {
- #define CSS_PSEUDO_CLASS(_name, _value, _flags, _pref) \
- _name,
- #include "nsCSSPseudoClassList.h"
- #undef CSS_PSEUDO_CLASS
- Count,
- NotPseudo, // This value MUST be second last! SelectorMatches depends on it.
- MAX
- };
- } // namespace mozilla
- class nsCSSPseudoClasses
- {
- typedef mozilla::CSSPseudoClassType Type;
- typedef mozilla::CSSEnabledState EnabledState;
- public:
- static void AddRefAtoms();
- static Type GetPseudoType(nsIAtom* aAtom, EnabledState aEnabledState);
- static bool HasStringArg(Type aType);
- static bool HasNthPairArg(Type aType);
- static bool HasSelectorListArg(Type aType) {
- return aType == Type::any;
- }
- static bool IsUserActionPseudoClass(Type aType);
- // Should only be used on types other than Count and NotPseudoClass
- static void PseudoTypeToString(Type aType, nsAString& aString);
- static bool IsEnabled(Type aType, EnabledState aEnabledState)
- {
- auto index = static_cast<size_t>(aType);
- MOZ_ASSERT(index < static_cast<size_t>(Type::Count));
- if (sPseudoClassEnabled[index] ||
- aEnabledState == EnabledState::eIgnoreEnabledState) {
- return true;
- }
- auto flags = kPseudoClassFlags[index];
- if (((aEnabledState & EnabledState::eInChrome) &&
- (flags & CSS_PSEUDO_CLASS_ENABLED_IN_CHROME)) ||
- ((aEnabledState & EnabledState::eInUASheets) &&
- (flags & CSS_PSEUDO_CLASS_ENABLED_IN_UA_SHEETS))) {
- return true;
- }
- return false;
- }
- private:
- static const uint32_t kPseudoClassFlags[size_t(Type::Count)];
- static bool sPseudoClassEnabled[size_t(Type::Count)];
- };
- #endif /* nsCSSPseudoClasses_h___ */
|