Title: [140382] trunk/Source/WebCore
Revision
140382
Author
[email protected]
Date
2013-01-21 21:07:16 -0800 (Mon, 21 Jan 2013)

Log Message

Move HTML Attribute case-sensitivity logic out of SelectorChecker to HTMLDocument.
https://bugs.webkit.org/show_bug.cgi?id=107460

The case-sensitivity of HTML attributes is defined in HTML spec and is only applicable in HTML documents,
so having this logic in HTMLDocument seems like a good thing.

Reviewed by Eric Seidel.

Refactoring, covered by existing tests.

* css/SelectorChecker.cpp:
(WebCore): Moved code out of here.
(WebCore::isFastCheckableMatch): Changed the callsite to use new location.
(WebCore::SelectorChecker::checkOne): Ditto.
* html/HTMLDocument.cpp:
(WebCore::addLocalNameToSet): Moved the code into here.
(WebCore): Ditto.
(WebCore::createHtmlCaseInsensitiveAttributesSet): Ditto.
(WebCore::HTMLDocument::isCaseSensitiveAttribute): Ditto.
* html/HTMLDocument.h:
(HTMLDocument): Added decl for the newly moved function.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (140381 => 140382)


--- trunk/Source/WebCore/ChangeLog	2013-01-22 05:04:29 UTC (rev 140381)
+++ trunk/Source/WebCore/ChangeLog	2013-01-22 05:07:16 UTC (rev 140382)
@@ -1,3 +1,27 @@
+2013-01-21  Dimitri Glazkov  <[email protected]>
+
+        Move HTML Attribute case-sensitivity logic out of SelectorChecker to HTMLDocument.
+        https://bugs.webkit.org/show_bug.cgi?id=107460
+
+        The case-sensitivity of HTML attributes is defined in HTML spec and is only applicable in HTML documents,
+        so having this logic in HTMLDocument seems like a good thing.
+
+        Reviewed by Eric Seidel.
+
+        Refactoring, covered by existing tests.
+
+        * css/SelectorChecker.cpp:
+        (WebCore): Moved code out of here.
+        (WebCore::isFastCheckableMatch): Changed the callsite to use new location.
+        (WebCore::SelectorChecker::checkOne): Ditto.
+        * html/HTMLDocument.cpp:
+        (WebCore::addLocalNameToSet): Moved the code into here.
+        (WebCore): Ditto.
+        (WebCore::createHtmlCaseInsensitiveAttributesSet): Ditto.
+        (WebCore::HTMLDocument::isCaseSensitiveAttribute): Ditto.
+        * html/HTMLDocument.h:
+        (HTMLDocument): Added decl for the newly moved function.
+
 2013-01-21  Shinya Kawanaka  <[email protected]>
 
         FrameSelection should use shadowHost instead of shadowAncestorNode

Modified: trunk/Source/WebCore/css/SelectorChecker.cpp (140381 => 140382)


--- trunk/Source/WebCore/css/SelectorChecker.cpp	2013-01-22 05:04:29 UTC (rev 140381)
+++ trunk/Source/WebCore/css/SelectorChecker.cpp	2013-01-22 05:07:16 UTC (rev 140382)
@@ -34,6 +34,7 @@
 #include "FocusController.h"
 #include "Frame.h"
 #include "FrameSelection.h"
+#include "HTMLDocument.h"
 #include "HTMLFrameElementBase.h"
 #include "HTMLInputElement.h"
 #include "HTMLNames.h"
@@ -61,8 +62,6 @@
 
 using namespace HTMLNames;
 
-static bool htmlAttributeHasCaseInsensitiveValue(const QualifiedName& attr);
-
 SelectorChecker::SelectorChecker(Document* document)
     : m_strictParsing(!document->inQuirksMode())
     , m_documentIsHTML(document->isHTMLDocument())
@@ -216,7 +215,7 @@
         return selector->attribute() != styleAttr;
     }
     if (selector->m_match == CSSSelector::Exact)
-        return selector->attribute() != styleAttr && !htmlAttributeHasCaseInsensitiveValue(selector->attribute());
+        return selector->attribute() != styleAttr && HTMLDocument::isCaseSensitiveAttribute(selector->attribute());
     return selector->m_match == CSSSelector::Tag || selector->m_match == CSSSelector::Id || selector->m_match == CSSSelector::Class;
 }
 
@@ -391,73 +390,6 @@
     return SelectorFailsCompletely;
 }
 
