Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(92)

Unified Diff: Source/core/html/track/vtt/VTTTokenizer.cpp

Issue 73813002: Simplify state handling in WebVTTTokenizer::nextToken (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebased after files moved Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/html/track/vtt/VTTTokenizer.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/html/track/vtt/VTTTokenizer.cpp
diff --git a/Source/core/html/track/vtt/VTTTokenizer.cpp b/Source/core/html/track/vtt/VTTTokenizer.cpp
index deed7b9415cf22b574681410da514f8fdf0092d0..8df875843ff3b0f13dfd5cdef03ef105659a7471 100644
--- a/Source/core/html/track/vtt/VTTTokenizer.cpp
+++ b/Source/core/html/track/vtt/VTTTokenizer.cpp
@@ -60,7 +60,6 @@ inline bool vectorEqualsString(const Vector<CharacterType, 32>& vector, const St
void WebVTTTokenizer::reset()
{
- m_state = WebVTTTokenizerState::DataState;
m_token = 0;
m_buffer.clear();
}
@@ -77,6 +76,8 @@ bool WebVTTTokenizer::nextToken(SegmentedString& source, WebVTTToken& token)
UChar cc = m_inputStreamPreprocessor.nextInputCharacter();
+ m_state = WebVTTTokenizerState::DataState;
+
// 4.8.10.13.4 WebVTT cue text tokenizer
switch (m_state) {
WEBVTT_BEGIN_STATE(DataState) {
@@ -87,12 +88,15 @@ bool WebVTTTokenizer::nextToken(SegmentedString& source, WebVTTToken& token)
// FIXME: the explicit Vector conversion copies into a temporary
// and is wasteful.
if (m_token->type() == WebVTTTokenTypes::Uninitialized
- || vectorEqualsString<UChar>(Vector<UChar, 32>(m_token->characters()), emptyString()))
+ || vectorEqualsString<UChar>(Vector<UChar, 32>(m_token->characters()), emptyString())) {
WEBVTT_ADVANCE_TO(TagState);
- else
- return emitAndResumeIn(source, WebVTTTokenizerState::TagState);
+ } else {
+ // We don't want to advance input or perform a state transition - just return a (new) token.
+ // (On the next call to nextToken we will see '<' again, but take the other branch in this if instead.)
+ return emitToken(WebVTTTokenTypes::Character);
+ }
} else if (cc == kEndOfFileMarker) {
- return emitEndOfFile(source);
+ return emitToken(WebVTTTokenTypes::Character);
} else {
bufferCharacter(cc);
WEBVTT_ADVANCE_TO(DataState);
@@ -125,7 +129,7 @@ bool WebVTTTokenizer::nextToken(SegmentedString& source, WebVTTToken& token)
WEBVTT_ADVANCE_TO(EscapeState);
} else if (cc == kEndOfFileMarker) {
m_token->appendToCharacter(m_buffer);
- return emitEndOfFile(source);
+ return emitToken(WebVTTTokenTypes::Character);
} else {
if (!vectorEqualsString(m_buffer, "&"))
m_token->appendToCharacter(m_buffer);
@@ -149,7 +153,7 @@ bool WebVTTTokenizer::nextToken(SegmentedString& source, WebVTTToken& token)
WEBVTT_ADVANCE_TO(TimestampTagState);
} else if (cc == '>' || cc == kEndOfFileMarker) {
m_token->beginEmptyStartTag();
- return emitAndResumeIn(source, WebVTTTokenizerState::DataState);
+ return advanceAndEmitToken(source, WebVTTTokenTypes::StartTag);
} else {
m_token->beginStartTag(cc);
WEBVTT_ADVANCE_TO(StartTagState);
@@ -163,7 +167,7 @@ bool WebVTTTokenizer::nextToken(SegmentedString& source, WebVTTToken& token)
} else if (cc == '.') {
WEBVTT_ADVANCE_TO(StartTagClassState);
} else if (cc == '>' || cc == kEndOfFileMarker) {
- return emitAndResumeIn(source, WebVTTTokenizerState::DataState);
+ return advanceAndEmitToken(source, WebVTTTokenTypes::StartTag);
} else {
m_token->appendToName(cc);
WEBVTT_ADVANCE_TO(StartTagState);
@@ -180,7 +184,7 @@ bool WebVTTTokenizer::nextToken(SegmentedString& source, WebVTTToken& token)
WEBVTT_ADVANCE_TO(StartTagClassState);
} else if (cc == '>' || cc == kEndOfFileMarker) {
m_token->addNewClass();
- return emitAndResumeIn(source, WebVTTTokenizerState::DataState);
+ return advanceAndEmitToken(source, WebVTTTokenTypes::StartTag);
} else {
m_token->appendToClass(cc);
WEBVTT_ADVANCE_TO(StartTagClassState);
@@ -192,7 +196,7 @@ bool WebVTTTokenizer::nextToken(SegmentedString& source, WebVTTToken& token)
WEBVTT_BEGIN_STATE(StartTagAnnotationState) {
if (cc == '>' || cc == kEndOfFileMarker) {
m_token->addNewAnnotation();
- return emitAndResumeIn(source, WebVTTTokenizerState::DataState);
+ return advanceAndEmitToken(source, WebVTTTokenTypes::StartTag);
}
m_token->appendToAnnotation(cc);
WEBVTT_ADVANCE_TO(StartTagAnnotationState);
@@ -202,7 +206,7 @@ bool WebVTTTokenizer::nextToken(SegmentedString& source, WebVTTToken& token)
WEBVTT_BEGIN_STATE(EndTagOpenState) {
if (cc == '>' || cc == kEndOfFileMarker) {
m_token->beginEndTag('\0');
- return emitAndResumeIn(source, WebVTTTokenizerState::DataState);
+ return advanceAndEmitToken(source, WebVTTTokenTypes::EndTag);
}
m_token->beginEndTag(cc);
WEBVTT_ADVANCE_TO(EndTagState);
@@ -211,7 +215,7 @@ bool WebVTTTokenizer::nextToken(SegmentedString& source, WebVTTToken& token)
WEBVTT_BEGIN_STATE(EndTagState) {
if (cc == '>' || cc == kEndOfFileMarker)
- return emitAndResumeIn(source, WebVTTTokenizerState::DataState);
+ return advanceAndEmitToken(source, WebVTTTokenTypes::EndTag);
m_token->appendToName(cc);
WEBVTT_ADVANCE_TO(EndTagState);
}
@@ -219,7 +223,7 @@ bool WebVTTTokenizer::nextToken(SegmentedString& source, WebVTTToken& token)
WEBVTT_BEGIN_STATE(TimestampTagState) {
if (cc == '>' || cc == kEndOfFileMarker)
- return emitAndResumeIn(source, WebVTTTokenizerState::DataState);
+ return advanceAndEmitToken(source, WebVTTTokenTypes::TimestampTag);
m_token->appendToTimestamp(cc);
WEBVTT_ADVANCE_TO(TimestampTagState);
}
« no previous file with comments | « Source/core/html/track/vtt/VTTTokenizer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698