OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 } |
OLD | NEW |