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