| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 
| 3  *           (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) | 3  *           (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) | 
| 4  * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) | 4  * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) | 
| 5  * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc.
       All rights reserved. | 5  * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc.
       All rights reserved. | 
| 6  * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> | 6  * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> | 
| 7  * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> | 7  * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> | 
| 8  * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
      orchmobile.com/) | 8  * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
      orchmobile.com/) | 
| 9  * Copyright (c) 2011, Code Aurora Forum. All rights reserved. | 9  * Copyright (c) 2011, Code Aurora Forum. All rights reserved. | 
| 10  * Copyright (C) Research In Motion Limited 2011. All rights reserved. | 10  * Copyright (C) Research In Motion Limited 2011. All rights reserved. | 
| (...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 490         // It they start the same, check for exact match or following '-': | 490         // It they start the same, check for exact match or following '-': | 
| 491         if (value.length() != selectorValue.length() && value[selectorValue.leng
      th()] != '-') | 491         if (value.length() != selectorValue.length() && value[selectorValue.leng
      th()] != '-') | 
| 492             return false; | 492             return false; | 
| 493         return true; | 493         return true; | 
| 494     default: | 494     default: | 
| 495         ASSERT_NOT_REACHED(); | 495         ASSERT_NOT_REACHED(); | 
| 496         return false; | 496         return false; | 
| 497     } | 497     } | 
| 498 } | 498 } | 
| 499 | 499 | 
|  | 500 static HashSet<StringImpl*>* createHtmlCaseInsensitiveAttributesSet() | 
|  | 501 { | 
|  | 502     // This list of attributes is from | 
|  | 503     // https://html.spec.whatwg.org/#case-sensitivity-of-selectors | 
|  | 504     HashSet<StringImpl*>* attrSet = new HashSet<StringImpl*>; | 
|  | 505 | 
|  | 506     const QualifiedName* caseInsensitiveAttributes[] = { | 
|  | 507         &accept_charsetAttr, &acceptAttr, &alignAttr, &alinkAttr, &axisAttr, | 
|  | 508         &bgcolorAttr, | 
|  | 509         &charsetAttr, &checkedAttr, &clearAttr, &codetypeAttr, &colorAttr, &comp
      actAttr, | 
|  | 510         &declareAttr, &deferAttr, &dirAttr, &directionAttr, &disabledAttr, | 
|  | 511         &enctypeAttr, | 
|  | 512         &faceAttr, &frameAttr, | 
|  | 513         &hreflangAttr, &http_equivAttr, | 
|  | 514         &langAttr, &languageAttr, &linkAttr, | 
|  | 515         &mediaAttr, &methodAttr, &multipleAttr, | 
|  | 516         &nohrefAttr, &noresizeAttr, &noshadeAttr, &nowrapAttr, | 
|  | 517         &readonlyAttr, &relAttr, &revAttr, &rulesAttr, | 
|  | 518         &scopeAttr, &scrollingAttr, &selectedAttr, &shapeAttr, | 
|  | 519         &targetAttr, &textAttr, &typeAttr, | 
|  | 520         &valignAttr, &valuetypeAttr, &vlinkAttr }; | 
|  | 521 | 
|  | 522     attrSet->reserveCapacityForSize(WTF_ARRAY_LENGTH(caseInsensitiveAttributes))
      ; | 
|  | 523     for (const QualifiedName* attr : caseInsensitiveAttributes) | 
|  | 524         attrSet->add(attr->localName().impl()); | 
|  | 525 | 
|  | 526     return attrSet; | 
|  | 527 } | 
|  | 528 | 
|  | 529 static bool isHtmlCaseSensitiveAttribute(const QualifiedName& attributeName) | 
|  | 530 { | 
|  | 531     static HashSet<StringImpl*>* htmlCaseInsensitiveAttributesSet = createHtmlCa
      seInsensitiveAttributesSet(); | 
|  | 532     bool isPossibleHTMLAttr = !attributeName.hasPrefix() && (attributeName.names
      paceURI() == nullAtom); | 
|  | 533     return !isPossibleHTMLAttr || !htmlCaseInsensitiveAttributesSet->contains(at
      tributeName.localName().impl()); | 
|  | 534 } | 
|  | 535 | 
| 500 static bool anyAttributeMatches(Element& element, CSSSelector::MatchType match, 
      const CSSSelector& selector) | 536 static bool anyAttributeMatches(Element& element, CSSSelector::MatchType match, 
      const CSSSelector& selector) | 
