Reviewed and partially fixed by Tim Hatcher.
[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 "MediaPlayer.h"
33 #include "Timer.h"
34 #include "VoidCallback.h"
35
36 namespace WebCore {
37
38 class MediaError;
39 class TimeRanges;
40     
41 class HTMLMediaElement : public HTMLElement, public MediaPlayerClient {
42 public:
43     HTMLMediaElement(const QualifiedName&, Document*);
44     virtual ~HTMLMediaElement();
45
46     bool checkDTD(const Node* newChild);
47     
48     void attributeChanged(Attribute*, bool preserveDecls);
49
50     virtual bool rendererIsNeeded(RenderStyle*);
51     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
52     virtual void insertedIntoDocument();
53     virtual void removedFromDocument();
54     virtual void attach();
55     
56     MediaPlayer* player() const { return m_player; }
57     
58     virtual bool isVideo() const { return false; }
59     
60     void scheduleLoad();
61     
62     virtual void defaultEventHandler(Event*);
63     
64 // DOM API
65 // error state
66     PassRefPtr<MediaError> error() const;
67
68 // network state
69     String src() const;
70     void setSrc(const String&);
71     String currentSrc() const;
72     
73     enum NetworkState { EMPTY, LOADING, LOADED_METADATA, LOADED_FIRST_FRAME, LOADED };
74     NetworkState networkState() const;
75     float bufferingRate();
76     PassRefPtr<TimeRanges> buffered() const;
77     void load(ExceptionCode&);
78
79 // ready state
80     enum ReadyState { DATA_UNAVAILABLE, CAN_SHOW_CURRENT_FRAME, CAN_PLAY, CAN_PLAY_THROUGH };
81     ReadyState readyState() const;
82     bool seeking() const;
83
84 // playback state
85     float currentTime() const;
86     void setCurrentTime(float, ExceptionCode&);
87     float duration() const;
88     bool paused() const;
89     float defaultPlaybackRate() const;
90     void setDefaultPlaybackRate(float, ExceptionCode&);
91     float playbackRate() const;
92     void setPlaybackRate(float, ExceptionCode&);
93     PassRefPtr<TimeRanges> played() const;
94     PassRefPtr<TimeRanges> seekable() const;
95     bool ended();
96     bool autoplay() const;    
97     void setAutoplay(bool b);
98     void play(ExceptionCode&);
99     void pause(ExceptionCode&);
100     
101 // looping
102     float start() const;
103     void setStart(float time);
104     float end() const;
105     void setEnd(float time);
106     float loopStart() const;
107     void setLoopStart(float time);
108     float loopEnd() const;
109     void setLoopEnd(float time);
110     unsigned playCount() const;
111     void setPlayCount(unsigned, ExceptionCode&);
112     unsigned currentLoop() const;
113     void setCurrentLoop(unsigned);
114  
115 // cue points
116     void addCuePoint(float time, VoidCallback* callback, bool pause);
117     void removeCuePoint(float time, VoidCallback* callback);
118     
119 // controls
120     bool controls() const;
121     void setControls(bool);
122     float volume() const;
123     void setVolume(float, ExceptionCode&);
124     bool muted() const;
125     void setMuted(bool);
126
127 protected:
128     float getTimeOffsetAttribute(const QualifiedName&, float valueOnError) const;
129     void setTimeOffsetAttribute(const QualifiedName&, float value);
130     
131     virtual void willSaveToCache();
132     virtual void didRestoreFromCache();
133     
134     void initAndDispatchProgressEvent(const AtomicString& eventName);
135     void dispatchEventAsync(const AtomicString& eventName);
136     
137     void setReadyState(ReadyState);
138     
139 private: // MediaPlayerObserver
140     virtual void mediaPlayerNetworkStateChanged(MediaPlayer*);
141     virtual void mediaPlayerReadyStateChanged(MediaPlayer*);
142     virtual void mediaPlayerTimeChanged(MediaPlayer*);
143     virtual void mediaPlayerVolumeChanged(MediaPlayer*);
144     virtual void mediaPlayerCuePointReached(MediaPlayer*, float cueTime);
145     virtual void mediaPlayerRepaint(MediaPlayer*);
146
147 private:
148     void loadTimerFired(Timer<HTMLMediaElement>*);
149     void asyncEventTimerFired(Timer<HTMLMediaElement>*);
150     void progressEventTimerFired(Timer<HTMLMediaElement>*);
151     void seek(float time, ExceptionCode& ec);
152     void checkIfSeekNeeded();
153     
154     String pickMedia();
155     void updateMediaPlayer();
156     float effectiveStart() const;
157     float effectiveEnd() const;
158     float effectiveLoopStart() const;
159     float effectiveLoopEnd() const;
160     bool activelyPlaying() const;
161     bool endedPlayback() const;
162     
163 protected:
164     Timer<HTMLMediaElement> m_loadTimer;
165     Timer<HTMLMediaElement> m_asyncEventTimer;
166     Timer<HTMLMediaElement> m_progressEventTimer;
167     Vector<AtomicString> m_asyncEventsToDispatch;
168     
169     float m_defaultPlaybackRate;
170     NetworkState m_networkState;
171     ReadyState m_readyState;
172     String m_currentSrc;
173     
174     RefPtr<MediaError> m_error;
175     
176     bool m_begun;
177     bool m_loadedFirstFrame;
178     bool m_autoplaying;
179     
180     bool m_wasPlayingBeforeMovingToPageCache;
181     
182     unsigned m_currentLoop;
183     float m_volume;
184     bool m_muted;
185     
186     bool m_paused;
187     bool m_seeking;
188     
189     float m_currentTimeDuringSeek;
190     
191     unsigned m_previousProgress;
192     double m_previousProgressTime;
193     bool m_sentStalledEvent;
194     
195     float m_bufferingRate;
196     
197     unsigned m_loadNestingLevel;
198     unsigned m_terminateLoadBelowNestingLevel;
199     
200     struct CallbackEntry {
201         CallbackEntry() : m_voidCallback(0), m_pause(false) { }
202         CallbackEntry(VoidCallback* voidCallback, bool pause) {    
203             m_voidCallback = voidCallback;
204             m_pause = pause;
205         }
206         RefPtr<VoidCallback> m_voidCallback;
207         bool m_pause;
208     };
209     typedef Vector<CallbackEntry> CallbackVector;
210     HashMap<float, CallbackVector*> m_cuePoints;
211     
212     MediaPlayer* m_player;
213 };
214
215 } //namespace
216
217 #endif
218 #endif