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();
}
Example #3
0
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());
}
Example #5
0
// 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)));
}