-static void addLocalNameToSet(HashSet<AtomicStringImpl*>* set, const QualifiedName& qName)
-{
-    set->add(qName.localName().impl());
-}
-
-static HashSet<AtomicStringImpl*>* createHtmlCaseInsensitiveAttributesSet()
-{
-    // This is the list of attributes in HTML 4.01 with values marked as "[CI]" or case-insensitive
-    // Mozilla treats all other values as case-sensitive, thus so do we.
-    HashSet<AtomicStringImpl*>* attrSet = new HashSet<AtomicStringImpl*>;
-
-    addLocalNameToSet(attrSet, accept_charsetAttr);
-    addLocalNameToSet(attrSet, acceptAttr);
-    addLocalNameToSet(attrSet, alignAttr);
-    addLocalNameToSet(attrSet, alinkAttr);
-    addLocalNameToSet(attrSet, axisAttr);
-    addLocalNameToSet(attrSet, bgcolorAttr);
-    addLocalNameToSet(attrSet, charsetAttr);
-    addLocalNameToSet(attrSet, checkedAttr);
-    addLocalNameToSet(attrSet, clearAttr);
-    addLocalNameToSet(attrSet, codetypeAttr);
-    addLocalNameToSet(attrSet, colorAttr);
-    addLocalNameToSet(attrSet, compactAttr);
-    addLocalNameToSet(attrSet, declareAttr);
-    addLocalNameToSet(attrSet, deferAttr);
-    addLocalNameToSet(attrSet, dirAttr);
-    addLocalNameToSet(attrSet, disabledAttr);
-    addLocalNameToSet(attrSet, enctypeAttr);
-    addLocalNameToSet(attrSet, faceAttr);
-    addLocalNameToSet(attrSet, frameAttr);
-    addLocalNameToSet(attrSet, hreflangAttr);
-    addLocalNameToSet(attrSet, http_equivAttr);
-    addLocalNameToSet(attrSet, langAttr);
-    addLocalNameToSet(attrSet, languageAttr);
-    addLocalNameToSet(attrSet, linkAttr);
-    addLocalNameToSet(attrSet, mediaAttr);
-    addLocalNameToSet(attrSet, methodAttr);
-    addLocalNameToSet(attrSet, multipleAttr);
-    addLocalNameToSet(attrSet, nohrefAttr);
-    addLocalNameToSet(attrSet, noresizeAttr);
-    addLocalNameToSet(attrSet, noshadeAttr);
-    addLocalNameToSet(attrSet, nowrapAttr);
-    addLocalNameToSet(attrSet, readonlyAttr);
-    addLocalNameToSet(attrSet, relAttr);
-    addLocalNameToSet(attrSet, revAttr);
-    addLocalNameToSet(attrSet, rulesAttr);
-    addLocalNameToSet(attrSet, scopeAttr);
-    addLocalNameToSet(attrSet, scrollingAttr);
-    addLocalNameToSet(attrSet, selectedAttr);
-    addLocalNameToSet(attrSet, shapeAttr);
-    addLocalNameToSet(attrSet, targetAttr);
-    addLocalNameToSet(attrSet, textAttr);
-    addLocalNameToSet(attrSet, typeAttr);
-    addLocalNameToSet(attrSet, valignAttr);
-    addLocalNameToSet(attrSet, valuetypeAttr);
-    addLocalNameToSet(attrSet, vlinkAttr);
-
-    return attrSet;
-}
-
-bool htmlAttributeHasCaseInsensitiveValue(const QualifiedName& attr)
-{
-    static HashSet<AtomicStringImpl*>* htmlCaseInsensitiveAttributesSet = createHtmlCaseInsensitiveAttributesSet();
-    bool isPossibleHTMLAttr = !attr.hasPrefix() && (attr.namespaceURI() == nullAtom);
-    return isPossibleHTMLAttr && htmlCaseInsensitiveAttributesSet->contains(attr.localName().impl());
-}
-
 static bool attributeValueMatches(const Attribute* attributeItem, CSSSelector::Match match, const AtomicString& selectorValue, bool caseSensitive)
 {
     const AtomicString& value = attributeItem->value();
@@ -560,7 +492,7 @@
         if (!element->hasAttributes())
             return false;
 
-        bool caseSensitive = !m_documentIsHTML || !htmlAttributeHasCaseInsensitiveValue(attr);
+        bool caseSensitive = !m_documentIsHTML || HTMLDocument::isCaseSensitiveAttribute(attr);
 
         if (!anyAttributeMatches(element, static_cast<CSSSelector::Match>(selector->m_match), attr, selector->value(), caseSensitive))
             return false;

Modified: trunk/Source/WebCore/html/HTMLDocument.cpp (140381 => 140382)


--- trunk/Source/WebCore/html/HTMLDocument.cpp	2013-01-22 05:04:29 UTC (rev 140381)
+++ trunk/Source/WebCore/html/HTMLDocument.cpp	2013-01-22 05:07:16 UTC (rev 140382)
@@ -332,6 +332,73 @@
     removeItemFromMap(m_extraNamedItemCounts, name);
 }
 
