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&);