15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
2926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Copyright (C) 2013 Google, 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. ``AS IS'' AND ANY
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (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.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef HTMLToken_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define HTMLToken_h
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Attribute.h"
300019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#include "wtf/PassOwnPtr.h"
31e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/RefCounted.h"
32e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/RefPtr.h"
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class DoctypeData {
37926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WTF_MAKE_NONCOPYABLE(DoctypeData);
38926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)public:
39926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DoctypeData()
40926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        : m_hasPublicIdentifier(false)
41926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        , m_hasSystemIdentifier(false)
42926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        , m_forceQuirks(false)
43926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
44926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
45926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
46926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool m_hasPublicIdentifier;
47926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool m_hasSystemIdentifier;
48926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WTF::Vector<UChar> m_publicIdentifier;
49926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WTF::Vector<UChar> m_systemIdentifier;
50926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool m_forceQuirks;
51926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
52926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
53926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static inline Attribute* findAttributeInVector(Vector<Attribute>& attributes, const QualifiedName& name)
54926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (unsigned i = 0; i < attributes.size(); ++i) {
56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (attributes.at(i).name().matches(name))
57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return &attributes.at(i);
58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return 0;
60926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class HTMLToken {
63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WTF_MAKE_NONCOPYABLE(HTMLToken);
64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WTF_MAKE_FAST_ALLOCATED;
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum Type {
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Uninitialized,
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DOCTYPE,
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        StartTag,
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        EndTag,
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Comment,
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Character,
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        EndOfFile,
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    class Attribute {
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    public:
78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        class Range {
79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        public:
80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            int start;
81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            int end;
82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        };
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        Range nameRange;
85926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        Range valueRange;
86926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        Vector<UChar, 32> name;
87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        Vector<UChar, 32> value;
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    typedef Vector<Attribute, 10> AttributeList;
9193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
9293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // By using an inline capacity of 256, we avoid spilling over into an malloced buffer
9393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // approximately 99% of the time based on a non-scientific browse around a number of
9493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // popular web sites on 23 May 2013.
9593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    typedef Vector<UChar, 256> DataVector;
96926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    HTMLToken() { clear(); }
98926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void clear()
100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_type = Uninitialized;
102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_range.start = 0;
103926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_range.end = 0;
104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_baseOffset = 0;
10507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        // Don't call Vector::clear() as that would destroy the
10607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        // alloced VectorBuffer. If the innerHTML'd content has
10707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        // two 257 character text nodes in a row, we'll needlessly
10807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        // thrash malloc. When we finally finish the parse the
10907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        // HTMLToken will be destroyed and the VectorBuffer released.
11007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_data.shrink(0);
111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_orAllData = 0;
112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isUninitialized() { return m_type == Uninitialized; }
115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Type type() const { return m_type; }
116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void makeEndOfFile()
118926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == Uninitialized);
120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_type = EndOfFile;
121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /* Range and offset methods exposed for HTMLSourceTracker and HTMLViewSourceParser */
124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int startIndex() const { return m_range.start; }
125926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int endIndex() const { return m_range.end; }
126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void setBaseOffset(int offset)
128926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_baseOffset = offset;
130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void end(int endOffset)
133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_range.end = endOffset - m_baseOffset;
135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const DataVector& data() const
138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == Character || m_type == Comment || m_type == StartTag || m_type == EndTag);
140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return m_data;
141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
143926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isAll8BitData() const
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return (m_orAllData <= 0xff);
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const DataVector& name() const
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == StartTag || m_type == EndTag || m_type == DOCTYPE);
151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return m_data;
152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void appendToName(UChar character)
155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == StartTag || m_type == EndTag || m_type == DOCTYPE);
157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(character);
158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_data.append(character);
159926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_orAllData |= character;
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
162926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /* DOCTYPE Tokens */
163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool forceQuirks() const
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
166926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == DOCTYPE);
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_doctypeData->m_forceQuirks;
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setForceQuirks()
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
172926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == DOCTYPE);
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_doctypeData->m_forceQuirks = true;
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
176926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void beginDOCTYPE()
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == Uninitialized);
179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_type = DOCTYPE;
180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_doctypeData = adoptPtr(new DoctypeData);
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
183926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void beginDOCTYPE(UChar character)
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
185926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(character);
186926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        beginDOCTYPE();
187926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_data.append(character);
188926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_orAllData |= character;
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
191926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // FIXME: Distinguish between a missing public identifer and an empty one.
192926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const WTF::Vector<UChar>& publicIdentifier() const
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
194926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == DOCTYPE);
195926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return m_doctypeData->m_publicIdentifier;
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
197926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
198926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // FIXME: Distinguish between a missing system identifer and an empty one.
199926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const WTF::Vector<UChar>& systemIdentifier() const
200926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
201926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == DOCTYPE);
202926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return m_doctypeData->m_systemIdentifier;
203926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
204926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
205926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void setPublicIdentifierToEmptyString()
206926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
207926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == DOCTYPE);
208926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_doctypeData->m_hasPublicIdentifier = true;
209926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_doctypeData->m_publicIdentifier.clear();
210926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
211926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
212926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void setSystemIdentifierToEmptyString()
213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
214926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == DOCTYPE);
215926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_doctypeData->m_hasSystemIdentifier = true;
216926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_doctypeData->m_systemIdentifier.clear();
217926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
218926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
219926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void appendToPublicIdentifier(UChar character)
220926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
221926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(character);
222926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == DOCTYPE);
223926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_doctypeData->m_hasPublicIdentifier);
224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_doctypeData->m_publicIdentifier.append(character);
225926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
226926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
227926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void appendToSystemIdentifier(UChar character)
228926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
229926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(character);
230926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == DOCTYPE);
231926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_doctypeData->m_hasSystemIdentifier);
232926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_doctypeData->m_systemIdentifier.append(character);
233926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
234926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
235926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    PassOwnPtr<DoctypeData> releaseDoctypeData()
236926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
237926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return m_doctypeData.release();
238926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
240926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /* Start/End Tag Tokens */
241926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
242926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool selfClosing() const
243926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
244926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == StartTag || m_type == EndTag);
245926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return m_selfClosing;
246926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
247926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
248926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void setSelfClosing()
249926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
250926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == StartTag || m_type == EndTag);
251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_selfClosing = true;
252926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
254926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void beginStartTag(UChar character)
255926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
256926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(character);
257926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == Uninitialized);
258926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_type = StartTag;
259926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_selfClosing = false;
260926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_currentAttribute = 0;
261926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_attributes.clear();
262926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
263926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_data.append(character);
264926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_orAllData |= character;
265926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
266926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
267926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void beginEndTag(LChar character)
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
269926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == Uninitialized);
270926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_type = EndTag;
271926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_selfClosing = false;
272926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_currentAttribute = 0;
273926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_attributes.clear();
274926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
275926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_data.append(character);
276926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
277926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
278926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void beginEndTag(const Vector<LChar, 32>& characters)
279926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
280926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == Uninitialized);
281926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_type = EndTag;
282926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_selfClosing = false;
283926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_currentAttribute = 0;
284926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_attributes.clear();
285926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
286926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_data.appendVector(characters);
287926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
288926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
289926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void addNewAttribute()
290926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
291926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == StartTag || m_type == EndTag);
292926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_attributes.grow(m_attributes.size() + 1);
293926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_currentAttribute = &m_attributes.last();
294197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT)
295926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_currentAttribute->nameRange.start = 0;
296926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_currentAttribute->nameRange.end = 0;
297926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_currentAttribute->valueRange.start = 0;
298926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_currentAttribute->valueRange.end = 0;
299926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif
300926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
301926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
302926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void beginAttributeName(int offset)
303926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
304926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_currentAttribute->nameRange.start = offset - m_baseOffset;
305926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
306926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
307926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void endAttributeName(int offset)
308926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
309926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        int index = offset - m_baseOffset;
310926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_currentAttribute->nameRange.end = index;
311926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_currentAttribute->valueRange.start = index;
312926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_currentAttribute->valueRange.end = index;
313926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
314926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
315926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void beginAttributeValue(int offset)
316926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
317926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_currentAttribute->valueRange.start = offset - m_baseOffset;
318197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT)
319926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_currentAttribute->valueRange.end = 0;
320926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif
321926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
322926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
323926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void endAttributeValue(int offset)
324926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
325926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_currentAttribute->valueRange.end = offset - m_baseOffset;
326926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
327926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
328926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void appendToAttributeName(UChar character)
329926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
330926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(character);
331926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == StartTag || m_type == EndTag);
332f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        ASSERT(m_currentAttribute->nameRange.start);
333926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_currentAttribute->name.append(character);
334926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
335926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
336926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void appendToAttributeValue(UChar character)
337926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
338926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(character);
339926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == StartTag || m_type == EndTag);
340926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_currentAttribute->valueRange.start);
341926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_currentAttribute->value.append(character);
342926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
343926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
344926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void appendToAttributeValue(size_t i, const String& value)
345926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
346926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(!value.isEmpty());
347926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == StartTag || m_type == EndTag);
348926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        append(m_attributes[i].value, value);
349926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
350926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
351926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const AttributeList& attributes() const
352926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
353926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == StartTag || m_type == EndTag);
354926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return m_attributes;
355926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
356926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
357926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const Attribute* getAttributeItem(const QualifiedName& name) const
358926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
359926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (unsigned i = 0; i < m_attributes.size(); ++i) {
360926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (AtomicString(m_attributes.at(i).name) == name.localName())
361926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                return &m_attributes.at(i);
362926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
363926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return 0;
364926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
365926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
366926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Used by the XSSAuditor to nuke XSS-laden attributes.
367926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void eraseValueOfAttribute(size_t i)
368926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
369926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == StartTag || m_type == EndTag);
370926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_attributes[i].value.clear();
371926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
372926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
373926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /* Character Tokens */
374926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
375926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Starting a character token works slightly differently than starting
376926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // other types of tokens because we want to save a per-character branch.
377926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void ensureIsCharacterToken()
378926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
379926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == Uninitialized || m_type == Character);
380926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_type = Character;
381926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
382926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
383926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const DataVector& characters() const
384926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
385926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == Character);
386926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return m_data;
387926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
388926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
389926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void appendToCharacter(char character)
390926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
391926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == Character);
392926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_data.append(character);
393926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
394926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
395926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void appendToCharacter(UChar character)
396926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
397926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == Character);
398926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_data.append(character);
399926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_orAllData |= character;
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
402926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void appendToCharacter(const Vector<LChar, 32>& characters)
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
404926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == Character);
405926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_data.appendVector(characters);
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
407926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
408926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /* Comment Tokens */
409926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
410926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const DataVector& comment() const
411926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
412926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == Comment);
413926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return m_data;
414926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
415926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
416926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void beginComment()
417926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
418926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == Uninitialized);
419926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_type = Comment;
420926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
421926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
422926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void appendToComment(UChar character)
423926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
424926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(character);
425926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == Comment);
426926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_data.append(character);
427926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_orAllData |= character;
428926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
429926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
43007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // Only for XSSAuditor
431926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void eraseCharacters()
432926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
433926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_type == Character);
434926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_data.clear();
435926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_orAllData = 0;
436926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
437926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
438926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)private:
439926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Type m_type;
440926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Attribute::Range m_range; // Always starts at zero.
441926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int m_baseOffset;
442926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DataVector m_data;
443926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    UChar m_orAllData;
444926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
445926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // For StartTag and EndTag
446926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool m_selfClosing;
447926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    AttributeList m_attributes;
448926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
449926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // A pointer into m_attributes used during lexing.
450926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Attribute* m_currentAttribute;
451926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
452926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // For DOCTYPE
453926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    OwnPtr<DoctypeData> m_doctypeData;
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
459