/* * Copyright (C) 1999-2003 Lars Knoll ([email protected]) * 1999 Waldo Bastian ([email protected]) * Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010, 2013 Apple Inc. All rights * reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifdef UNSAFE_BUFFERS_BUILD // TODO(crbug.com/351564777): Remove this and convert code to safer constructs. #pragma allow_unsafe_buffers #endif #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSS_SELECTOR_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSS_SELECTOR_H_ #include <memory> #include <utility> #include "base/check_op.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/css/parser/css_nesting_type.h" #include "third_party/blink/renderer/core/css/parser/css_parser_mode.h" #include "third_party/blink/renderer/core/dom/qualified_name.h" #include "third_party/blink/renderer/core/style/computed_style_constants.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/heap/member.h" #include "third_party/blink/renderer/platform/heap/visitor.h" #include "third_party/blink/renderer/platform/wtf/bit_field.h" #include "third_party/blink/renderer/platform/wtf/gc_plugin.h" namespace WTF { class StringBuilder; } // namespace WTF namespace blink { class CSSParserContext; class CSSSelectorList; class Document; class StyleRule; // This class represents a simple selector for a StyleRule. // CSS selector representation is somewhat complicated and subtle. A // representative list of selectors is in CSSSelectorTest; run it in a debug // build to see useful debugging output. // // ** NextSimpleSelector() and Relation(): // // Selectors are represented as an array of simple selectors (defined more // or less according to // http://www.w3.org/TR/css3-selectors/#simple-selectors-dfn). // The NextInSimpleSelector() member function returns the next simple selector // in the list. The Relation() member function returns the relationship of the // current simple selector to the one in NextSimpleSelector(). For example, the // CSS selector .a.b #c is represented as: // // SelectorText(): .a.b #c // --> (relation == kDescendant) // SelectorText(): .a.b // --> (relation == kSubSelector) // SelectorText(): .b // // The ordering of the simple selectors varies depending on the situation. // * Relations using combinators // (http://www.w3.org/TR/css3-selectors/#combinators), such as descendant, // sibling, etc., are parsed right-to-left (in the example above, this is why // #c is earlier in the simple selector chain than .a.b). // * SubSelector relations are parsed left-to-right, such as the .a.b example // above. // * ShadowPseudo relations are parsed right-to-left. Example: // summary::-webkit-details-marker is parsed as: selectorText(): // summary::-webkit-details-marker --> (relation == ShadowPseudo) // selectorText(): summary // // ** match(): // // The match of the current simple selector tells us the type of selector, such // as class, id, tagname, or pseudo-class. Inline comments in the Match enum // give examples of when each type would occur. // // ** value(), attribute(): // // value() tells you the value of the simple selector. For example, for class // selectors, value() will tell you the class string, and for id selectors it // will tell you the id(). See below for the special case of attribute // selectors. // // ** Attribute selectors. // // Attribute selectors return the attribute name in the attribute() method. The // value() method returns the value matched against in case of selectors like // [attr="value"]. // class CORE_EXPORT CSSSelector { … }; inline const QualifiedName& CSSSelector::Attribute() const { … } inline CSSSelector::AttributeMatchType CSSSelector::AttributeMatch() const { … } inline bool CSSSelector::IsCaseSensitiveAttribute() const { … } inline bool CSSSelector::IsASCIILower(const AtomicString& value) { … } inline void CSSSelector::SetValue(const AtomicString& value, bool match_lower_case = false) { … } inline CSSSelector::CSSSelector() : … { … } inline CSSSelector::CSSSelector(const QualifiedName& tag_q_name, bool tag_is_implicit) : … { … } inline CSSSelector::CSSSelector(const StyleRule* parent_rule, bool is_implicit) : … { … } inline CSSSelector::CSSSelector(const AtomicString& pseudo_name, bool is_implicit) : … { … } inline CSSSelector::CSSSelector(const CSSSelector& o) : … { … } inline CSSSelector::CSSSelector(CSSSelector&& o) : … { … } inline CSSSelector::~CSSSelector() { … } inline CSSSelector& CSSSelector::operator=(CSSSelector&& other) { … } inline const QualifiedName& CSSSelector::TagQName() const { … } inline const StyleRule* CSSSelector::ParentRule() const { … } inline const AtomicString& CSSSelector::Value() const { … } inline const AtomicString& CSSSelector::SerializingValue() const { … } inline bool CSSSelector::IsUserActionPseudoClass() const { … } inline bool CSSSelector::IsIdClassOrAttributeSelector() const { … } inline void swap(CSSSelector& a, CSSSelector& b) { … } // Converts descendant to relative descendant, child to relative child // and so on. Subselector is converted to relative descendant. // All others that don't have a corresponding relative combinator will // call NOTREACHED(). CSSSelector::RelationType ConvertRelationToRelative( CSSSelector::RelationType relation); // Returns the maximum specificity within a list of selectors. This is typically // used to calculate the specificity of selectors that have an inner selector // list, e.g. :is(), :where() etc. unsigned MaximumSpecificity(const CSSSelector* first_selector); } // namespace blink namespace WTF { template <> struct VectorTraits<blink::CSSSelector> : VectorTraitsBase<blink::CSSSelector> { … }; } // namespace WTF #endif // THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSS_SELECTOR_H_