+static void addLocalNameToSet(HashSet<AtomicStringImpl*>* set, const QualifiedName& qName)
+{
+    set->add(qName.localName().impl());
+}
+
+static HashSet<AtomicStringImpl*>* createHtmlCaseInsensitiveAttributesSet()
+{
+    // This is the list of attributes in HTML 4.01 with values marked as "[CI]" or case-insensitive
+    // Mozilla treats all other values as case-sensitive, thus so do we.
+    HashSet<AtomicStringImpl*>* attrSet = new HashSet<AtomicStringImpl*>;
+
+    addLocalNameToSet(attrSet, accept_charsetAttr);
+    addLocalNameToSet(attrSet, acceptAttr);
+    addLocalNameToSet(attrSet, alignAttr);
+    addLocalNameToSet(attrSet, alinkAttr);
+    addLocalNameToSet(attrSet, axisAttr);
+    addLocalNameToSet(attrSet, bgcolorAttr);
+    addLocalNameToSet(attrSet, charsetAttr);
+    addLocalNameToSet(attrSet, checkedAttr);
+    addLocalNameToSet(attrSet, clearAttr);
+    addLocalNameToSet(attrSet, codetypeAttr);
+    addLocalNameToSet(attrSet, colorAttr);
+    addLocalNameToSet(attrSet, compactAttr);
+    addLocalNameToSet(attrSet, declareAttr);
+    addLocalNameToSet(attrSet, deferAttr);
+    addLocalNameToSet(attrSet, dirAttr);
+    addLocalNameToSet(attrSet, disabledAttr);
+    addLocalNameToSet(attrSet, enctypeAttr);
+    addLocalNameToSet(attrSet, faceAttr);
+    addLocalNameToSet(attrSet, frameAttr);
+    addLocalNameToSet(attrSet, hreflangAttr);
+    addLocalNameToSet(attrSet, http_equivAttr);
+    addLocalNameToSet(attrSet, langAttr);
+    addLocalNameToSet(attrSet, languageAttr);
+    addLocalNameToSet(attrSet, linkAttr);
+    addLocalNameToSet(attrSet, mediaAttr);
+    addLocalNameToSet(attrSet, methodAttr);
+    addLocalNameToSet(attrSet, multipleAttr);
+    addLocalNameToSet(attrSet, nohrefAttr);
+    addLocalNameToSet(attrSet, noresizeAttr);
+    addLocalNameToSet(attrSet, noshadeAttr);
+    addLocalNameToSet(attrSet, nowrapAttr);
+    addLocalNameToSet(attrSet, readonlyAttr);
+    addLocalNameToSet(attrSet, relAttr);
+    addLocalNameToSet(attrSet, revAttr);
+    addLocalNameToSet(attrSet, rulesAttr);
+    addLocalNameToSet(attrSet, scopeAttr);
+    addLocalNameToSet(attrSet, scrollingAttr);
+    addLocalNameToSet(attrSet, selectedAttr);
+    addLocalNameToSet(attrSet, shapeAttr);
+    addLocalNameToSet(attrSet, targetAttr);
+    addLocalNameToSet(attrSet, textAttr);
+    addLocalNameToSet(attrSet, typeAttr);
+    addLocalNameToSet(attrSet, valignAttr);
+    addLocalNameToSet(attrSet, valuetypeAttr);
+    addLocalNameToSet(attrSet, vlinkAttr);
+
+    return attrSet;
+}
+
+bool HTMLDocument::isCaseSensitiveAttribute(const QualifiedName& attributeName)
+{
+    static HashSet<AtomicStringImpl*>* htmlCaseInsensitiveAttributesSet = createHtmlCaseInsensitiveAttributesSet();
+    bool isPossibleHTMLAttr = !attributeName.hasPrefix() && (attributeName.namespaceURI() == nullAtom);
+    return !isPossibleHTMLAttr || !htmlCaseInsensitiveAttributesSet->contains(attributeName.localName().impl());
+}
+
 void HTMLDocument::clear()
 {
     // FIXME: This does nothing, and that seems unlikely to be correct.

Modified: trunk/Source/WebCore/html/HTMLDocument.h (140381 => 140382)


--- trunk/Source/WebCore/html/HTMLDocument.h	2013-01-22 05:04:29 UTC (rev 140381)
+++ trunk/Source/WebCore/html/HTMLDocument.h	2013-01-22 05:07:16 UTC (rev 140382)
@@ -77,6 +77,8 @@
     void removeExtraNamedItem(const AtomicString& name);
     bool hasExtraNamedItem(AtomicStringImpl* name);
 
+    static bool isCaseSensitiveAttribute(const QualifiedName&);
+
 protected:
     HTMLDocument(Frame*, const KURL&);
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to