WebCore:
[WebKit-https.git] / WebCore / html / HTMLMediaElement.h
1 /*
2  * Copyright (C) 2007 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 COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #ifndef HTMLMediaElement_h
27 #define HTMLMediaElement_h
28
29 #if ENABLE(VIDEO)
30
31 #include "HTMLElement.h"
32 #include "Movie.h"
33 #include "Timer.h"
34 #include "StringHash.h"
35 #include "VoidCallback.h"
36 #include "wtf/HashMap.h"
37 #include "wtf/HashSet.h"
38 #include "wtf/RefPtr.h"
39 #include "wtf/Vector.h"
40
41 namespace WebCore {
42
43 class MediaError;
44 class TimeRanges;
45     
46 class HTMLMediaElement : public HTMLElement, public MovieClient {
47 public:
48     HTMLMediaElement(const QualifiedName&, Document*);
49     virtual ~HTMLMediaElement();
50
51     bool checkDTD(const Node* newChild);
52     
53     void attributeChanged(Attribute*, bool preserveDecls);
54
55     virtual bool rendererIsNeeded(RenderStyle*);
56     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
57     virtual void insertedIntoDocument();
58     virtual void removedFromDocument();
59     
60     Movie* movie() const { return m_movie; }
61     
62     virtual bool isVideo() const { return false; }
63     
64     void scheduleLoad();
65     
66     virtual void defaultEventHandler(Event*);
67     
68 // DOM API
69 // error state
70     PassRefPtr<MediaError> error() const;
71
72 // network state
73     String src() const;
74     void setSrc(const String&);
75     String currentSrc() const;
76     
77     enum NetworkState { EMPTY, LOADING, LOADED_METADATA, LOADED_FIRST_FRAME, LOADED };
78     NetworkState networkState() const;
79     float bufferingRate();
80     PassRefPtr<TimeRanges> buffered() const;
81     void load(ExceptionCode&);
82
83 // ready state
84     enum ReadyState { DATA_UNAVAILABLE, CAN_SHOW_CURRENT_FRAME, CAN_PLAY, CAN_PLAY_THROUGH };
85     ReadyState readyState() const;
86     bool seeking() const;
87
88 // playback state
89     float currentTime() const;
90     void setCurrentTime(float, ExceptionCode&);
91     float duration() const;
92     bool paused() const;
93     float defaultPlaybackRate() const;
94     void setDefaultPlaybackRate(float, ExceptionCode&);
95     float playbackRate() const;
96     void setPlaybackRate(float, ExceptionCode&);
97     PassRefPtr<TimeRanges> played() const;
98     PassRefPtr<TimeRanges> seekable() const;
99     bool ended();
100     bool autoplay() const;    
101     void setAutoplay(bool b);
102     void play(ExceptionCode&);
103     void pause(ExceptionCode&);
104     
105 // looping
106     float start() const;
107     void setStart(float time);
108     float end() const;
109     void setEnd(float time);
110     float loopStart() const;
111     void setLoopStart(float time);
112     float loopEnd() const;
113     void setLoopEnd(float time);
114     unsigned playCount() const;
115     void setPlayCount(unsigned, ExceptionCode&);
116     unsigned currentLoop() const;
117     void setCurrentLoop(unsigned);
118  
119 // cue points
120     void addCuePoint(float time, VoidCallback* callback, bool pause);
121     void removeCuePoint(float time, VoidCallback* callback);
122     
123 // controls
124     bool controls() const;
125     void setControls(bool);
126     float volume() const;
127     void setVolume(float, ExceptionCode&);
128     bool muted() const;
129     void setMuted(bool);
130
131 protected:
132     float getTimeOffsetAttribute(const QualifiedName&, float valueOnError) const;
133     void setTimeOffsetAttribute(const QualifiedName&, float value);
134     
135     virtual void willSaveToCache();
136     virtual void didRestoreFromCache();
137     
138     void initAndDispatchProgressEvent(const AtomicString& eventName);
139     void dispatchEventAsync(const AtomicString& eventName);
140     
141     void setReadyState(ReadyState);
142     
143 private: // MovieObserver
144     virtual void movieNetworkStateChanged(Movie*);
145     virtual void movieReadyStateChanged(Movie*);
146     virtual void movieTimeChanged(Movie*);
147     virtual void movieVolumeChanged(Movie*);
148     virtual void movieCuePointReached(Movie*, float cueTime);
149         
150 private:
151     void loadTimerFired(Timer<HTMLMediaElement>*);
152     void asyncEventTimerFired(Timer<HTMLMediaElement>*);
153     void progressEventTimerFired(Timer<HTMLMediaElement>*);
154     void seek(float time, ExceptionCode& ec);
155     void checkIfSeekNeeded();
156     
157     String pickMedia();
158     void updateMovie();
159     float effectiveStart() const;
160     float effectiveEnd() const;
161     float effectiveLoopStart() const;
162     float effectiveLoopEnd() const;
163     bool activelyPlaying() const;
164     bool endedPlayback() const;
165     
166 protected:
167     Timer<HTMLMediaElement> m_loadTimer;
168     Timer<HTMLMediaElement> m_asyncEventTimer;
169     Timer<HTMLMediaElement> m_progressEventTimer;
170     Vector<AtomicString> m_asyncEventsToDispatch;
171     
172     float m_defaultPlaybackRate;
173     NetworkState m_networkState;
174     ReadyState m_readyState;
175     String m_currentSrc;
176     
177     RefPtr<MediaError> m_error;
178     
179     bool m_begun;
180     bool m_loadedFirstFrame;
181     bool m_autoplaying;
182     
183     bool m_wasPlayingBeforeMovingToPageCache;
184     
185     unsigned m_currentLoop;
186     float m_volume;
187     bool m_muted;
188     
189     bool m_paused;
190     bool m_seeking;
191     
192     float m_currentTimeDuringSeek;
193     
194     unsigned m_previousProgress;
195     double m_previousProgressTime;
196     bool m_sentStalledEvent;
197     
198     float m_bufferingRate;
199     
200     unsigned m_loadNestingLevel;
201     unsigned m_terminateLoadBelowNestingLevel;
202     
203     struct CallbackEntry {
204         CallbackEntry() : m_voidCallback(0), m_pause(false) { }
205         CallbackEntry(VoidCallback* voidCallback, bool pause) {    
206             m_voidCallback = voidCallback;
207             m_pause = pause;
208         }
209         RefPtr<VoidCallback> m_voidCallback;
210         bool m_pause;
211     };
212     typedef Vector<CallbackEntry> CallbackVector;
213     HashMap<float, CallbackVector*> m_cuePoints;
214     
215     Movie* m_movie;
216 };
217
218 } //namespace
219
220 #endif
221 #endif