Source/WebCore: Source/WebCore: Mac: Media Controls always hide time display elements
[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 Computer, 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 #ifndef MediaControlElementTypes_h
31 #define MediaControlElementTypes_h
32
33 #if ENABLE(VIDEO)
34
35 #include "HTMLDivElement.h"
36 #include "HTMLInputElement.h"
37 #include "HTMLMediaElement.h"
38 #include "MediaControllerInterface.h"
39 #include "RenderBlock.h"
40
41 namespace WebCore {
42
43 // Must match WebKitSystemInterface.h
44 enum MediaControlElementType {
45     MediaEnterFullscreenButton = 0,
46     MediaMuteButton,
47     MediaPlayButton,
48     MediaSeekBackButton,
49     MediaSeekForwardButton,
50     MediaSlider,
51     MediaSliderThumb,
52     MediaRewindButton,
53     MediaReturnToRealtimeButton,
54     MediaShowClosedCaptionsButton,
55     MediaHideClosedCaptionsButton,
56     MediaUnMuteButton,
57     MediaPauseButton,
58     MediaTimelineContainer,
59     MediaCurrentTimeDisplay,
60     MediaTimeRemainingDisplay,
61     MediaStatusDisplay,
62     MediaControlsPanel,
63     MediaVolumeSliderContainer,
64     MediaVolumeSlider,
65     MediaVolumeSliderThumb,
66     MediaFullScreenVolumeSlider,
67     MediaFullScreenVolumeSliderThumb,
68     MediaVolumeSliderMuteButton,
69     MediaTextTrackDisplayContainer,
70     MediaTextTrackDisplay,
71     MediaExitFullscreenButton,
72     MediaOverlayPlayButton,
73     MediaClosedCaptionsContainer,
74     MediaClosedCaptionsTrackList,
75 };
76
77 HTMLMediaElement* toParentMediaElement(Node*);
78 inline HTMLMediaElement* toParentMediaElement(RenderObject* renderer) { return toParentMediaElement(renderer->node()); }
79
80 MediaControlElementType mediaControlElementType(Node*);
81
82 #if ENABLE(VIDEO_TRACK)
83 const AtomicString& trackIndexAttributeName();
84 int trackListIndexForElement(Element*);
85 #endif
86
87 // ----------------------------
88
89 class MediaControlElement {
90 public:
91     virtual void hide();
92     virtual void show();
93     virtual bool isShowing() const;
94
95     virtual MediaControlElementType displayType() { return m_displayType; }
96     virtual const AtomicString& shadowPseudoId() const = 0;
97
98     virtual void setMediaController(MediaControllerInterface* controller) { m_mediaController = controller; }
99     virtual MediaControllerInterface* mediaController() const { return m_mediaController; }
100
101 protected:
102     explicit MediaControlElement(MediaControlElementType, HTMLElement*);
103     ~MediaControlElement() { }
104
105     virtual void setDisplayType(MediaControlElementType);
106     virtual bool isMediaControlElement() const { return true; }
107
108 private:
109     MediaControllerInterface* m_mediaController;
110     MediaControlElementType m_displayType;
111     HTMLElement* m_element;
112 };
113
114 // ----------------------------
115
116 class MediaControlDivElement : public HTMLDivElement, public MediaControlElement {
117 protected:
118     virtual bool isMediaControlElement() const OVERRIDE { return MediaControlElement::isMediaControlElement(); }
119     explicit MediaControlDivElement(Document*, MediaControlElementType);
120 };
121
122 // ----------------------------
123
124 class MediaControlInputElement : public HTMLInputElement, public MediaControlElement {
125 protected:
126     virtual bool isMediaControlElement() const OVERRIDE { return MediaControlElement::isMediaControlElement(); }
127     explicit MediaControlInputElement(Document*, MediaControlElementType);
128
129 private:
130     virtual void updateDisplayType() { }
131 };
132
133 // ----------------------------
134
135 class MediaControlTimeDisplayElement : public MediaControlDivElement {
136 public:
137     void setCurrentValue(float);
138     float currentValue() const { return m_currentValue; }
139
140 protected:
141     explicit MediaControlTimeDisplayElement(Document*, MediaControlElementType);
142
143 private:
144     float m_currentValue;
145 };
146
147 // ----------------------------
148
149 class MediaControlMuteButtonElement : public MediaControlInputElement {
150 public:
151     void changedMute();
152
153     virtual bool willRespondToMouseClickEvents() OVERRIDE { return true; }
154
155 protected:
156     explicit MediaControlMuteButtonElement(Document*, MediaControlElementType);
157
158     virtual void defaultEventHandler(Event*) OVERRIDE;
159
160 private:
161     virtual void updateDisplayType() OVERRIDE;
162 };
163
164 // ----------------------------
165
166 class MediaControlSeekButtonElement : public MediaControlInputElement {
167 public:
168     virtual bool willRespondToMouseClickEvents() OVERRIDE { return true; }
169
170 protected:
171     explicit MediaControlSeekButtonElement(Document*, MediaControlElementType);
172
173     virtual void defaultEventHandler(Event*) OVERRIDE;
174     virtual bool isForwardButton() const = 0;
175
176 private:
177     void setActive(bool /*flag*/ = true, bool /*pause*/ = false);
178
179     void startTimer();
180     void stopTimer();
181     float nextRate() const;
182     void seekTimerFired(Timer<MediaControlSeekButtonElement>*);
183
184     enum ActionType { Nothing, Play, Pause };
185     ActionType m_actionOnStop;
186     enum SeekType { Skip, Scan };
187     SeekType m_seekType;
188     Timer<MediaControlSeekButtonElement> m_seekTimer;
189 };
190
191 // ----------------------------
192
193 class MediaControlVolumeSliderElement : public MediaControlInputElement {
194 public:
195     virtual bool willRespondToMouseMoveEvents() OVERRIDE;
196     virtual bool willRespondToMouseClickEvents() OVERRIDE;
197     void setVolume(float);
198     void setClearMutedOnUserInteraction(bool);
199
200 protected:
201     explicit MediaControlVolumeSliderElement(Document*);
202
203     virtual void defaultEventHandler(Event*) OVERRIDE;
204
205 private:
206     bool m_clearMutedOnUserInteraction;
207 };
208
209 } // namespace WebCore
210
211 #endif // ENABLE(VIDEO)
212
213 #endif // MediaControlElementTypes_h