15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2005, 2006, 2009 Apple Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/QualifiedName.h" 235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/HTMLNames.h" 259e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)#include "core/MathMLNames.h" 265d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/SVGNames.h" 275d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/XLinkNames.h" 285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/XMLNSNames.h" 295d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/XMLNames.h" 30e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/Assertions.h" 31e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/HashSet.h" 321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "wtf/MainThread.h" 33e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/StaticConstructors.h" 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccistruct SameSizeAsQualifiedNameImpl : public RefCounted<SameSizeAsQualifiedNameImpl> { 387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci unsigned bitfield; 397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci void* pointers[4]; 407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}; 417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciCOMPILE_ASSERT(sizeof(QualifiedName::QualifiedNameImpl) == sizeof(SameSizeAsQualifiedNameImpl), qualified_name_impl_should_stay_small); 437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const int staticQualifiedNamesCount = HTMLNames::HTMLTagsCount + HTMLNames::HTMLAttrsCount 459e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) + MathMLNames::MathMLTagsCount + MathMLNames::MathMLAttrsCount 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) + SVGNames::SVGTagsCount + SVGNames::SVGAttrsCount 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) + XLinkNames::XLinkAttrsCount 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) + XMLNSNames::XMLNSAttrsCount 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) + XMLNames::XMLAttrsCount; 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct QualifiedNameHashTraits : public HashTraits<QualifiedName::QualifiedNameImpl*> { 52f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) static const unsigned minimumTableSize = WTF::HashTableCapacityForSize<staticQualifiedNamesCount>::value; 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 551e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)typedef HashSet<QualifiedName::QualifiedNameImpl*, QualifiedNameHash, QualifiedNameHashTraits> QualifiedNameCache; 561e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 571e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)static QualifiedNameCache& qualifiedNameCache() 581e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){ 591e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) // This code is lockless and thus assumes it all runs on one thread! 601e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) ASSERT(isMainThread()); 611e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) static QualifiedNameCache* gNameCache = new QualifiedNameCache; 621e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) return *gNameCache; 631e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)} 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct QNameComponentsTranslator { 665d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) static unsigned hash(const QualifiedNameData& data) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return hashComponents(data.m_components); 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 705d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) static bool equal(QualifiedName::QualifiedNameImpl* name, const QualifiedNameData& data) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 725d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return data.m_components.m_prefix == name->m_prefix.impl() 735d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) && data.m_components.m_localName == name->m_localName.impl() 745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) && data.m_components.m_namespace == name->m_namespace.impl(); 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 765d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) static void translate(QualifiedName::QualifiedNameImpl*& location, const QualifiedNameData& data, unsigned) 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 785d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) const QualifiedNameComponents& components = data.m_components; 795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) location = QualifiedName::QualifiedNameImpl::create(AtomicString(components.m_prefix), AtomicString(components.m_localName), AtomicString(components.m_namespace), data.m_isStatic).leakRef(); 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)QualifiedName::QualifiedName(const AtomicString& p, const AtomicString& l, const AtomicString& n) 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) QualifiedNameData data = { { p.impl(), l.impl(), n.isEmpty() ? nullAtom.impl() : n.impl() }, false }; 865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) QualifiedNameCache::AddResult addResult = qualifiedNameCache().add<QNameComponentsTranslator>(data); 875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_impl = addResult.isNewEntry ? adoptRef(*addResult.storedValue) : *addResult.storedValue; 885d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)} 895d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 905d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)QualifiedName::QualifiedName(const AtomicString& p, const AtomicString& l, const AtomicString& n, bool isStatic) 915d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){ 925d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) QualifiedNameData data = { { p.impl(), l.impl(), n.impl() }, isStatic }; 935d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) QualifiedNameCache::AddResult addResult = qualifiedNameCache().add<QNameComponentsTranslator>(data); 9409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_impl = addResult.isNewEntry ? adoptRef(*addResult.storedValue) : *addResult.storedValue; 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)QualifiedName::~QualifiedName() 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)QualifiedName::QualifiedNameImpl::~QualifiedNameImpl() 102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 1031e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) qualifiedNameCache().remove(this); 104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String QualifiedName::toString() const 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String local = localName(); 1091fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch if (hasPrefix()) 1101fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch return prefix().string() + ":" + local; 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return local; 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Global init routines 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DEFINE_GLOBAL(QualifiedName, anyName, nullAtom, starAtom, starAtom) 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void QualifiedName::init() 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) ASSERT(starAtom.impl()); 1205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) new ((void*)&anyName) QualifiedName(nullAtom, starAtom, starAtom, true ); 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)const QualifiedName& QualifiedName::null() 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) DEFINE_STATIC_LOCAL(QualifiedName, nullName, (nullAtom, nullAtom, nullAtom, true)); 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return nullName; 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const AtomicString& QualifiedName::localNameUpper() const 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_impl->m_localNameUpper) 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_impl->m_localNameUpper = m_impl->m_localName.upper(); 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_impl->m_localNameUpper; 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned QualifiedName::QualifiedNameImpl::computeHash() const 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) QualifiedNameComponents components = { m_prefix.impl(), m_localName.impl(), m_namespace.impl() }; 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return hashComponents(components); 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1425d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void QualifiedName::createStatic(void* targetAddress, StringImpl* name, const AtomicString& nameNamespace) 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) new (targetAddress) QualifiedName(nullAtom, AtomicString(name), nameNamespace, true); 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1475d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void QualifiedName::createStatic(void* targetAddress, StringImpl* name) 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) new (targetAddress) QualifiedName(nullAtom, AtomicString(name), nullAtom, true); 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 153