| 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);
|
| }
|
|
|