Changeset 29212 in webkit


Ignore:
Timestamp:
Jan 6, 2008 12:35:04 PM (16 years ago)
Author:
eric@webkit.org
Message:

Reviewed by darin.

Make attr selectors case-insensitive for certain HTML attributes
http://bugs.webkit.org/show_bug.cgi?id=15470

Test: fast/css/html-attr-case-sensitivity.html

  • css/CSSStyleSelector.cpp: (WebCore::addLocalNameToSet): (WebCore::createHtmlCaseInsensitiveAttributesSet): (WebCore::htmlAttributeHasCaseInsensitiveValue): (WebCore::CSSStyleSelector::checkOneSelector):
Location:
trunk
Files:
3 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r29211 r29212  
    3434        * fast/dom/Range/range-clone-empty.html: Added.
    3535        * fast/dom/Range/resources/range-clone-empty.js: Added.
     36
     372008-01-06  Eric Seidel  <eric@webkit.org>
     38
     39        Reviewed by darin.
     40       
     41        Make attr selectors case-insensitive for certain HTML attributes
     42        http://bugs.webkit.org/show_bug.cgi?id=15470
     43
     44        * fast/css/html-attr-case-sensitivity-expected.txt: Added.
     45        * fast/css/html-attr-case-sensitivity.html: Added.
     46        * fast/css/resources/html-attr-case-sensitivity.js: Added.
    3647
    37482008-01-06  Eric Seidel  <eric@webkit.org>
  • trunk/WebCore/ChangeLog

    r29211 r29212  
    6060        * html/CanvasPattern.cpp:
    6161        (WebCore::CanvasPattern::CanvasPattern):
     62
     632008-01-06  Eric Seidel  <eric@webkit.org>
     64
     65        Reviewed by darin.
     66
     67        Make attr selectors case-insensitive for certain HTML attributes
     68        http://bugs.webkit.org/show_bug.cgi?id=15470
     69
     70        Test: fast/css/html-attr-case-sensitivity.html
     71
     72        * css/CSSStyleSelector.cpp:
     73        (WebCore::addLocalNameToSet):
     74        (WebCore::createHtmlCaseInsensitiveAttributesSet):
     75        (WebCore::htmlAttributeHasCaseInsensitiveValue):
     76        (WebCore::CSSStyleSelector::checkOneSelector):
    6277
    63782008-01-06  Eric Seidel  <eric@webkit.org>
  • trunk/WebCore/css/CSSStyleSelector.cpp

    r29191 r29212  
    14101410}
    14111411
     1412static void addLocalNameToSet(HashSet<AtomicStringImpl*>* set, const QualifiedName& qName)
     1413{
     1414    set->add(qName.localName().impl());
     1415}
     1416
     1417static HashSet<AtomicStringImpl*>* createHtmlCaseInsensitiveAttributesSet()
     1418{
     1419    // This is the list of attributes in HTML 4.01 with values marked as "[CI]" or case-insensitive
     1420    // Mozilla treats all other values as case-sensitive, thus so do we.
     1421    HashSet<AtomicStringImpl*>* attrSet = new HashSet<AtomicStringImpl*>;
     1422
     1423    addLocalNameToSet(attrSet, accept_charsetAttr);
     1424    addLocalNameToSet(attrSet, acceptAttr);
     1425    addLocalNameToSet(attrSet, alignAttr);
     1426    addLocalNameToSet(attrSet, alinkAttr);
     1427    addLocalNameToSet(attrSet, axisAttr);
     1428    addLocalNameToSet(attrSet, bgcolorAttr);
     1429    addLocalNameToSet(attrSet, charsetAttr);
     1430    addLocalNameToSet(attrSet, checkedAttr);
     1431    addLocalNameToSet(attrSet, clearAttr);
     1432    addLocalNameToSet(attrSet, codetypeAttr);
     1433    addLocalNameToSet(attrSet, colorAttr);
     1434    addLocalNameToSet(attrSet, compactAttr);
     1435    addLocalNameToSet(attrSet, declareAttr);
     1436    addLocalNameToSet(attrSet, deferAttr);
     1437    addLocalNameToSet(attrSet, dirAttr);
     1438    addLocalNameToSet(attrSet, disabledAttr);
     1439    addLocalNameToSet(attrSet, enctypeAttr);
     1440    addLocalNameToSet(attrSet, faceAttr);
     1441    addLocalNameToSet(attrSet, frameAttr);
     1442    addLocalNameToSet(attrSet, hreflangAttr);
     1443    addLocalNameToSet(attrSet, http_equivAttr);
     1444    addLocalNameToSet(attrSet, langAttr);
     1445    addLocalNameToSet(attrSet, languageAttr);
     1446    addLocalNameToSet(attrSet, linkAttr);
     1447    addLocalNameToSet(attrSet, mediaAttr);
     1448    addLocalNameToSet(attrSet, methodAttr);
     1449    addLocalNameToSet(attrSet, multipleAttr);
     1450    addLocalNameToSet(attrSet, nohrefAttr);
     1451    addLocalNameToSet(attrSet, noresizeAttr);
     1452    addLocalNameToSet(attrSet, noshadeAttr);
     1453    addLocalNameToSet(attrSet, nowrapAttr);
     1454    addLocalNameToSet(attrSet, readonlyAttr);
     1455    addLocalNameToSet(attrSet, relAttr);
     1456    addLocalNameToSet(attrSet, revAttr);
     1457    addLocalNameToSet(attrSet, rulesAttr);
     1458    addLocalNameToSet(attrSet, scopeAttr);
     1459    addLocalNameToSet(attrSet, scrollingAttr);
     1460    addLocalNameToSet(attrSet, selectedAttr);
     1461    addLocalNameToSet(attrSet, shapeAttr);
     1462    addLocalNameToSet(attrSet, targetAttr);
     1463    addLocalNameToSet(attrSet, textAttr);
     1464    addLocalNameToSet(attrSet, typeAttr);
     1465    addLocalNameToSet(attrSet, valignAttr);
     1466    addLocalNameToSet(attrSet, valuetypeAttr);
     1467    addLocalNameToSet(attrSet, vlinkAttr);
     1468
     1469    return attrSet;
     1470}
     1471
     1472static bool htmlAttributeHasCaseInsensitiveValue(const QualifiedName& attr)
     1473{
     1474    static HashSet<AtomicStringImpl*>* htmlCaseInsensitiveAttributesSet = createHtmlCaseInsensitiveAttributesSet();
     1475    bool isPossibleHTMLAttr = !attr.hasPrefix() && (attr.namespaceURI() == nullAtom);
     1476    return isPossibleHTMLAttr && htmlCaseInsensitiveAttributesSet->contains(attr.localName().impl());
     1477}
     1478
    14121479bool CSSStyleSelector::checkOneSelector(CSSSelector* sel, Element* e, bool isAncestor, bool isSubSelector)
    14131480{
     
    14471514            return false; // attribute is not set
    14481515
     1516        bool caseSensitive = isXMLDoc || !htmlAttributeHasCaseInsensitiveValue(sel->m_attr);
     1517
    14491518        switch (sel->m_match) {
    14501519        case CSSSelector::Exact:
    1451             if ((isXMLDoc && sel->m_value != value) || (!isXMLDoc && !equalIgnoringCase(sel->m_value, value)))
     1520            if (caseSensitive ? sel->m_value != value : !equalIgnoringCase(sel->m_value, value))
    14521521                return false;
    14531522            break;
     
    14601529            int startSearchAt = 0;
    14611530            while (true) {
    1462                 int foundPos = value.find(sel->m_value, startSearchAt, isXMLDoc);
     1531                int foundPos = value.find(sel->m_value, startSearchAt, caseSensitive);
    14631532                if (foundPos == -1)
    14641533                    return false;
     
    14751544        }
    14761545        case CSSSelector::Contain:
    1477             if (!value.contains(sel->m_value, isXMLDoc))
     1546            if (!value.contains(sel->m_value, caseSensitive))
    14781547                return false;
    14791548            break;
    14801549        case CSSSelector::Begin:
    1481             if (!value.startsWith(sel->m_value, isXMLDoc))
     1550            if (!value.startsWith(sel->m_value, caseSensitive))
    14821551                return false;
    14831552            break;
    14841553        case CSSSelector::End:
    1485             if (!value.endsWith(sel->m_value, isXMLDoc))
     1554            if (!value.endsWith(sel->m_value, caseSensitive))
    14861555                return false;
    14871556            break;
     
    14891558            if (value.length() < sel->m_value.length())
    14901559                return false;
    1491             if (!value.startsWith(sel->m_value, isXMLDoc))
     1560            if (!value.startsWith(sel->m_value, caseSensitive))
    14921561                return false;
    14931562            // It they start the same, check for exact match or following '-':
     
    15011570        }
    15021571    }
    1503     if (sel->m_match == CSSSelector::PseudoClass)
    1504     {
     1572    if (sel->m_match == CSSSelector::PseudoClass) {
    15051573        switch (sel->pseudoType()) {
    15061574            // Pseudo classes:
Note: See TracChangeset for help on using the changeset viewer.