1e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block/*
2e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block * Copyright (C) 2008 Apple Inc. All Rights Reserved.
3e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block * Copyright (C) 2009 Torch Mobile, Inc. http://www.torchmobile.com/
4e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block * Copyright (C) 2010 Google, Inc. All Rights Reserved.
5e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block *
6e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block * Redistribution and use in source and binary forms, with or without
7e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block * modification, are permitted provided that the following conditions
8e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block * are met:
9e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block * 1. Redistributions of source code must retain the above copyright
10e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block *    notice, this list of conditions and the following disclaimer.
11e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block * 2. Redistributions in binary form must reproduce the above copyright
12e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block *    notice, this list of conditions and the following disclaimer in the
13e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block *    documentation and/or other materials provided with the distribution.
14e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block *
15e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
16e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
19e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block */
27e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
28e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include "config.h"
2906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "HTMLTokenizer.h"
30e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
3106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "HTMLEntityParser.h"
3206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "HTMLToken.h"
3368513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "HTMLTreeBuilder.h"
34e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include "HTMLNames.h"
35e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include "NotImplemented.h"
36ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#include <wtf/ASCIICType.h>
37e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include <wtf/CurrentTime.h>
38e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include <wtf/UnusedParam.h>
39f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include <wtf/text/AtomicString.h>
40e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include <wtf/text/CString.h>
41e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include <wtf/unicode/Unicode.h>
42e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
43e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockusing namespace WTF;
44e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
45e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blocknamespace WebCore {
46e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
47e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockusing namespace HTMLNames;
48e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
49ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockconst UChar HTMLTokenizer::InputStreamPreprocessor::endOfFileMarker = 0;
50ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
515af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkenamespace {
525af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
53e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockinline UChar toLowerCase(UChar cc)
54e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block{
55ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    ASSERT(isASCIIUpper(cc));
56e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    const int lowerCaseOffset = 0x20;
57e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    return cc + lowerCaseOffset;
58e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block}
59e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
60ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockinline bool isTokenizerWhitespace(UChar cc)
61ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
620617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    return cc == ' ' || cc == '\x0A' || cc == '\x09' || cc == '\x0C';
63ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
64ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
655af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkeinline void advanceStringAndASSERTIgnoringCase(SegmentedString& source, const char* expectedCharacters)
665af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
675af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    while (*expectedCharacters)
685af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        source.advanceAndASSERTIgnoringCase(*expectedCharacters++);
695af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
705af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monseninline void advanceStringAndASSERT(SegmentedString& source, const char* expectedCharacters)
725ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
735ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    while (*expectedCharacters)
745ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        source.advanceAndASSERT(*expectedCharacters++);
755ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
765ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
775af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkeinline bool vectorEqualsString(const Vector<UChar, 32>& vector, const String& string)
785af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
795af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (vector.size() != string.length())
805af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        return false;
815af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    const UChar* stringData = string.characters();
825af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    const UChar* vectorData = vector.data();
835af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    // FIXME: Is there a higher-level function we should be calling here?
845af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    return !memcmp(stringData, vectorData, vector.size() * sizeof(UChar));
855af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
865af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
8706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monseninline bool isEndTagBufferingState(HTMLTokenizer::State state)
885af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
8906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    switch (state) {
9006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case HTMLTokenizer::RCDATAEndTagOpenState:
9106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case HTMLTokenizer::RCDATAEndTagNameState:
9206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case HTMLTokenizer::RAWTEXTEndTagOpenState:
9306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case HTMLTokenizer::RAWTEXTEndTagNameState:
9406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case HTMLTokenizer::ScriptDataEndTagOpenState:
9506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case HTMLTokenizer::ScriptDataEndTagNameState:
9606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case HTMLTokenizer::ScriptDataEscapedEndTagOpenState:
9706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case HTMLTokenizer::ScriptDataEscapedEndTagNameState:
9806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return true;
9906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    default:
10006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return false;
10106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
1025af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
1035af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
1045af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
1055af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
10668513a70bcd92384395513322f1b801e7bf9c729Steve BlockHTMLTokenizer::HTMLTokenizer(bool usePreHTML5ParserQuirks)
107dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    : m_inputStreamPreprocessor(this)
10868513a70bcd92384395513322f1b801e7bf9c729Steve Block    , m_usePreHTML5ParserQuirks(usePreHTML5ParserQuirks)
109e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block{
110e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    reset();
111e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block}
112e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
11306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenHTMLTokenizer::~HTMLTokenizer()
114e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block{
115e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block}
116e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
11706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenvoid HTMLTokenizer::reset()
118e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block{
119e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    m_state = DataState;
120e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    m_token = 0;
121545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    m_lineNumber = 0;
1225af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    m_skipLeadingNewLineForListing = false;
123dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    m_forceNullCharacterReplacement = false;
1245ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_shouldAllowCDATA = false;
125e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    m_additionalAllowedCharacter = '\0';
126e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block}
127e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
12806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monseninline bool HTMLTokenizer::processEntity(SegmentedString& source)
1295af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
1305af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    bool notEnoughCharacters = false;
1315ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    Vector<UChar, 16> decodedEntity;
1325ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    bool success = consumeHTMLEntity(source, decodedEntity, notEnoughCharacters);
1335af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (notEnoughCharacters)
1345af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        return false;
1355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (!success) {
1365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        ASSERT(decodedEntity.isEmpty());
137ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        bufferCharacter('&');
1385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    } else {
1395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        Vector<UChar>::const_iterator iter = decodedEntity.begin();
1405ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        for (; iter != decodedEntity.end(); ++iter)
1415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            bufferCharacter(*iter);
1425ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    }
1435af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    return true;
1445af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
1455af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
146545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#if COMPILER(MSVC)
147545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch// We need to disable the "unreachable code" warning because we want to assert
148545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch// that some code points aren't reached in the state machine.
149545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#pragma warning(disable: 4702)
150545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#endif
151545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
152545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#define BEGIN_STATE(stateName) case stateName: stateName:
153545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#define END_STATE() ASSERT_NOT_REACHED(); break;
154545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
155545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch// We use this macro when the HTML5 spec says "reconsume the current input
156545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch// character in the <mumble> state."
157545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#define RECONSUME_IN(stateName)                                            \
158545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    do {                                                                   \
159545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        m_state = stateName;                                               \
160545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        goto stateName;                                                    \
161545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    } while (false)
162545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
163545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch// We use this macro when the HTML5 spec says "consume the next input
164545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch// character ... and switch to the <mumble> state."
165545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#define ADVANCE_TO(stateName)                                              \
166545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    do {                                                                   \
167545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        m_state = stateName;                                               \
168545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (!m_inputStreamPreprocessor.advance(source, m_lineNumber))      \
169f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            return haveBufferedCharacterToken();                           \
170545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        cc = m_inputStreamPreprocessor.nextInputCharacter();               \
171545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        goto stateName;                                                    \
172545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    } while (false)
173545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
174545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch// Sometimes there's more complicated logic in the spec that separates when
175545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch// we consume the next input character and when we switch to a particular
17668513a70bcd92384395513322f1b801e7bf9c729Steve Block// state. We handle those cases by advancing the source directly and using
177545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch// this macro to switch to the indicated state.
178545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#define SWITCH_TO(stateName)                                               \
179545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    do {                                                                   \
180545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        m_state = stateName;                                               \
18106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (source.isEmpty() || !m_inputStreamPreprocessor.peek(source, m_lineNumber)) \
182f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            return haveBufferedCharacterToken();                           \
183545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        cc = m_inputStreamPreprocessor.nextInputCharacter();               \
184545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        goto stateName;                                                    \
185545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    } while (false)
186545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
187ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
188ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockinline void HTMLTokenizer::saveEndTagNameIfNeeded()
189ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
190ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    ASSERT(m_token->type() != HTMLToken::Uninitialized);
191ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (m_token->type() == HTMLToken::StartTag)
192ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        m_appropriateEndTagName = m_token->name();
193ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
194ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
195ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block// We use this function when the HTML5 spec says "Emit the current <mumble>
196545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch// token. Switch to the <mumble> state."  We use the word "resume" instead of
197545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch// switch to indicate that this macro actually returns and that we'll end up
198545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch// in the state when we "resume" (i.e., are called again).
199ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool HTMLTokenizer::emitAndResumeIn(SegmentedString& source, State state)
200ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
201ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    m_state = state;
202ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    source.advance(m_lineNumber);
203ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    saveEndTagNameIfNeeded();
204ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    return true;
205ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
206545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
207ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block// Identical to emitAndResumeIn, except does not advance.
208ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool HTMLTokenizer::emitAndReconsumeIn(SegmentedString&, State state)
209ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
210ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    m_state = state;
211ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    saveEndTagNameIfNeeded();
212ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    return true;
213ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
214ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
215ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block// Used to emit the EndOfFile token.
216ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block// Check if we have buffered characters to emit first before emitting the EOF.
217ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool HTMLTokenizer::emitEndOfFile(SegmentedString& source)
218ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
219f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (haveBufferedCharacterToken())
220ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        return true;
221ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    m_state = DataState;
222ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    source.advance(m_lineNumber);
223ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    m_token->clear();
224ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    m_token->makeEndOfFile();
225ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    return true;
226ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
227ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
228ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool HTMLTokenizer::flushBufferedEndTag(SegmentedString& source)
229ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
230ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    ASSERT(m_token->type() == HTMLToken::Character || m_token->type() == HTMLToken::Uninitialized);
231ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    source.advance(m_lineNumber);
232ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (m_token->type() == HTMLToken::Character)
233ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        return true;
234ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    m_token->beginEndTag(m_bufferedEndTagName);
235ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    m_bufferedEndTagName.clear();
236ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    return false;
237ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
238545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
239545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#define FLUSH_AND_ADVANCE_TO(stateName)                                    \
240545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    do {                                                                   \
241545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        m_state = stateName;                                               \
242ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (flushBufferedEndTag(source))                                   \
243ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return true;                                                   \
244545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (source.isEmpty()                                               \
245545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            || !m_inputStreamPreprocessor.peek(source, m_lineNumber))      \
246f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            return haveBufferedCharacterToken();                           \
247545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        cc = m_inputStreamPreprocessor.nextInputCharacter();               \
248545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        goto stateName;                                                    \
249545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    } while (false)
250545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
251ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool HTMLTokenizer::flushEmitAndResumeIn(SegmentedString& source, State state)
252ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
253ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    m_state = state;
254ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    flushBufferedEndTag(source);
255ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    return true;
256ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
257545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
25806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenbool HTMLTokenizer::nextToken(SegmentedString& source, HTMLToken& token)
259e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block{
260e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    // If we have a token in progress, then we're supposed to be called back
261e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    // with the same token so we can finish it.
26206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    ASSERT(!m_token || m_token == &token || token.type() == HTMLToken::Uninitialized);
263e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    m_token = &token;
264e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
2655af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (!m_bufferedEndTagName.isEmpty() && !isEndTagBufferingState(m_state)) {
2665af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        // FIXME: This should call flushBufferedEndTag().
267e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        // We started an end tag during our last iteration.
268e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        m_token->beginEndTag(m_bufferedEndTagName);
269e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        m_bufferedEndTagName.clear();
270e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        if (m_state == DataState) {
271e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            // We're back in the data state, so we must be done with the tag.
272e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            return true;
273e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
274e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    }
275e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
276545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (source.isEmpty() || !m_inputStreamPreprocessor.peek(source, m_lineNumber))
277f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return haveBufferedCharacterToken();
278545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    UChar cc = m_inputStreamPreprocessor.nextInputCharacter();
279545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
2805af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#parsing-main-inbody
281545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // Note that this logic is different than the generic \r\n collapsing
28268513a70bcd92384395513322f1b801e7bf9c729Steve Block    // handled in the input stream preprocessor. This logic is here as an
283545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // "authoring convenience" so folks can write:
284545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    //
285545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // <pre>
286545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // lorem ipsum
287545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // lorem ipsum
288545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // </pre>
289545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    //
290545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // without getting an extra newline at the start of their <pre> element.
291545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (m_skipLeadingNewLineForListing) {
292545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        m_skipLeadingNewLineForListing = false;
293e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (cc == '\n') {
294e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            if (m_state == DataState)
295e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                ADVANCE_TO(DataState);
296e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            if (m_state == RCDATAState)
297e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                ADVANCE_TO(RCDATAState);
2985abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            // When parsing text/plain documents, we run the tokenizer in the
2995abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            // PLAINTEXTState and ignore m_skipLeadingNewLineForListing.
3005abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            ASSERT(m_state == PLAINTEXTState);
301e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        }
302545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
3035af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
304e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    // Source: http://www.whatwg.org/specs/web-apps/current-work/#tokenisation0
305545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    switch (m_state) {
306545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(DataState) {
307545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '&')
308545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(CharacterReferenceInDataState);
309545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '<') {
31006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            if (m_token->type() == HTMLToken::Character) {
311545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                // We have a bunch of character tokens queued up that we
312545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                // are emitting lazily here.
313545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                return true;
314545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            }
315545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(TagOpenState);
316ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker)
317ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitEndOfFile(source);
318ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        else {
319ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
320545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(DataState);
321e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
322545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
323545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
324545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
325545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(CharacterReferenceInDataState) {
326545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (!processEntity(source))
327f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            return haveBufferedCharacterToken();
328545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        SWITCH_TO(DataState);
329545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
330545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
331545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
332545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(RCDATAState) {
333545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '&')
334545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(CharacterReferenceInRCDATAState);
335545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '<')
336545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(RCDATALessThanSignState);
337ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        else if (cc == InputStreamPreprocessor::endOfFileMarker)
338ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitEndOfFile(source);
339545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else {
340ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
341545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(RCDATAState);
342e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
343545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
344545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
345545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
346545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(CharacterReferenceInRCDATAState) {
347545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (!processEntity(source))
348f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            return haveBufferedCharacterToken();
349545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        SWITCH_TO(RCDATAState);
350545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
351545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
352545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
353545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(RAWTEXTState) {
354545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '<')
355545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(RAWTEXTLessThanSignState);
356ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        else if (cc == InputStreamPreprocessor::endOfFileMarker)
357ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitEndOfFile(source);
358545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else {
359ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
360545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(RAWTEXTState);
361e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
362545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
363545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
364545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
365545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(ScriptDataState) {
366545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '<')
367545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataLessThanSignState);
368ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        else if (cc == InputStreamPreprocessor::endOfFileMarker)
369ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitEndOfFile(source);
370545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else {
371ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
372545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataState);
373e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
374545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
375545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
376545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
377545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(PLAINTEXTState) {
378ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (cc == InputStreamPreprocessor::endOfFileMarker)
379ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitEndOfFile(source);
380ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        else
381ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
382545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        ADVANCE_TO(PLAINTEXTState);
383545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
384545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
385545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
386545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(TagOpenState) {
387545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '!')
388545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(MarkupDeclarationOpenState);
389545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '/')
390545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(EndTagOpenState);
391ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        else if (isASCIIUpper(cc)) {
392545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->beginStartTag(toLowerCase(cc));
393545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(TagNameState);
394ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (isASCIILower(cc)) {
395545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->beginStartTag(cc);
396545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(TagNameState);
397545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else if (cc == '?') {
398ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
399545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            // The spec consumes the current character before switching
400545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            // to the bogus comment state, but it's easier to implement
401545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            // if we reconsume the current character.
402545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            RECONSUME_IN(BogusCommentState);
403545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
404ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
405ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('<');
406545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            RECONSUME_IN(DataState);
407e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
408545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
409545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
410545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
411545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(EndTagOpenState) {
412ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isASCIIUpper(cc)) {
413545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->beginEndTag(toLowerCase(cc));
414545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(TagNameState);
415ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (isASCIILower(cc)) {
416545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->beginEndTag(cc);
417545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(TagNameState);
418545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else if (cc == '>') {
419ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
420545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(DataState);
421ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
422ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
423ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('<');
424ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('/');
425ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            RECONSUME_IN(DataState);
426545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
427ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
428545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            RECONSUME_IN(BogusCommentState);
429e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
430545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
431545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
432545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
433545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(TagNameState) {
434ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isTokenizerWhitespace(cc))
435545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(BeforeAttributeNameState);
436545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '/')
437545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(SelfClosingStartTagState);
438545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '>')
439ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
44068513a70bcd92384395513322f1b801e7bf9c729Steve Block        else if (m_usePreHTML5ParserQuirks && cc == '<')
44168513a70bcd92384395513322f1b801e7bf9c729Steve Block            return emitAndReconsumeIn(source, DataState);
442ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        else if (isASCIIUpper(cc)) {
443545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToName(toLowerCase(cc));
444545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(TagNameState);
445ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } if (cc == InputStreamPreprocessor::endOfFileMarker) {
446ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
447ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            RECONSUME_IN(DataState);
448545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
449545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToName(cc);
450545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(TagNameState);
451545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        }
452545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
453545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
454545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
455545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(RCDATALessThanSignState) {
456545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '/') {
457545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.clear();
458545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ASSERT(m_bufferedEndTagName.isEmpty());
459545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(RCDATAEndTagOpenState);
460545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
461ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('<');
462545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            RECONSUME_IN(RCDATAState);
463e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
464545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
465545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
466545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
467545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(RCDATAEndTagOpenState) {
468ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isASCIIUpper(cc)) {
469545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.append(cc);
470545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            addToPossibleEndTag(toLowerCase(cc));
471545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(RCDATAEndTagNameState);
472ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (isASCIILower(cc)) {
473545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.append(cc);
474545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            addToPossibleEndTag(cc);
475545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(RCDATAEndTagNameState);
476545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
477ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('<');
478ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('/');
479545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            RECONSUME_IN(RCDATAState);
480e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
481545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
482545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
483545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
484545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(RCDATAEndTagNameState) {
485ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isASCIIUpper(cc)) {
486545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.append(cc);
487545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            addToPossibleEndTag(toLowerCase(cc));
488545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(RCDATAEndTagNameState);
489ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (isASCIILower(cc)) {
490545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.append(cc);
491545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            addToPossibleEndTag(cc);
492545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(RCDATAEndTagNameState);
493545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
494ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            if (isTokenizerWhitespace(cc)) {
495545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                if (isAppropriateEndTag())
496545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                    FLUSH_AND_ADVANCE_TO(BeforeAttributeNameState);
497545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            } else if (cc == '/') {
498545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                if (isAppropriateEndTag())
499545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                    FLUSH_AND_ADVANCE_TO(SelfClosingStartTagState);
500e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            } else if (cc == '>') {
501545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                if (isAppropriateEndTag())
502ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                    return flushEmitAndResumeIn(source, DataState);
503e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            }
504ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('<');
505ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('/');
506545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToCharacter(m_temporaryBuffer);
507545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_bufferedEndTagName.clear();
508545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            RECONSUME_IN(RCDATAState);
509e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
510545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
511545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
512545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
513545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(RAWTEXTLessThanSignState) {
514545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '/') {
515545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.clear();
516545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ASSERT(m_bufferedEndTagName.isEmpty());
517545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(RAWTEXTEndTagOpenState);
518545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
519ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('<');
520545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            RECONSUME_IN(RAWTEXTState);
521e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
522545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
523545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
524545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
525545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(RAWTEXTEndTagOpenState) {
526ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isASCIIUpper(cc)) {
527545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.append(cc);
528545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            addToPossibleEndTag(toLowerCase(cc));
529545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(RAWTEXTEndTagNameState);
530ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (isASCIILower(cc)) {
531545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.append(cc);
532545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            addToPossibleEndTag(cc);
533545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(RAWTEXTEndTagNameState);
534545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
535ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('<');
536ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('/');
537545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            RECONSUME_IN(RAWTEXTState);
538e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
539545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
540545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
541545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
542545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(RAWTEXTEndTagNameState) {
543ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isASCIIUpper(cc)) {
544545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.append(cc);
545545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            addToPossibleEndTag(toLowerCase(cc));
546545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(RAWTEXTEndTagNameState);
547ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (isASCIILower(cc)) {
548545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.append(cc);
549545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            addToPossibleEndTag(cc);
550545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(RAWTEXTEndTagNameState);
551545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
552ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            if (isTokenizerWhitespace(cc)) {
553545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                if (isAppropriateEndTag())
554545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                    FLUSH_AND_ADVANCE_TO(BeforeAttributeNameState);
555545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            } else if (cc == '/') {
556545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                if (isAppropriateEndTag())
557545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                    FLUSH_AND_ADVANCE_TO(SelfClosingStartTagState);
558545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            } else if (cc == '>') {
559545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                if (isAppropriateEndTag())
560ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                    return flushEmitAndResumeIn(source, DataState);
561e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            }
562ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('<');
563ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('/');
564545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToCharacter(m_temporaryBuffer);
565545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_bufferedEndTagName.clear();
566545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            RECONSUME_IN(RAWTEXTState);
567e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
568545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
569545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
570545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
571545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(ScriptDataLessThanSignState) {
572545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '/') {
573545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.clear();
574545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ASSERT(m_bufferedEndTagName.isEmpty());
575545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataEndTagOpenState);
576545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else if (cc == '!') {
577ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('<');
578ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('!');
579545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataEscapeStartState);
580545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
581ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('<');
582545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            RECONSUME_IN(ScriptDataState);
583e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
584545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
585545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
586545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
587545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(ScriptDataEndTagOpenState) {
588ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isASCIIUpper(cc)) {
589545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.append(cc);
590545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            addToPossibleEndTag(toLowerCase(cc));
591545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataEndTagNameState);
592ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (isASCIILower(cc)) {
593545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.append(cc);
594545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            addToPossibleEndTag(cc);
595545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataEndTagNameState);
596545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
597ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('<');
598ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('/');
599545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            RECONSUME_IN(ScriptDataState);
600e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
601545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
602545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
603545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
604545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(ScriptDataEndTagNameState) {
605ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isASCIIUpper(cc)) {
606545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.append(cc);
607545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            addToPossibleEndTag(toLowerCase(cc));
608545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataEndTagNameState);
609ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (isASCIILower(cc)) {
610545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.append(cc);
611545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            addToPossibleEndTag(cc);
612545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataEndTagNameState);
613545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
614ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            if (isTokenizerWhitespace(cc)) {
615545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                if (isAppropriateEndTag())
616545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                    FLUSH_AND_ADVANCE_TO(BeforeAttributeNameState);
617545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            } else if (cc == '/') {
618545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                if (isAppropriateEndTag())
619545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                    FLUSH_AND_ADVANCE_TO(SelfClosingStartTagState);
620545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            } else if (cc == '>') {
621545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                if (isAppropriateEndTag())
622ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                    return flushEmitAndResumeIn(source, DataState);
623e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            }
624ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('<');
625ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('/');
626545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToCharacter(m_temporaryBuffer);
627545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_bufferedEndTagName.clear();
628545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            RECONSUME_IN(ScriptDataState);
629e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
630545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
631545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
632545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
633545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(ScriptDataEscapeStartState) {
634545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '-') {
635ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
636545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataEscapeStartDashState);
637545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else
638545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            RECONSUME_IN(ScriptDataState);
639545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
640545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
641545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
642545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(ScriptDataEscapeStartDashState) {
643545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '-') {
644ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
645545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataEscapedDashDashState);
646545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else
647545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            RECONSUME_IN(ScriptDataState);
648545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
649545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
650545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
651545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(ScriptDataEscapedState) {
652545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '-') {
653ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
654545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataEscapedDashState);
655545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else if (cc == '<')
656545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataEscapedLessThanSignState);
657ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        else if (cc == InputStreamPreprocessor::endOfFileMarker) {
658ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
659ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            RECONSUME_IN(DataState);
660ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else {
661ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
662545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataEscapedState);
663e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
664545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
665545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
666545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
667545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(ScriptDataEscapedDashState) {
668545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '-') {
669ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
670545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataEscapedDashDashState);
671545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else if (cc == '<')
672545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataEscapedLessThanSignState);
673ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        else if (cc == InputStreamPreprocessor::endOfFileMarker) {
674ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
675ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            RECONSUME_IN(DataState);
676ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else {
677ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
678545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataEscapedState);
679e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
680545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
681545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
682545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
683545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(ScriptDataEscapedDashDashState) {
684545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '-') {
685ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
686545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataEscapedDashDashState);
687545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else if (cc == '<')
688545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataEscapedLessThanSignState);
689545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '>') {
690ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
691545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataState);
692ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } if (cc == InputStreamPreprocessor::endOfFileMarker) {
693ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
694ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            RECONSUME_IN(DataState);
695545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
696ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
697545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataEscapedState);
698e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
699545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
700545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
701545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
702545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(ScriptDataEscapedLessThanSignState) {
703545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '/') {
704545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.clear();
705545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ASSERT(m_bufferedEndTagName.isEmpty());
706545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataEscapedEndTagOpenState);
707ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (isASCIIUpper(cc)) {
708ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('<');
709ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
710545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.clear();
711545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.append(toLowerCase(cc));
712545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataDoubleEscapeStartState);
713ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (isASCIILower(cc)) {
714ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('<');
715ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
716545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.clear();
717545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.append(cc);
718545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataDoubleEscapeStartState);
719545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
720ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('<');
721545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            RECONSUME_IN(ScriptDataEscapedState);
722e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
723545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
724545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
725545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
726545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(ScriptDataEscapedEndTagOpenState) {
727ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isASCIIUpper(cc)) {
728545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.append(cc);
729545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            addToPossibleEndTag(toLowerCase(cc));
730545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataEscapedEndTagNameState);
731ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (isASCIILower(cc)) {
732545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.append(cc);
733545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            addToPossibleEndTag(cc);
734545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataEscapedEndTagNameState);
735545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
736ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('<');
737ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('/');
738545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            RECONSUME_IN(ScriptDataEscapedState);
739e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
740545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
741545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
742545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
743545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(ScriptDataEscapedEndTagNameState) {
744ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isASCIIUpper(cc)) {
745545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.append(cc);
746545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            addToPossibleEndTag(toLowerCase(cc));
747545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataEscapedEndTagNameState);
748ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (isASCIILower(cc)) {
749545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.append(cc);
750545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            addToPossibleEndTag(cc);
751545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataEscapedEndTagNameState);
752545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
753ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            if (isTokenizerWhitespace(cc)) {
754545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                if (isAppropriateEndTag())
755545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                    FLUSH_AND_ADVANCE_TO(BeforeAttributeNameState);
756545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            } else if (cc == '/') {
757545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                if (isAppropriateEndTag())
758545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                    FLUSH_AND_ADVANCE_TO(SelfClosingStartTagState);
759545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            } else if (cc == '>') {
760545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                if (isAppropriateEndTag())
761ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                    return flushEmitAndResumeIn(source, DataState);
762e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            }
763ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('<');
764ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter('/');
765545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToCharacter(m_temporaryBuffer);
766545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_bufferedEndTagName.clear();
767545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            RECONSUME_IN(ScriptDataEscapedState);
768e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
769545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
770545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
771545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
772545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(ScriptDataDoubleEscapeStartState) {
773ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isTokenizerWhitespace(cc) || cc == '/' || cc == '>') {
774ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
775545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            if (temporaryBufferIs(scriptTag.localName()))
776545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                ADVANCE_TO(ScriptDataDoubleEscapedState);
777e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            else
778545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                ADVANCE_TO(ScriptDataEscapedState);
779ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (isASCIIUpper(cc)) {
780ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
781545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.append(toLowerCase(cc));
782545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataDoubleEscapeStartState);
783ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (isASCIILower(cc)) {
784ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
785545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.append(cc);
786545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataDoubleEscapeStartState);
787545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else
788545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            RECONSUME_IN(ScriptDataEscapedState);
789545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
790545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
791545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
792545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(ScriptDataDoubleEscapedState) {
793545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '-') {
794ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
795545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataDoubleEscapedDashState);
796545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else if (cc == '<') {
797ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
798545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataDoubleEscapedLessThanSignState);
799ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
800ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
801ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            RECONSUME_IN(DataState);
802545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
803ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
804545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataDoubleEscapedState);
805e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
806545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
807545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
808545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
809545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(ScriptDataDoubleEscapedDashState) {
810545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '-') {
811ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
812545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataDoubleEscapedDashDashState);
813545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else if (cc == '<') {
814ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
815545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataDoubleEscapedLessThanSignState);
816ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
817ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
818ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            RECONSUME_IN(DataState);
819545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
820ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
821545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataDoubleEscapedState);
822e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
823545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
824545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
825545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
826545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(ScriptDataDoubleEscapedDashDashState) {
827545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '-') {
828ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
829545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataDoubleEscapedDashDashState);
830545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else if (cc == '<') {
831ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
832545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataDoubleEscapedLessThanSignState);
833545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else if (cc == '>') {
834ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
835545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataState);
836ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
837ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
838ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            RECONSUME_IN(DataState);
839545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
840ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
841545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataDoubleEscapedState);
842e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
843545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
844545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
845545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
846545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(ScriptDataDoubleEscapedLessThanSignState) {
847545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '/') {
848ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
849545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.clear();
850545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataDoubleEscapeEndState);
851545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else
852545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            RECONSUME_IN(ScriptDataDoubleEscapedState);
853545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
854545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
855545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
856545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(ScriptDataDoubleEscapeEndState) {
857ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isTokenizerWhitespace(cc) || cc == '/' || cc == '>') {
858ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
859545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            if (temporaryBufferIs(scriptTag.localName()))
860545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                ADVANCE_TO(ScriptDataEscapedState);
861545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            else
862545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                ADVANCE_TO(ScriptDataDoubleEscapedState);
863ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (isASCIIUpper(cc)) {
864ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
865545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.append(toLowerCase(cc));
866545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataDoubleEscapeEndState);
867ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (isASCIILower(cc)) {
868ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            bufferCharacter(cc);
869545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_temporaryBuffer.append(cc);
870545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(ScriptDataDoubleEscapeEndState);
871545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else
872545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            RECONSUME_IN(ScriptDataDoubleEscapedState);
873545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
874545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
875545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
876545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(BeforeAttributeNameState) {
877ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isTokenizerWhitespace(cc))
878545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(BeforeAttributeNameState);
879545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '/')
880545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(SelfClosingStartTagState);
881545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '>')
882ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
88368513a70bcd92384395513322f1b801e7bf9c729Steve Block        else if (m_usePreHTML5ParserQuirks && cc == '<')
88468513a70bcd92384395513322f1b801e7bf9c729Steve Block            return emitAndReconsumeIn(source, DataState);
885ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        else if (isASCIIUpper(cc)) {
886545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->addNewAttribute();
887f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            m_token->beginAttributeName(source.numberOfCharactersConsumed());
888545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToAttributeName(toLowerCase(cc));
889545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(AttributeNameState);
890ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
891ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
892ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            RECONSUME_IN(DataState);
893545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
894545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            if (cc == '"' || cc == '\'' || cc == '<' || cc == '=')
895ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                parseError();
896545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->addNewAttribute();
897f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            m_token->beginAttributeName(source.numberOfCharactersConsumed());
898545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToAttributeName(cc);
899545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(AttributeNameState);
900e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
901545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
902545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
903545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
904545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(AttributeNameState) {
905f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        if (isTokenizerWhitespace(cc)) {
906f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            m_token->endAttributeName(source.numberOfCharactersConsumed());
907545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(AfterAttributeNameState);
908f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        } else if (cc == '/') {
909f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            m_token->endAttributeName(source.numberOfCharactersConsumed());
910545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(SelfClosingStartTagState);
911f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        } else if (cc == '=') {
912f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            m_token->endAttributeName(source.numberOfCharactersConsumed());
913545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(BeforeAttributeValueState);
914f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        } else if (cc == '>') {
915f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            m_token->endAttributeName(source.numberOfCharactersConsumed());
916ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
91768513a70bcd92384395513322f1b801e7bf9c729Steve Block        } else if (m_usePreHTML5ParserQuirks && cc == '<') {
91868513a70bcd92384395513322f1b801e7bf9c729Steve Block            m_token->endAttributeName(source.numberOfCharactersConsumed());
91968513a70bcd92384395513322f1b801e7bf9c729Steve Block            return emitAndReconsumeIn(source, DataState);
920f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        } else if (isASCIIUpper(cc)) {
921545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToAttributeName(toLowerCase(cc));
922545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(AttributeNameState);
923ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
924ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
925f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            m_token->endAttributeName(source.numberOfCharactersConsumed());
926ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            RECONSUME_IN(DataState);
927545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
928545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            if (cc == '"' || cc == '\'' || cc == '<' || cc == '=')
929ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                parseError();
930545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToAttributeName(cc);
931545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(AttributeNameState);
932e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
933545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
934545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
935545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
936545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(AfterAttributeNameState) {
937ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isTokenizerWhitespace(cc))
938545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(AfterAttributeNameState);
939545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '/')
940545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(SelfClosingStartTagState);
941545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '=')
942545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(BeforeAttributeValueState);
943545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '>')
944ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
94568513a70bcd92384395513322f1b801e7bf9c729Steve Block        else if (m_usePreHTML5ParserQuirks && cc == '<')
94668513a70bcd92384395513322f1b801e7bf9c729Steve Block            return emitAndReconsumeIn(source, DataState);
947ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        else if (isASCIIUpper(cc)) {
948545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->addNewAttribute();
949f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            m_token->beginAttributeName(source.numberOfCharactersConsumed());
950545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToAttributeName(toLowerCase(cc));
951545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(AttributeNameState);
952ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
953ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
954ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            RECONSUME_IN(DataState);
955545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
956545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            if (cc == '"' || cc == '\'' || cc == '<')
957ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                parseError();
958545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->addNewAttribute();
959f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            m_token->beginAttributeName(source.numberOfCharactersConsumed());
960545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToAttributeName(cc);
961545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(AttributeNameState);
962e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
963545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
964545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
965545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
966545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(BeforeAttributeValueState) {
967ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isTokenizerWhitespace(cc))
968545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(BeforeAttributeValueState);
969f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        else if (cc == '"') {
970f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            m_token->beginAttributeValue(source.numberOfCharactersConsumed() + 1);
971545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(AttributeValueDoubleQuotedState);
972f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        } else if (cc == '&') {
973f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            m_token->beginAttributeValue(source.numberOfCharactersConsumed());
974545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            RECONSUME_IN(AttributeValueUnquotedState);
975f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        } else if (cc == '\'') {
976f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            m_token->beginAttributeValue(source.numberOfCharactersConsumed() + 1);
977545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(AttributeValueSingleQuotedState);
978f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        } else if (cc == '>') {
979ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
980ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
981ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
982ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
983ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            RECONSUME_IN(DataState);
984545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
985545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            if (cc == '<' || cc == '=' || cc == '`')
986ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                parseError();
987f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            m_token->beginAttributeValue(source.numberOfCharactersConsumed());
988545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToAttributeValue(cc);
989545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(AttributeValueUnquotedState);
990e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
991545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
992545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
993545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
994545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(AttributeValueDoubleQuotedState) {
995f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        if (cc == '"') {
996f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            m_token->endAttributeValue(source.numberOfCharactersConsumed());
997545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(AfterAttributeValueQuotedState);
998f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        } else if (cc == '&') {
999545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_additionalAllowedCharacter = '"';
1000545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(CharacterReferenceInAttributeValueState);
1001ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
1002ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1003f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            m_token->endAttributeValue(source.numberOfCharactersConsumed());
1004ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            RECONSUME_IN(DataState);
1005545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
1006545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToAttributeValue(cc);
1007545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(AttributeValueDoubleQuotedState);
1008545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        }
1009545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1010545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1011545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1012545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(AttributeValueSingleQuotedState) {
1013f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        if (cc == '\'') {
1014f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            m_token->endAttributeValue(source.numberOfCharactersConsumed());
1015545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(AfterAttributeValueQuotedState);
1016f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        } else if (cc == '&') {
1017545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_additionalAllowedCharacter = '\'';
1018545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(CharacterReferenceInAttributeValueState);
1019ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
1020ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1021f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            m_token->endAttributeValue(source.numberOfCharactersConsumed());
1022ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            RECONSUME_IN(DataState);
1023545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
1024545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToAttributeValue(cc);
1025545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(AttributeValueSingleQuotedState);
1026545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        }
1027545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1028545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1029545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1030545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(AttributeValueUnquotedState) {
1031f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        if (isTokenizerWhitespace(cc)) {
1032f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            m_token->endAttributeValue(source.numberOfCharactersConsumed());
1033545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(BeforeAttributeNameState);
1034f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        } else if (cc == '&') {
1035545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_additionalAllowedCharacter = '>';
1036545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(CharacterReferenceInAttributeValueState);
1037f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        } else if (cc == '>') {
1038f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            m_token->endAttributeValue(source.numberOfCharactersConsumed());
1039ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
1040f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
1041ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1042f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            m_token->endAttributeValue(source.numberOfCharactersConsumed());
1043ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            RECONSUME_IN(DataState);
1044ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else {
1045545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            if (cc == '"' || cc == '\'' || cc == '<' || cc == '=' || cc == '`')
1046ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                parseError();
1047545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToAttributeValue(cc);
1048545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(AttributeValueUnquotedState);
1049e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
1050545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1051545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1052545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1053545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(CharacterReferenceInAttributeValueState) {
1054545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        bool notEnoughCharacters = false;
10555ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        Vector<UChar, 16> decodedEntity;
10565ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        bool success = consumeHTMLEntity(source, decodedEntity, notEnoughCharacters, m_additionalAllowedCharacter);
1057545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (notEnoughCharacters)
1058f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            return haveBufferedCharacterToken();
10595ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        if (!success) {
10605ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            ASSERT(decodedEntity.isEmpty());
1061545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToAttributeValue('&');
10625ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        } else {
10635ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            Vector<UChar>::const_iterator iter = decodedEntity.begin();
10645ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            for (; iter != decodedEntity.end(); ++iter)
10655ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                m_token->appendToAttributeValue(*iter);
1066545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        }
1067545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        // We're supposed to switch back to the attribute value state that
106868513a70bcd92384395513322f1b801e7bf9c729Steve Block        // we were in when we were switched into this state. Rather than
1069545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        // keeping track of this explictly, we observe that the previous
1070545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        // state can be determined by m_additionalAllowedCharacter.
1071545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (m_additionalAllowedCharacter == '"')
1072545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            SWITCH_TO(AttributeValueDoubleQuotedState);
1073545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (m_additionalAllowedCharacter == '\'')
1074545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            SWITCH_TO(AttributeValueSingleQuotedState);
1075545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (m_additionalAllowedCharacter == '>')
1076545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            SWITCH_TO(AttributeValueUnquotedState);
1077545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else
1078545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ASSERT_NOT_REACHED();
1079545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1080545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1081545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1082545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(AfterAttributeValueQuotedState) {
1083ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isTokenizerWhitespace(cc))
1084545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(BeforeAttributeNameState);
1085545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '/')
1086545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(SelfClosingStartTagState);
1087545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '>')
1088ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
108968513a70bcd92384395513322f1b801e7bf9c729Steve Block        else if (m_usePreHTML5ParserQuirks && cc == '<')
109068513a70bcd92384395513322f1b801e7bf9c729Steve Block            return emitAndReconsumeIn(source, DataState);
1091ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        else if (cc == InputStreamPreprocessor::endOfFileMarker) {
1092ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1093ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            RECONSUME_IN(DataState);
1094ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else {
1095ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1096545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            RECONSUME_IN(BeforeAttributeNameState);
1097e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
1098545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1099545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1100545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1101545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(SelfClosingStartTagState) {
1102545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '>') {
1103e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            m_token->setSelfClosing();
1104ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
1105ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
1106ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1107ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            RECONSUME_IN(DataState);
1108545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
1109ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1110545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            RECONSUME_IN(BeforeAttributeNameState);
1111e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
1112545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1113545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1114545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1115545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(BogusCommentState) {
1116545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        m_token->beginComment();
1117ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        RECONSUME_IN(ContinueBogusCommentState);
1118ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
1119ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    END_STATE()
1120ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1121ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    BEGIN_STATE(ContinueBogusCommentState) {
1122ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (cc == '>')
1123ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
1124ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        else if (cc == InputStreamPreprocessor::endOfFileMarker)
1125ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndReconsumeIn(source, DataState);
1126ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        else {
1127545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToComment(cc);
1128ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            ADVANCE_TO(ContinueBogusCommentState);
1129545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        }
1130545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1131545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1132545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1133545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(MarkupDeclarationOpenState) {
1134545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        DEFINE_STATIC_LOCAL(String, dashDashString, ("--"));
1135545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        DEFINE_STATIC_LOCAL(String, doctypeString, ("doctype"));
11365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        DEFINE_STATIC_LOCAL(String, cdataString, ("[CDATA["));
1137545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '-') {
1138545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            SegmentedString::LookAheadResult result = source.lookAhead(dashDashString);
1139545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            if (result == SegmentedString::DidMatch) {
1140545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                source.advanceAndASSERT('-');
1141545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                source.advanceAndASSERT('-');
1142545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                m_token->beginComment();
1143545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                SWITCH_TO(CommentStartState);
1144545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            } else if (result == SegmentedString::NotEnoughCharacters)
1145f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                return haveBufferedCharacterToken();
1146545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else if (cc == 'D' || cc == 'd') {
1147545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            SegmentedString::LookAheadResult result = source.lookAheadIgnoringCase(doctypeString);
1148545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            if (result == SegmentedString::DidMatch) {
1149545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                advanceStringAndASSERTIgnoringCase(source, "doctype");
1150545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                SWITCH_TO(DOCTYPEState);
1151545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            } else if (result == SegmentedString::NotEnoughCharacters)
1152f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                return haveBufferedCharacterToken();
11535ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        } else if (cc == '[' && shouldAllowCDATA()) {
11545ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            SegmentedString::LookAheadResult result = source.lookAhead(cdataString);
11555ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            if (result == SegmentedString::DidMatch) {
11565ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                advanceStringAndASSERT(source, "[CDATA[");
11575ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                SWITCH_TO(CDATASectionState);
11585ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            } else if (result == SegmentedString::NotEnoughCharacters)
11595ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                return haveBufferedCharacterToken();
1160e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
1161ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        parseError();
1162545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        RECONSUME_IN(BogusCommentState);
1163545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1164545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1165545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1166545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(CommentStartState) {
1167545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '-')
1168545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(CommentStartDashState);
1169545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '>') {
1170ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1171ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
1172ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
1173ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1174ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndReconsumeIn(source, DataState);
1175545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
1176545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToComment(cc);
1177545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(CommentState);
1178e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
1179545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1180545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1181545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1182545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(CommentStartDashState) {
1183545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '-')
1184545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(CommentEndState);
1185545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '>') {
1186ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1187ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
1188ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
1189ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1190ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndReconsumeIn(source, DataState);
1191545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
1192545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToComment('-');
1193545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToComment(cc);
1194545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(CommentState);
1195e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
1196545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1197545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1198545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1199545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(CommentState) {
1200545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '-')
1201545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(CommentEndDashState);
1202ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        else if (cc == InputStreamPreprocessor::endOfFileMarker) {
1203ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1204ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndReconsumeIn(source, DataState);
1205ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else {
1206545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToComment(cc);
1207545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(CommentState);
1208545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        }
1209545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1210545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1211545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1212545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(CommentEndDashState) {
1213545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '-')
1214545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(CommentEndState);
1215ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        else if (cc == InputStreamPreprocessor::endOfFileMarker) {
1216ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1217ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndReconsumeIn(source, DataState);
1218ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else {
1219545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToComment('-');
1220545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToComment(cc);
1221545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(CommentState);
1222545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        }
1223545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1224545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1225545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1226545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(CommentEndState) {
1227545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '>')
1228ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
122968513a70bcd92384395513322f1b801e7bf9c729Steve Block        else if (cc == '!') {
1230ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1231545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(CommentEndBangState);
1232545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else if (cc == '-') {
1233ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1234545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToComment('-');
1235545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(CommentEndState);
1236ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
1237ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1238ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndReconsumeIn(source, DataState);
1239545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
1240ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1241545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToComment('-');
1242545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToComment('-');
1243545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToComment(cc);
1244545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(CommentState);
1245545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        }
1246545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1247545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1248545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1249545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(CommentEndBangState) {
1250545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '-') {
1251545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToComment('-');
1252545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToComment('-');
1253545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToComment('!');
1254545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(CommentEndDashState);
1255545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else if (cc == '>')
1256ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
1257ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        else if (cc == InputStreamPreprocessor::endOfFileMarker) {
1258ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1259ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndReconsumeIn(source, DataState);
1260ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else {
1261545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToComment('-');
1262545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToComment('-');
1263545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToComment('!');
1264545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToComment(cc);
1265545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(CommentState);
1266545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        }
1267545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1268545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1269545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1270545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(DOCTYPEState) {
1271ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isTokenizerWhitespace(cc))
1272545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(BeforeDOCTYPENameState);
1273ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        else if (cc == InputStreamPreprocessor::endOfFileMarker) {
1274ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1275ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            m_token->beginDOCTYPE();
1276ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            m_token->setForceQuirks();
1277ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndReconsumeIn(source, DataState);
1278ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else {
1279ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1280545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            RECONSUME_IN(BeforeDOCTYPENameState);
1281e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
1282545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1283545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1284545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1285545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(BeforeDOCTYPENameState) {
1286ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isTokenizerWhitespace(cc))
1287545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(BeforeDOCTYPENameState);
1288ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        else if (isASCIIUpper(cc)) {
1289545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->beginDOCTYPE(toLowerCase(cc));
1290545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(DOCTYPENameState);
1291545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else if (cc == '>') {
1292ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1293ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            m_token->beginDOCTYPE();
1294ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            m_token->setForceQuirks();
1295ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
1296ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
1297ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1298545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->beginDOCTYPE();
1299545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->setForceQuirks();
1300ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndReconsumeIn(source, DataState);
1301545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
1302545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->beginDOCTYPE(cc);
1303545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(DOCTYPENameState);
1304545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        }
1305545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1306545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1307545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1308545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(DOCTYPENameState) {
1309ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isTokenizerWhitespace(cc))
1310545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(AfterDOCTYPENameState);
1311545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '>')
1312ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
1313ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        else if (isASCIIUpper(cc)) {
1314545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToName(toLowerCase(cc));
1315545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(DOCTYPENameState);
1316ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
1317ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1318ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            m_token->setForceQuirks();
1319ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndReconsumeIn(source, DataState);
1320545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
1321545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToName(cc);
1322545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(DOCTYPENameState);
1323545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        }
1324545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1325545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1326545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1327545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(AfterDOCTYPENameState) {
1328ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isTokenizerWhitespace(cc))
1329545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(AfterDOCTYPENameState);
1330545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '>')
1331ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
1332ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        else if (cc == InputStreamPreprocessor::endOfFileMarker) {
1333ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1334ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            m_token->setForceQuirks();
1335ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndReconsumeIn(source, DataState);
1336ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else {
1337545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            DEFINE_STATIC_LOCAL(String, publicString, ("public"));
1338545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            DEFINE_STATIC_LOCAL(String, systemString, ("system"));
1339545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            if (cc == 'P' || cc == 'p') {
1340545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                SegmentedString::LookAheadResult result = source.lookAheadIgnoringCase(publicString);
1341e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                if (result == SegmentedString::DidMatch) {
1342545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                    advanceStringAndASSERTIgnoringCase(source, "public");
1343545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                    SWITCH_TO(AfterDOCTYPEPublicKeywordState);
1344e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                } else if (result == SegmentedString::NotEnoughCharacters)
1345f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                    return haveBufferedCharacterToken();
1346545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            } else if (cc == 'S' || cc == 's') {
1347545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                SegmentedString::LookAheadResult result = source.lookAheadIgnoringCase(systemString);
13485af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke                if (result == SegmentedString::DidMatch) {
1349545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                    advanceStringAndASSERTIgnoringCase(source, "system");
1350545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                    SWITCH_TO(AfterDOCTYPESystemKeywordState);
13515af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke                } else if (result == SegmentedString::NotEnoughCharacters)
1352f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                    return haveBufferedCharacterToken();
1353e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            }
1354ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1355545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->setForceQuirks();
1356545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(BogusDOCTYPEState);
1357e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
1358545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1359545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1360545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1361545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(AfterDOCTYPEPublicKeywordState) {
1362ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isTokenizerWhitespace(cc))
1363545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(BeforeDOCTYPEPublicIdentifierState);
1364545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '"') {
1365ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1366545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->setPublicIdentifierToEmptyString();
1367545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(DOCTYPEPublicIdentifierDoubleQuotedState);
1368545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else if (cc == '\'') {
1369ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1370545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->setPublicIdentifierToEmptyString();
1371545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(DOCTYPEPublicIdentifierSingleQuotedState);
1372545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else if (cc == '>') {
1373ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1374ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            m_token->setForceQuirks();
1375ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
1376ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
1377ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1378545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->setForceQuirks();
1379ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndReconsumeIn(source, DataState);
1380545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
1381ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1382545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->setForceQuirks();
1383545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(BogusDOCTYPEState);
1384e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
1385545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1386545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1387545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1388545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(BeforeDOCTYPEPublicIdentifierState) {
1389ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isTokenizerWhitespace(cc))
1390545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(BeforeDOCTYPEPublicIdentifierState);
1391545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '"') {
1392545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->setPublicIdentifierToEmptyString();
1393545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(DOCTYPEPublicIdentifierDoubleQuotedState);
1394545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else if (cc == '\'') {
1395545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->setPublicIdentifierToEmptyString();
1396545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(DOCTYPEPublicIdentifierSingleQuotedState);
1397545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else if (cc == '>') {
1398ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1399545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->setForceQuirks();
1400ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
1401ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
1402ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1403ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            m_token->setForceQuirks();
1404ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndReconsumeIn(source, DataState);
1405545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
1406ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1407545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->setForceQuirks();
1408545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(BogusDOCTYPEState);
1409e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
1410545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1411545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1412545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1413545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(DOCTYPEPublicIdentifierDoubleQuotedState) {
1414545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '"')
1415545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(AfterDOCTYPEPublicIdentifierState);
1416545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '>') {
1417ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1418545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->setForceQuirks();
1419ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
1420ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
1421ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1422ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            m_token->setForceQuirks();
1423ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndReconsumeIn(source, DataState);
1424545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
1425545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToPublicIdentifier(cc);
1426545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(DOCTYPEPublicIdentifierDoubleQuotedState);
1427e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
1428545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1429545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1430545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1431545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(DOCTYPEPublicIdentifierSingleQuotedState) {
1432545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '\'')
1433545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(AfterDOCTYPEPublicIdentifierState);
1434545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '>') {
1435ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1436ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            m_token->setForceQuirks();
1437ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
1438ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
1439ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1440545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->setForceQuirks();
1441ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndReconsumeIn(source, DataState);
1442545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
1443545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToPublicIdentifier(cc);
1444545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(DOCTYPEPublicIdentifierSingleQuotedState);
1445e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
1446545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1447545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1448545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1449545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(AfterDOCTYPEPublicIdentifierState) {
1450ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isTokenizerWhitespace(cc))
1451545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(BetweenDOCTYPEPublicAndSystemIdentifiersState);
1452545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '>')
1453ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
1454545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '"') {
1455ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
145606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            m_token->setSystemIdentifierToEmptyString();
1457545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(DOCTYPESystemIdentifierDoubleQuotedState);
1458545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else if (cc == '\'') {
1459ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
146006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            m_token->setSystemIdentifierToEmptyString();
1461545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(DOCTYPESystemIdentifierSingleQuotedState);
1462ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
1463ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1464ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            m_token->setForceQuirks();
1465ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndReconsumeIn(source, DataState);
1466545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
1467ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1468545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->setForceQuirks();
1469545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(BogusDOCTYPEState);
1470e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
1471545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1472545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1473545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1474545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(BetweenDOCTYPEPublicAndSystemIdentifiersState) {
1475ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isTokenizerWhitespace(cc))
1476545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(BetweenDOCTYPEPublicAndSystemIdentifiersState);
1477545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '>')
1478ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
1479545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '"') {
1480545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->setSystemIdentifierToEmptyString();
1481545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(DOCTYPESystemIdentifierDoubleQuotedState);
1482545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else if (cc == '\'') {
1483545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->setSystemIdentifierToEmptyString();
1484545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(DOCTYPESystemIdentifierSingleQuotedState);
1485ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
1486ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1487ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            m_token->setForceQuirks();
1488ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndReconsumeIn(source, DataState);
1489545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
1490ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1491545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->setForceQuirks();
1492545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(BogusDOCTYPEState);
1493e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
1494545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1495545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1496545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1497545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(AfterDOCTYPESystemKeywordState) {
1498ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isTokenizerWhitespace(cc))
1499545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(BeforeDOCTYPESystemIdentifierState);
1500545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '"') {
1501ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1502545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->setSystemIdentifierToEmptyString();
1503545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(DOCTYPESystemIdentifierDoubleQuotedState);
1504545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else if (cc == '\'') {
1505ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1506545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->setSystemIdentifierToEmptyString();
1507545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(DOCTYPESystemIdentifierSingleQuotedState);
1508545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else if (cc == '>') {
1509ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1510ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            m_token->setForceQuirks();
1511ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
1512ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
1513ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1514545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->setForceQuirks();
1515ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndReconsumeIn(source, DataState);
1516545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
1517ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1518545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->setForceQuirks();
1519545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(BogusDOCTYPEState);
1520e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
1521545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1522545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1523545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1524545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(BeforeDOCTYPESystemIdentifierState) {
1525ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isTokenizerWhitespace(cc))
1526545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(BeforeDOCTYPESystemIdentifierState);
1527545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '"') {
1528545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->setSystemIdentifierToEmptyString();
1529545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(DOCTYPESystemIdentifierDoubleQuotedState);
1530545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else if (cc == '\'') {
1531545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->setSystemIdentifierToEmptyString();
1532545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(DOCTYPESystemIdentifierSingleQuotedState);
1533545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else if (cc == '>') {
1534ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1535ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            m_token->setForceQuirks();
1536ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
1537ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
1538ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1539545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->setForceQuirks();
1540ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndReconsumeIn(source, DataState);
1541545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
1542ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1543545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->setForceQuirks();
1544545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(BogusDOCTYPEState);
1545e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
1546545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1547545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1548545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1549545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(DOCTYPESystemIdentifierDoubleQuotedState) {
1550545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '"')
1551545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(AfterDOCTYPESystemIdentifierState);
1552545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '>') {
1553ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1554545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->setForceQuirks();
1555ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
1556ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
1557ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1558ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            m_token->setForceQuirks();
1559ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndReconsumeIn(source, DataState);
1560545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
1561545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToSystemIdentifier(cc);
1562545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(DOCTYPESystemIdentifierDoubleQuotedState);
1563e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
1564545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1565545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1566545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1567545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(DOCTYPESystemIdentifierSingleQuotedState) {
1568545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '\'')
1569545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(AfterDOCTYPESystemIdentifierState);
1570545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '>') {
1571ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1572545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->setForceQuirks();
1573ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
1574ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else if (cc == InputStreamPreprocessor::endOfFileMarker) {
1575ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1576ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            m_token->setForceQuirks();
1577ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndReconsumeIn(source, DataState);
1578545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else {
1579545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_token->appendToSystemIdentifier(cc);
1580545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(DOCTYPESystemIdentifierSingleQuotedState);
1581e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
1582545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1583545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1584545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1585545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(AfterDOCTYPESystemIdentifierState) {
1586ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (isTokenizerWhitespace(cc))
1587545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(AfterDOCTYPESystemIdentifierState);
1588545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        else if (cc == '>')
1589ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
1590ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        else if (cc == InputStreamPreprocessor::endOfFileMarker) {
1591ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1592ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            m_token->setForceQuirks();
1593ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndReconsumeIn(source, DataState);
1594ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        } else {
1595ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            parseError();
1596545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            ADVANCE_TO(BogusDOCTYPEState);
1597e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
1598545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1599545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1600545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1601545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(BogusDOCTYPEState) {
1602545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (cc == '>')
1603ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndResumeIn(source, DataState);
1604ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        else if (cc == InputStreamPreprocessor::endOfFileMarker)
1605ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return emitAndReconsumeIn(source, DataState);
1606545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        ADVANCE_TO(BogusDOCTYPEState);
1607545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1608545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1609545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1610545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    BEGIN_STATE(CDATASectionState) {
16115ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        if (cc == ']')
16125ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            ADVANCE_TO(CDATASectionRightSquareBracketState);
16135ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        else if (cc == InputStreamPreprocessor::endOfFileMarker)
16145ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            RECONSUME_IN(DataState);
16155ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        else {
16165ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            bufferCharacter(cc);
16175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            ADVANCE_TO(CDATASectionState);
16185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        }
16195ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    }
16205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    END_STATE()
16215ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
16225ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    BEGIN_STATE(CDATASectionRightSquareBracketState) {
16235ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        if (cc == ']')
16245ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            ADVANCE_TO(CDATASectionDoubleRightSquareBracketState);
16255ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        else {
16265ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            bufferCharacter(']');
16275ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            RECONSUME_IN(CDATASectionState);
16285ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        }
16295ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    }
16305ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
16315ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    BEGIN_STATE(CDATASectionDoubleRightSquareBracketState) {
16325ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        if (cc == '>')
16335ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            ADVANCE_TO(DataState);
16345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        else {
16355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            bufferCharacter(']');
16365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            bufferCharacter(']');
16375ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            RECONSUME_IN(CDATASectionState);
16385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        }
1639e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    }
1640545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    END_STATE()
1641545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1642545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
1643545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1644545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    ASSERT_NOT_REACHED();
1645545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return false;
1646e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block}
1647e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
164868513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid HTMLTokenizer::updateStateFor(const AtomicString& tagName, Frame* frame)
164968513a70bcd92384395513322f1b801e7bf9c729Steve Block{
165068513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (tagName == textareaTag || tagName == titleTag)
165168513a70bcd92384395513322f1b801e7bf9c729Steve Block        setState(RCDATAState);
165268513a70bcd92384395513322f1b801e7bf9c729Steve Block    else if (tagName == plaintextTag)
165368513a70bcd92384395513322f1b801e7bf9c729Steve Block        setState(PLAINTEXTState);
165468513a70bcd92384395513322f1b801e7bf9c729Steve Block    else if (tagName == scriptTag)
165568513a70bcd92384395513322f1b801e7bf9c729Steve Block        setState(ScriptDataState);
165668513a70bcd92384395513322f1b801e7bf9c729Steve Block    else if (tagName == styleTag
165768513a70bcd92384395513322f1b801e7bf9c729Steve Block        || tagName == iframeTag
165868513a70bcd92384395513322f1b801e7bf9c729Steve Block        || tagName == xmpTag
165968513a70bcd92384395513322f1b801e7bf9c729Steve Block        || (tagName == noembedTag && HTMLTreeBuilder::pluginsEnabled(frame))
166068513a70bcd92384395513322f1b801e7bf9c729Steve Block        || tagName == noframesTag
166168513a70bcd92384395513322f1b801e7bf9c729Steve Block        || (tagName == noscriptTag && HTMLTreeBuilder::scriptEnabled(frame)))
166268513a70bcd92384395513322f1b801e7bf9c729Steve Block        setState(RAWTEXTState);
166368513a70bcd92384395513322f1b801e7bf9c729Steve Block}
166468513a70bcd92384395513322f1b801e7bf9c729Steve Block
166506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monseninline bool HTMLTokenizer::temporaryBufferIs(const String& expectedString)
1666e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block{
16675af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    return vectorEqualsString(m_temporaryBuffer, expectedString);
16685af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
16695af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
167006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monseninline void HTMLTokenizer::addToPossibleEndTag(UChar cc)
16715af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
16725af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    ASSERT(isEndTagBufferingState(m_state));
16735af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    m_bufferedEndTagName.append(cc);
1674e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block}
1675e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
167606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monseninline bool HTMLTokenizer::isAppropriateEndTag()
1677e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block{
1678545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return m_bufferedEndTagName == m_appropriateEndTagName;
1679e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block}
1680e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
1681ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockinline void HTMLTokenizer::bufferCharacter(UChar character)
1682e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block{
1683ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    ASSERT(character != InputStreamPreprocessor::endOfFileMarker);
16840617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    m_token->ensureIsCharacterToken();
1685e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    m_token->appendToCharacter(character);
1686e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block}
1687e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
1688ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockinline void HTMLTokenizer::parseError()
1689e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block{
1690e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    notImplemented();
1691e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block}
1692e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
1693f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickinline bool HTMLTokenizer::haveBufferedCharacterToken()
1694e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block{
1695f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    return m_token->type() == HTMLToken::Character;
1696e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block}
1697e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
1698e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block}
1699