656041c7d55dc0b6e3443f37d8a347262e1267b6
[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 // DOM API
66 // error state
67     PassRefPtr<MediaError> error() const;
68
69 // network state
70     String src() const;
71     void setSrc(const String&);
72     String currentSrc() const;
73     
74     enum NetworkState { EMPTY, LOADING, LOADED_METADATA, LOADED_FIRST_FRAME, LOADED };
75     NetworkState networkState() const;
76     float bufferingRate();
77     PassRefPtr<TimeRanges> buffered() const;
78     void load(ExceptionCode&);
79
80 // ready state
81     enum ReadyState { DATA_UNAVAILABLE, CAN_SHOW_CURRENT_FRAME, CAN_PLAY, CAN_PLAY_THROUGH };
82     ReadyState readyState() const;
83     bool seeking() const;
84
85 // playback state
86     float currentTime() const;
87     void setCurrentTime(float, ExceptionCode&);
88     float duration() const;
89     bool paused() const;
90     float defaultPlaybackRate() const;
91     void setDefaultPlaybackRate(float, ExceptionCode&);
92     float playbackRate() const;
93     void setPlaybackRate(float, ExceptionCode&);
94     PassRefPtr<TimeRanges> played() const;
95     PassRefPtr<TimeRanges> seekable() const;
96     bool ended();
97     bool autoplay() const;    
98     void setAutoplay(bool b);
99     void play(ExceptionCode&);
100     void pause(ExceptionCode&);
101     
102 // looping
103     float start() const;
104     void setStart(float time);
105     float end() const;
106     void setEnd(float time);
107     float loopStart() const;
108     void setLoopStart(float time);
109     float loopEnd() const;
110     void setLoopEnd(float time);
111     unsigned loopCount() const;
112     void setLoopCount(unsigned, ExceptionCode&);
113     unsigned currentLoop() const;
114     void setCurrentLoop(unsigned);
115  
116 // cue points
117     void addCuePoint(float time, VoidCallback* callback, bool pause);
118     void removeCuePoint(float time, VoidCallback* callback);
119     
120 // controls
121     bool controls() const;
122     void setControls(bool);
123     float volume() const;
124     void setVolume(float, ExceptionCode&);
125     bool muted() const;
126     void setMuted(bool);
127
128 protected:
129     float getTimeOffsetAttribute(const QualifiedName&, float valueOnError) const;
130     void setTimeOffsetAttribute(const QualifiedName&, float value);
131     
132     virtual void willSaveToCache();
133     virtual void didRestoreFromCache();
134     
135     void initAndDispatchProgressEvent(const AtomicString& eventName);
136     void dispatchEventAsync(const AtomicString& eventName);
137     
138     void setReadyState(ReadyState);
139     
140 private: // MovieObserver
141     virtual void movieNetworkStateChanged(Movie*);
142     virtual void movieReadyStateChanged(Movie*);
143     virtual void movieVolumeChanged(Movie*);
144     virtual void movieDidEnd(Movie*);
145     virtual void movieCuePointReached(Movie*, float cueTime);
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 updatePlayState();
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     unsigned m_previousProgress;
190     double m_previousProgressTime;
191     bool m_sentStalledEvent;
192     
193     float m_bufferingRate;
194     
195     unsigned m_loadNestingLevel;
196     unsigned m_terminateLoadBelowNestingLevel;
197     
198     struct CallbackEntry {
199         CallbackEntry() : m_voidCallback(0), m_pause(false) { }
200         CallbackEntry(VoidCallback* voidCallback, bool pause) {    
201             m_voidCallback = voidCallback;
202             m_pause = pause;
203         }
204         RefPtr<VoidCallback> m_voidCallback;
205         bool m_pause;
206     };
207     typedef Vector<CallbackEntry> CallbackVector;
208     HashMap<float, CallbackVector*> m_cuePoints;
209     
210     Movie* m_movie;
211 };
212
213 } //namespace
214
215 #endif
216 #endif