diff -r 000000000000 -r 6474c204b198 layout/style/nsCSSPseudoClasses.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/layout/style/nsCSSPseudoClasses.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,101 @@ +/* -*- 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 */ + +#include "mozilla/ArrayUtils.h" + +#include "nsCSSPseudoClasses.h" +#include "nsStaticAtom.h" +#include "mozilla/Preferences.h" +#include "nsString.h" + +using namespace mozilla; + +// define storage for all atoms +#define CSS_PSEUDO_CLASS(_name, _value, _pref) \ + static nsIAtom* sPseudoClass_##_name; +#include "nsCSSPseudoClassList.h" +#undef CSS_PSEUDO_CLASS + +#define CSS_PSEUDO_CLASS(name_, value_, pref_) \ + NS_STATIC_ATOM_BUFFER(name_##_pseudo_class_buffer, value_) +#include "nsCSSPseudoClassList.h" +#undef CSS_PSEUDO_CLASS + +static const nsStaticAtom CSSPseudoClasses_info[] = { +#define CSS_PSEUDO_CLASS(name_, value_, pref_) \ + NS_STATIC_ATOM(name_##_pseudo_class_buffer, &sPseudoClass_##name_), +#include "nsCSSPseudoClassList.h" +#undef CSS_PSEUDO_CLASS +}; + +static bool sPseudoClassEnabled[] = { +#define CSS_PSEUDO_CLASS(name_, value_, pref_) \ + true, +#include "nsCSSPseudoClassList.h" +#undef CSS_PSEUDO_CLASS +}; + +void nsCSSPseudoClasses::AddRefAtoms() +{ + NS_RegisterStaticAtoms(CSSPseudoClasses_info); + +#define CSS_PSEUDO_CLASS(name_, value_, pref_) \ + if (pref_[0]) { \ + Preferences::AddBoolVarCache(&sPseudoClassEnabled[ePseudoClass_##name_], \ + pref_); \ + } +#include "nsCSSPseudoClassList.h" +#undef CSS_PSEUDO_CLASS +} + +bool +nsCSSPseudoClasses::HasStringArg(Type aType) +{ + return aType == ePseudoClass_lang || + aType == ePseudoClass_mozEmptyExceptChildrenWithLocalname || + aType == ePseudoClass_mozSystemMetric || + aType == ePseudoClass_mozLocaleDir || + aType == ePseudoClass_dir; +} + +bool +nsCSSPseudoClasses::HasNthPairArg(Type aType) +{ + return aType == ePseudoClass_nthChild || + aType == ePseudoClass_nthLastChild || + aType == ePseudoClass_nthOfType || + aType == ePseudoClass_nthLastOfType; +} + +void +nsCSSPseudoClasses::PseudoTypeToString(Type aType, nsAString& aString) +{ + NS_ABORT_IF_FALSE(aType < ePseudoClass_Count, "Unexpected type"); + NS_ABORT_IF_FALSE(aType >= 0, "Very unexpected type"); + (*CSSPseudoClasses_info[aType].mAtom)->ToString(aString); +} + +nsCSSPseudoClasses::Type +nsCSSPseudoClasses::GetPseudoType(nsIAtom* aAtom) +{ + for (uint32_t i = 0; i < ArrayLength(CSSPseudoClasses_info); ++i) { + if (*CSSPseudoClasses_info[i].mAtom == aAtom) { + return sPseudoClassEnabled[i] ? Type(i) : ePseudoClass_NotPseudoClass; + } + } + + return nsCSSPseudoClasses::ePseudoClass_NotPseudoClass; +} + +/* static */ bool +nsCSSPseudoClasses::IsUserActionPseudoClass(Type aType) +{ + // See http://dev.w3.org/csswg/selectors4/#useraction-pseudos + return aType == ePseudoClass_hover || + aType == ePseudoClass_active || + aType == ePseudoClass_focus; +}