| 501 { | 537 { | 
| 502     const QualifiedName& selectorAttr = selector.attribute(); | 538     const QualifiedName& selectorAttr = selector.attribute(); | 
| 503     ASSERT(selectorAttr.localName() != starAtom); // Should not be possible from
       the CSS grammar. | 539     ASSERT(selectorAttr.localName() != starAtom); // Should not be possible from
       the CSS grammar. | 
| 504 | 540 | 
| 505     // Synchronize the attribute in case it is lazy-computed. | 541     // Synchronize the attribute in case it is lazy-computed. | 
| 506     // Currently all lazy properties have a null namespace, so only pass localNa
      me(). | 542     // Currently all lazy properties have a null namespace, so only pass localNa
      me(). | 
| 507     element.synchronizeAttribute(selectorAttr.localName()); | 543     element.synchronizeAttribute(selectorAttr.localName()); | 
| 508 | 544 | 
| 509     const AtomicString& selectorValue = selector.value(); | 545     const AtomicString& selectorValue = selector.value(); | 
| 510     TextCaseSensitivity caseSensitivity = (selector.attributeMatch() == CSSSelec
      tor::CaseInsensitive) ? TextCaseASCIIInsensitive : TextCaseSensitive; | 546     TextCaseSensitivity caseSensitivity = (selector.attributeMatch() == CSSSelec
      tor::CaseInsensitive) ? TextCaseASCIIInsensitive : TextCaseSensitive; | 
| 511 | 547 | 
| 512     AttributeCollection attributes = element.attributesWithoutUpdate(); | 548     AttributeCollection attributes = element.attributesWithoutUpdate(); | 
| 513     for (const auto& attributeItem: attributes) { | 549     for (const auto& attributeItem: attributes) { | 
| 514         if (!attributeItem.matches(selectorAttr)) | 550         if (!attributeItem.matches(selectorAttr)) | 
| 515             continue; | 551             continue; | 
| 516 | 552 | 
| 517         if (attributeValueMatches(attributeItem, match, selectorValue, caseSensi
      tivity)) | 553         if (attributeValueMatches(attributeItem, match, selectorValue, caseSensi
      tivity)) | 
| 518             return true; | 554             return true; | 
| 519 | 555 | 
| 520         if (caseSensitivity == TextCaseASCIIInsensitive) { | 556         if (caseSensitivity == TextCaseASCIIInsensitive) { | 
| 521             if (selectorAttr.namespaceURI() != starAtom) | 557             if (selectorAttr.namespaceURI() != starAtom) | 
| 522                 return false; | 558                 return false; | 
| 523             continue; | 559             continue; | 
| 524         } | 560         } | 
| 525 | 561 | 
| 526         // Legacy dictates that values of some attributes should be compared in | 562         // https://html.spec.whatwg.org/#case-sensitivity-of-selectors | 
| 527         // a case-insensitive manner regardless of whether the case insensitive | 563         // TODO(foolip): The spec says "HTML element in an HTML document", but | 
| 528         // flag is set or not. | 564         // this applies to any element in an HTML document. | 
| 529         bool legacyCaseInsensitive = element.document().isHTMLDocument() && !HTM
      LDocument::isCaseSensitiveAttribute(selectorAttr); | 565         bool legacyCaseInsensitive = element.document().isHTMLDocument() && !isH
      tmlCaseSensitiveAttribute(selectorAttr); | 
| 530 | 566 | 
| 531         // If case-insensitive, re-check, and count if result differs. | 567         // If case-insensitive, re-check, and count if result differs. | 
| 532         // See http://code.google.com/p/chromium/issues/detail?id=327060 | 568         // See http://code.google.com/p/chromium/issues/detail?id=327060 | 
| 533         if (legacyCaseInsensitive && attributeValueMatches(attributeItem, match,
       selectorValue, TextCaseASCIIInsensitive)) { | 569         if (legacyCaseInsensitive && attributeValueMatches(attributeItem, match,
       selectorValue, TextCaseASCIIInsensitive)) { | 
| 534             UseCounter::count(element.document(), UseCounter::CaseInsensitiveAtt
      rSelectorMatch); | 570             UseCounter::count(element.document(), UseCounter::CaseInsensitiveAtt
      rSelectorMatch); | 
| 535             return true; | 571             return true; | 
| 536         } | 572         } | 
| 537         if (selectorAttr.namespaceURI() != starAtom) | 573         if (selectorAttr.namespaceURI() != starAtom) | 
| 538             return false; | 574             return false; | 
| 539     } | 575     } | 
| (...skipping 622 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1162 } | 1198 } | 
| 1163 | 1199 | 
| 1164 bool SelectorChecker::matchesFocusPseudoClass(const Element& element) | 1200 bool SelectorChecker::matchesFocusPseudoClass(const Element& element) | 
| 1165 { | 1201 { | 
| 1166     if (InspectorInstrumentation::forcePseudoState(const_cast<Element*>(&element
      ), CSSSelector::PseudoFocus)) | 1202     if (InspectorInstrumentation::forcePseudoState(const_cast<Element*>(&element
      ), CSSSelector::PseudoFocus)) | 
| 1167         return true; | 1203         return true; | 
| 1168     return element.focused() && isFrameFocused(element); | 1204     return element.focused() && isFrameFocused(element); | 
| 1169 } | 1205 } | 
| 1170 | 1206 | 
| 1171 } // namespace blink | 1207 } // namespace blink | 
| OLD | NEW | 
|---|