15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#ifndef VTTParser_h 3251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#define VTTParser_h 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 345d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/HTMLNames.h" 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DocumentFragment.h" 3609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/html/parser/TextResourceDecoder.h" 3751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/html/track/vtt/BufferedLineReader.h" 3851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/html/track/vtt/VTTCue.h" 3951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/html/track/vtt/VTTRegion.h" 4051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/html/track/vtt/VTTTokenizer.h" 41f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "platform/heap/Handle.h" 42e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/PassOwnPtr.h" 43e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/text/StringBuilder.h" 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 45c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Document; 4809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class VTTScanner; 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)class VTTParserClient { 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 5251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) virtual ~VTTParserClient() { } 5353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void newCuesParsed() = 0; 5553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) virtual void newRegionsParsed() = 0; 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void fileFailedToParse() = 0; 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 59f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuclass VTTParser FINAL : public NoBaseWillBeGarbageCollectedFinalized<VTTParser> { 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 6153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) enum ParseState { 6253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Initial, 6353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Header, 6453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Id, 6553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) TimingsAndSettings, 6653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) CueText, 6753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) BadCue 6853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) }; 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 70f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu static PassOwnPtrWillBeRawPtr<VTTParser> create(VTTParserClient* client, Document& document) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 72f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu return adoptPtrWillBeNoop(new VTTParser(client, document)); 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static inline bool isRecognizedTag(const AtomicString& tagName) 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 7709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return tagName == HTMLNames::iTag 7809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) || tagName == HTMLNames::bTag 7909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) || tagName == HTMLNames::uTag 8009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) || tagName == HTMLNames::rubyTag 8109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) || tagName == HTMLNames::rtTag; 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 8309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) static inline bool isASpace(UChar c) 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // WebVTT space characters are U+0020 SPACE, U+0009 CHARACTER TABULATION (tab), U+000A LINE FEED (LF), U+000C FORM FEED (FF), and U+000D CARRIAGE RETURN (CR). 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return c == ' ' || c == '\t' || c == '\n' || c == '\f' || c == '\r'; 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 8809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) static inline bool isValidSettingDelimiter(UChar c) 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 9002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // ... a WebVTT cue consists of zero or more of the following components, in any order, separated from each other by one or more 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // U+0020 SPACE characters or U+0009 CHARACTER TABULATION (tab) characters. 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return c == ' ' || c == '\t'; 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) static bool collectTimeStamp(const String&, double& timeStamp); 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // Useful functions for parsing percentage settings. 9709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) static bool parseFloatPercentageValue(VTTScanner& valueScanner, float& percentage); 9809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) static bool parseFloatPercentageValuePair(VTTScanner&, char, FloatPoint&); 9953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 10019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) // Create the DocumentFragment representation of the WebVTT cue text. 101d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) static PassRefPtrWillBeRawPtr<DocumentFragment> createDocumentFragmentFromCueText(Document&, const String&); 10219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Input data to the parser to parse. 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void parseBytes(const char* data, unsigned length); 10551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) void flush(); 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Transfers ownership of last parsed cues to caller. 108f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu void getNewCues(WillBeHeapVector<RefPtrWillBeMember<VTTCue> >&); 109f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu void getNewRegions(WillBeHeapVector<RefPtrWillBeMember<VTTRegion> >&); 110f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu 111f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu void trace(Visitor*); 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)private: 11451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) VTTParser(VTTParserClient*, Document&); 11553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 1165d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) RawPtrWillBeMember<Document> m_document; 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ParseState m_state; 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) void parse(); 12051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) void flushPendingCue(); 12119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) bool hasRequiredFileIdentifier(const String& line); 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ParseState collectCueId(const String&); 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ParseState collectTimingsAndSettings(const String&); 12451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) ParseState collectCueText(const String&); 12551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) ParseState recoverCue(const String&); 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ParseState ignoreBadCue(const String&); 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void createNewCue(); 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void resetCueValues(); 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 131bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) void collectMetadataHeader(const String&); 13251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) void createNewRegion(const String& headerValue); 13353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 13409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) static bool collectTimeStamp(VTTScanner& input, double& timeStamp); 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) BufferedLineReader m_lineReader; 13751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) OwnPtr<TextResourceDecoder> m_decoder; 13809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) AtomicString m_currentId; 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) double m_currentStartTime; 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) double m_currentEndTime; 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) StringBuilder m_currentContent; 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String m_currentSettings; 14302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 14451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) VTTParserClient* m_client; 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 146f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu WillBeHeapVector<RefPtrWillBeMember<VTTCue> > m_cueList; 14753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 148f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu WillBeHeapVector<RefPtrWillBeMember<VTTRegion> > m_regionList; 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 151c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 154