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