Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(89)

Side by Side Diff: Source/core/html/shadow/MediaControls.cpp

Issue 291163004: Implement media cast buttons (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Respond to comments Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011, 2012 Apple Inc. All rights reserved. 2 * Copyright (C) 2011, 2012 Apple Inc. All rights reserved.
3 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. 3 * Copyright (C) 2011, 2012 Google Inc. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 , m_textDisplayContainer(nullptr) 52 , m_textDisplayContainer(nullptr)
53 , m_overlayPlayButton(nullptr) 53 , m_overlayPlayButton(nullptr)
54 , m_overlayEnclosure(nullptr) 54 , m_overlayEnclosure(nullptr)
55 , m_playButton(nullptr) 55 , m_playButton(nullptr)
56 , m_currentTimeDisplay(nullptr) 56 , m_currentTimeDisplay(nullptr)
57 , m_timeline(nullptr) 57 , m_timeline(nullptr)
58 , m_muteButton(nullptr) 58 , m_muteButton(nullptr)
59 , m_volumeSlider(nullptr) 59 , m_volumeSlider(nullptr)
60 , m_toggleClosedCaptionsButton(nullptr) 60 , m_toggleClosedCaptionsButton(nullptr)
61 , m_fullScreenButton(nullptr) 61 , m_fullScreenButton(nullptr)
62 , m_castButton(nullptr)
63 , m_overlayCastButton(nullptr)
62 , m_durationDisplay(nullptr) 64 , m_durationDisplay(nullptr)
63 , m_enclosure(nullptr) 65 , m_enclosure(nullptr)
64 , m_hideMediaControlsTimer(this, &MediaControls::hideMediaControlsTimerFired ) 66 , m_hideMediaControlsTimer(this, &MediaControls::hideMediaControlsTimerFired )
65 , m_isMouseOverControls(false) 67 , m_isMouseOverControls(false)
66 , m_isPausedForScrubbing(false) 68 , m_isPausedForScrubbing(false)
67 , m_wasLastEventTouch(false) 69 , m_wasLastEventTouch(false)
68 { 70 {
69 } 71 }
70 72
71 PassRefPtrWillBeRawPtr<MediaControls> MediaControls::create(HTMLMediaElement& me diaElement) 73 PassRefPtrWillBeRawPtr<MediaControls> MediaControls::create(HTMLMediaElement& me diaElement)
72 { 74 {
73 RefPtrWillBeRawPtr<MediaControls> controls = adoptRefWillBeNoop(new MediaCon trols(mediaElement)); 75 RefPtrWillBeRawPtr<MediaControls> controls = adoptRefWillBeNoop(new MediaCon trols(mediaElement));
74 76
75 if (controls->initializeControls()) 77 if (controls->initializeControls())
76 return controls.release(); 78 return controls.release();
77 79
78 return nullptr; 80 return nullptr;
79 } 81 }
80 82
81 bool MediaControls::initializeControls() 83 bool MediaControls::initializeControls()
82 { 84 {
83 TrackExceptionState exceptionState; 85 TrackExceptionState exceptionState;
84 86
87 RefPtrWillBeRawPtr<MediaControlOverlayEnclosureElement> overlayEnclosure = M ediaControlOverlayEnclosureElement::create(*this);
88
85 if (document().settings() && document().settings()->mediaControlsOverlayPlay ButtonEnabled()) { 89 if (document().settings() && document().settings()->mediaControlsOverlayPlay ButtonEnabled()) {
86 RefPtrWillBeRawPtr<MediaControlOverlayEnclosureElement> overlayEnclosure = MediaControlOverlayEnclosureElement::create(*this);
87 RefPtrWillBeRawPtr<MediaControlOverlayPlayButtonElement> overlayPlayButt on = MediaControlOverlayPlayButtonElement::create(*this); 90 RefPtrWillBeRawPtr<MediaControlOverlayPlayButtonElement> overlayPlayButt on = MediaControlOverlayPlayButtonElement::create(*this);
88 m_overlayPlayButton = overlayPlayButton.get(); 91 m_overlayPlayButton = overlayPlayButton.get();
89 overlayEnclosure->appendChild(overlayPlayButton.release(), exceptionStat e); 92 overlayEnclosure->appendChild(overlayPlayButton.release(), exceptionStat e);
90 if (exceptionState.hadException()) 93 if (exceptionState.hadException())
91 return false; 94 return false;
95 }
92 96
93 m_overlayEnclosure = overlayEnclosure.get(); 97 RefPtrWillBeRawPtr<MediaControlCastButtonElement> overlayCastButton = MediaC ontrolCastButtonElement::create(*this, true);
94 appendChild(overlayEnclosure.release(), exceptionState); 98 m_overlayCastButton = overlayCastButton.get();
95 if (exceptionState.hadException()) 99 overlayEnclosure->appendChild(overlayCastButton.release(), exceptionState);
96 return false; 100 if (exceptionState.hadException())
97 } 101 return false;
102
103 m_overlayEnclosure = overlayEnclosure.get();
104 appendChild(overlayEnclosure.release(), exceptionState);
105 if (exceptionState.hadException())
106 return false;
98 107
99 // Create an enclosing element for the panel so we can visually offset the c ontrols correctly. 108 // Create an enclosing element for the panel so we can visually offset the c ontrols correctly.
100 RefPtrWillBeRawPtr<MediaControlPanelEnclosureElement> enclosure = MediaContr olPanelEnclosureElement::create(*this); 109 RefPtrWillBeRawPtr<MediaControlPanelEnclosureElement> enclosure = MediaContr olPanelEnclosureElement::create(*this);
101 110
102 RefPtrWillBeRawPtr<MediaControlPanelElement> panel = MediaControlPanelElemen t::create(*this); 111 RefPtrWillBeRawPtr<MediaControlPanelElement> panel = MediaControlPanelElemen t::create(*this);
103 112
104 RefPtrWillBeRawPtr<MediaControlPlayButtonElement> playButton = MediaControlP layButtonElement::create(*this); 113 RefPtrWillBeRawPtr<MediaControlPlayButtonElement> playButton = MediaControlP layButtonElement::create(*this);
105 m_playButton = playButton.get(); 114 m_playButton = playButton.get();
106 panel->appendChild(playButton.release(), exceptionState); 115 panel->appendChild(playButton.release(), exceptionState);
107 if (exceptionState.hadException()) 116 if (exceptionState.hadException())
(...skipping 29 matching lines...) Expand all
137 panel->appendChild(slider.release(), exceptionState); 146 panel->appendChild(slider.release(), exceptionState);
138 if (exceptionState.hadException()) 147 if (exceptionState.hadException())
139 return false; 148 return false;
140 149
141 RefPtrWillBeRawPtr<MediaControlToggleClosedCaptionsButtonElement> toggleClos edCaptionsButton = MediaControlToggleClosedCaptionsButtonElement::create(*this); 150 RefPtrWillBeRawPtr<MediaControlToggleClosedCaptionsButtonElement> toggleClos edCaptionsButton = MediaControlToggleClosedCaptionsButtonElement::create(*this);
142 m_toggleClosedCaptionsButton = toggleClosedCaptionsButton.get(); 151 m_toggleClosedCaptionsButton = toggleClosedCaptionsButton.get();
143 panel->appendChild(toggleClosedCaptionsButton.release(), exceptionState); 152 panel->appendChild(toggleClosedCaptionsButton.release(), exceptionState);
144 if (exceptionState.hadException()) 153 if (exceptionState.hadException())
145 return false; 154 return false;
146 155
156 RefPtrWillBeRawPtr<MediaControlCastButtonElement> castButton = MediaControlC astButtonElement::create(*this, false);
157 m_castButton = castButton.get();
158 panel->appendChild(castButton.release(), exceptionState);
159 if (exceptionState.hadException())
160 return false;
161
147 RefPtrWillBeRawPtr<MediaControlFullscreenButtonElement> fullscreenButton = M ediaControlFullscreenButtonElement::create(*this); 162 RefPtrWillBeRawPtr<MediaControlFullscreenButtonElement> fullscreenButton = M ediaControlFullscreenButtonElement::create(*this);
148 m_fullScreenButton = fullscreenButton.get(); 163 m_fullScreenButton = fullscreenButton.get();
149 panel->appendChild(fullscreenButton.release(), exceptionState); 164 panel->appendChild(fullscreenButton.release(), exceptionState);
150 if (exceptionState.hadException()) 165 if (exceptionState.hadException())
151 return false; 166 return false;
152 167
153 m_panel = panel.get(); 168 m_panel = panel.get();
154 enclosure->appendChild(panel.release(), exceptionState); 169 enclosure->appendChild(panel.release(), exceptionState);
155 if (exceptionState.hadException()) 170 if (exceptionState.hadException())
156 return false; 171 return false;
(...skipping 25 matching lines...) Expand all
182 m_volumeSlider->show(); 197 m_volumeSlider->show();
183 updateVolume(); 198 updateVolume();
184 199
185 refreshClosedCaptionsButtonVisibility(); 200 refreshClosedCaptionsButtonVisibility();
186 201
187 if (mediaElement().hasVideo() && fullscreenIsSupported(document())) 202 if (mediaElement().hasVideo() && fullscreenIsSupported(document()))
188 m_fullScreenButton->show(); 203 m_fullScreenButton->show();
189 else 204 else
190 m_fullScreenButton->hide(); 205 m_fullScreenButton->hide();
191 206
207 refreshCastButtonVisibility();
192 makeOpaque(); 208 makeOpaque();
193 } 209 }
194 210
195 void MediaControls::show() 211 void MediaControls::show()
196 { 212 {
197 makeOpaque(); 213 makeOpaque();
198 m_panel->setIsDisplayed(true); 214 m_panel->setIsDisplayed(true);
199 m_panel->show(); 215 m_panel->show();
200 if (m_overlayPlayButton) 216 if (m_overlayPlayButton)
201 m_overlayPlayButton->updateDisplayType(); 217 m_overlayPlayButton->updateDisplayType();
202 } 218 }
203 219
204 void MediaControls::mediaElementFocused() 220 void MediaControls::mediaElementFocused()
205 { 221 {
206 show(); 222 show();
207 stopHideMediaControlsTimer(); 223 resetHideMediaControlsTimer();
208 } 224 }
209 225
210 void MediaControls::hide() 226 void MediaControls::hide()
211 { 227 {
212 m_panel->setIsDisplayed(false); 228 m_panel->setIsDisplayed(false);
213 m_panel->hide(); 229 m_panel->hide();
214 if (m_overlayPlayButton) 230 if (m_overlayPlayButton)
215 m_overlayPlayButton->hide(); 231 m_overlayPlayButton->hide();
216 } 232 }
217 233
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
344 m_toggleClosedCaptionsButton->show(); 360 m_toggleClosedCaptionsButton->show();
345 else 361 else
346 m_toggleClosedCaptionsButton->hide(); 362 m_toggleClosedCaptionsButton->hide();
347 } 363 }
348 364
349 void MediaControls::textTracksChanged() 365 void MediaControls::textTracksChanged()
350 { 366 {
351 refreshClosedCaptionsButtonVisibility(); 367 refreshClosedCaptionsButtonVisibility();
352 } 368 }
353 369
370 void MediaControls::refreshCastButtonVisibility()
371 {
372 if (mediaElement().hasRemoteRoutes()) {
373 if (!mediaElement().shouldShowControls() && !mediaElement().autoplay() & & mediaElement().paused()) {
acolwell GONE FROM CHROMIUM 2014/09/10 23:35:23 nit: Please add a comment about why the autoplay c
aberent 2014/09/11 16:38:19 Done.
374 showOverlayCastButton();
375 } else if (mediaElement().shouldShowControls()) {
376 m_overlayCastButton->hide();
377 m_castButton->show();
378 }
379 } else {
380 m_castButton->hide();
381 m_overlayCastButton->hide();
382 }
383 }
384
385 void MediaControls::showOverlayCastButton()
386 {
387 m_overlayCastButton->show();
388 resetHideMediaControlsTimer();
389 }
390
354 void MediaControls::enteredFullscreen() 391 void MediaControls::enteredFullscreen()
355 { 392 {
356 m_fullScreenButton->setIsFullscreen(true); 393 m_fullScreenButton->setIsFullscreen(true);
357 stopHideMediaControlsTimer(); 394 stopHideMediaControlsTimer();
358 startHideMediaControlsTimer(); 395 startHideMediaControlsTimer();
359 } 396 }
360 397
361 void MediaControls::exitedFullscreen() 398 void MediaControls::exitedFullscreen()
362 { 399 {
363 m_fullScreenButton->setIsFullscreen(false); 400 m_fullScreenButton->setIsFullscreen(false);
364 stopHideMediaControlsTimer(); 401 stopHideMediaControlsTimer();
365 startHideMediaControlsTimer(); 402 startHideMediaControlsTimer();
366 } 403 }
367 404
405 void MediaControls::startedCasting()
406 {
407 m_castButton->setIsPlayingRemotely(true);
408 m_overlayCastButton->setIsPlayingRemotely(true);
409 }
410
411 void MediaControls::stoppedCasting()
412 {
413 m_castButton->setIsPlayingRemotely(false);
414 m_overlayCastButton->setIsPlayingRemotely(false);
415 }
416
368 void MediaControls::defaultEventHandler(Event* event) 417 void MediaControls::defaultEventHandler(Event* event)
369 { 418 {
370 HTMLDivElement::defaultEventHandler(event); 419 HTMLDivElement::defaultEventHandler(event);
371 m_wasLastEventTouch = event->isTouchEvent() || event->isGestureEvent() 420 m_wasLastEventTouch = event->isTouchEvent() || event->isGestureEvent()
372 || (event->isMouseEvent() && toMouseEvent(event)->fromTouch()); 421 || (event->isMouseEvent() && toMouseEvent(event)->fromTouch());
373 422
374 if (event->type() == EventTypeNames::mouseover) { 423 if (event->type() == EventTypeNames::mouseover) {
375 if (!containsRelatedTarget(event)) { 424 if (!containsRelatedTarget(event)) {
376 m_isMouseOverControls = true; 425 m_isMouseOverControls = true;
377 if (!mediaElement().togglePlayStateWillPlay()) { 426 if (!mediaElement().togglePlayStateWillPlay()) {
(...skipping 29 matching lines...) Expand all
407 return; 456 return;
408 457
409 unsigned behaviorFlags = IgnoreFocus | IgnoreVideoHover; 458 unsigned behaviorFlags = IgnoreFocus | IgnoreVideoHover;
410 if (m_wasLastEventTouch) { 459 if (m_wasLastEventTouch) {
411 behaviorFlags |= IgnoreControlsHover; 460 behaviorFlags |= IgnoreControlsHover;
412 } 461 }
413 if (!shouldHideMediaControls(behaviorFlags)) 462 if (!shouldHideMediaControls(behaviorFlags))
414 return; 463 return;
415 464
416 makeTransparent(); 465 makeTransparent();
466 m_overlayCastButton->hide();
417 } 467 }
418 468
419 void MediaControls::startHideMediaControlsTimer() 469 void MediaControls::startHideMediaControlsTimer()
420 { 470 {
421 m_hideMediaControlsTimer.startOneShot(timeWithoutMouseMovementBeforeHidingMe diaControls, FROM_HERE); 471 m_hideMediaControlsTimer.startOneShot(timeWithoutMouseMovementBeforeHidingMe diaControls, FROM_HERE);
422 } 472 }
423 473
424 void MediaControls::stopHideMediaControlsTimer() 474 void MediaControls::stopHideMediaControlsTimer()
425 { 475 {
426 m_hideMediaControlsTimer.stop(); 476 m_hideMediaControlsTimer.stop();
427 } 477 }
428 478
479 void MediaControls::resetHideMediaControlsTimer()
480 {
481 stopHideMediaControlsTimer();
482 if (!mediaElement().paused())
483 startHideMediaControlsTimer();
484 }
485
486
429 const AtomicString& MediaControls::shadowPseudoId() const 487 const AtomicString& MediaControls::shadowPseudoId() const
430 { 488 {
431 DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls")); 489 DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls"));
432 return id; 490 return id;
433 } 491 }
434 492
435 bool MediaControls::containsRelatedTarget(Event* event) 493 bool MediaControls::containsRelatedTarget(Event* event)
436 { 494 {
437 if (!event->isMouseEvent()) 495 if (!event->isMouseEvent())
438 return false; 496 return false;
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
492 visitor->trace(m_muteButton); 550 visitor->trace(m_muteButton);
493 visitor->trace(m_volumeSlider); 551 visitor->trace(m_volumeSlider);
494 visitor->trace(m_toggleClosedCaptionsButton); 552 visitor->trace(m_toggleClosedCaptionsButton);
495 visitor->trace(m_fullScreenButton); 553 visitor->trace(m_fullScreenButton);
496 visitor->trace(m_durationDisplay); 554 visitor->trace(m_durationDisplay);
497 visitor->trace(m_enclosure); 555 visitor->trace(m_enclosure);
498 HTMLDivElement::trace(visitor); 556 HTMLDivElement::trace(visitor);
499 } 557 }
500 558
501 } 559 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698