| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999-2003 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999-2003 Lars Knoll (knoll@kde.org) |
| 3 * 1999 Waldo Bastian (bastian@kde.org) | 3 * 1999 Waldo Bastian (bastian@kde.org) |
| 4 * 2001 Andreas Schlapbach (schlpbch@iam.unibe.ch) | 4 * 2001 Andreas Schlapbach (schlpbch@iam.unibe.ch) |
| 5 * 2001-2003 Dirk Mueller (mueller@kde.org) | 5 * 2001-2003 Dirk Mueller (mueller@kde.org) |
| 6 * Copyright (C) 2002, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv
ed. | 6 * Copyright (C) 2002, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv
ed. |
| 7 * Copyright (C) 2008 David Smith (catfish.man@gmail.com) | 7 * Copyright (C) 2008 David Smith (catfish.man@gmail.com) |
| 8 * Copyright (C) 2010 Google Inc. All rights reserved. | 8 * Copyright (C) 2010 Google Inc. All rights reserved. |
| 9 * | 9 * |
| 10 * This library is free software; you can redistribute it and/or | 10 * This library is free software; you can redistribute it and/or |
| 11 * modify it under the terms of the GNU Library General Public | 11 * modify it under the terms of the GNU Library General Public |
| 12 * License as published by the Free Software Foundation; either | 12 * License as published by the Free Software Foundation; either |
| 13 * version 2 of the License, or (at your option) any later version. | 13 * version 2 of the License, or (at your option) any later version. |
| 14 * | 14 * |
| 15 * This library is distributed in the hope that it will be useful, | 15 * This library is distributed in the hope that it will be useful, |
| 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 18 * Library General Public License for more details. | 18 * Library General Public License for more details. |
| 19 * | 19 * |
| 20 * You should have received a copy of the GNU Library General Public License | 20 * You should have received a copy of the GNU Library General Public License |
| 21 * along with this library; see the file COPYING.LIB. If not, write to | 21 * along with this library; see the file COPYING.LIB. If not, write to |
| 22 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 22 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
| 23 * Boston, MA 02110-1301, USA. | 23 * Boston, MA 02110-1301, USA. |
| 24 */ | 24 */ |
| 25 | 25 |
| 26 #include "config.h" | 26 #include "config.h" |
| 27 #include "core/css/CSSSelector.h" | 27 #include "core/css/CSSSelector.h" |
| 28 | 28 |
| 29 #include "HTMLNames.h" | 29 #include "HTMLNames.h" |
| 30 #include "RuntimeEnabledFeatures.h" |
| 30 #include "core/css/CSSOMUtils.h" | 31 #include "core/css/CSSOMUtils.h" |
| 31 #include "core/css/CSSSelectorList.h" | 32 #include "core/css/CSSSelectorList.h" |
| 32 #include <wtf/Assertions.h> | 33 #include <wtf/Assertions.h> |
| 33 #include <wtf/HashMap.h> | 34 #include <wtf/HashMap.h> |
| 34 #include <wtf/StdLibExtras.h> | 35 #include <wtf/StdLibExtras.h> |
| 35 #include <wtf/text/StringBuilder.h> | 36 #include <wtf/text/StringBuilder.h> |
| 36 #include <wtf/Vector.h> | 37 #include <wtf/Vector.h> |
| 37 | 38 |
| 38 namespace WebCore { | 39 namespace WebCore { |
| 39 | 40 |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 239 case PseudoRightPage: | 240 case PseudoRightPage: |
| 240 case PseudoInRange: | 241 case PseudoInRange: |
| 241 case PseudoOutOfRange: | 242 case PseudoOutOfRange: |
| 242 case PseudoUserAgentCustomElement: | 243 case PseudoUserAgentCustomElement: |
| 243 case PseudoWebKitCustomElement: | 244 case PseudoWebKitCustomElement: |
| 244 case PseudoCue: | 245 case PseudoCue: |
| 245 case PseudoFutureCue: | 246 case PseudoFutureCue: |
| 246 case PseudoPastCue: | 247 case PseudoPastCue: |
| 247 case PseudoSeamlessDocument: | 248 case PseudoSeamlessDocument: |
| 248 case PseudoDistributed: | 249 case PseudoDistributed: |
| 250 case PseudoUnresolved: |
| 249 return NOPSEUDO; | 251 return NOPSEUDO; |
| 250 case PseudoNotParsed: | 252 case PseudoNotParsed: |
| 251 ASSERT_NOT_REACHED(); | 253 ASSERT_NOT_REACHED(); |
| 252 return NOPSEUDO; | 254 return NOPSEUDO; |
| 253 } | 255 } |
| 254 | 256 |
| 255 ASSERT_NOT_REACHED(); | 257 ASSERT_NOT_REACHED(); |
| 256 return NOPSEUDO; | 258 return NOPSEUDO; |
| 257 } | 259 } |
| 258 | 260 |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 327 DEFINE_STATIC_LOCAL(AtomicString, fullScreenAncestor, ("-webkit-full-screen-
ancestor", AtomicString::ConstructFromLiteral)); | 329 DEFINE_STATIC_LOCAL(AtomicString, fullScreenAncestor, ("-webkit-full-screen-
ancestor", AtomicString::ConstructFromLiteral)); |
| 328 DEFINE_STATIC_LOCAL(AtomicString, animatingFullScreenTransition, ("-webkit-a
nimating-full-screen-transition", AtomicString::ConstructFromLiteral)); | 330 DEFINE_STATIC_LOCAL(AtomicString, animatingFullScreenTransition, ("-webkit-a
nimating-full-screen-transition", AtomicString::ConstructFromLiteral)); |
| 329 DEFINE_STATIC_LOCAL(AtomicString, cue, ("cue(", AtomicString::ConstructFromL
iteral)); | 331 DEFINE_STATIC_LOCAL(AtomicString, cue, ("cue(", AtomicString::ConstructFromL
iteral)); |
| 330 DEFINE_STATIC_LOCAL(AtomicString, futureCue, ("future", AtomicString::Constr
uctFromLiteral)); | 332 DEFINE_STATIC_LOCAL(AtomicString, futureCue, ("future", AtomicString::Constr
uctFromLiteral)); |
| 331 DEFINE_STATIC_LOCAL(AtomicString, pastCue, ("past", AtomicString::ConstructF
romLiteral)); | 333 DEFINE_STATIC_LOCAL(AtomicString, pastCue, ("past", AtomicString::ConstructF
romLiteral)); |
| 332 DEFINE_STATIC_LOCAL(AtomicString, seamlessDocument, ("-webkit-seamless-docum
ent", AtomicString::ConstructFromLiteral)); | 334 DEFINE_STATIC_LOCAL(AtomicString, seamlessDocument, ("-webkit-seamless-docum
ent", AtomicString::ConstructFromLiteral)); |
| 333 DEFINE_STATIC_LOCAL(AtomicString, distributed, ("-webkit-distributed(", Atom
icString::ConstructFromLiteral)); | 335 DEFINE_STATIC_LOCAL(AtomicString, distributed, ("-webkit-distributed(", Atom
icString::ConstructFromLiteral)); |
| 334 DEFINE_STATIC_LOCAL(AtomicString, inRange, ("in-range", AtomicString::Constr
uctFromLiteral)); | 336 DEFINE_STATIC_LOCAL(AtomicString, inRange, ("in-range", AtomicString::Constr
uctFromLiteral)); |
| 335 DEFINE_STATIC_LOCAL(AtomicString, outOfRange, ("out-of-range", AtomicString:
:ConstructFromLiteral)); | 337 DEFINE_STATIC_LOCAL(AtomicString, outOfRange, ("out-of-range", AtomicString:
:ConstructFromLiteral)); |
| 336 DEFINE_STATIC_LOCAL(AtomicString, scope, ("scope", AtomicString::ConstructFr
omLiteral)); | 338 DEFINE_STATIC_LOCAL(AtomicString, scope, ("scope", AtomicString::ConstructFr
omLiteral)); |
| 339 DEFINE_STATIC_LOCAL(AtomicString, unresolved, ("unresolved", AtomicString::C
onstructFromLiteral)); |
| 337 | 340 |
| 338 static HashMap<AtomicStringImpl*, CSSSelector::PseudoType>* nameToPseudoType
= 0; | 341 static HashMap<AtomicStringImpl*, CSSSelector::PseudoType>* nameToPseudoType
= 0; |
| 339 if (!nameToPseudoType) { | 342 if (!nameToPseudoType) { |
| 340 nameToPseudoType = new HashMap<AtomicStringImpl*, CSSSelector::PseudoTyp
e>; | 343 nameToPseudoType = new HashMap<AtomicStringImpl*, CSSSelector::PseudoTyp
e>; |
| 341 nameToPseudoType->set(active.impl(), CSSSelector::PseudoActive); | 344 nameToPseudoType->set(active.impl(), CSSSelector::PseudoActive); |
| 342 nameToPseudoType->set(after.impl(), CSSSelector::PseudoAfter); | 345 nameToPseudoType->set(after.impl(), CSSSelector::PseudoAfter); |
| 343 nameToPseudoType->set(anyLink.impl(), CSSSelector::PseudoAnyLink); | 346 nameToPseudoType->set(anyLink.impl(), CSSSelector::PseudoAnyLink); |
| 344 nameToPseudoType->set(any.impl(), CSSSelector::PseudoAny); | 347 nameToPseudoType->set(any.impl(), CSSSelector::PseudoAny); |
| 345 nameToPseudoType->set(autofill.impl(), CSSSelector::PseudoAutofill); | 348 nameToPseudoType->set(autofill.impl(), CSSSelector::PseudoAutofill); |
| 346 nameToPseudoType->set(before.impl(), CSSSelector::PseudoBefore); | 349 nameToPseudoType->set(before.impl(), CSSSelector::PseudoBefore); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 406 nameToPseudoType->set(fullScreenDocument.impl(), CSSSelector::PseudoFull
ScreenDocument); | 409 nameToPseudoType->set(fullScreenDocument.impl(), CSSSelector::PseudoFull
ScreenDocument); |
| 407 nameToPseudoType->set(fullScreenAncestor.impl(), CSSSelector::PseudoFull
ScreenAncestor); | 410 nameToPseudoType->set(fullScreenAncestor.impl(), CSSSelector::PseudoFull
ScreenAncestor); |
| 408 nameToPseudoType->set(animatingFullScreenTransition.impl(), CSSSelector:
:PseudoAnimatingFullScreenTransition); | 411 nameToPseudoType->set(animatingFullScreenTransition.impl(), CSSSelector:
:PseudoAnimatingFullScreenTransition); |
| 409 nameToPseudoType->set(cue.impl(), CSSSelector::PseudoCue); | 412 nameToPseudoType->set(cue.impl(), CSSSelector::PseudoCue); |
| 410 nameToPseudoType->set(futureCue.impl(), CSSSelector::PseudoFutureCue); | 413 nameToPseudoType->set(futureCue.impl(), CSSSelector::PseudoFutureCue); |
| 411 nameToPseudoType->set(pastCue.impl(), CSSSelector::PseudoPastCue); | 414 nameToPseudoType->set(pastCue.impl(), CSSSelector::PseudoPastCue); |
| 412 nameToPseudoType->set(seamlessDocument.impl(), CSSSelector::PseudoSeamle
ssDocument); | 415 nameToPseudoType->set(seamlessDocument.impl(), CSSSelector::PseudoSeamle
ssDocument); |
| 413 nameToPseudoType->set(distributed.impl(), CSSSelector::PseudoDistributed
); | 416 nameToPseudoType->set(distributed.impl(), CSSSelector::PseudoDistributed
); |
| 414 nameToPseudoType->set(inRange.impl(), CSSSelector::PseudoInRange); | 417 nameToPseudoType->set(inRange.impl(), CSSSelector::PseudoInRange); |
| 415 nameToPseudoType->set(outOfRange.impl(), CSSSelector::PseudoOutOfRange); | 418 nameToPseudoType->set(outOfRange.impl(), CSSSelector::PseudoOutOfRange); |
| 419 if (RuntimeEnabledFeatures::customDOMElementsEnabled()) |
| 420 nameToPseudoType->set(unresolved.impl(), CSSSelector::PseudoUnresolv
ed); |
| 416 } | 421 } |
| 417 return nameToPseudoType; | 422 return nameToPseudoType; |
| 418 } | 423 } |
| 419 | 424 |
| 420 CSSSelector::PseudoType CSSSelector::parsePseudoType(const AtomicString& name) | 425 CSSSelector::PseudoType CSSSelector::parsePseudoType(const AtomicString& name) |
| 421 { | 426 { |
| 422 if (name.isNull()) | 427 if (name.isNull()) |
| 423 return PseudoUnknown; | 428 return PseudoUnknown; |
| 424 HashMap<AtomicStringImpl*, CSSSelector::PseudoType>* nameToPseudoType = name
ToPseudoTypeMap(); | 429 HashMap<AtomicStringImpl*, CSSSelector::PseudoType>* nameToPseudoType = name
ToPseudoTypeMap(); |
| 425 HashMap<AtomicStringImpl*, CSSSelector::PseudoType>::iterator slot = nameToP
seudoType->find(name.impl()); | 430 HashMap<AtomicStringImpl*, CSSSelector::PseudoType>::iterator slot = nameToP
seudoType->find(name.impl()); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 526 case PseudoNotParsed: | 531 case PseudoNotParsed: |
| 527 case PseudoFullScreen: | 532 case PseudoFullScreen: |
| 528 case PseudoFullScreenDocument: | 533 case PseudoFullScreenDocument: |
| 529 case PseudoFullScreenAncestor: | 534 case PseudoFullScreenAncestor: |
| 530 case PseudoAnimatingFullScreenTransition: | 535 case PseudoAnimatingFullScreenTransition: |
| 531 case PseudoSeamlessDocument: | 536 case PseudoSeamlessDocument: |
| 532 case PseudoInRange: | 537 case PseudoInRange: |
| 533 case PseudoOutOfRange: | 538 case PseudoOutOfRange: |
| 534 case PseudoFutureCue: | 539 case PseudoFutureCue: |
| 535 case PseudoPastCue: | 540 case PseudoPastCue: |
| 541 case PseudoUnresolved: |
| 536 break; | 542 break; |
| 537 case PseudoFirstPage: | 543 case PseudoFirstPage: |
| 538 case PseudoLeftPage: | 544 case PseudoLeftPage: |
| 539 case PseudoRightPage: | 545 case PseudoRightPage: |
| 540 isPagePseudoClass = true; | 546 isPagePseudoClass = true; |
| 541 break; | 547 break; |
| 542 } | 548 } |
| 543 | 549 |
| 544 bool matchPagePseudoClass = (m_match == PagePseudoClass); | 550 bool matchPagePseudoClass = (m_match == PagePseudoClass); |
| 545 if (matchPagePseudoClass != isPagePseudoClass) | 551 if (matchPagePseudoClass != isPagePseudoClass) |
| 546 m_pseudoType = PseudoUnknown; | 552 m_pseudoType = PseudoUnknown; |
| 547 else if (m_match == PseudoClass && element) { | 553 else if (m_match == PseudoClass && element) { |
| 548 if (!compat) | 554 if (!compat) |
| 549 m_pseudoType = PseudoUnknown; | 555 m_pseudoType = PseudoUnknown; |
| 550 else | 556 else |
| 551 m_match = PseudoElement; | 557 m_match = PseudoElement; |
| 552 } else if (m_match == PseudoElement && !element) | 558 } else if (m_match == PseudoElement && !element) |
| 553 m_pseudoType = PseudoUnknown; | 559 m_pseudoType = PseudoUnknown; |
| 554 } | 560 } |
| 555 | 561 |
| 556 bool CSSSelector::operator==(const CSSSelector& other) const | 562 bool CSSSelector::operator==(const CSSSelector& other) const |
| 557 { | 563 { |
| 558 const CSSSelector* sel1 = this; | 564 const CSSSelector* sel1 = this; |
| 559 const CSSSelector* sel2 = &other; | 565 const CSSSelector* sel2 = &other; |
| 560 | 566 |
| 561 while (sel1 && sel2) { | 567 while (sel1 && sel2) { |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 804 return false; | 810 return false; |
| 805 return (count - m_b) % m_a == 0; | 811 return (count - m_b) % m_a == 0; |
| 806 } else { | 812 } else { |
| 807 if (count > m_b) | 813 if (count > m_b) |
| 808 return false; | 814 return false; |
| 809 return (m_b - count) % (-m_a) == 0; | 815 return (m_b - count) % (-m_a) == 0; |
| 810 } | 816 } |
| 811 } | 817 } |
| 812 | 818 |
| 813 } // namespace WebCore | 819 } // namespace WebCore |
| OLD | NEW |