提交 1bceb35c 编写于 作者: A Adam Barth

Remove ScriptData* states

In the new parsing.md spec, we parse <script> the same way as <style> so we
don't need all these tokenizer states.

R=eseidel@chromium.org

Review URL: https://codereview.chromium.org/678913002
上级 2e40b826
......@@ -113,22 +113,11 @@ bool BackgroundHTMLParser::updateTokenizerState(const CompactHTMLToken& token)
{
if (token.type() == HTMLToken::StartTag) {
const String& tagName = token.data();
// FIXME: This is just a copy of Tokenizer::updateStateFor which uses threadSafeMatches.
if (threadSafeMatch(tagName, HTMLNames::scriptTag))
m_tokenizer->setState(HTMLTokenizer::ScriptDataState);
else if (threadSafeMatch(tagName, HTMLNames::styleTag))
if (threadSafeMatch(tagName, HTMLNames::scriptTag) || threadSafeMatch(tagName, HTMLNames::styleTag))
m_tokenizer->setState(HTMLTokenizer::RAWTEXTState);
}
if (token.type() == HTMLToken::EndTag) {
const String& tagName = token.data();
if (threadSafeMatch(tagName, HTMLNames::scriptTag)) {
m_tokenizer->setState(HTMLTokenizer::DataState);
return false;
}
}
return true;
return token.type() != HTMLToken::EndTag || !threadSafeMatch(token.data(), HTMLNames::scriptTag);
}
void BackgroundHTMLParser::pumpTokenizer()
......
......@@ -86,10 +86,6 @@ static inline bool isEndTagBufferingState(HTMLTokenizer::State state)
switch (state) {
case HTMLTokenizer::RAWTEXTEndTagOpenState:
case HTMLTokenizer::RAWTEXTEndTagNameState:
case HTMLTokenizer::ScriptDataEndTagOpenState:
case HTMLTokenizer::ScriptDataEndTagNameState:
case HTMLTokenizer::ScriptDataEscapedEndTagOpenState:
case HTMLTokenizer::ScriptDataEscapedEndTagNameState:
return true;
default:
return false;
......@@ -231,18 +227,6 @@ bool HTMLTokenizer::nextToken(SegmentedString& source, HTMLToken& token)
}
END_STATE()
HTML_BEGIN_STATE(ScriptDataState) {
if (cc == '<')
HTML_ADVANCE_TO(ScriptDataLessThanSignState);
else if (cc == kEndOfFileMarker)
return emitEndOfFile(source);
else {
bufferCharacter(cc);
HTML_ADVANCE_TO(ScriptDataState);
}
}
END_STATE()
HTML_BEGIN_STATE(TagOpenState) {
if (cc == '!')
HTML_ADVANCE_TO(MarkupDeclarationOpenState);
......@@ -377,325 +361,6 @@ bool HTMLTokenizer::nextToken(SegmentedString& source, HTMLToken& token)
}
END_STATE()
HTML_BEGIN_STATE(ScriptDataLessThanSignState) {
if (cc == '/') {
m_temporaryBuffer.clear();
ASSERT(m_bufferedEndTagName.isEmpty());
HTML_ADVANCE_TO(ScriptDataEndTagOpenState);
} else if (cc == '!') {
bufferCharacter('<');
bufferCharacter('!');
HTML_ADVANCE_TO(ScriptDataEscapeStartState);
} else {
bufferCharacter('<');
HTML_RECONSUME_IN(ScriptDataState);
}
}
END_STATE()
HTML_BEGIN_STATE(ScriptDataEndTagOpenState) {
if (isASCIIUpper(cc)) {
m_temporaryBuffer.append(static_cast<LChar>(cc));
addToPossibleEndTag(static_cast<LChar>(toLowerCase(cc)));
HTML_ADVANCE_TO(ScriptDataEndTagNameState);
} else if (isASCIILower(cc)) {
m_temporaryBuffer.append(static_cast<LChar>(cc));
addToPossibleEndTag(static_cast<LChar>(cc));
HTML_ADVANCE_TO(ScriptDataEndTagNameState);
} else {
bufferCharacter('<');
bufferCharacter('/');
HTML_RECONSUME_IN(ScriptDataState);
}
}
END_STATE()
HTML_BEGIN_STATE(ScriptDataEndTagNameState) {
if (isASCIIUpper(cc)) {
m_temporaryBuffer.append(static_cast<LChar>(cc));
addToPossibleEndTag(static_cast<LChar>(toLowerCase(cc)));
HTML_ADVANCE_TO(ScriptDataEndTagNameState);
} else if (isASCIILower(cc)) {
m_temporaryBuffer.append(static_cast<LChar>(cc));
addToPossibleEndTag(static_cast<LChar>(cc));
HTML_ADVANCE_TO(ScriptDataEndTagNameState);
} else {
if (isTokenizerWhitespace(cc)) {
if (isAppropriateEndTag()) {
m_temporaryBuffer.append(static_cast<LChar>(cc));
FLUSH_AND_ADVANCE_TO(BeforeAttributeNameState);
}
} else if (cc == '/') {
if (isAppropriateEndTag()) {
m_temporaryBuffer.append(static_cast<LChar>(cc));
FLUSH_AND_ADVANCE_TO(SelfClosingStartTagState);
}
} else if (cc == '>') {
if (isAppropriateEndTag()) {
m_temporaryBuffer.append(static_cast<LChar>(cc));
return flushEmitAndResumeIn(source, HTMLTokenizer::DataState);
}
}
bufferCharacter('<');
bufferCharacter('/');
m_token->appendToCharacter(m_temporaryBuffer);
m_bufferedEndTagName.clear();
m_temporaryBuffer.clear();
HTML_RECONSUME_IN(ScriptDataState);
}
}
END_STATE()
HTML_BEGIN_STATE(ScriptDataEscapeStartState) {
if (cc == '-') {
bufferCharacter(cc);
HTML_ADVANCE_TO(ScriptDataEscapeStartDashState);
} else
HTML_RECONSUME_IN(ScriptDataState);
}
END_STATE()
HTML_BEGIN_STATE(ScriptDataEscapeStartDashState) {
if (cc == '-') {
bufferCharacter(cc);
HTML_ADVANCE_TO(ScriptDataEscapedDashDashState);
} else
HTML_RECONSUME_IN(ScriptDataState);
}
END_STATE()
HTML_BEGIN_STATE(ScriptDataEscapedState) {
if (cc == '-') {
bufferCharacter(cc);
HTML_ADVANCE_TO(ScriptDataEscapedDashState);
} else if (cc == '<')
HTML_ADVANCE_TO(ScriptDataEscapedLessThanSignState);
else if (cc == kEndOfFileMarker) {
parseError();
HTML_RECONSUME_IN(DataState);
} else {
bufferCharacter(cc);
HTML_ADVANCE_TO(ScriptDataEscapedState);
}
}
END_STATE()
HTML_BEGIN_STATE(ScriptDataEscapedDashState) {
if (cc == '-') {
bufferCharacter(cc);
HTML_ADVANCE_TO(ScriptDataEscapedDashDashState);
} else if (cc == '<')
HTML_ADVANCE_TO(ScriptDataEscapedLessThanSignState);
else if (cc == kEndOfFileMarker) {
parseError();
HTML_RECONSUME_IN(DataState);
} else {
bufferCharacter(cc);
HTML_ADVANCE_TO(ScriptDataEscapedState);
}
}
END_STATE()
HTML_BEGIN_STATE(ScriptDataEscapedDashDashState) {
if (cc == '-') {
bufferCharacter(cc);
HTML_ADVANCE_TO(ScriptDataEscapedDashDashState);
} else if (cc == '<')
HTML_ADVANCE_TO(ScriptDataEscapedLessThanSignState);
else if (cc == '>') {
bufferCharacter(cc);
HTML_ADVANCE_TO(ScriptDataState);
} else if (cc == kEndOfFileMarker) {
parseError();
HTML_RECONSUME_IN(DataState);
} else {
bufferCharacter(cc);
HTML_ADVANCE_TO(ScriptDataEscapedState);
}
}
END_STATE()
HTML_BEGIN_STATE(ScriptDataEscapedLessThanSignState) {
if (cc == '/') {
m_temporaryBuffer.clear();
ASSERT(m_bufferedEndTagName.isEmpty());
HTML_ADVANCE_TO(ScriptDataEscapedEndTagOpenState);
} else if (isASCIIUpper(cc)) {
bufferCharacter('<');
bufferCharacter(cc);
m_temporaryBuffer.clear();
m_temporaryBuffer.append(toLowerCase(cc));
HTML_ADVANCE_TO(ScriptDataDoubleEscapeStartState);
} else if (isASCIILower(cc)) {
bufferCharacter('<');
bufferCharacter(cc);
m_temporaryBuffer.clear();
m_temporaryBuffer.append(static_cast<LChar>(cc));
HTML_ADVANCE_TO(ScriptDataDoubleEscapeStartState);
} else {
bufferCharacter('<');
HTML_RECONSUME_IN(ScriptDataEscapedState);
}
}
END_STATE()
HTML_BEGIN_STATE(ScriptDataEscapedEndTagOpenState) {
if (isASCIIUpper(cc)) {
m_temporaryBuffer.append(static_cast<LChar>(cc));
addToPossibleEndTag(static_cast<LChar>(toLowerCase(cc)));
HTML_ADVANCE_TO(ScriptDataEscapedEndTagNameState);
} else if (isASCIILower(cc)) {
m_temporaryBuffer.append(static_cast<LChar>(cc));
addToPossibleEndTag(static_cast<LChar>(cc));
HTML_ADVANCE_TO(ScriptDataEscapedEndTagNameState);
} else {
bufferCharacter('<');
bufferCharacter('/');
HTML_RECONSUME_IN(ScriptDataEscapedState);
}
}
END_STATE()
HTML_BEGIN_STATE(ScriptDataEscapedEndTagNameState) {
if (isASCIIUpper(cc)) {
m_temporaryBuffer.append(static_cast<LChar>(cc));
addToPossibleEndTag(static_cast<LChar>(toLowerCase(cc)));
HTML_ADVANCE_TO(ScriptDataEscapedEndTagNameState);
} else if (isASCIILower(cc)) {
m_temporaryBuffer.append(static_cast<LChar>(cc));
addToPossibleEndTag(static_cast<LChar>(cc));
HTML_ADVANCE_TO(ScriptDataEscapedEndTagNameState);
} else {
if (isTokenizerWhitespace(cc)) {
if (isAppropriateEndTag()) {
m_temporaryBuffer.append(static_cast<LChar>(cc));
FLUSH_AND_ADVANCE_TO(BeforeAttributeNameState);
}
} else if (cc == '/') {
if (isAppropriateEndTag()) {
m_temporaryBuffer.append(static_cast<LChar>(cc));
FLUSH_AND_ADVANCE_TO(SelfClosingStartTagState);
}
} else if (cc == '>') {
if (isAppropriateEndTag()) {
m_temporaryBuffer.append(static_cast<LChar>(cc));
return flushEmitAndResumeIn(source, HTMLTokenizer::DataState);
}
}
bufferCharacter('<');
bufferCharacter('/');
m_token->appendToCharacter(m_temporaryBuffer);
m_bufferedEndTagName.clear();
m_temporaryBuffer.clear();
HTML_RECONSUME_IN(ScriptDataEscapedState);
}
}
END_STATE()
HTML_BEGIN_STATE(ScriptDataDoubleEscapeStartState) {
if (isTokenizerWhitespace(cc) || cc == '/' || cc == '>') {
bufferCharacter(cc);
if (temporaryBufferIs(HTMLNames::scriptTag.localName()))
HTML_ADVANCE_TO(ScriptDataDoubleEscapedState);
else
HTML_ADVANCE_TO(ScriptDataEscapedState);
} else if (isASCIIUpper(cc)) {
bufferCharacter(cc);
m_temporaryBuffer.append(toLowerCase(cc));
HTML_ADVANCE_TO(ScriptDataDoubleEscapeStartState);
} else if (isASCIILower(cc)) {
bufferCharacter(cc);
m_temporaryBuffer.append(static_cast<LChar>(cc));
HTML_ADVANCE_TO(ScriptDataDoubleEscapeStartState);
} else
HTML_RECONSUME_IN(ScriptDataEscapedState);
}
END_STATE()
HTML_BEGIN_STATE(ScriptDataDoubleEscapedState) {
if (cc == '-') {
bufferCharacter(cc);
HTML_ADVANCE_TO(ScriptDataDoubleEscapedDashState);
} else if (cc == '<') {
bufferCharacter(cc);
HTML_ADVANCE_TO(ScriptDataDoubleEscapedLessThanSignState);
} else if (cc == kEndOfFileMarker) {
parseError();
HTML_RECONSUME_IN(DataState);
} else {
bufferCharacter(cc);
HTML_ADVANCE_TO(ScriptDataDoubleEscapedState);
}
}
END_STATE()
HTML_BEGIN_STATE(ScriptDataDoubleEscapedDashState) {
if (cc == '-') {
bufferCharacter(cc);
HTML_ADVANCE_TO(ScriptDataDoubleEscapedDashDashState);
} else if (cc == '<') {
bufferCharacter(cc);
HTML_ADVANCE_TO(ScriptDataDoubleEscapedLessThanSignState);
} else if (cc == kEndOfFileMarker) {
parseError();
HTML_RECONSUME_IN(DataState);
} else {
bufferCharacter(cc);
HTML_ADVANCE_TO(ScriptDataDoubleEscapedState);
}
}
END_STATE()
HTML_BEGIN_STATE(ScriptDataDoubleEscapedDashDashState) {
if (cc == '-') {
bufferCharacter(cc);
HTML_ADVANCE_TO(ScriptDataDoubleEscapedDashDashState);
} else if (cc == '<') {
bufferCharacter(cc);
HTML_ADVANCE_TO(ScriptDataDoubleEscapedLessThanSignState);
} else if (cc == '>') {
bufferCharacter(cc);
HTML_ADVANCE_TO(ScriptDataState);
} else if (cc == kEndOfFileMarker) {
parseError();
HTML_RECONSUME_IN(DataState);
} else {
bufferCharacter(cc);
HTML_ADVANCE_TO(ScriptDataDoubleEscapedState);
}
}
END_STATE()
HTML_BEGIN_STATE(ScriptDataDoubleEscapedLessThanSignState) {
if (cc == '/') {
bufferCharacter(cc);
m_temporaryBuffer.clear();
HTML_ADVANCE_TO(ScriptDataDoubleEscapeEndState);
} else
HTML_RECONSUME_IN(ScriptDataDoubleEscapedState);
}
END_STATE()
HTML_BEGIN_STATE(ScriptDataDoubleEscapeEndState) {
if (isTokenizerWhitespace(cc) || cc == '/' || cc == '>') {
bufferCharacter(cc);
if (temporaryBufferIs(HTMLNames::scriptTag.localName()))
HTML_ADVANCE_TO(ScriptDataEscapedState);
else
HTML_ADVANCE_TO(ScriptDataDoubleEscapedState);
} else if (isASCIIUpper(cc)) {
bufferCharacter(cc);
m_temporaryBuffer.append(toLowerCase(cc));
HTML_ADVANCE_TO(ScriptDataDoubleEscapeEndState);
} else if (isASCIILower(cc)) {
bufferCharacter(cc);
m_temporaryBuffer.append(static_cast<LChar>(cc));
HTML_ADVANCE_TO(ScriptDataDoubleEscapeEndState);
} else
HTML_RECONSUME_IN(ScriptDataDoubleEscapedState);
}
END_STATE()
HTML_BEGIN_STATE(BeforeAttributeNameState) {
if (isTokenizerWhitespace(cc))
HTML_ADVANCE_TO(BeforeAttributeNameState);
......
......@@ -46,30 +46,12 @@ public:
DataState,
CharacterReferenceInDataState,
RAWTEXTState,
ScriptDataState,
TagOpenState,
EndTagOpenState,
TagNameState,
RAWTEXTLessThanSignState,
RAWTEXTEndTagOpenState,
RAWTEXTEndTagNameState,
ScriptDataLessThanSignState,
ScriptDataEndTagOpenState,
ScriptDataEndTagNameState,
ScriptDataEscapeStartState,
ScriptDataEscapeStartDashState,
ScriptDataEscapedState,
ScriptDataEscapedDashState,
ScriptDataEscapedDashDashState,
ScriptDataEscapedLessThanSignState,
ScriptDataEscapedEndTagOpenState,
ScriptDataEscapedEndTagNameState,
ScriptDataDoubleEscapeStartState,
ScriptDataDoubleEscapedState,
ScriptDataDoubleEscapedDashState,
ScriptDataDoubleEscapedDashDashState,
ScriptDataDoubleEscapedLessThanSignState,
ScriptDataDoubleEscapeEndState,
BeforeAttributeNameState,
AttributeNameState,
AfterAttributeNameState,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册