18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1999-2003 Lars Knoll (knoll@kde.org) 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1999 Waldo Bastian (bastian@kde.org) 4e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful, 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details. 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB. If not, write to 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA. 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef CSSSelector_h 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define CSSSelector_h 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "QualifiedName.h" 26967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#include "RenderStyleConstants.h" 27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/Noncopyable.h> 28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/OwnPtr.h> 29e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include <wtf/PassOwnPtr.h> 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 322bde8e466a4451c7319e3a072d118917957d6554Steve Block class CSSSelectorList; 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // this class represents a selector for a StyleRule 35ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch class CSSSelector { 36ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch WTF_MAKE_NONCOPYABLE(CSSSelector); WTF_MAKE_FAST_ALLOCATED; 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project public: 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CSSSelector() 396c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen : m_relation(Descendant) 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_match(None) 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_pseudoType(PseudoNotParsed) 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_parsedNth(false) 43635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , m_isLastInSelectorList(false) 442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block , m_isLastInTagHistory(true) 45635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , m_hasRareData(false) 4606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen , m_isForPage(false) 4781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch , m_deleted(false) 486c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_tag(anyQName()) 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CSSSelector(const QualifiedName& qName) 536c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen : m_relation(Descendant) 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_match(None) 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_pseudoType(PseudoNotParsed) 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_parsedNth(false) 57635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , m_isLastInSelectorList(false) 582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block , m_isLastInTagHistory(true) 59635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , m_hasRareData(false) 6006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen , m_isForPage(false) 6181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch , m_deleted(false) 626c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_tag(qName) 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 660617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen ~CSSSelector() 670617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen { 6881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (m_deleted) 6981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch CRASH(); 7081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_deleted = true; 712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (m_hasRareData) 722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block delete m_data.m_rareData; 732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block else if (m_data.m_value) 742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_data.m_value->deref(); 750617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen } 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project /** 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Re-create selector text from selector's data 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String selectorText() const; 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // checks if the 2 selectors (including sub selectors) agree. 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool operator==(const CSSSelector&); 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // tag == -1 means apply to all elements (Selector = *) 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 87f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick unsigned specificity() const; 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project /* how the attribute value has to match.... Default is Exact */ 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project enum Match { 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project None = 0, 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Id, 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Class, 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Exact, 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Set, 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project List, 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Hyphen, 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoClass, 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoElement, 100e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block Contain, // css3: E[foo*="bar"] 101e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block Begin, // css3: E[foo^="bar"] 102e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block End, // css3: E[foo$="bar"] 103e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block PagePseudoClass 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project enum Relation { 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Descendant = 0, 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Child, 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DirectAdjacent, 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IndirectAdjacent, 11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch SubSelector, 11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ShadowDescendant 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project enum PseudoType { 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoNotParsed = 0, 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoUnknown, 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoEmpty, 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoFirstChild, 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoFirstOfType, 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoLastChild, 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoLastOfType, 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoOnlyChild, 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoOnlyOfType, 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoFirstLine, 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoFirstLetter, 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoNthChild, 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoNthOfType, 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoNthLastChild, 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoNthLastOfType, 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoLink, 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoVisited, 1332bde8e466a4451c7319e3a072d118917957d6554Steve Block PseudoAny, 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoAnyLink, 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoAutofill, 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoHover, 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoDrag, 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoFocus, 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoActive, 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoChecked, 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoEnabled, 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoFullPageMedia, 143231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block PseudoDefault, 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoDisabled, 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoInputPlaceholder, 1460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch PseudoOptional, 1470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch PseudoRequired, 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoReadOnly, 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoReadWrite, 150231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block PseudoValid, 151231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block PseudoInvalid, 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoIndeterminate, 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoTarget, 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoBefore, 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoAfter, 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoLang, 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoNot, 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoResizer, 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoRoot, 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoScrollbar, 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoScrollbarBack, 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoScrollbarButton, 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoScrollbarCorner, 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoScrollbarForward, 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoScrollbarThumb, 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoScrollbarTrack, 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoScrollbarTrackPiece, 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoWindowInactive, 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoCornerPresent, 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoDecrement, 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoIncrement, 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoHorizontal, 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoVertical, 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoStart, 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoEnd, 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoDoubleButton, 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoSingleButton, 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoNoButton, 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoSelection, 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoFileUploadButton, 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoSearchCancelButton, 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoSearchDecoration, 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoSearchResultsDecoration, 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoSearchResultsButton, 185d0825bca7fe65beaee391d30da42e937db621564Steve Block PseudoInputListButton, 18606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if ENABLE(INPUT_SPEECH) 18706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen PseudoInputSpeechButton, 18806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif 189d0825bca7fe65beaee391d30da42e937db621564Steve Block PseudoInnerSpinButton, 190d0825bca7fe65beaee391d30da42e937db621564Steve Block PseudoOuterSpinButton, 19121939df44de1705786c545cd1bf519d47250322dBen Murdoch PseudoLeftPage, 19221939df44de1705786c545cd1bf519d47250322dBen Murdoch PseudoRightPage, 19321939df44de1705786c545cd1bf519d47250322dBen Murdoch PseudoFirstPage, 1945ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if ENABLE(FULLSCREEN_API) 1955ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen PseudoFullScreen, 1965ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen PseudoFullScreenDocument, 1975ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif 198cad810f21b803229eb11403f9209855525a25d57Steve Block PseudoInRange, 199cad810f21b803229eb11403f9209855525a25d57Steve Block PseudoOutOfRange, 20021939df44de1705786c545cd1bf519d47250322dBen Murdoch }; 20121939df44de1705786c545cd1bf519d47250322dBen Murdoch 20221939df44de1705786c545cd1bf519d47250322dBen Murdoch enum MarginBoxType { 20321939df44de1705786c545cd1bf519d47250322dBen Murdoch TopLeftCornerMarginBox, 20421939df44de1705786c545cd1bf519d47250322dBen Murdoch TopLeftMarginBox, 20521939df44de1705786c545cd1bf519d47250322dBen Murdoch TopCenterMarginBox, 20621939df44de1705786c545cd1bf519d47250322dBen Murdoch TopRightMarginBox, 20721939df44de1705786c545cd1bf519d47250322dBen Murdoch TopRightCornerMarginBox, 20821939df44de1705786c545cd1bf519d47250322dBen Murdoch BottomLeftCornerMarginBox, 20921939df44de1705786c545cd1bf519d47250322dBen Murdoch BottomLeftMarginBox, 21021939df44de1705786c545cd1bf519d47250322dBen Murdoch BottomCenterMarginBox, 21121939df44de1705786c545cd1bf519d47250322dBen Murdoch BottomRightMarginBox, 21221939df44de1705786c545cd1bf519d47250322dBen Murdoch BottomRightCornerMarginBox, 21321939df44de1705786c545cd1bf519d47250322dBen Murdoch LeftTopMarginBox, 21421939df44de1705786c545cd1bf519d47250322dBen Murdoch LeftMiddleMarginBox, 21521939df44de1705786c545cd1bf519d47250322dBen Murdoch LeftBottomMarginBox, 21621939df44de1705786c545cd1bf519d47250322dBen Murdoch RightTopMarginBox, 21721939df44de1705786c545cd1bf519d47250322dBen Murdoch RightMiddleMarginBox, 21821939df44de1705786c545cd1bf519d47250322dBen Murdoch RightBottomMarginBox, 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PseudoType pseudoType() const 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_pseudoType == PseudoNotParsed) 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project extractPseudoType(); 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return static_cast<PseudoType>(m_pseudoType); 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 228dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block static PseudoType parsePseudoType(const AtomicString&); 229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block static PseudoId pseudoId(PseudoType); 230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 2312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // Selectors are kept in an array by CSSSelectorList. The next component of the selector is 2322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // the next item in the array. 2332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block CSSSelector* tagHistory() const { return m_isLastInTagHistory ? 0 : const_cast<CSSSelector*>(this + 1); } 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool hasTag() const { return m_tag != anyQName(); } 236635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool hasAttribute() const { return m_match == Id || m_match == Class || (m_hasRareData && m_data.m_rareData->m_attribute != anyQName()); } 237635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block const QualifiedName& tag() const { return m_tag; } 2392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // AtomicString is really just an AtomicStringImpl* so the cast below is safe. 2402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // FIXME: Perhaps call sites could be changed to accept AtomicStringImpl? 2412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block const AtomicString& value() const { return *reinterpret_cast<const AtomicString*>(m_hasRareData ? &m_data.m_rareData->m_value : &m_data.m_value); } 242635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project const QualifiedName& attribute() const; 243635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project const AtomicString& argument() const { return m_hasRareData ? m_data.m_rareData->m_argument : nullAtom; } 2442bde8e466a4451c7319e3a072d118917957d6554Steve Block CSSSelectorList* selectorList() const { return m_hasRareData ? m_data.m_rareData->m_selectorList.get() : 0; } 245635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block void setTag(const QualifiedName& value) { m_tag = value; } 2472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block void setValue(const AtomicString&); 2482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block void setAttribute(const QualifiedName&); 2492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block void setArgument(const AtomicString&); 2502bde8e466a4451c7319e3a072d118917957d6554Steve Block void setSelectorList(PassOwnPtr<CSSSelectorList>); 251635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 252635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool parseNth(); 253635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool matchNth(int count); 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block bool matchesPseudoElement() const; 25665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool isUnknownPseudoElement() const; 257ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch bool isSiblingSelector() const; 258dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Relation relation() const { return static_cast<Relation>(m_relation); } 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 261635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool isLastInSelectorList() const { return m_isLastInSelectorList; } 262635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void setLastInSelectorList() { m_isLastInSelectorList = true; } 2632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block bool isLastInTagHistory() const { return m_isLastInTagHistory; } 2642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block void setNotLastInTagHistory() { m_isLastInTagHistory = false; } 2652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 266dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block bool isSimple() const; 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen bool isForPage() const { return m_isForPage; } 26906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen void setForPage() { m_isForPage = true; } 27006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned m_relation : 3; // enum Relation 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mutable unsigned m_match : 4; // enum Match 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mutable unsigned m_pseudoType : 8; // PseudoType 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project private: 276635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool m_parsedNth : 1; // Used for :nth-* 277635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool m_isLastInSelectorList : 1; 2782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block bool m_isLastInTagHistory : 1; 279635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool m_hasRareData : 1; 28006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen bool m_isForPage : 1; 2812bde8e466a4451c7319e3a072d118917957d6554Steve Block // FIXME: Remove once http://webkit.org/b/56124 is fixed. 28281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch bool m_deleted : 1; 283635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 284f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick unsigned specificityForOneSelector() const; 285f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick unsigned specificityForPage() const; 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void extractPseudoType() const; 287635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 288ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch struct RareData { 289ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch WTF_MAKE_NONCOPYABLE(RareData); WTF_MAKE_FAST_ALLOCATED; 290ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch public: 2912bde8e466a4451c7319e3a072d118917957d6554Steve Block RareData(PassRefPtr<AtomicStringImpl> value); 2922bde8e466a4451c7319e3a072d118917957d6554Steve Block ~RareData(); 293635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 294635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool parseNth(); 295635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool matchNth(int count); 296635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block AtomicStringImpl* m_value; // Plain pointer to keep things uniform with the union. 2986c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen int m_a; // Used for :nth-* 2996c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen int m_b; // Used for :nth-* 300635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project QualifiedName m_attribute; // used for attribute selector 301635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project AtomicString m_argument; // Used for :contains, :lang and :nth-* 3022bde8e466a4451c7319e3a072d118917957d6554Steve Block OwnPtr<CSSSelectorList> m_selectorList; // Used for :-webkit-any and :not 303635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project }; 3042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block void createRareData(); 305635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 306635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project union DataUnion { 3072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block DataUnion() : m_value(0) { } 3082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block AtomicStringImpl* m_value; 309635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project RareData* m_rareData; 310635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } m_data; 3116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 3126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen QualifiedName m_tag; 3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 3142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 3152fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline bool CSSSelector::matchesPseudoElement() const 3162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 3172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (m_pseudoType == PseudoUnknown) 3182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block extractPseudoType(); 3192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return m_match == PseudoElement; 3202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 32265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochinline bool CSSSelector::isUnknownPseudoElement() const 32365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 32465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return m_match == PseudoElement && m_pseudoType == PseudoUnknown; 32565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 32665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 327ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochinline bool CSSSelector::isSiblingSelector() const 328ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{ 329ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch PseudoType type = pseudoType(); 330ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch return m_relation == DirectAdjacent 331ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch || m_relation == IndirectAdjacent 332ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch || type == PseudoEmpty 333ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch || type == PseudoFirstChild 334ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch || type == PseudoFirstOfType 335ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch || type == PseudoLastChild 336ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch || type == PseudoLastOfType 337ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch || type == PseudoOnlyChild 338ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch || type == PseudoOnlyOfType 339ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch || type == PseudoNthChild 340ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch || type == PseudoNthOfType 341ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch || type == PseudoNthLastChild 342ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch || type == PseudoNthLastOfType; 343ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch} 3442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 3452fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline void CSSSelector::setValue(const AtomicString& value) 3462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 3472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // Need to do ref counting manually for the union. 3482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (m_hasRareData) { 3492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_data.m_rareData->m_value = value.impl(); 3502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_data.m_rareData->m_value->ref(); 3512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return; 3522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 3532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_data.m_value = value.impl(); 3542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_data.m_value->ref(); 3552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 3562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 3572fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline void move(PassOwnPtr<CSSSelector> from, CSSSelector* to) 3582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 3592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block memcpy(to, from.get(), sizeof(CSSSelector)); 3602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // We want to free the memory (which was allocated with fastNew), but we 3612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // don't want the destructor to run since it will affect the copy we've just made. 3622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block fastDeleteSkippingDestructor(from.leakPtr()); 3632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 364ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // CSSSelector_h 368