de855da4971122a636fbe088207fd788e6da4406
[WebKit-https.git] / Source / WebCore / html / shadow / MediaControlElements.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 MediaControlElements_h
31 #define MediaControlElements_h
32
33 #if ENABLE(VIDEO)
34 #include "MediaControlElementTypes.h"
35 #include "TextTrackRepresentation.h"
36
37 namespace WebCore {
38
39 // ----------------------------
40
41 class MediaControlPanelElement FINAL : public MediaControlDivElement {
42 public:
43     static PassRefPtr<MediaControlPanelElement> create(Document&);
44
45     void setCanBeDragged(bool);
46     void setIsDisplayed(bool);
47
48     void resetPosition();
49     void makeOpaque();
50     void makeTransparent();
51
52 #if !PLATFORM(IOS)
53     virtual bool willRespondToMouseMoveEvents() OVERRIDE { return true; }
54     virtual bool willRespondToMouseClickEvents() OVERRIDE { return true; }
55 #endif
56
57 private:
58     explicit MediaControlPanelElement(Document&);
59
60     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
61     virtual void defaultEventHandler(Event*) OVERRIDE;
62
63     void startDrag(const LayoutPoint& eventLocation);
64     void continueDrag(const LayoutPoint& eventLocation);
65     void endDrag();
66
67     void startTimer();
68     void stopTimer();
69     void transitionTimerFired(Timer<MediaControlPanelElement>*);
70
71     void setPosition(const LayoutPoint&);
72
73     bool m_canBeDragged;
74     bool m_isBeingDragged;
75     bool m_isDisplayed;
76     bool m_opaque;
77     LayoutPoint m_lastDragEventLocation;
78     LayoutPoint m_cumulativeDragOffset;
79
80     Timer<MediaControlPanelElement> m_transitionTimer;
81 };
82
83 // ----------------------------
84
85 class MediaControlPanelEnclosureElement FINAL : public MediaControlDivElement {
86 public:
87     static PassRefPtr<MediaControlPanelEnclosureElement> create(Document&);
88
89 private:
90     explicit MediaControlPanelEnclosureElement(Document&);
91     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
92 };
93
94 // ----------------------------
95
96 class MediaControlOverlayEnclosureElement FINAL : public MediaControlDivElement {
97 public:
98     static PassRefPtr<MediaControlOverlayEnclosureElement> create(Document&);
99
100 private:
101     explicit MediaControlOverlayEnclosureElement(Document&);
102     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
103 };
104
105 // ----------------------------
106
107 class MediaControlTimelineContainerElement : public MediaControlDivElement {
108 public:
109     static PassRefPtr<MediaControlTimelineContainerElement> create(Document&);
110
111     void setTimeDisplaysHidden(bool);
112
113 private:
114     explicit MediaControlTimelineContainerElement(Document&);
115     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
116
117     virtual RenderPtr<RenderElement> createElementRenderer(PassRef<RenderStyle>) OVERRIDE;
118 };
119
120 // ----------------------------
121
122 class MediaControlVolumeSliderContainerElement : public MediaControlDivElement {
123 public:
124     static PassRefPtr<MediaControlVolumeSliderContainerElement> create(Document&);
125
126 #if !PLATFORM(IOS)
127     virtual bool willRespondToMouseMoveEvents() OVERRIDE { return true; }
128 #endif
129
130 private:
131     explicit MediaControlVolumeSliderContainerElement(Document&);
132
133     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
134     virtual void defaultEventHandler(Event*) OVERRIDE;
135
136     virtual RenderPtr<RenderElement> createElementRenderer(PassRef<RenderStyle>) OVERRIDE;
137 };
138
139 // ----------------------------
140
141 class MediaControlStatusDisplayElement : public MediaControlDivElement {
142 public:
143     static PassRefPtr<MediaControlStatusDisplayElement> create(Document&);
144
145     void update();
146
147 private:
148     explicit MediaControlStatusDisplayElement(Document&);
149     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
150
151     enum StateBeingDisplayed { Nothing, Loading, LiveBroadcast };
152     StateBeingDisplayed m_stateBeingDisplayed;
153 };
154
155 // ----------------------------
156
157 class MediaControlPanelMuteButtonElement FINAL : public MediaControlMuteButtonElement {
158 public:
159     static PassRefPtr<MediaControlPanelMuteButtonElement> create(Document&, MediaControls*);
160
161 #if !PLATFORM(IOS)
162     virtual bool willRespondToMouseMoveEvents() OVERRIDE { return true; }
163 #endif
164
165 private:
166     explicit MediaControlPanelMuteButtonElement(Document&, MediaControls*);
167
168     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
169     virtual void defaultEventHandler(Event*) OVERRIDE;
170
171     MediaControls* m_controls;
172 };
173
174 // ----------------------------
175
176 class MediaControlVolumeSliderMuteButtonElement FINAL : public MediaControlMuteButtonElement {
177 public:
178     static PassRefPtr<MediaControlVolumeSliderMuteButtonElement> create(Document&);
179
180 private:
181     explicit MediaControlVolumeSliderMuteButtonElement(Document&);
182     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
183 };
184
185
186 // ----------------------------
187
188 class MediaControlPlayButtonElement FINAL : public MediaControlInputElement {
189 public:
190     static PassRefPtr<MediaControlPlayButtonElement> create(Document&);
191
192 #if !PLATFORM(IOS)
193     virtual bool willRespondToMouseClickEvents() OVERRIDE { return true; }
194 #endif
195
196     virtual void updateDisplayType() OVERRIDE;
197
198 private:
199     explicit MediaControlPlayButtonElement(Document&);
200
201     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
202     virtual void defaultEventHandler(Event*) OVERRIDE;
203 };
204
205 // ----------------------------
206
207 class MediaControlOverlayPlayButtonElement FINAL : public MediaControlInputElement {
208 public:
209     static PassRefPtr<MediaControlOverlayPlayButtonElement> create(Document&);
210
211     virtual void updateDisplayType() OVERRIDE;
212
213 private:
214     explicit MediaControlOverlayPlayButtonElement(Document&);
215
216     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
217     virtual void defaultEventHandler(Event*) OVERRIDE;
218 };
219
220 // ----------------------------
221
222 class MediaControlSeekForwardButtonElement : public MediaControlSeekButtonElement {
223 public:
224     static PassRefPtr<MediaControlSeekForwardButtonElement> create(Document&);
225
226 private:
227     explicit MediaControlSeekForwardButtonElement(Document&);
228     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
229
230     virtual bool isForwardButton() const OVERRIDE { return true; }
231 };
232
233 // ----------------------------
234
235 class MediaControlSeekBackButtonElement : public MediaControlSeekButtonElement {
236 public:
237     static PassRefPtr<MediaControlSeekBackButtonElement> create(Document&);
238
239 private:
240     explicit MediaControlSeekBackButtonElement(Document&);
241     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
242
243     virtual bool isForwardButton() const OVERRIDE { return false; }
244 };
245
246 // ----------------------------
247
248 class MediaControlRewindButtonElement : public MediaControlInputElement {
249 public:
250     static PassRefPtr<MediaControlRewindButtonElement> create(Document&);
251
252 #if !PLATFORM(IOS)
253     virtual bool willRespondToMouseClickEvents() OVERRIDE { return true; }
254 #endif
255
256 private:
257     explicit MediaControlRewindButtonElement(Document&);
258
259     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
260     virtual void defaultEventHandler(Event*) OVERRIDE;
261 };
262
263 // ----------------------------
264
265 class MediaControlReturnToRealtimeButtonElement : public MediaControlInputElement {
266 public:
267     static PassRefPtr<MediaControlReturnToRealtimeButtonElement> create(Document&);
268
269 #if !PLATFORM(IOS)
270     virtual bool willRespondToMouseClickEvents() OVERRIDE { return true; }
271 #endif
272
273 private:
274     explicit MediaControlReturnToRealtimeButtonElement(Document&);
275
276     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
277     virtual void defaultEventHandler(Event*) OVERRIDE;
278 };
279
280 // ----------------------------
281
282 class MediaControlToggleClosedCaptionsButtonElement FINAL : public MediaControlInputElement {
283 public:
284     static PassRefPtr<MediaControlToggleClosedCaptionsButtonElement> create(Document&, MediaControls*);
285
286 #if !PLATFORM(IOS)
287     virtual bool willRespondToMouseClickEvents() OVERRIDE { return true; }
288 #endif
289
290     virtual void updateDisplayType() OVERRIDE;
291
292 private:
293     explicit MediaControlToggleClosedCaptionsButtonElement(Document&, MediaControls*);
294
295     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
296     virtual void defaultEventHandler(Event*) OVERRIDE;
297
298 #if PLATFORM(MAC) || PLATFORM(WIN) || PLATFORM(GTK)
299     MediaControls* m_controls;
300 #endif
301 };
302
303 // ----------------------------
304
305 class MediaControlClosedCaptionsContainerElement FINAL : public MediaControlDivElement {
306 public:
307     static PassRefPtr<MediaControlClosedCaptionsContainerElement> create(Document&);
308
309 #if !PLATFORM(IOS)
310     virtual bool willRespondToMouseClickEvents() OVERRIDE { return true; }
311 #endif
312
313 private:
314     MediaControlClosedCaptionsContainerElement(Document&);
315     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
316 };
317
318 // ----------------------------
319
320 class MediaControlClosedCaptionsTrackListElement FINAL : public MediaControlDivElement {
321 public:
322     static PassRefPtr<MediaControlClosedCaptionsTrackListElement> create(Document&, MediaControls*);
323
324 #if !PLATFORM(IOS)
325     virtual bool willRespondToMouseClickEvents() OVERRIDE { return true; }
326 #endif
327
328     void updateDisplay();
329
330 private:
331     MediaControlClosedCaptionsTrackListElement(Document&, MediaControls*);
332
333     void rebuildTrackListMenu();
334
335     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
336     virtual void defaultEventHandler(Event*) OVERRIDE;
337
338     typedef Vector<RefPtr<Element>> TrackMenuItems;
339     TrackMenuItems m_menuItems;
340 #if ENABLE(VIDEO_TRACK)
341     typedef HashMap<RefPtr<Element>, RefPtr<TextTrack>> MenuItemToTrackMap;
342     MenuItemToTrackMap m_menuToTrackMap;
343 #endif
344     MediaControls* m_controls;
345 };
346
347 // ----------------------------
348
349 class MediaControlTimelineElement FINAL : public MediaControlInputElement {
350 public:
351     static PassRefPtr<MediaControlTimelineElement> create(Document&, MediaControls*);
352
353 #if !PLATFORM(IOS)
354     virtual bool willRespondToMouseClickEvents() OVERRIDE;
355 #endif
356
357     void setPosition(double);
358     void setDuration(double);
359
360 private:
361     explicit MediaControlTimelineElement(Document&, MediaControls*);
362
363     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
364     virtual void defaultEventHandler(Event*) OVERRIDE;
365
366     MediaControls* m_controls;
367 };
368
369 // ----------------------------
370
371 class MediaControlFullscreenButtonElement FINAL : public MediaControlInputElement {
372 public:
373     static PassRefPtr<MediaControlFullscreenButtonElement> create(Document&);
374
375 #if !PLATFORM(IOS)
376     virtual bool willRespondToMouseClickEvents() OVERRIDE { return true; }
377 #endif
378
379     virtual void setIsFullscreen(bool);
380
381 private:
382     explicit MediaControlFullscreenButtonElement(Document&);
383
384     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
385     virtual void defaultEventHandler(Event*) OVERRIDE;
386 };
387
388 // ----------------------------
389
390 class MediaControlPanelVolumeSliderElement FINAL : public MediaControlVolumeSliderElement {
391 public:
392     static PassRefPtr<MediaControlPanelVolumeSliderElement> create(Document&);
393
394 private:
395     explicit MediaControlPanelVolumeSliderElement(Document&);
396     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
397 };
398 // ----------------------------
399
400 class MediaControlFullscreenVolumeSliderElement : public MediaControlVolumeSliderElement {
401 public:
402     static PassRefPtr<MediaControlFullscreenVolumeSliderElement> create(Document&);
403
404 private:
405     explicit MediaControlFullscreenVolumeSliderElement(Document&);
406     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
407 };
408
409 // ----------------------------
410
411 class MediaControlFullscreenVolumeMinButtonElement : public MediaControlInputElement {
412 public:
413     static PassRefPtr<MediaControlFullscreenVolumeMinButtonElement> create(Document&);
414
415 #if !PLATFORM(IOS)
416     virtual bool willRespondToMouseClickEvents() OVERRIDE { return true; }
417 #endif
418
419 private:
420     explicit MediaControlFullscreenVolumeMinButtonElement(Document&);
421     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
422     virtual void defaultEventHandler(Event*) OVERRIDE;
423 };
424
425 // ----------------------------
426
427 class MediaControlFullscreenVolumeMaxButtonElement : public MediaControlInputElement {
428 public:
429     static PassRefPtr<MediaControlFullscreenVolumeMaxButtonElement> create(Document&);
430
431 #if !PLATFORM(IOS)
432     virtual bool willRespondToMouseClickEvents() OVERRIDE { return true; }
433 #endif
434
435 private:
436     explicit MediaControlFullscreenVolumeMaxButtonElement(Document&);
437
438     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
439     virtual void defaultEventHandler(Event*) OVERRIDE;
440 };
441
442
443 // ----------------------------
444
445 class MediaControlTimeRemainingDisplayElement FINAL : public MediaControlTimeDisplayElement {
446 public:
447     static PassRefPtr<MediaControlTimeRemainingDisplayElement> create(Document&);
448
449 private:
450     explicit MediaControlTimeRemainingDisplayElement(Document&);
451     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
452 };
453
454 // ----------------------------
455
456 class MediaControlCurrentTimeDisplayElement FINAL : public MediaControlTimeDisplayElement {
457 public:
458     static PassRefPtr<MediaControlCurrentTimeDisplayElement> create(Document&);
459
460 private:
461     explicit MediaControlCurrentTimeDisplayElement(Document&);
462     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
463 };
464
465 // ----------------------------
466
467 #if ENABLE(VIDEO_TRACK)
468
469 class MediaControlTextTrackContainerElement FINAL : public MediaControlDivElement, public TextTrackRepresentationClient {
470 public:
471     static PassRefPtr<MediaControlTextTrackContainerElement> create(Document&);
472
473     void updateDisplay();
474     void updateSizes(bool forceUpdate = false);
475     void enteredFullscreen();
476     void exitedFullscreen();
477     static const AtomicString& textTrackContainerElementShadowPseudoId();
478
479 private:
480     void updateTimerFired(Timer<MediaControlTextTrackContainerElement>*);
481
482     explicit MediaControlTextTrackContainerElement(Document&);
483     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
484
485     virtual RenderPtr<RenderElement> createElementRenderer(PassRef<RenderStyle>) OVERRIDE;
486
487     virtual PassRefPtr<Image> createTextTrackRepresentationImage() OVERRIDE;
488     virtual void textTrackRepresentationBoundsChanged(const IntRect&) OVERRIDE;
489     void clearTextTrackRepresentation();
490     OwnPtr<TextTrackRepresentation> m_textTrackRepresentation;
491
492     Timer<MediaControlTextTrackContainerElement> m_updateTimer;
493     IntRect m_videoDisplaySize;
494     int m_fontSize;
495     bool m_fontSizeIsImportant;
496 };
497
498 #endif
499
500 } // namespace WebCore
501
502 #endif // ENABLE(VIDEO)
503
504 #endif // MediaControlElements_h