| 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 |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 } | 89 } |
| 90 | 90 |
| 91 inline unsigned CSSSelector::specificityForOneSelector() const | 91 inline unsigned CSSSelector::specificityForOneSelector() const |
| 92 { | 92 { |
| 93 // FIXME: Pseudo-elements and pseudo-classes do not have the same specificit
y. This function | 93 // FIXME: Pseudo-elements and pseudo-classes do not have the same specificit
y. This function |
| 94 // isn't quite correct. | 94 // isn't quite correct. |
| 95 switch (m_match) { | 95 switch (m_match) { |
| 96 case Id: | 96 case Id: |
| 97 return 0x10000; | 97 return 0x10000; |
| 98 case PseudoClass: | 98 case PseudoClass: |
| 99 if (pseudoType() == PseudoHost) | 99 if (pseudoType() == PseudoHost || pseudoType() == PseudoAncestor) |
| 100 return 0; | 100 return 0; |
| 101 // fall through. | 101 // fall through. |
| 102 case Exact: | 102 case Exact: |
| 103 case Class: | 103 case Class: |
| 104 case Set: | 104 case Set: |
| 105 case List: | 105 case List: |
| 106 case Hyphen: | 106 case Hyphen: |
| 107 case PseudoElement: | 107 case PseudoElement: |
| 108 case Contain: | 108 case Contain: |
| 109 case Begin: | 109 case Begin: |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 244 case PseudoUserAgentCustomElement: | 244 case PseudoUserAgentCustomElement: |
| 245 case PseudoWebKitCustomElement: | 245 case PseudoWebKitCustomElement: |
| 246 case PseudoCue: | 246 case PseudoCue: |
| 247 case PseudoFutureCue: | 247 case PseudoFutureCue: |
| 248 case PseudoPastCue: | 248 case PseudoPastCue: |
| 249 case PseudoSeamlessDocument: | 249 case PseudoSeamlessDocument: |
| 250 case PseudoDistributed: | 250 case PseudoDistributed: |
| 251 case PseudoUnresolved: | 251 case PseudoUnresolved: |
| 252 case PseudoContent: | 252 case PseudoContent: |
| 253 case PseudoHost: | 253 case PseudoHost: |
| 254 case PseudoAncestor: |
| 254 case PseudoFullScreen: | 255 case PseudoFullScreen: |
| 255 case PseudoFullScreenDocument: | 256 case PseudoFullScreenDocument: |
| 256 case PseudoFullScreenAncestor: | 257 case PseudoFullScreenAncestor: |
| 257 return NOPSEUDO; | 258 return NOPSEUDO; |
| 258 case PseudoNotParsed: | 259 case PseudoNotParsed: |
| 259 ASSERT_NOT_REACHED(); | 260 ASSERT_NOT_REACHED(); |
| 260 return NOPSEUDO; | 261 return NOPSEUDO; |
| 261 } | 262 } |
| 262 | 263 |
| 263 ASSERT_NOT_REACHED(); | 264 ASSERT_NOT_REACHED(); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 DEFINE_STATIC_LOCAL(AtomicString, pastCue, ("past", AtomicString::ConstructF
romLiteral)); | 340 DEFINE_STATIC_LOCAL(AtomicString, pastCue, ("past", AtomicString::ConstructF
romLiteral)); |
| 340 DEFINE_STATIC_LOCAL(AtomicString, seamlessDocument, ("-webkit-seamless-docum
ent", AtomicString::ConstructFromLiteral)); | 341 DEFINE_STATIC_LOCAL(AtomicString, seamlessDocument, ("-webkit-seamless-docum
ent", AtomicString::ConstructFromLiteral)); |
| 341 DEFINE_STATIC_LOCAL(AtomicString, distributed, ("-webkit-distributed(", Atom
icString::ConstructFromLiteral)); | 342 DEFINE_STATIC_LOCAL(AtomicString, distributed, ("-webkit-distributed(", Atom
icString::ConstructFromLiteral)); |
| 342 DEFINE_STATIC_LOCAL(AtomicString, inRange, ("in-range", AtomicString::Constr
uctFromLiteral)); | 343 DEFINE_STATIC_LOCAL(AtomicString, inRange, ("in-range", AtomicString::Constr
uctFromLiteral)); |
| 343 DEFINE_STATIC_LOCAL(AtomicString, outOfRange, ("out-of-range", AtomicString:
:ConstructFromLiteral)); | 344 DEFINE_STATIC_LOCAL(AtomicString, outOfRange, ("out-of-range", AtomicString:
:ConstructFromLiteral)); |
| 344 DEFINE_STATIC_LOCAL(AtomicString, scope, ("scope", AtomicString::ConstructFr
omLiteral)); | 345 DEFINE_STATIC_LOCAL(AtomicString, scope, ("scope", AtomicString::ConstructFr
omLiteral)); |
| 345 DEFINE_STATIC_LOCAL(AtomicString, unresolved, ("unresolved", AtomicString::C
onstructFromLiteral)); | 346 DEFINE_STATIC_LOCAL(AtomicString, unresolved, ("unresolved", AtomicString::C
onstructFromLiteral)); |
| 346 DEFINE_STATIC_LOCAL(AtomicString, content, ("content", AtomicString::Constru
ctFromLiteral)); | 347 DEFINE_STATIC_LOCAL(AtomicString, content, ("content", AtomicString::Constru
ctFromLiteral)); |
| 347 DEFINE_STATIC_LOCAL(AtomicString, host, ("host", AtomicString::ConstructFrom
Literal)); | 348 DEFINE_STATIC_LOCAL(AtomicString, host, ("host", AtomicString::ConstructFrom
Literal)); |
| 348 DEFINE_STATIC_LOCAL(AtomicString, hostWithParams, ("host(", AtomicString::Co
nstructFromLiteral)); | 349 DEFINE_STATIC_LOCAL(AtomicString, hostWithParams, ("host(", AtomicString::Co
nstructFromLiteral)); |
| 350 DEFINE_STATIC_LOCAL(AtomicString, ancestor, ("ancestor", AtomicString::Const
ructFromLiteral)); |
| 351 DEFINE_STATIC_LOCAL(AtomicString, ancestorWithParams, ("ancestor(", AtomicSt
ring::ConstructFromLiteral)); |
| 349 | 352 |
| 350 static HashMap<StringImpl*, CSSSelector::PseudoType>* nameToPseudoType = 0; | 353 static HashMap<StringImpl*, CSSSelector::PseudoType>* nameToPseudoType = 0; |
| 351 if (!nameToPseudoType) { | 354 if (!nameToPseudoType) { |
| 352 nameToPseudoType = new HashMap<StringImpl*, CSSSelector::PseudoType>; | 355 nameToPseudoType = new HashMap<StringImpl*, CSSSelector::PseudoType>; |
| 353 nameToPseudoType->set(active.impl(), CSSSelector::PseudoActive); | 356 nameToPseudoType->set(active.impl(), CSSSelector::PseudoActive); |
| 354 nameToPseudoType->set(after.impl(), CSSSelector::PseudoAfter); | 357 nameToPseudoType->set(after.impl(), CSSSelector::PseudoAfter); |
| 355 nameToPseudoType->set(anyLink.impl(), CSSSelector::PseudoAnyLink); | 358 nameToPseudoType->set(anyLink.impl(), CSSSelector::PseudoAnyLink); |
| 356 nameToPseudoType->set(any.impl(), CSSSelector::PseudoAny); | 359 nameToPseudoType->set(any.impl(), CSSSelector::PseudoAny); |
| 357 nameToPseudoType->set(autofill.impl(), CSSSelector::PseudoAutofill); | 360 nameToPseudoType->set(autofill.impl(), CSSSelector::PseudoAutofill); |
| 358 nameToPseudoType->set(backdrop.impl(), CSSSelector::PseudoBackdrop); | 361 nameToPseudoType->set(backdrop.impl(), CSSSelector::PseudoBackdrop); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 421 nameToPseudoType->set(cueWithoutParen.impl(), CSSSelector::PseudoWebKitC
ustomElement); | 424 nameToPseudoType->set(cueWithoutParen.impl(), CSSSelector::PseudoWebKitC
ustomElement); |
| 422 nameToPseudoType->set(futureCue.impl(), CSSSelector::PseudoFutureCue); | 425 nameToPseudoType->set(futureCue.impl(), CSSSelector::PseudoFutureCue); |
| 423 nameToPseudoType->set(pastCue.impl(), CSSSelector::PseudoPastCue); | 426 nameToPseudoType->set(pastCue.impl(), CSSSelector::PseudoPastCue); |
| 424 nameToPseudoType->set(seamlessDocument.impl(), CSSSelector::PseudoSeamle
ssDocument); | 427 nameToPseudoType->set(seamlessDocument.impl(), CSSSelector::PseudoSeamle
ssDocument); |
| 425 nameToPseudoType->set(distributed.impl(), CSSSelector::PseudoDistributed
); | 428 nameToPseudoType->set(distributed.impl(), CSSSelector::PseudoDistributed
); |
| 426 nameToPseudoType->set(inRange.impl(), CSSSelector::PseudoInRange); | 429 nameToPseudoType->set(inRange.impl(), CSSSelector::PseudoInRange); |
| 427 nameToPseudoType->set(outOfRange.impl(), CSSSelector::PseudoOutOfRange); | 430 nameToPseudoType->set(outOfRange.impl(), CSSSelector::PseudoOutOfRange); |
| 428 if (RuntimeEnabledFeatures::shadowDOMEnabled()) { | 431 if (RuntimeEnabledFeatures::shadowDOMEnabled()) { |
| 429 nameToPseudoType->set(host.impl(), CSSSelector::PseudoHost); | 432 nameToPseudoType->set(host.impl(), CSSSelector::PseudoHost); |
| 430 nameToPseudoType->set(hostWithParams.impl(), CSSSelector::PseudoHost
); | 433 nameToPseudoType->set(hostWithParams.impl(), CSSSelector::PseudoHost
); |
| 434 nameToPseudoType->set(ancestor.impl(), CSSSelector::PseudoAncestor); |
| 435 nameToPseudoType->set(ancestorWithParams.impl(), CSSSelector::Pseudo
Ancestor); |
| 431 nameToPseudoType->set(content.impl(), CSSSelector::PseudoContent); | 436 nameToPseudoType->set(content.impl(), CSSSelector::PseudoContent); |
| 432 } | 437 } |
| 433 if (RuntimeEnabledFeatures::customElementsEnabled()) | 438 if (RuntimeEnabledFeatures::customElementsEnabled()) |
| 434 nameToPseudoType->set(unresolved.impl(), CSSSelector::PseudoUnresolv
ed); | 439 nameToPseudoType->set(unresolved.impl(), CSSSelector::PseudoUnresolv
ed); |
| 435 } | 440 } |
| 436 return nameToPseudoType; | 441 return nameToPseudoType; |
| 437 } | 442 } |
| 438 | 443 |
| 439 CSSSelector::PseudoType CSSSelector::parsePseudoType(const AtomicString& name) | 444 CSSSelector::PseudoType CSSSelector::parsePseudoType(const AtomicString& name) |
| 440 { | 445 { |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 541 case PseudoNotParsed: | 546 case PseudoNotParsed: |
| 542 case PseudoFullScreen: | 547 case PseudoFullScreen: |
| 543 case PseudoFullScreenDocument: | 548 case PseudoFullScreenDocument: |
| 544 case PseudoFullScreenAncestor: | 549 case PseudoFullScreenAncestor: |
| 545 case PseudoSeamlessDocument: | 550 case PseudoSeamlessDocument: |
| 546 case PseudoInRange: | 551 case PseudoInRange: |
| 547 case PseudoOutOfRange: | 552 case PseudoOutOfRange: |
| 548 case PseudoFutureCue: | 553 case PseudoFutureCue: |
| 549 case PseudoPastCue: | 554 case PseudoPastCue: |
| 550 case PseudoHost: | 555 case PseudoHost: |
| 556 case PseudoAncestor: |
| 551 case PseudoUnresolved: | 557 case PseudoUnresolved: |
| 552 break; | 558 break; |
| 553 case PseudoFirstPage: | 559 case PseudoFirstPage: |
| 554 case PseudoLeftPage: | 560 case PseudoLeftPage: |
| 555 case PseudoRightPage: | 561 case PseudoRightPage: |
| 556 isPagePseudoClass = true; | 562 isPagePseudoClass = true; |
| 557 break; | 563 break; |
| 558 } | 564 } |
| 559 | 565 |
| 560 bool matchPagePseudoClass = (m_match == PagePseudoClass); | 566 bool matchPagePseudoClass = (m_match == PagePseudoClass); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 640 case PseudoAny: { | 646 case PseudoAny: { |
| 641 const CSSSelector* firstSubSelector = cs->selectorList()->first(
); | 647 const CSSSelector* firstSubSelector = cs->selectorList()->first(
); |
| 642 for (const CSSSelector* subSelector = firstSubSelector; subSelec
tor; subSelector = CSSSelectorList::next(subSelector)) { | 648 for (const CSSSelector* subSelector = firstSubSelector; subSelec
tor; subSelector = CSSSelectorList::next(subSelector)) { |
| 643 if (subSelector != firstSubSelector) | 649 if (subSelector != firstSubSelector) |
| 644 str.append(','); | 650 str.append(','); |
| 645 str.append(subSelector->selectorText()); | 651 str.append(subSelector->selectorText()); |
| 646 } | 652 } |
| 647 str.append(')'); | 653 str.append(')'); |
| 648 break; | 654 break; |
| 649 } | 655 } |
| 650 case PseudoHost: { | 656 case PseudoHost: |
| 657 case PseudoAncestor: { |
| 651 if (cs->selectorList()) { | 658 if (cs->selectorList()) { |
| 652 const CSSSelector* firstSubSelector = cs->selectorList()->fi
rst(); | 659 const CSSSelector* firstSubSelector = cs->selectorList()->fi
rst(); |
| 653 for (const CSSSelector* subSelector = firstSubSelector; subS
elector; subSelector = CSSSelectorList::next(subSelector)) { | 660 for (const CSSSelector* subSelector = firstSubSelector; subS
elector; subSelector = CSSSelectorList::next(subSelector)) { |
| 654 if (subSelector != firstSubSelector) | 661 if (subSelector != firstSubSelector) |
| 655 str.append(','); | 662 str.append(','); |
| 656 str.append(subSelector->selectorText()); | 663 str.append(subSelector->selectorText()); |
| 657 } | 664 } |
| 658 str.append(')'); | 665 str.append(')'); |
| 659 } | 666 } |
| 660 break; | 667 break; |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 792 case CSSSelector::PseudoNthChild: | 799 case CSSSelector::PseudoNthChild: |
| 793 case CSSSelector::PseudoNthLastChild: | 800 case CSSSelector::PseudoNthLastChild: |
| 794 case CSSSelector::PseudoNthOfType: | 801 case CSSSelector::PseudoNthOfType: |
| 795 case CSSSelector::PseudoNthLastOfType: | 802 case CSSSelector::PseudoNthLastOfType: |
| 796 case CSSSelector::PseudoFirstChild: | 803 case CSSSelector::PseudoFirstChild: |
| 797 case CSSSelector::PseudoLastChild: | 804 case CSSSelector::PseudoLastChild: |
| 798 case CSSSelector::PseudoFirstOfType: | 805 case CSSSelector::PseudoFirstOfType: |
| 799 case CSSSelector::PseudoLastOfType: | 806 case CSSSelector::PseudoLastOfType: |
| 800 case CSSSelector::PseudoOnlyOfType: | 807 case CSSSelector::PseudoOnlyOfType: |
| 801 case CSSSelector::PseudoHost: | 808 case CSSSelector::PseudoHost: |
| 809 case CSSSelector::PseudoAncestor: |
| 802 return true; | 810 return true; |
| 803 default: | 811 default: |
| 804 return false; | 812 return false; |
| 805 } | 813 } |
| 806 } | 814 } |
| 807 | 815 |
| 808 bool CSSSelector::isCompound() const | 816 bool CSSSelector::isCompound() const |
| 809 { | 817 { |
| 810 if (!validateSubSelector(this)) | 818 if (!validateSubSelector(this)) |
| 811 return false; | 819 return false; |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 908 return false; | 916 return false; |
| 909 return (count - m_b) % m_a == 0; | 917 return (count - m_b) % m_a == 0; |
| 910 } else { | 918 } else { |
| 911 if (count > m_b) | 919 if (count > m_b) |
| 912 return false; | 920 return false; |
| 913 return (m_b - count) % (-m_a) == 0; | 921 return (m_b - count) % (-m_a) == 0; |
| 914 } | 922 } |
| 915 } | 923 } |
| 916 | 924 |
| 917 } // namespace WebCore | 925 } // namespace WebCore |
| OLD | NEW |