1d9c1b3e10054ffaf1193f0a7d36e7a3590afff7
[WebKit-https.git] / Source / WebCore / html / MediaController.h
1 /*
2  * Copyright (C) 2011 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 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 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 MediaController_h
27 #define MediaController_h
28
29 #if ENABLE(VIDEO)
30
31 #include "Event.h"
32 #include "EventTarget.h"
33 #include "MediaControllerInterface.h"
34 #include "Timer.h"
35 #include <wtf/PassRefPtr.h>
36 #include <wtf/RefCounted.h>
37 #include <wtf/Vector.h>
38
39 namespace WebCore {
40
41 class Clock;
42 class HTMLMediaElement;
43 class Event;
44 class ScriptExecutionContext;
45
46 class MediaController final : public RefCounted<MediaController>, public MediaControllerInterface, public EventTargetWithInlineData {
47 public:
48     static PassRefPtr<MediaController> create(ScriptExecutionContext&);
49     virtual ~MediaController();
50
51     void addMediaElement(HTMLMediaElement*);
52     void removeMediaElement(HTMLMediaElement*);
53     bool containsMediaElement(HTMLMediaElement*) const;
54
55     const String& mediaGroup() const { return m_mediaGroup; }
56     
57     virtual PassRefPtr<TimeRanges> buffered() const override;
58     virtual PassRefPtr<TimeRanges> seekable() const override;
59     virtual PassRefPtr<TimeRanges> played() override;
60     
61     virtual double duration() const override;
62     virtual double currentTime() const override;
63     virtual void setCurrentTime(double) override;
64     
65     virtual bool paused() const override { return m_paused; }
66     virtual void play() override;
67     virtual void pause() override;
68     void unpause();
69     
70     virtual double defaultPlaybackRate() const override { return m_defaultPlaybackRate; }
71     virtual void setDefaultPlaybackRate(double) override;
72     
73     virtual double playbackRate() const override;
74     virtual void setPlaybackRate(double) override;
75     
76     virtual double volume() const override { return m_volume; }
77     virtual void setVolume(double, ExceptionCode&) override;
78     
79     virtual bool muted() const override { return m_muted; }
80     virtual void setMuted(bool) override;
81     
82     virtual ReadyState readyState() const override { return m_readyState; }
83
84     enum PlaybackState { WAITING, PLAYING, ENDED };
85     const AtomicString& playbackState() const;
86
87     virtual bool supportsFullscreen() const override { return false; }
88     virtual bool isFullscreen() const override { return false; }
89     virtual void enterFullscreen() override { }
90
91     virtual bool hasAudio() const override;
92     virtual bool hasVideo() const override;
93     virtual bool hasClosedCaptions() const override;
94     virtual void setClosedCaptionsVisible(bool) override;
95     virtual bool closedCaptionsVisible() const override { return m_closedCaptionsVisible; }
96     
97     virtual bool supportsScanning() const override;
98     
99     virtual void beginScrubbing() override;
100     virtual void endScrubbing() override;
101     virtual void beginScanning(ScanDirection) override;
102     virtual void endScanning() override;
103     
104     virtual bool canPlay() const override;
105     
106     virtual bool isLiveStream() const override;
107     
108     virtual bool hasCurrentSrc() const override;
109     
110     virtual void returnToRealtime() override;
111
112     bool isBlocked() const;
113
114     // EventTarget
115     using RefCounted<MediaController>::ref;
116     using RefCounted<MediaController>::deref;
117
118 private:
119     explicit MediaController(ScriptExecutionContext&);
120     void reportControllerState();
121     void updateReadyState();
122     void updatePlaybackState();
123     void updateMediaElements();
124     void bringElementUpToSpeed(HTMLMediaElement*);
125     void scheduleEvent(const AtomicString& eventName);
126     void asyncEventTimerFired();
127     void clearPositionTimerFired();
128     bool hasEnded() const;
129     void scheduleTimeupdateEvent();
130     void timeupdateTimerFired();
131     void startTimeupdateTimer();
132
133     // EventTarget
134     virtual void refEventTarget() override { ref(); }
135     virtual void derefEventTarget() override { deref(); }
136     virtual EventTargetInterface eventTargetInterface() const override { return MediaControllerEventTargetInterfaceType; }
137     virtual ScriptExecutionContext* scriptExecutionContext() const override { return &m_scriptExecutionContext; };
138
139     friend class HTMLMediaElement;
140     friend class MediaControllerEventListener;
141     Vector<HTMLMediaElement*> m_mediaElements;
142     bool m_paused;
143     double m_defaultPlaybackRate;
144     double m_volume;
145     mutable double m_position;
146     bool m_muted;
147     ReadyState m_readyState;
148     PlaybackState m_playbackState;
149     Vector<RefPtr<Event>> m_pendingEvents;
150     Timer m_asyncEventTimer;
151     mutable Timer m_clearPositionTimer;
152     String m_mediaGroup;
153     bool m_closedCaptionsVisible;
154     std::unique_ptr<Clock> m_clock;
155     ScriptExecutionContext& m_scriptExecutionContext;
156     Timer m_timeupdateTimer;
157     double m_previousTimeupdateTime;
158 };
159
160 } // namespace WebCore
161
162 #endif
163 #endif