1926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/* 2926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Copyright (C) 2013 Google, Inc. All Rights Reserved. 3926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * 4926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without 5926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * modification, are permitted provided that the following conditions 6926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * are met: 7926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 8926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * notice, this list of conditions and the following disclaimer. 9926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 10926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 11926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * documentation and/or other materials provided with the distribution. 12926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * 13926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */ 25926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 26926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#ifndef AtomicHTMLToken_h 27926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#define AtomicHTMLToken_h 28926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 295d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/HTMLElementLookupTrie.h" 3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Attribute.h" 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/parser/CompactHTMLToken.h" 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/parser/HTMLToken.h" 33e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/RefCounted.h" 34e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/RefPtr.h" 35926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 36c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 37926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 38926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class AtomicHTMLToken { 39926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) WTF_MAKE_NONCOPYABLE(AtomicHTMLToken); 40926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)public: 41926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 42926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool forceQuirks() const 43926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 44926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(m_type == HTMLToken::DOCTYPE); 45926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_doctypeData->m_forceQuirks; 46926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 47926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 48926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) HTMLToken::Type type() const { return m_type; } 49926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 50926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const AtomicString& name() const 51926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 52926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(usesName()); 53926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_name; 54926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void setName(const AtomicString& name) 57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(usesName()); 59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_name = name; 60926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool selfClosing() const 63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(m_type == HTMLToken::StartTag || m_type == HTMLToken::EndTag); 65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_selfClosing; 66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) Attribute* getAttributeItem(const QualifiedName& attributeName) 69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(usesAttributes()); 71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return findAttributeInVector(m_attributes, attributeName); 72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) Vector<Attribute>& attributes() 75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(usesAttributes()); 77926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_attributes; 78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const Vector<Attribute>& attributes() const 81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(usesAttributes()); 83926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_attributes; 84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 85926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 8693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) const String& characters() const 87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 88926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(m_type == HTMLToken::Character); 8993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return m_data; 90926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 91926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 92926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const String& comment() const 93926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 94926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(m_type == HTMLToken::Comment); 95926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_data; 96926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 98926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // FIXME: Distinguish between a missing public identifer and an empty one. 99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) Vector<UChar>& publicIdentifier() const 100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(m_type == HTMLToken::DOCTYPE); 102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_doctypeData->m_publicIdentifier; 103926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // FIXME: Distinguish between a missing system identifer and an empty one. 106926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) Vector<UChar>& systemIdentifier() const 107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 108926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(m_type == HTMLToken::DOCTYPE); 109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_doctypeData->m_systemIdentifier; 110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) explicit AtomicHTMLToken(HTMLToken& token) 113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) : m_type(token.type()) 114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) switch (m_type) { 116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case HTMLToken::Uninitialized: 117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT_NOT_REACHED(); 118926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case HTMLToken::DOCTYPE: 120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_name = AtomicString(token.name()); 121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_doctypeData = token.releaseDoctypeData(); 122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case HTMLToken::EndOfFile: 124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 125926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case HTMLToken::StartTag: 126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case HTMLToken::EndTag: { 127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_selfClosing = token.selfClosing(); 12851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (StringImpl* tagName = lookupHTMLTag(token.name().data(), token.name().size())) 12951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_name = AtomicString(tagName); 13051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) else 13151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_name = AtomicString(token.name()); 132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) initializeAttributes(token.attributes()); 133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 13593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) case HTMLToken::Character: 136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case HTMLToken::Comment: 137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (token.isAll8BitData()) 13893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_data = String::make8BitFrom16BitSource(token.data()); 139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else 14093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_data = String(token.data()); 141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 143926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 144926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) explicit AtomicHTMLToken(const CompactHTMLToken& token) 146926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) : m_type(token.type()) 147926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 148926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) switch (m_type) { 149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case HTMLToken::Uninitialized: 150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT_NOT_REACHED(); 151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case HTMLToken::DOCTYPE: 15309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_name = AtomicString(token.data()); 154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_doctypeData = adoptPtr(new DoctypeData()); 155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_doctypeData->m_hasPublicIdentifier = true; 15609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) append(m_doctypeData->m_publicIdentifier, token.publicIdentifier()); 157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_doctypeData->m_hasSystemIdentifier = true; 158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) append(m_doctypeData->m_systemIdentifier, token.systemIdentifier()); 159926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_doctypeData->m_forceQuirks = token.doctypeForcesQuirks(); 160926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case HTMLToken::EndOfFile: 162926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case HTMLToken::StartTag: 164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_attributes.reserveInitialCapacity(token.attributes().size()); 165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (Vector<CompactHTMLToken::Attribute>::const_iterator it = token.attributes().begin(); it != token.attributes().end(); ++it) { 16609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) QualifiedName name(nullAtom, AtomicString(it->name), nullAtom); 167926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // FIXME: This is N^2 for the number of attributes. 168926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!findAttributeInVector(m_attributes, name)) 16909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_attributes.append(Attribute(name, AtomicString(it->value))); 170926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 171926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Fall through! 172926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case HTMLToken::EndTag: 173926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_selfClosing = token.selfClosing(); 17409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_name = AtomicString(token.data()); 175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 17693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) case HTMLToken::Character: 177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case HTMLToken::Comment: 17809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_data = token.data(); 179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 181926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 182926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 183926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) explicit AtomicHTMLToken(HTMLToken::Type type) 184926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) : m_type(type) 185926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_selfClosing(false) 186926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 187926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 188926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 189926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) AtomicHTMLToken(HTMLToken::Type type, const AtomicString& name, const Vector<Attribute>& attributes = Vector<Attribute>()) 190926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) : m_type(type) 191926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_name(name) 192926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_selfClosing(false) 193926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_attributes(attributes) 194926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 195926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(usesName()); 196926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 197926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 198926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)private: 199926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) HTMLToken::Type m_type; 200926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 201926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void initializeAttributes(const HTMLToken::AttributeList& attributes); 202926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) QualifiedName nameForAttribute(const HTMLToken::Attribute&) const; 203926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 204926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool usesName() const; 205926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 206926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool usesAttributes() const; 207926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 208926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // "name" for DOCTYPE, StartTag, and EndTag 209926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) AtomicString m_name; 210926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 21193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // "data" for Comment, "characters" for Character 212926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) String m_data; 213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 214926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // For DOCTYPE 215926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) OwnPtr<DoctypeData> m_doctypeData; 216926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 217926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // For StartTag and EndTag 218926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool m_selfClosing; 219926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 220926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) Vector<Attribute> m_attributes; 221926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}; 222926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 223926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline void AtomicHTMLToken::initializeAttributes(const HTMLToken::AttributeList& attributes) 224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 225926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) size_t size = attributes.size(); 226926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!size) 227926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 228926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 229926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_attributes.clear(); 230926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_attributes.reserveInitialCapacity(size); 231926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (size_t i = 0; i < size; ++i) { 232926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const HTMLToken::Attribute& attribute = attributes[i]; 233926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (attribute.name.isEmpty()) 234926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) continue; 235926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 23676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) ASSERT(attribute.nameRange.start); 237926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(attribute.nameRange.end); 238926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(attribute.valueRange.start); 239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(attribute.valueRange.end); 240926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 241926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) AtomicString value(attribute.value); 242926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const QualifiedName& name = nameForAttribute(attribute); 243926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // FIXME: This is N^2 for the number of attributes. 244926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!findAttributeInVector(m_attributes, name)) 245926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_attributes.append(Attribute(name, value)); 246926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 247926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 248926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 249926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 250926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif 252