void MediaControls::updateVolume() { m_muteButton->updateDisplayType(); // Invalidate the mute button because it paints differently according to volume. invalidate(m_muteButton); if (mediaElement().muted()) m_volumeSlider->setVolume(0); else m_volumeSlider->setVolume(mediaElement().volume()); // Update the visibility of our audio elements. // We never want the volume slider if there's no audio. // If there is audio, then we want it unless hiding audio is enabled and // we prefer to hide it. BatchedControlUpdate batch(this); m_volumeSlider->setIsWanted(mediaElement().hasAudio() && !(m_allowHiddenVolumeControls && preferHiddenVolumeControls(document()))); // The mute button is a little more complicated. If enableNewMediaPlaybackUi // is true, then we choose to hide or show the mute button to save space. // If enableNew* is not set, then we never touch the mute button, and // instead leave it to the CSS. // Note that this is why m_allowHiddenVolumeControls isn't rolled into prefer...(). if (m_allowHiddenVolumeControls) { // If there is no audio track, then hide the mute button. m_muteButton->setIsWanted(mediaElement().hasAudio()); } // Invalidate the volume slider because it paints differently according to volume. invalidate(m_volumeSlider); }
void MediaControls::updateVolume() { m_muteButton->updateDisplayType(); // Invalidate the mute button because it paints differently according to volume. if (LayoutObject* layoutObject = m_muteButton->layoutObject()) layoutObject->setShouldDoFullPaintInvalidation(); if (mediaElement().muted()) m_volumeSlider->setVolume(0); else m_volumeSlider->setVolume(mediaElement().volume()); // Update the visibility of our audio elements. // We never want the volume slider if there's no audio. // If there is audio, then we want it unless hiding audio is enabled and // we prefer to hide it. BatchedControlUpdate batch(this); m_volumeSlider->setIsWanted(mediaElement().hasAudio() && !(m_allowHiddenVolumeControls && preferHiddenVolumeControls(document()))); // The mute button is a little more complicated. If enableNewMediaPlaybackUi // is true, then we choose to hide or show the mute button to save space. // If enableNew* is not set, then we never touch the mute button, and // instead leave it to the CSS. // Note that this is why m_allowHiddenVolumeControls isn't rolled into prefer...(). if (m_allowHiddenVolumeControls) { // If there is no audio track, then hide the mute button. If there // is an audio track, then we always show the mute button unless // we prefer to hide it and the media isn't muted. If it's muted, // then we show it to let the user unmute it. In this case, we don't // want to re-hide the mute button later. m_keepMuteButton |= mediaElement().muted(); m_muteButton->setIsWanted(mediaElement().hasAudio() && (!preferHiddenVolumeControls(document()) || m_keepMuteButton)); } // Invalidate the volume slider because it paints differently according to volume. if (LayoutObject* layoutObject = m_volumeSlider->layoutObject()) layoutObject->setShouldDoFullPaintInvalidation(); }
void MediaControls::onVolumeChange() { m_muteButton->updateDisplayType(); m_volumeSlider->setVolume(mediaElement().muted() ? 0 : mediaElement().volume()); // Update visibility of volume controls. // TODO(mlamouri): it should not be part of the volumechange handling because // it is using audio availability as input. BatchedControlUpdate batch(this); m_volumeSlider->setIsWanted(mediaElement().hasAudio() && !preferHiddenVolumeControls(document())); m_muteButton->setIsWanted(mediaElement().hasAudio()); }
// The media controls DOM structure looks like: // // MediaControls (-webkit-media-controls) // +-MediaControlOverlayEnclosureElement (-webkit-media-controls-overlay-enclosure) // | +-MediaControlOverlayPlayButtonElement (-webkit-media-controls-overlay-play-button) // | | {if mediaControlsOverlayPlayButtonEnabled} // | \-MediaControlCastButtonElement (-internal-media-controls-overlay-cast-button) // \-MediaControlPanelEnclosureElement (-webkit-media-controls-enclosure) // \-MediaControlPanelElement (-webkit-media-controls-panel) // +-MediaControlPlayButtonElement (-webkit-media-controls-play-button) // | {if !RTE::newMediaPlaybackUi()} // +-MediaControlTimelineElement (-webkit-media-controls-timeline) // +-MediaControlCurrentTimeDisplayElement (-webkit-media-controls-current-time-display) // +-MediaControlTimeRemainingDisplayElement (-webkit-media-controls-time-remaining-display) // | {if RTE::newMediaPlaybackUi()} // +-MediaControlTimelineElement (-webkit-media-controls-timeline) // +-MediaControlMuteButtonElement (-webkit-media-controls-mute-button) // +-MediaControlVolumeSliderElement (-webkit-media-controls-volume-slider) // +-MediaControlToggleClosedCaptionsButtonElement (-webkit-media-controls-toggle-closed-captions-button) // +-MediaControlCastButtonElement (-internal-media-controls-cast-button) // \-MediaControlFullscreenButtonElement (-webkit-media-controls-fullscreen-button) void MediaControls::initializeControls() { const bool useNewUi = RuntimeEnabledFeatures::newMediaPlaybackUiEnabled(); RefPtrWillBeRawPtr<MediaControlOverlayEnclosureElement> overlayEnclosure = MediaControlOverlayEnclosureElement::create(*this); if (document().settings() && document().settings()->mediaControlsOverlayPlayButtonEnabled()) { RefPtrWillBeRawPtr<MediaControlOverlayPlayButtonElement> overlayPlayButton = MediaControlOverlayPlayButtonElement::create(*this); m_overlayPlayButton = overlayPlayButton.get(); overlayEnclosure->appendChild(overlayPlayButton.release()); } RefPtrWillBeRawPtr<MediaControlCastButtonElement> overlayCastButton = MediaControlCastButtonElement::create(*this, true); m_overlayCastButton = overlayCastButton.get(); overlayEnclosure->appendChild(overlayCastButton.release()); m_overlayEnclosure = overlayEnclosure.get(); appendChild(overlayEnclosure.release()); // Create an enclosing element for the panel so we can visually offset the controls correctly. RefPtrWillBeRawPtr<MediaControlPanelEnclosureElement> enclosure = MediaControlPanelEnclosureElement::create(*this); RefPtrWillBeRawPtr<MediaControlPanelElement> panel = MediaControlPanelElement::create(*this); RefPtrWillBeRawPtr<MediaControlPlayButtonElement> playButton = MediaControlPlayButtonElement::create(*this); m_playButton = playButton.get(); panel->appendChild(playButton.release()); RefPtrWillBeRawPtr<MediaControlTimelineElement> timeline = MediaControlTimelineElement::create(*this); m_timeline = timeline.get(); // In old UX, timeline is before the time / duration text. if (!useNewUi) panel->appendChild(timeline.release()); // else we will attach it later. RefPtrWillBeRawPtr<MediaControlCurrentTimeDisplayElement> currentTimeDisplay = MediaControlCurrentTimeDisplayElement::create(*this); m_currentTimeDisplay = currentTimeDisplay.get(); m_currentTimeDisplay->setIsWanted(useNewUi); panel->appendChild(currentTimeDisplay.release()); RefPtrWillBeRawPtr<MediaControlTimeRemainingDisplayElement> durationDisplay = MediaControlTimeRemainingDisplayElement::create(*this); m_durationDisplay = durationDisplay.get(); panel->appendChild(durationDisplay.release()); // Timeline is after the time / duration text if newMediaPlaybackUiEnabled. if (useNewUi) panel->appendChild(timeline.release()); RefPtrWillBeRawPtr<MediaControlMuteButtonElement> muteButton = MediaControlMuteButtonElement::create(*this); m_muteButton = muteButton.get(); panel->appendChild(muteButton.release()); if (m_allowHiddenVolumeControls && preferHiddenVolumeControls(document())) m_muteButton->setIsWanted(false); RefPtrWillBeRawPtr<MediaControlVolumeSliderElement> slider = MediaControlVolumeSliderElement::create(*this); m_volumeSlider = slider.get(); panel->appendChild(slider.release()); if (m_allowHiddenVolumeControls && preferHiddenVolumeControls(document())) m_volumeSlider->setIsWanted(false); RefPtrWillBeRawPtr<MediaControlToggleClosedCaptionsButtonElement> toggleClosedCaptionsButton = MediaControlToggleClosedCaptionsButtonElement::create(*this); m_toggleClosedCaptionsButton = toggleClosedCaptionsButton.get(); panel->appendChild(toggleClosedCaptionsButton.release()); RefPtrWillBeRawPtr<MediaControlCastButtonElement> castButton = MediaControlCastButtonElement::create(*this, false); m_castButton = castButton.get(); panel->appendChild(castButton.release()); RefPtrWillBeRawPtr<MediaControlFullscreenButtonElement> fullscreenButton = MediaControlFullscreenButtonElement::create(*this); m_fullScreenButton = fullscreenButton.get(); panel->appendChild(fullscreenButton.release()); m_panel = panel.get(); enclosure->appendChild(panel.release()); m_enclosure = enclosure.get(); appendChild(enclosure.release()); }
// The media controls DOM structure looks like: // // MediaControls // (-webkit-media-controls) // +-MediaControlOverlayEnclosureElement // | (-webkit-media-controls-overlay-enclosure) // | +-MediaControlOverlayPlayButtonElement // | | (-webkit-media-controls-overlay-play-button) // | | {if mediaControlsOverlayPlayButtonEnabled} // | \-MediaControlCastButtonElement // | (-internal-media-controls-overlay-cast-button) // \-MediaControlPanelEnclosureElement // | (-webkit-media-controls-enclosure) // \-MediaControlPanelElement // | (-webkit-media-controls-panel) // +-MediaControlPlayButtonElement // | (-webkit-media-controls-play-button) // +-MediaControlCurrentTimeDisplayElement // | (-webkit-media-controls-current-time-display) // +-MediaControlTimeRemainingDisplayElement // | (-webkit-media-controls-time-remaining-display) // +-MediaControlTimelineElement // | (-webkit-media-controls-timeline) // +-MediaControlMuteButtonElement // | (-webkit-media-controls-mute-button) // +-MediaControlVolumeSliderElement // | (-webkit-media-controls-volume-slider) // +-MediaControlFullscreenButtonElement // | (-webkit-media-controls-fullscreen-button) // +-MediaControlDownloadButtonElement // | (-internal-media-controls-download-button) // +-MediaControlToggleClosedCaptionsButtonElement // | (-webkit-media-controls-toggle-closed-captions-button) // \-MediaControlCastButtonElement // (-internal-media-controls-cast-button) // +-MediaControlTextTrackListElement // | (-internal-media-controls-text-track-list) // | {for each renderable text track} // \-MediaControlTextTrackListItem // | (-internal-media-controls-text-track-list-item) // +-MediaControlTextTrackListItemInput // | (-internal-media-controls-text-track-list-item-input) // +-MediaControlTextTrackListItemCaptions // | (-internal-media-controls-text-track-list-kind-captions) // +-MediaControlTextTrackListItemSubtitles // (-internal-media-controls-text-track-list-kind-subtitles) void MediaControls::initializeControls() { MediaControlOverlayEnclosureElement* overlayEnclosure = MediaControlOverlayEnclosureElement::create(*this); if (document().settings() && document().settings()->mediaControlsOverlayPlayButtonEnabled()) { MediaControlOverlayPlayButtonElement* overlayPlayButton = MediaControlOverlayPlayButtonElement::create(*this); m_overlayPlayButton = overlayPlayButton; overlayEnclosure->appendChild(overlayPlayButton); } MediaControlCastButtonElement* overlayCastButton = MediaControlCastButtonElement::create(*this, true); m_overlayCastButton = overlayCastButton; overlayEnclosure->appendChild(overlayCastButton); m_overlayEnclosure = overlayEnclosure; appendChild(overlayEnclosure); // Create an enclosing element for the panel so we can visually offset the // controls correctly. MediaControlPanelEnclosureElement* enclosure = MediaControlPanelEnclosureElement::create(*this); MediaControlPanelElement* panel = MediaControlPanelElement::create(*this); MediaControlPlayButtonElement* playButton = MediaControlPlayButtonElement::create(*this); m_playButton = playButton; panel->appendChild(playButton); MediaControlCurrentTimeDisplayElement* currentTimeDisplay = MediaControlCurrentTimeDisplayElement::create(*this); m_currentTimeDisplay = currentTimeDisplay; m_currentTimeDisplay->setIsWanted(true); panel->appendChild(currentTimeDisplay); MediaControlTimeRemainingDisplayElement* durationDisplay = MediaControlTimeRemainingDisplayElement::create(*this); m_durationDisplay = durationDisplay; panel->appendChild(durationDisplay); MediaControlTimelineElement* timeline = MediaControlTimelineElement::create(*this); m_timeline = timeline; panel->appendChild(timeline); MediaControlMuteButtonElement* muteButton = MediaControlMuteButtonElement::create(*this); m_muteButton = muteButton; panel->appendChild(muteButton); MediaControlVolumeSliderElement* slider = MediaControlVolumeSliderElement::create(*this); m_volumeSlider = slider; panel->appendChild(slider); if (preferHiddenVolumeControls(document())) m_volumeSlider->setIsWanted(false); MediaControlFullscreenButtonElement* fullscreenButton = MediaControlFullscreenButtonElement::create(*this); m_fullscreenButton = fullscreenButton; panel->appendChild(fullscreenButton); MediaControlDownloadButtonElement* downloadButton = MediaControlDownloadButtonElement::create(*this); m_downloadButton = downloadButton; panel->appendChild(downloadButton); MediaControlCastButtonElement* castButton = MediaControlCastButtonElement::create(*this, false); m_castButton = castButton; panel->appendChild(castButton); MediaControlToggleClosedCaptionsButtonElement* toggleClosedCaptionsButton = MediaControlToggleClosedCaptionsButtonElement::create(*this); m_toggleClosedCaptionsButton = toggleClosedCaptionsButton; panel->appendChild(toggleClosedCaptionsButton); m_panel = panel; enclosure->appendChild(panel); m_enclosure = enclosure; appendChild(enclosure); MediaControlTextTrackListElement* textTrackList = MediaControlTextTrackListElement::create(*this); m_textTrackList = textTrackList; appendChild(textTrackList); MediaControlOverflowMenuButtonElement* overflowMenu = MediaControlOverflowMenuButtonElement::create(*this); m_overflowMenu = overflowMenu; panel->appendChild(overflowMenu); MediaControlOverflowMenuListElement* overflowList = MediaControlOverflowMenuListElement::create(*this); m_overflowList = overflowList; appendChild(overflowList); // The order in which we append elements to the overflow list is significant // because it determines how the elements show up in the overflow menu // relative to each other. The first item appended appears at the top of the // overflow menu. m_overflowList->appendChild(m_playButton->createOverflowElement( *this, MediaControlPlayButtonElement::create(*this))); m_overflowList->appendChild(m_fullscreenButton->createOverflowElement( *this, MediaControlFullscreenButtonElement::create(*this))); m_overflowList->appendChild(m_downloadButton->createOverflowElement( *this, MediaControlDownloadButtonElement::create(*this))); m_overflowList->appendChild(m_muteButton->createOverflowElement( *this, MediaControlMuteButtonElement::create(*this))); m_overflowList->appendChild(m_castButton->createOverflowElement( *this, MediaControlCastButtonElement::create(*this, false))); m_overflowList->appendChild( m_toggleClosedCaptionsButton->createOverflowElement( *this, MediaControlToggleClosedCaptionsButtonElement::create(*this))); }