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