/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is atom lists for CSS pseudos. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1998 * the Initial Developer. All Rights Reserved. * * Contributor(s): * L. David Baron * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ /* atom list for CSS pseudo-elements */ #include "nsCSSPseudoElements.h" #include "nsAtomListUtils.h" #include "nsStaticAtom.h" #include "nsMemory.h" #include "nsCSSAnonBoxes.h" // define storage for all atoms #define CSS_PSEUDO_ELEMENT(name_, value_, flags_) \ nsICSSPseudoElement* nsCSSPseudoElements::name_; #include "nsCSSPseudoElementList.h" #undef CSS_PSEUDO_ELEMENT #define CSS_PSEUDO_ELEMENT(name_, value_, flags_) \ NS_STATIC_ATOM_BUFFER(name_##_buffer, value_) #include "nsCSSPseudoElementList.h" #undef CSS_PSEUDO_ELEMENT static const nsStaticAtom CSSPseudoElements_info[] = { #define CSS_PSEUDO_ELEMENT(name_, value_, flags_) \ NS_STATIC_ATOM(name_##_buffer, (nsIAtom**)&nsCSSPseudoElements::name_), #include "nsCSSPseudoElementList.h" #undef CSS_PSEUDO_ELEMENT }; // Separate from the array above so that we can have an array of // nsStaticAtom (to pass to NS_RegisterStaticAtoms and // nsAtomListUtils::IsMember), but with corresponding indices (so the // i-th element of this array is the flags for the i-th pseudo-element // in the previous array). static const PRUint32 CSSPseudoElements_flags[] = { #define CSS_PSEUDO_ELEMENT(name_, value_, flags_) \ flags_, #include "nsCSSPseudoElementList.h" #undef CSS_PSEUDO_ELEMENT }; void nsCSSPseudoElements::AddRefAtoms() { NS_RegisterStaticAtoms(CSSPseudoElements_info, NS_ARRAY_LENGTH(CSSPseudoElements_info)); } PRBool nsCSSPseudoElements::IsPseudoElement(nsIAtom *aAtom) { return nsAtomListUtils::IsMember(aAtom, CSSPseudoElements_info, NS_ARRAY_LENGTH(CSSPseudoElements_info)); } /* static */ PRBool nsCSSPseudoElements::IsCSS2PseudoElement(nsIAtom *aAtom) { // We don't implement this using PseudoElementHasFlags because callers // want to pass things that could be anon boxes. NS_ASSERTION(nsCSSPseudoElements::IsPseudoElement(aAtom) || nsCSSAnonBoxes::IsAnonBox(aAtom), "must be pseudo element or anon box"); PRBool result = aAtom == nsCSSPseudoElements::after || aAtom == nsCSSPseudoElements::before || aAtom == nsCSSPseudoElements::firstLetter || aAtom == nsCSSPseudoElements::firstLine; NS_ASSERTION(nsCSSAnonBoxes::IsAnonBox(aAtom) || result == PseudoElementHasFlags(aAtom, CSS_PSEUDO_ELEMENT_IS_CSS2), "result doesn't match flags"); return result; } /* static */ nsCSSPseudoElements::Type nsCSSPseudoElements::GetPseudoType(nsIAtom *aAtom) { for (PRUint32 i = 0; i < NS_ARRAY_LENGTH(CSSPseudoElements_info); ++i) { if (*CSSPseudoElements_info[i].mAtom == aAtom) { return Type(i); } } if (nsCSSAnonBoxes::IsAnonBox(aAtom)) { #ifdef MOZ_XUL if (nsCSSAnonBoxes::IsTreePseudoElement(aAtom)) { return ePseudo_XULTree; } #endif return ePseudo_AnonBox; } return ePseudo_NotPseudoElement; } /* static */ nsIAtom* nsCSSPseudoElements::GetPseudoAtom(Type aType) { NS_ASSERTION(aType < nsCSSPseudoElements::ePseudo_PseudoElementCount, "Unexpected type"); return *CSSPseudoElements_info[aType].mAtom; } /* static */ PRUint32 nsCSSPseudoElements::FlagsForPseudoElement(nsIAtom *aAtom) { PRUint32 i; for (i = 0; i < NS_ARRAY_LENGTH(CSSPseudoElements_info); ++i) { if (*CSSPseudoElements_info[i].mAtom == aAtom) { break; } } NS_ASSERTION(i < NS_ARRAY_LENGTH(CSSPseudoElements_info), "argument must be a pseudo-element"); return CSSPseudoElements_flags[i]; }