| Index: Source/core/html/track/WebVTTParser.cpp
|
| diff --git a/Source/core/html/track/WebVTTParser.cpp b/Source/core/html/track/WebVTTParser.cpp
|
| index aa6f59211cbc793861f32e609cc5b7ce03711c23..32d0bbe90e08fc1bee88d55c93e3cb4a9f67f03c 100644
|
| --- a/Source/core/html/track/WebVTTParser.cpp
|
| +++ b/Source/core/html/track/WebVTTParser.cpp
|
| @@ -116,7 +116,6 @@ WebVTTParser::WebVTTParser(WebVTTParserClient* client, Document& document)
|
| , m_decoder(TextResourceDecoder::create("text/plain", UTF8Encoding()))
|
| , m_currentStartTime(0)
|
| , m_currentEndTime(0)
|
| - , m_tokenizer(WebVTTTokenizer::create())
|
| , m_client(client)
|
| {
|
| }
|
| @@ -300,31 +299,55 @@ WebVTTParser::ParseState WebVTTParser::ignoreBadCue(const String& line)
|
| return Id;
|
| }
|
|
|
| -PassRefPtr<DocumentFragment> WebVTTParser::createDocumentFragmentFromCueText(const String& text)
|
| +// A helper class for the construction of a "cue fragment" from the cue text.
|
| +class WebVTTTreeBuilder {
|
| +public:
|
| + WebVTTTreeBuilder(Document& document)
|
| + : m_document(document) { }
|
| +
|
| + PassRefPtr<DocumentFragment> buildFromString(const String& cueText);
|
| +
|
| +private:
|
| + void constructTreeFromToken(Document&);
|
| +
|
| + WebVTTToken m_token;
|
| + RefPtr<ContainerNode> m_currentNode;
|
| + Vector<AtomicString> m_languageStack;
|
| + Document& m_document;
|
| +};
|
| +
|
| +PassRefPtr<DocumentFragment> WebVTTTreeBuilder::buildFromString(const String& cueText)
|
| {
|
| // Cue text processing based on
|
| // 4.8.10.13.4 WebVTT cue text parsing rules and
|
| // 4.8.10.13.5 WebVTT cue text DOM construction rules.
|
|
|
| - RefPtr<DocumentFragment> fragment = DocumentFragment::create(*m_document);
|
| + RefPtr<DocumentFragment> fragment = DocumentFragment::create(m_document);
|
|
|
| - if (!text.length()) {
|
| - fragment->parserAppendChild(Text::create(*m_document, ""));
|
| + if (cueText.isEmpty()) {
|
| + fragment->parserAppendChild(Text::create(m_document, ""));
|
| return fragment;
|
| }
|
|
|
| m_currentNode = fragment;
|
| - m_tokenizer->reset();
|
| - m_token.clear();
|
|
|
| + OwnPtr<WebVTTTokenizer> tokenizer(WebVTTTokenizer::create());
|
| + m_token.clear();
|
| m_languageStack.clear();
|
| - SegmentedString content(text);
|
| - while (m_tokenizer->nextToken(content, m_token))
|
| - constructTreeFromToken(*m_document);
|
| +
|
| + SegmentedString content(cueText);
|
| + while (tokenizer->nextToken(content, m_token))
|
| + constructTreeFromToken(m_document);
|
|
|
| return fragment.release();
|
| }
|
|
|
| +PassRefPtr<DocumentFragment> WebVTTParser::createDocumentFragmentFromCueText(Document& document, const String& cueText)
|
| +{
|
| + WebVTTTreeBuilder treeBuilder(document);
|
| + return treeBuilder.buildFromString(cueText);
|
| +}
|
| +
|
| void WebVTTParser::createNewCue()
|
| {
|
| if (!m_currentContent.length())
|
| @@ -456,7 +479,7 @@ static WebVTTNodeType tokenToNodeType(WebVTTToken& token)
|
| return WebVTTNodeTypeNone;
|
| }
|
|
|
| -void WebVTTParser::constructTreeFromToken(Document& document)
|
| +void WebVTTTreeBuilder::constructTreeFromToken(Document& document)
|
| {
|
| QualifiedName tagName(nullAtom, AtomicString(m_token.name()), xhtmlNamespaceURI);
|
|
|
| @@ -504,7 +527,7 @@ void WebVTTParser::constructTreeFromToken(Document& document)
|
| case WebVTTTokenTypes::TimestampTag: {
|
| unsigned position = 0;
|
| String charactersString(StringImpl::create8BitIfPossible(m_token.characters()));
|
| - double time = collectTimeStamp(charactersString, &position);
|
| + double time = WebVTTParser::collectTimeStamp(charactersString, &position);
|
| if (time != malformedTime)
|
| m_currentNode->parserAppendChild(ProcessingInstruction::create(document, "timestamp", charactersString));
|
| break;
|
|
|