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