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