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

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

Issue 1156993013: New media playback UI. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fixed tests (thanks, trybots!) and duration display. Created 5 years, 6 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 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 // The media controls DOM structure looks like: 82 // The media controls DOM structure looks like:
83 // 83 //
84 // MediaControls (-webkit-media-controls) 84 // MediaControls (-webkit-media-controls)
85 // +-MediaControlOverlayEnclosureElement (-webkit-media-controls-o verlay-enclosure) 85 // +-MediaControlOverlayEnclosureElement (-webkit-media-controls-o verlay-enclosure)
86 // | +-MediaControlOverlayPlayButtonElement (-webkit-media-controls-o verlay-play-button) 86 // | +-MediaControlOverlayPlayButtonElement (-webkit-media-controls-o verlay-play-button)
87 // | | {if mediaControlsOverlayPlayButtonEnabled} 87 // | | {if mediaControlsOverlayPlayButtonEnabled}
88 // | \-MediaControlCastButtonElement (-internal-media-controls -overlay-cast-button) 88 // | \-MediaControlCastButtonElement (-internal-media-controls -overlay-cast-button)
89 // \-MediaControlPanelEnclosureElement (-webkit-media-controls-e nclosure) 89 // \-MediaControlPanelEnclosureElement (-webkit-media-controls-e nclosure)
90 // \-MediaControlPanelElement (-webkit-media-controls-p anel) 90 // \-MediaControlPanelElement (-webkit-media-controls-p anel)
91 // +-MediaControlPlayButtonElement (-webkit-media-controls-p lay-button) 91 // +-MediaControlPlayButtonElement (-webkit-media-controls-p lay-button)
92 // +-MediaControlTimelineElement (-webkit-media-controls-t imeline)
93 // +-MediaControlCurrentTimeDisplayElement (-webkit-media-controls-c urrent-time-display) 92 // +-MediaControlCurrentTimeDisplayElement (-webkit-media-controls-c urrent-time-display)
94 // +-MediaControlTimeRemainingDisplayElement (-webkit-media-controls-t ime-remaining-display) 93 // +-MediaControlTimeRemainingDisplayElement (-webkit-media-controls-t ime-remaining-display)
94 // +-MediaControlTimelineElement (-webkit-media-controls-t imeline)
95 // +-MediaControlMuteButtonElement (-webkit-media-controls-m ute-button) 95 // +-MediaControlMuteButtonElement (-webkit-media-controls-m ute-button)
96 // +-MediaControlVolumeSliderElement (-webkit-media-controls-v olume-slider) 96 // +-MediaControlVolumeSliderElement (-webkit-media-controls-v olume-slider)
97 // +-MediaControlToggleClosedCaptionsButtonElement (-webkit-media-controls-t oggle-closed-captions-button) 97 // +-MediaControlToggleClosedCaptionsButtonElement (-webkit-media-controls-t oggle-closed-captions-button)
98 // +-MediaControlCastButtonElement (-internal-media-controls -cast-button) 98 // +-MediaControlCastButtonElement (-internal-media-controls -cast-button)
99 // \-MediaControlFullscreenButtonElement (-webkit-media-controls-f ullscreen-button) 99 // \-MediaControlFullscreenButtonElement (-webkit-media-controls-f ullscreen-button)
100 void MediaControls::initializeControls() 100 void MediaControls::initializeControls()
101 { 101 {
102 RefPtrWillBeRawPtr<MediaControlOverlayEnclosureElement> overlayEnclosure = M ediaControlOverlayEnclosureElement::create(*this); 102 RefPtrWillBeRawPtr<MediaControlOverlayEnclosureElement> overlayEnclosure = M ediaControlOverlayEnclosureElement::create(*this);
103 103
104 if (document().settings() && document().settings()->mediaControlsOverlayPlay ButtonEnabled()) { 104 if (document().settings() && document().settings()->mediaControlsOverlayPlay ButtonEnabled()) {
(...skipping 13 matching lines...) Expand all
118 RefPtrWillBeRawPtr<MediaControlPanelEnclosureElement> enclosure = MediaContr olPanelEnclosureElement::create(*this); 118 RefPtrWillBeRawPtr<MediaControlPanelEnclosureElement> enclosure = MediaContr olPanelEnclosureElement::create(*this);
119 119
120 RefPtrWillBeRawPtr<MediaControlPanelElement> panel = MediaControlPanelElemen t::create(*this); 120 RefPtrWillBeRawPtr<MediaControlPanelElement> panel = MediaControlPanelElemen t::create(*this);
121 121
122 RefPtrWillBeRawPtr<MediaControlPlayButtonElement> playButton = MediaControlP layButtonElement::create(*this); 122 RefPtrWillBeRawPtr<MediaControlPlayButtonElement> playButton = MediaControlP layButtonElement::create(*this);
123 m_playButton = playButton.get(); 123 m_playButton = playButton.get();
124 panel->appendChild(playButton.release()); 124 panel->appendChild(playButton.release());
125 125
126 RefPtrWillBeRawPtr<MediaControlTimelineElement> timeline = MediaControlTimel ineElement::create(*this); 126 RefPtrWillBeRawPtr<MediaControlTimelineElement> timeline = MediaControlTimel ineElement::create(*this);
127 m_timeline = timeline.get(); 127 m_timeline = timeline.get();
128 panel->appendChild(timeline.release()); 128 // In old UX, timeline is before the time / duration text.
129 if (!RuntimeEnabledFeatures::newMediaPlaybackUiEnabled())
130 panel->appendChild(timeline.release());
131 // else we will attach it later.
129 132
130 RefPtrWillBeRawPtr<MediaControlCurrentTimeDisplayElement> currentTimeDisplay = MediaControlCurrentTimeDisplayElement::create(*this); 133 RefPtrWillBeRawPtr<MediaControlCurrentTimeDisplayElement> currentTimeDisplay = MediaControlCurrentTimeDisplayElement::create(*this);
131 m_currentTimeDisplay = currentTimeDisplay.get(); 134 m_currentTimeDisplay = currentTimeDisplay.get();
132 m_currentTimeDisplay->hide(); 135 if (!RuntimeEnabledFeatures::newMediaPlaybackUiEnabled())
136 m_currentTimeDisplay->hide();
137
133 panel->appendChild(currentTimeDisplay.release()); 138 panel->appendChild(currentTimeDisplay.release());
134 139
135 RefPtrWillBeRawPtr<MediaControlTimeRemainingDisplayElement> durationDisplay = MediaControlTimeRemainingDisplayElement::create(*this); 140 RefPtrWillBeRawPtr<MediaControlTimeRemainingDisplayElement> durationDisplay = MediaControlTimeRemainingDisplayElement::create(*this);
136 m_durationDisplay = durationDisplay.get(); 141 m_durationDisplay = durationDisplay.get();
137 panel->appendChild(durationDisplay.release()); 142 panel->appendChild(durationDisplay.release());
138 143
144 // In new UX, timeline is after the time / duration text.
145 if (RuntimeEnabledFeatures::newMediaPlaybackUiEnabled())
146 panel->appendChild(timeline.release());
147
139 RefPtrWillBeRawPtr<MediaControlMuteButtonElement> muteButton = MediaControlM uteButtonElement::create(*this); 148 RefPtrWillBeRawPtr<MediaControlMuteButtonElement> muteButton = MediaControlM uteButtonElement::create(*this);
140 m_muteButton = muteButton.get(); 149 m_muteButton = muteButton.get();
141 panel->appendChild(muteButton.release()); 150 panel->appendChild(muteButton.release());
151 #if OS(ANDROID)
DaleCurtis 2015/06/11 00:54:29 Seems like this should be more a function of viewp
liberato (no reviews please) 2015/06/11 01:06:52 it's part of the spec -- hide this on android, sin
152 if (RuntimeEnabledFeatures::newMediaPlaybackUiEnabled())
153 m_muteButton->hide();
154 #endif
142 155
143 RefPtrWillBeRawPtr<MediaControlVolumeSliderElement> slider = MediaControlVol umeSliderElement::create(*this); 156 RefPtrWillBeRawPtr<MediaControlVolumeSliderElement> slider = MediaControlVol umeSliderElement::create(*this);
144 m_volumeSlider = slider.get(); 157 m_volumeSlider = slider.get();
145 panel->appendChild(slider.release()); 158 panel->appendChild(slider.release());
159 #if OS(ANDROID)
160 if (RuntimeEnabledFeatures::newMediaPlaybackUiEnabled())
161 m_volumeSlider->hide();
162 #endif
146 163
147 RefPtrWillBeRawPtr<MediaControlToggleClosedCaptionsButtonElement> toggleClos edCaptionsButton = MediaControlToggleClosedCaptionsButtonElement::create(*this); 164 RefPtrWillBeRawPtr<MediaControlToggleClosedCaptionsButtonElement> toggleClos edCaptionsButton = MediaControlToggleClosedCaptionsButtonElement::create(*this);
148 m_toggleClosedCaptionsButton = toggleClosedCaptionsButton.get(); 165 m_toggleClosedCaptionsButton = toggleClosedCaptionsButton.get();
149 panel->appendChild(toggleClosedCaptionsButton.release()); 166 panel->appendChild(toggleClosedCaptionsButton.release());
150 167
151 RefPtrWillBeRawPtr<MediaControlCastButtonElement> castButton = MediaControlC astButtonElement::create(*this, false); 168 RefPtrWillBeRawPtr<MediaControlCastButtonElement> castButton = MediaControlC astButtonElement::create(*this, false);
152 m_castButton = castButton.get(); 169 m_castButton = castButton.get();
153 panel->appendChild(castButton.release()); 170 panel->appendChild(castButton.release());
154 171
155 RefPtrWillBeRawPtr<MediaControlFullscreenButtonElement> fullscreenButton = M ediaControlFullscreenButtonElement::create(*this); 172 RefPtrWillBeRawPtr<MediaControlFullscreenButtonElement> fullscreenButton = M ediaControlFullscreenButtonElement::create(*this);
156 m_fullScreenButton = fullscreenButton.get(); 173 m_fullScreenButton = fullscreenButton.get();
157 panel->appendChild(fullscreenButton.release()); 174 panel->appendChild(fullscreenButton.release());
158 175
159 m_panel = panel.get(); 176 m_panel = panel.get();
160 enclosure->appendChild(panel.release()); 177 enclosure->appendChild(panel.release());
161 178
162 m_enclosure = enclosure.get(); 179 m_enclosure = enclosure.get();
163 appendChild(enclosure.release()); 180 appendChild(enclosure.release());
164 } 181 }
165 182
166 void MediaControls::reset() 183 void MediaControls::reset()
167 { 184 {
168 double duration = mediaElement().duration(); 185 double duration = mediaElement().duration();
169 m_durationDisplay->setInnerText(LayoutTheme::theme().formatMediaControlsTime (duration), ASSERT_NO_EXCEPTION); 186 m_durationDisplay->setInnerText(LayoutTheme::theme().formatMediaControlsTime (duration), ASSERT_NO_EXCEPTION);
170 m_durationDisplay->setCurrentValue(duration); 187 m_durationDisplay->setCurrentValue(duration);
171 188
189 if (RuntimeEnabledFeatures::newMediaPlaybackUiEnabled()) {
190 // Show everything that we might hide.
191 // If we don't have a duration, then hide it.
192 if (std::isfinite(duration))
193 m_durationDisplay->show();
194 else
195 m_durationDisplay->hide();
196 m_currentTimeDisplay->show();
197 m_timeline->show();
198 }
199
172 updatePlayState(); 200 updatePlayState();
173 201
174 updateCurrentTimeDisplay(); 202 updateCurrentTimeDisplay();
175 203
176 m_timeline->setDuration(duration); 204 m_timeline->setDuration(duration);
177 m_timeline->setPosition(mediaElement().currentTime()); 205 m_timeline->setPosition(mediaElement().currentTime());
178 206
179 if (!mediaElement().hasAudio()) 207 if (!mediaElement().hasAudio()) {
180 m_volumeSlider->hide(); 208 m_volumeSlider->hide();
181 else 209 } else {
210 #if OS(ANDROID)
211 // New UI always hides the volume slider on Android.
212 if (!RuntimeEnabledFeatures::newMediaPlaybackUiEnabled())
213 m_volumeSlider->show();
214 else
215 m_volumeSlider->hide();
216 #else
182 m_volumeSlider->show(); 217 m_volumeSlider->show();
218 #endif
219 }
183 updateVolume(); 220 updateVolume();
184 221
185 refreshClosedCaptionsButtonVisibility(); 222 refreshClosedCaptionsButtonVisibility();
186 223
187 if (mediaElement().hasVideo() && fullscreenIsSupported(document())) 224 if (mediaElement().hasVideo() && fullscreenIsSupported(document()))
188 m_fullScreenButton->show(); 225 m_fullScreenButton->show();
189 else 226 else
190 m_fullScreenButton->hide(); 227 m_fullScreenButton->hide();
191 228
192 refreshCastButtonVisibility(); 229 refreshCastButtonVisibility();
230 hideControlsForSpace();
193 makeOpaque(); 231 makeOpaque();
194 } 232 }
195 233
196 LayoutObject* MediaControls::layoutObjectForTextTrackLayout() 234 LayoutObject* MediaControls::layoutObjectForTextTrackLayout()
197 { 235 {
198 return m_panel->layoutObject(); 236 return m_panel->layoutObject();
199 } 237 }
200 238
201 void MediaControls::show() 239 void MediaControls::show()
202 { 240 {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 // controls/shadow tree. (Perform the checks separately to avoid going 288 // controls/shadow tree. (Perform the checks separately to avoid going
251 // through all the potential ancestor hosts for the focused element.) 289 // through all the potential ancestor hosts for the focused element.)
252 const bool ignoreFocus = behaviorFlags & IgnoreFocus; 290 const bool ignoreFocus = behaviorFlags & IgnoreFocus;
253 if (!ignoreFocus && (mediaElement().focused() || contains(document().focused Element()))) 291 if (!ignoreFocus && (mediaElement().focused() || contains(document().focused Element())))
254 return false; 292 return false;
255 return true; 293 return true;
256 } 294 }
257 295
258 void MediaControls::playbackStarted() 296 void MediaControls::playbackStarted()
259 { 297 {
260 m_currentTimeDisplay->show(); 298 if (!RuntimeEnabledFeatures::newMediaPlaybackUiEnabled()) {
261 m_durationDisplay->hide(); 299 m_currentTimeDisplay->show();
300 m_durationDisplay->hide();
301 }
262 302
263 updatePlayState(); 303 updatePlayState();
264 m_timeline->setPosition(mediaElement().currentTime()); 304 m_timeline->setPosition(mediaElement().currentTime());
265 updateCurrentTimeDisplay(); 305 updateCurrentTimeDisplay();
266 306
267 startHideMediaControlsTimer(); 307 startHideMediaControlsTimer();
268 } 308 }
269 309
270 void MediaControls::playbackProgressed() 310 void MediaControls::playbackProgressed()
271 { 311 {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
312 mediaElement().togglePlayState(); 352 mediaElement().togglePlayState();
313 } 353 }
314 } 354 }
315 355
316 void MediaControls::updateCurrentTimeDisplay() 356 void MediaControls::updateCurrentTimeDisplay()
317 { 357 {
318 double now = mediaElement().currentTime(); 358 double now = mediaElement().currentTime();
319 double duration = mediaElement().duration(); 359 double duration = mediaElement().duration();
320 360
321 // After seek, hide duration display and show current time. 361 // After seek, hide duration display and show current time.
322 if (now > 0) { 362 if (!RuntimeEnabledFeatures::newMediaPlaybackUiEnabled() && now > 0) {
323 m_currentTimeDisplay->show(); 363 m_currentTimeDisplay->show();
324 m_durationDisplay->hide(); 364 m_durationDisplay->hide();
325 } 365 }
326 366
327 // Allow the theme to format the time. 367 // Allow the theme to format the time.
328 m_currentTimeDisplay->setInnerText(LayoutTheme::theme().formatMediaControlsC urrentTime(now, duration), IGNORE_EXCEPTION); 368 m_currentTimeDisplay->setInnerText(LayoutTheme::theme().formatMediaControlsC urrentTime(now, duration), IGNORE_EXCEPTION);
329 m_currentTimeDisplay->setCurrentValue(now); 369 m_currentTimeDisplay->setCurrentValue(now);
330 } 370 }
331 371
332 void MediaControls::updateVolume() 372 void MediaControls::updateVolume()
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
392 // Check that the cast button actually fits on the bar. 432 // Check that the cast button actually fits on the bar.
393 if (m_fullScreenButton->getBoundingClientRect()->right() > m_panel-> getBoundingClientRect()->right()) { 433 if (m_fullScreenButton->getBoundingClientRect()->right() > m_panel-> getBoundingClientRect()->right()) {
394 m_castButton->hide(); 434 m_castButton->hide();
395 tryShowOverlayCastButton(); 435 tryShowOverlayCastButton();
396 } 436 }
397 } 437 }
398 } else { 438 } else {
399 m_castButton->hide(); 439 m_castButton->hide();
400 m_overlayCastButton->hide(); 440 m_overlayCastButton->hide();
401 } 441 }
442
443 hideControlsForSpace();
402 } 444 }
403 445
404 void MediaControls::showOverlayCastButton() 446 void MediaControls::showOverlayCastButton()
405 { 447 {
406 tryShowOverlayCastButton(); 448 tryShowOverlayCastButton();
407 resetHideMediaControlsTimer(); 449 resetHideMediaControlsTimer();
408 } 450 }
409 451
410 void MediaControls::enteredFullscreen() 452 void MediaControls::enteredFullscreen()
411 { 453 {
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
512 bool MediaControls::containsRelatedTarget(Event* event) 554 bool MediaControls::containsRelatedTarget(Event* event)
513 { 555 {
514 if (!event->isMouseEvent()) 556 if (!event->isMouseEvent())
515 return false; 557 return false;
516 EventTarget* relatedTarget = toMouseEvent(event)->relatedTarget(); 558 EventTarget* relatedTarget = toMouseEvent(event)->relatedTarget();
517 if (!relatedTarget) 559 if (!relatedTarget)
518 return false; 560 return false;
519 return contains(relatedTarget->toNode()); 561 return contains(relatedTarget->toNode());
520 } 562 }
521 563
564 void MediaControls::hideControlsForSpace()
565 {
566 // Hide all controls that don't fit.
567 // The order, in order of decreasing droppiness:
568 // Volume, time, seek bar, cast.
569
570 // In the old UI, don't do this.
571 if (!RuntimeEnabledFeatures::newMediaPlaybackUiEnabled())
572 return;
573
574 int panelWidth = m_panel->clientWidth();
575 if (panelWidth == 0)
576 return;
577
578 // we should just memorize the requirements of each.
579 // cases: Vol Time Slider Cast
580 // Time Slider Cast
581 // Vol Time Slider
582 // Time Slider
583
584 // The cast button is the only variable. If it's shown, then subtract it
585 // from the available space. Note that because we don't re-show the other
586 // controls, this is stable.
587 if (m_castButton->isShown())
588 panelWidth -= 48;
589
590 // TODO(liberato): get confirmation from spec on these values.
591 if (panelWidth < 350)
592 m_volumeSlider->hide();
593
594 if (panelWidth < 300) {
595 m_currentTimeDisplay->hide();
596 m_durationDisplay->hide();
597 }
598
599 if (panelWidth < 200)
600 m_timeline->hide();
601
602 if (panelWidth < 150)
603 m_castButton->hide();
604 }
605
522 DEFINE_TRACE(MediaControls) 606 DEFINE_TRACE(MediaControls)
523 { 607 {
524 visitor->trace(m_mediaElement); 608 visitor->trace(m_mediaElement);
525 visitor->trace(m_panel); 609 visitor->trace(m_panel);
526 visitor->trace(m_overlayPlayButton); 610 visitor->trace(m_overlayPlayButton);
527 visitor->trace(m_overlayEnclosure); 611 visitor->trace(m_overlayEnclosure);
528 visitor->trace(m_playButton); 612 visitor->trace(m_playButton);
529 visitor->trace(m_currentTimeDisplay); 613 visitor->trace(m_currentTimeDisplay);
530 visitor->trace(m_timeline); 614 visitor->trace(m_timeline);
531 visitor->trace(m_muteButton); 615 visitor->trace(m_muteButton);
532 visitor->trace(m_volumeSlider); 616 visitor->trace(m_volumeSlider);
533 visitor->trace(m_toggleClosedCaptionsButton); 617 visitor->trace(m_toggleClosedCaptionsButton);
534 visitor->trace(m_fullScreenButton); 618 visitor->trace(m_fullScreenButton);
535 visitor->trace(m_durationDisplay); 619 visitor->trace(m_durationDisplay);
536 visitor->trace(m_enclosure); 620 visitor->trace(m_enclosure);
537 visitor->trace(m_castButton); 621 visitor->trace(m_castButton);
538 visitor->trace(m_overlayCastButton); 622 visitor->trace(m_overlayCastButton);
539 HTMLDivElement::trace(visitor); 623 HTMLDivElement::trace(visitor);
540 } 624 }
541 625
542 } 626 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698