Source/WebCore:
[WebKit-https.git] / Source / WebCore / html / shadow / MediaControlElementTypes.h
1 /*
2  * Copyright (C) 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
3  * Copyright (C) 2012 Google Inc. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1.  Redistributions of source code must retain the above copyright
10  *     notice, this list of conditions and the following disclaimer.
11  * 2.  Redistributions in binary form must reproduce the above copyright
12  *     notice, this list of conditions and the following disclaimer in the
13  *     documentation and/or other materials provided with the distribution.
14  * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
15  *     its contributors may be used to endorse or promote products derived
16  *     from this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
19  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
22  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30 #pragma once
31
32 #if ENABLE(VIDEO)
33
34 #include "HTMLDivElement.h"
35 #include "HTMLInputElement.h"
36 #include "HTMLMediaElement.h"
37 #include "MediaControllerInterface.h"
38 #include "RenderObject.h"
39
40 namespace WebCore {
41
42 enum MediaControlElementType {
43     MediaEnterFullscreenButton = 0,
44     MediaMuteButton,
45     MediaPlayButton,
46     MediaSeekBackButton,
47     MediaSeekForwardButton,
48     MediaSlider,
49     MediaSliderThumb,
50     MediaRewindButton,
51     MediaReturnToRealtimeButton,
52     MediaShowClosedCaptionsButton,
53     MediaHideClosedCaptionsButton,
54     MediaUnMuteButton,
55     MediaPauseButton,
56     MediaTimelineContainer,
57     MediaCurrentTimeDisplay,
58     MediaTimeRemainingDisplay,
59     MediaStatusDisplay,
60     MediaControlsPanel,
61     MediaVolumeSliderContainer,
62     MediaVolumeSlider,
63     MediaVolumeSliderThumb,
64     MediaFullScreenVolumeSlider,
65     MediaFullScreenVolumeSliderThumb,
66     MediaVolumeSliderMuteButton,
67     MediaTextTrackDisplayContainer,
68     MediaTextTrackDisplay,
69     MediaExitFullscreenButton,
70     MediaOverlayPlayButton,
71     MediaClosedCaptionsContainer,
72     MediaClosedCaptionsTrackList,
73 };
74
75 RefPtr<HTMLMediaElement> parentMediaElement(const Node*);
76 inline RefPtr<HTMLMediaElement> parentMediaElement(const RenderObject& renderer) { return parentMediaElement(renderer.node()); }
77
78 MediaControlElementType mediaControlElementType(Node*);
79
80 // ----------------------------
81
82 class MediaControlElement {
83 public:
84     virtual void hide();
85     virtual void show();
86     virtual bool isShowing() const;
87
88     virtual MediaControlElementType displayType() { return m_displayType; }
89
90     virtual void setMediaController(MediaControllerInterface* controller) { m_mediaController = controller; }
91     virtual MediaControllerInterface* mediaController() const { return m_mediaController; }
92
93 protected:
94     explicit MediaControlElement(MediaControlElementType, HTMLElement*);
95     ~MediaControlElement() = default;
96
97     virtual void setDisplayType(MediaControlElementType);
98     virtual bool isMediaControlElement() const { return true; }
99
100 private:
101     MediaControllerInterface* m_mediaController;
102     MediaControlElementType m_displayType;
103     HTMLElement* m_element;
104 };
105
106 // ----------------------------
107
108 class MediaControlDivElement : public HTMLDivElement, public MediaControlElement {
109     WTF_MAKE_ISO_ALLOCATED(MediaControlDivElement);
110 protected:
111     explicit MediaControlDivElement(Document&, MediaControlElementType);
112
113 private:
114     bool isMediaControlElement() const final { return MediaControlElement::isMediaControlElement(); }
115 };
116
117 // ----------------------------
118
119 class MediaControlInputElement : public HTMLInputElement, public MediaControlElement {
120     WTF_MAKE_ISO_ALLOCATED(MediaControlInputElement);
121 protected:
122     explicit MediaControlInputElement(Document&, MediaControlElementType);
123
124 private:
125     bool isMediaControlElement() const final { return MediaControlElement::isMediaControlElement(); }
126     virtual void updateDisplayType() { }
127 };
128
129 // ----------------------------
130
131 class MediaControlTimeDisplayElement : public MediaControlDivElement {
132     WTF_MAKE_ISO_ALLOCATED(MediaControlTimeDisplayElement);
133 public:
134     void setCurrentValue(double);
135     double currentValue() const { return m_currentValue; }
136
137 protected:
138     explicit MediaControlTimeDisplayElement(Document&, MediaControlElementType);
139
140 private:
141     double m_currentValue;
142 };
143
144 // ----------------------------
145
146 class MediaControlMuteButtonElement : public MediaControlInputElement {
147     WTF_MAKE_ISO_ALLOCATED(MediaControlMuteButtonElement);
148 public:
149     void changedMute();
150
151     bool willRespondToMouseClickEvents() override { return true; }
152
153 protected:
154     explicit MediaControlMuteButtonElement(Document&, MediaControlElementType);
155
156     void defaultEventHandler(Event&) override;
157
158 private:
159     void updateDisplayType() override;
160 };
161
162 // ----------------------------
163
164 class MediaControlSeekButtonElement : public MediaControlInputElement {
165     WTF_MAKE_ISO_ALLOCATED(MediaControlSeekButtonElement);
166 public:
167     bool willRespondToMouseClickEvents() override { return true; }
168
169 protected:
170     explicit MediaControlSeekButtonElement(Document&, MediaControlElementType);
171
172     void defaultEventHandler(Event&) override;
173     virtual bool isForwardButton() const = 0;
174
175 private:
176     void setActive(bool /*flag*/ = true, bool /*pause*/ = false) final;
177 };
178
179 // ----------------------------
180
181 class MediaControlVolumeSliderElement : public MediaControlInputElement {
182     WTF_MAKE_ISO_ALLOCATED(MediaControlVolumeSliderElement);
183 public:
184     bool willRespondToMouseMoveEvents() override;
185     bool willRespondToMouseClickEvents() override;
186     void setVolume(double);
187     void setClearMutedOnUserInteraction(bool);
188
189 protected:
190     explicit MediaControlVolumeSliderElement(Document&);
191
192     void defaultEventHandler(Event&) override;
193
194 private:
195     bool m_clearMutedOnUserInteraction;
196 };
197
198 } // namespace WebCore
199
200 #endif // ENABLE(VIDEO)