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 |