15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Apple Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DatasetDOMStringMap.h"
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29df95704c49daea886ddad70775bda23618d6274dBen Murdoch#include "bindings/v8/ExceptionState.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Attribute.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Element.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ExceptionCode.h"
33e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/ASCIICType.h"
34e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/text/StringBuilder.h"
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool isValidAttributeName(const String& name)
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!name.startsWith("data-"))
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned length = name.length();
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned i = 5; i < length; ++i) {
45591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (isASCIIUpper(name[i]))
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static String convertAttributeNameToPropertyName(const String& name)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StringBuilder stringBuilder;
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned length = name.length();
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned i = 5; i < length; ++i) {
58591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        UChar character = name[i];
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (character != '-')
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            stringBuilder.append(character);
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else {
62591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            if ((i + 1 < length) && isASCIILower(name[i + 1])) {
63591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                stringBuilder.append(toASCIIUpper(name[i + 1]));
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ++i;
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            } else
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                stringBuilder.append(character);
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return stringBuilder.toString();
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool propertyNameMatchesAttributeName(const String& propertyName, const String& attributeName)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!attributeName.startsWith("data-"))
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned propertyLength = propertyName.length();
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned attributeLength = attributeName.length();
8002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned a = 5;
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned p = 0;
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool wordBoundary = false;
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (a < attributeLength && p < propertyLength) {
85591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (attributeName[a] == '-' && a + 1 < attributeLength && attributeName[a + 1] != '-')
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            wordBoundary = true;
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else {
88591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            if ((wordBoundary ? toASCIIUpper(attributeName[a]) : attributeName[a]) != propertyName[p])
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return false;
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            p++;
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            wordBoundary = false;
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        a++;
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return (a == attributeLength && p == propertyLength);
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool isValidPropertyName(const String& name)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned length = name.length();
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned i = 0; i < length; ++i) {
103591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (name[i] == '-' && (i + 1 < length) && isASCIILower(name[i + 1]))
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static String convertPropertyNameToAttributeName(const String& name)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StringBuilder builder;
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    builder.append("data-");
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned length = name.length();
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned i = 0; i < length; ++i) {
116591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        UChar character = name[i];
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isASCIIUpper(character)) {
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            builder.append('-');
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            builder.append(toASCIILower(character));
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            builder.append(character);
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return builder.toString();
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DatasetDOMStringMap::ref()
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_element->ref();
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DatasetDOMStringMap::deref()
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_element->deref();
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DatasetDOMStringMap::getNames(Vector<String>& names)
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_element->hasAttributes())
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned length = m_element->attributeCount();
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned i = 0; i < length; i++) {
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const Attribute* attribute = m_element->attributeItem(i);
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isValidAttributeName(attribute->localName()))
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            names.append(convertAttributeNameToPropertyName(attribute->localName()));
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String DatasetDOMStringMap::item(const String& name)
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_element->hasAttributes())
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return String();
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned length = m_element->attributeCount();
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned i = 0; i < length; i++) {
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const Attribute* attribute = m_element->attributeItem(i);
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (propertyNameMatchesAttributeName(name, attribute->localName()))
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return attribute->value();
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return String();
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool DatasetDOMStringMap::contains(const String& name)
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_element->hasAttributes())
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned length = m_element->attributeCount();
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned i = 0; i < length; i++) {
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const Attribute* attribute = m_element->attributeItem(i);
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (propertyNameMatchesAttributeName(name, attribute->localName()))
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
180df95704c49daea886ddad70775bda23618d6274dBen Murdochvoid DatasetDOMStringMap::setItem(const String& name, const String& value, ExceptionState& es)
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!isValidPropertyName(name)) {
183df95704c49daea886ddad70775bda23618d6274dBen Murdoch        es.throwDOMException(SyntaxError);
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
187df95704c49daea886ddad70775bda23618d6274dBen Murdoch    m_element->setAttribute(convertPropertyNameToAttributeName(name), value, es);
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
190df95704c49daea886ddad70775bda23618d6274dBen Murdochvoid DatasetDOMStringMap::deleteItem(const String& name, ExceptionState& es)
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!isValidPropertyName(name)) {
193df95704c49daea886ddad70775bda23618d6274dBen Murdoch        es.throwDOMException(SyntaxError);
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_element->removeAttribute(convertPropertyNameToAttributeName(name));
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
201