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