1/*
2 * Copyright (C) 2011 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#ifndef TextTrackLoader_h
27#define TextTrackLoader_h
28
29#include "core/fetch/RawResource.h"
30#include "core/fetch/ResourceOwner.h"
31#include "core/html/track/vtt/VTTParser.h"
32#include "platform/Timer.h"
33#include "platform/heap/Handle.h"
34#include "wtf/OwnPtr.h"
35
36namespace blink {
37
38class Document;
39class TextTrackLoader;
40
41class TextTrackLoaderClient : public ResourceOwner<RawResource> {
42public:
43    virtual ~TextTrackLoaderClient() { }
44
45    virtual void newCuesAvailable(TextTrackLoader*) = 0;
46    virtual void cueLoadingCompleted(TextTrackLoader*, bool loadingFailed) = 0;
47    virtual void newRegionsAvailable(TextTrackLoader*) = 0;
48};
49
50class TextTrackLoader FINAL : public NoBaseWillBeGarbageCollectedFinalized<TextTrackLoader>, public ResourceOwner<RawResource>, private VTTParserClient {
51    WTF_MAKE_NONCOPYABLE(TextTrackLoader);
52    WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED;
53public:
54    static PassOwnPtrWillBeRawPtr<TextTrackLoader> create(TextTrackLoaderClient& client, Document& document)
55    {
56        return adoptPtrWillBeNoop(new TextTrackLoader(client, document));
57    }
58    virtual ~TextTrackLoader();
59
60    bool load(const KURL&, const AtomicString& crossOriginMode);
61    void cancelLoad();
62
63    enum State { Idle, Loading, Finished, Failed };
64    State loadState() { return m_state; }
65
66    void getNewCues(WillBeHeapVector<RefPtrWillBeMember<VTTCue> >& outputCues);
67    void getNewRegions(WillBeHeapVector<RefPtrWillBeMember<VTTRegion> >& outputRegions);
68
69    void trace(Visitor*);
70
71private:
72    // RawResourceClient
73    virtual void dataReceived(Resource*, const char* data, int length) OVERRIDE;
74    virtual void notifyFinished(Resource*) OVERRIDE;
75
76    // VTTParserClient
77    virtual void newCuesParsed() OVERRIDE;
78    virtual void newRegionsParsed() OVERRIDE;
79    virtual void fileFailedToParse() OVERRIDE;
80
81    TextTrackLoader(TextTrackLoaderClient&, Document&);
82
83    void cueLoadTimerFired(Timer<TextTrackLoader>*);
84    void corsPolicyPreventedLoad(SecurityOrigin*, const KURL&);
85
86    Document& document() const { return *m_document; }
87
88    TextTrackLoaderClient& m_client;
89    OwnPtrWillBeMember<VTTParser> m_cueParser;
90    // FIXME: Remove this pointer and get the Document from m_client.
91    RawPtrWillBeMember<Document> m_document;
92    Timer<TextTrackLoader> m_cueLoadTimer;
93    State m_state;
94    bool m_newCuesAvailable;
95};
96
97} // namespace blink
98
99#endif
100