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