| Index: Source/core/html/shadow/MediaControls.cpp
|
| diff --git a/Source/core/html/shadow/MediaControls.cpp b/Source/core/html/shadow/MediaControls.cpp
|
| index 8e65d275d32aae675e97f5050b16f13c429948fc..bebbf521616cb3a59dd140180eb4835f5d7b3366 100644
|
| --- a/Source/core/html/shadow/MediaControls.cpp
|
| +++ b/Source/core/html/shadow/MediaControls.cpp
|
| @@ -28,17 +28,22 @@
|
| #include "core/html/shadow/MediaControls.h"
|
|
|
| #include "bindings/core/v8/ExceptionStatePlaceholder.h"
|
| +#include "bindings/core/v8/V8MediaControls.h"
|
| +#include "bindings/core/v8/PrivateScriptRunner.h"
|
| #include "core/events/MouseEvent.h"
|
| #include "core/frame/Settings.h"
|
| #include "core/html/HTMLMediaElement.h"
|
| +#include "core/html/HTMLVideoElement.h"
|
| #include "core/html/MediaController.h"
|
| #include "core/rendering/RenderTheme.h"
|
| +#include "core/rendering/RenderVideo.h"
|
| +#include "wtf/text/Base64.h"
|
|
|
| namespace blink {
|
|
|
| // If you change this value, then also update the corresponding value in
|
| // LayoutTests/media/media-controls.js.
|
| -static const double timeWithoutMouseMovementBeforeHidingMediaControls = 3;
|
| +//static const double timeWithoutMouseMovementBeforeHidingMediaControls = 3;
|
|
|
| static bool fullscreenIsSupported(const Document& document)
|
| {
|
| @@ -62,19 +67,26 @@ MediaControls::MediaControls(HTMLMediaElement& mediaElement)
|
| , m_durationDisplay(nullptr)
|
| , m_enclosure(nullptr)
|
| , m_hideMediaControlsTimer(this, &MediaControls::hideMediaControlsTimerFired)
|
| - , m_isMouseOverControls(false)
|
| - , m_isPausedForScrubbing(false)
|
| + //, m_isMouseOverControls(false)
|
| + //, m_isPausedForScrubbing(false)
|
| {
|
| + ScriptWrappable::init(this);
|
| + v8::Handle<v8::Value> classObject = PrivateScriptRunner::installClassIfNeeded(document().frame(), "MediaControls");
|
| + RELEASE_ASSERT(!classObject.IsEmpty());
|
| }
|
|
|
| PassRefPtrWillBeRawPtr<MediaControls> MediaControls::create(HTMLMediaElement& mediaElement)
|
| {
|
| RefPtrWillBeRawPtr<MediaControls> controls = adoptRefWillBeNoop(new MediaControls(mediaElement));
|
|
|
| - if (controls->initializeControls())
|
| - return controls.release();
|
| + /*if (!controls->initializeControls())
|
| + return nullptr;*/
|
|
|
| - return nullptr;
|
| + PassRefPtrWillBeRawPtr<HTMLMediaElement> media(&mediaElement);
|
| + if (!V8MediaControls::PrivateScript::createdCallbackMethod(controls->document().frame(), controls.get(), media))
|
| + return nullptr;
|
| +
|
| + return controls.release();
|
| }
|
|
|
| bool MediaControls::initializeControls()
|
| @@ -164,7 +176,7 @@ bool MediaControls::initializeControls()
|
|
|
| void MediaControls::reset()
|
| {
|
| - double duration = mediaElement().duration();
|
| + /*double duration = mediaElement().duration();
|
| m_durationDisplay->setInnerText(RenderTheme::theme().formatMediaControlsTime(duration), ASSERT_NO_EXCEPTION);
|
| m_durationDisplay->setCurrentValue(duration);
|
|
|
| @@ -183,50 +195,58 @@ void MediaControls::reset()
|
|
|
| refreshClosedCaptionsButtonVisibility();
|
|
|
| - if (mediaElement().hasVideo() && fullscreenIsSupported(document()))
|
| + if (mediaElement().hasVideo() && fullscreenIsSupported())
|
| m_fullScreenButton->show();
|
| else
|
| m_fullScreenButton->hide();
|
|
|
| - makeOpaque();
|
| + makeOpaque();*/
|
| +
|
| + V8MediaControls::PrivateScript::resetMethod(document().frame(), this);
|
| }
|
|
|
| void MediaControls::show()
|
| {
|
| - makeOpaque();
|
| + /*makeOpaque();
|
| m_panel->setIsDisplayed(true);
|
| m_panel->show();
|
| if (m_overlayPlayButton)
|
| - m_overlayPlayButton->updateDisplayType();
|
| + m_overlayPlayButton->updateDisplayType();*/
|
| +
|
| + V8MediaControls::PrivateScript::showMethod(document().frame(), this);
|
| }
|
|
|
| void MediaControls::mediaElementFocused()
|
| {
|
| - show();
|
| - stopHideMediaControlsTimer();
|
| + /*show();
|
| + stopHideMediaControlsTimer();*/
|
| +
|
| + V8MediaControls::PrivateScript::mediaElementFocusedMethod(document().frame(), this);
|
| }
|
|
|
| void MediaControls::hide()
|
| {
|
| - m_panel->setIsDisplayed(false);
|
| + /*m_panel->setIsDisplayed(false);
|
| m_panel->hide();
|
| if (m_overlayPlayButton)
|
| - m_overlayPlayButton->hide();
|
| + m_overlayPlayButton->hide();*/
|
| +
|
| + V8MediaControls::PrivateScript::hideMethod(document().frame(), this);
|
| }
|
|
|
| void MediaControls::makeOpaque()
|
| {
|
| - m_panel->makeOpaque();
|
| + //m_panel->makeOpaque();
|
| }
|
|
|
| void MediaControls::makeTransparent()
|
| {
|
| - m_panel->makeTransparent();
|
| + //m_panel->makeTransparent();
|
| }
|
|
|
| bool MediaControls::shouldHideMediaControls(unsigned behaviorFlags) const
|
| {
|
| - // Never hide for a media element without visual representation.
|
| + /*// Never hide for a media element without visual representation.
|
| if (!mediaElement().hasVideo())
|
| return false;
|
| // Don't hide if the controls are hovered or the mouse is over the video area.
|
| @@ -239,70 +259,82 @@ bool MediaControls::shouldHideMediaControls(unsigned behaviorFlags) const
|
| const bool ignoreFocus = behaviorFlags & IgnoreFocus;
|
| if (!ignoreFocus && (mediaElement().focused() || contains(document().focusedElement())))
|
| return false;
|
| - return true;
|
| + return true;*/
|
| +
|
| + return false;
|
| }
|
|
|
| void MediaControls::playbackStarted()
|
| {
|
| - m_currentTimeDisplay->show();
|
| + /* m_currentTimeDisplay->show();
|
| m_durationDisplay->hide();
|
|
|
| updatePlayState();
|
| m_timeline->setPosition(mediaElement().currentTime());
|
| updateCurrentTimeDisplay();
|
|
|
| - startHideMediaControlsTimer();
|
| + startHideMediaControlsTimer();*/
|
| +
|
| + V8MediaControls::PrivateScript::playbackStartedMethod(document().frame(), this);
|
| }
|
|
|
| void MediaControls::playbackProgressed()
|
| {
|
| - m_timeline->setPosition(mediaElement().currentTime());
|
| + /*m_timeline->setPosition(mediaElement().currentTime());
|
| updateCurrentTimeDisplay();
|
|
|
| if (shouldHideMediaControls())
|
| - makeTransparent();
|
| + makeTransparent();*/
|
| +
|
| + V8MediaControls::PrivateScript::playbackProgressedMethod(document().frame(), this);
|
| }
|
|
|
| void MediaControls::playbackStopped()
|
| {
|
| - updatePlayState();
|
| + /*updatePlayState();
|
| m_timeline->setPosition(mediaElement().currentTime());
|
| updateCurrentTimeDisplay();
|
| makeOpaque();
|
|
|
| - stopHideMediaControlsTimer();
|
| + stopHideMediaControlsTimer();*/
|
| +
|
| + V8MediaControls::PrivateScript::playbackStoppedMethod(document().frame(), this);
|
| }
|
|
|
| void MediaControls::updatePlayState()
|
| {
|
| - if (m_isPausedForScrubbing)
|
| + /*if (m_isPausedForScrubbing)
|
| return;
|
|
|
| if (m_overlayPlayButton)
|
| m_overlayPlayButton->updateDisplayType();
|
| - m_playButton->updateDisplayType();
|
| + m_playButton->updateDisplayType();*/
|
| }
|
|
|
| void MediaControls::beginScrubbing()
|
| {
|
| - if (!mediaElement().togglePlayStateWillPlay()) {
|
| + /*if (!mediaElement().togglePlayStateWillPlay()) {
|
| m_isPausedForScrubbing = true;
|
| mediaElement().togglePlayState();
|
| - }
|
| + }*/
|
| +
|
| + V8MediaControls::PrivateScript::beginScrubbingMethod(document().frame(), this);
|
| }
|
|
|
| void MediaControls::endScrubbing()
|
| {
|
| - if (m_isPausedForScrubbing) {
|
| + /*if (m_isPausedForScrubbing) {
|
| m_isPausedForScrubbing = false;
|
| if (mediaElement().togglePlayStateWillPlay())
|
| mediaElement().togglePlayState();
|
| - }
|
| + }*/
|
| +
|
| + V8MediaControls::PrivateScript::endScrubbingMethod(document().frame(), this);
|
| }
|
|
|
| void MediaControls::updateCurrentTimeDisplay()
|
| {
|
| - double now = mediaElement().currentTime();
|
| + /*double now = mediaElement().currentTime();
|
| double duration = mediaElement().duration();
|
|
|
| // After seek, hide duration display and show current time.
|
| @@ -313,56 +345,70 @@ void MediaControls::updateCurrentTimeDisplay()
|
|
|
| // Allow the theme to format the time.
|
| m_currentTimeDisplay->setInnerText(RenderTheme::theme().formatMediaControlsCurrentTime(now, duration), IGNORE_EXCEPTION);
|
| - m_currentTimeDisplay->setCurrentValue(now);
|
| + m_currentTimeDisplay->setCurrentValue(now);*/
|
| +
|
| + V8MediaControls::PrivateScript::updateCurrentTimeDisplayMethod(document().frame(), this);
|
| }
|
|
|
| void MediaControls::updateVolume()
|
| {
|
| - m_muteButton->updateDisplayType();
|
| + /*m_muteButton->updateDisplayType();
|
| if (m_muteButton->renderer())
|
| m_muteButton->renderer()->setShouldDoFullPaintInvalidation(true);
|
|
|
| if (mediaElement().muted())
|
| m_volumeSlider->setVolume(0);
|
| else
|
| - m_volumeSlider->setVolume(mediaElement().volume());
|
| + m_volumeSlider->setVolume(mediaElement().volume());*/
|
| +
|
| + V8MediaControls::PrivateScript::updateVolumeMethod(document().frame(), this);
|
| }
|
|
|
| void MediaControls::changedClosedCaptionsVisibility()
|
| {
|
| - m_toggleClosedCaptionsButton->updateDisplayType();
|
| + //m_toggleClosedCaptionsButton->updateDisplayType();
|
| +
|
| + V8MediaControls::PrivateScript::changedClosedCaptionsVisibilityMethod(document().frame(), this);
|
| }
|
|
|
| void MediaControls::refreshClosedCaptionsButtonVisibility()
|
| {
|
| - if (mediaElement().hasClosedCaptions())
|
| + /*if (mediaElement().hasClosedCaptions())
|
| m_toggleClosedCaptionsButton->show();
|
| else
|
| - m_toggleClosedCaptionsButton->hide();
|
| + m_toggleClosedCaptionsButton->hide();*/
|
| +
|
| + V8MediaControls::PrivateScript::refreshClosedCaptionsButtonVisibilityMethod(document().frame(), this);
|
| }
|
|
|
| void MediaControls::closedCaptionTracksChanged()
|
| {
|
| - refreshClosedCaptionsButtonVisibility();
|
| + //refreshClosedCaptionsButtonVisibility();
|
| +
|
| + V8MediaControls::PrivateScript::closedCaptionTracksChangedMethod(document().frame(), this);
|
| }
|
|
|
| void MediaControls::enteredFullscreen()
|
| {
|
| - m_fullScreenButton->setIsFullscreen(true);
|
| + /*m_fullScreenButton->setIsFullscreen(true);
|
| stopHideMediaControlsTimer();
|
| - startHideMediaControlsTimer();
|
| + startHideMediaControlsTimer();*/
|
| +
|
| + V8MediaControls::PrivateScript::enteredFullscreenMethod(document().frame(), this);
|
| }
|
|
|
| void MediaControls::exitedFullscreen()
|
| {
|
| - m_fullScreenButton->setIsFullscreen(false);
|
| + /*m_fullScreenButton->setIsFullscreen(false);
|
| stopHideMediaControlsTimer();
|
| - startHideMediaControlsTimer();
|
| + startHideMediaControlsTimer();*/
|
| +
|
| + V8MediaControls::PrivateScript::exitedFullscreenMethod(document().frame(), this);
|
| }
|
|
|
| void MediaControls::defaultEventHandler(Event* event)
|
| {
|
| - HTMLDivElement::defaultEventHandler(event);
|
| + /*HTMLDivElement::defaultEventHandler(event);
|
|
|
| if (event->type() == EventTypeNames::mouseover) {
|
| if (!containsRelatedTarget(event)) {
|
| @@ -391,28 +437,28 @@ void MediaControls::defaultEventHandler(Event* event)
|
| if (shouldHideMediaControls(IgnoreVideoHover))
|
| startHideMediaControlsTimer();
|
| return;
|
| - }
|
| + }*/
|
| }
|
|
|
| void MediaControls::hideMediaControlsTimerFired(Timer<MediaControls>*)
|
| {
|
| - if (mediaElement().togglePlayStateWillPlay())
|
| + /*if (mediaElement().togglePlayStateWillPlay())
|
| return;
|
|
|
| if (!shouldHideMediaControls(IgnoreFocus | IgnoreVideoHover))
|
| return;
|
|
|
| - makeTransparent();
|
| + makeTransparent();*/
|
| }
|
|
|
| void MediaControls::startHideMediaControlsTimer()
|
| {
|
| - m_hideMediaControlsTimer.startOneShot(timeWithoutMouseMovementBeforeHidingMediaControls, FROM_HERE);
|
| + //m_hideMediaControlsTimer.startOneShot(timeWithoutMouseMovementBeforeHidingMediaControls, FROM_HERE);
|
| }
|
|
|
| void MediaControls::stopHideMediaControlsTimer()
|
| {
|
| - m_hideMediaControlsTimer.stop();
|
| + //m_hideMediaControlsTimer.stop();
|
| }
|
|
|
| const AtomicString& MediaControls::shadowPseudoId() const
|
| @@ -423,17 +469,19 @@ const AtomicString& MediaControls::shadowPseudoId() const
|
|
|
| bool MediaControls::containsRelatedTarget(Event* event)
|
| {
|
| - if (!event->isMouseEvent())
|
| + /*if (!event->isMouseEvent())
|
| return false;
|
| EventTarget* relatedTarget = toMouseEvent(event)->relatedTarget();
|
| if (!relatedTarget)
|
| return false;
|
| - return contains(relatedTarget->toNode());
|
| + return contains(relatedTarget->toNode());*/
|
| +
|
| + return false;
|
| }
|
|
|
| void MediaControls::createTextTrackDisplay()
|
| {
|
| - if (m_textDisplayContainer)
|
| + /*if (m_textDisplayContainer)
|
| return;
|
|
|
| RefPtrWillBeRawPtr<MediaControlTextTrackContainerElement> textDisplayContainer = MediaControlTextTrackContainerElement::create(*this);
|
| @@ -443,29 +491,200 @@ void MediaControls::createTextTrackDisplay()
|
| if (m_overlayEnclosure && m_overlayPlayButton)
|
| m_overlayEnclosure->insertBefore(textDisplayContainer.release(), m_overlayPlayButton);
|
| else
|
| - insertBefore(textDisplayContainer.release(), m_enclosure);
|
| + insertBefore(textDisplayContainer.release(), m_enclosure);*/
|
| }
|
|
|
| void MediaControls::showTextTrackDisplay()
|
| {
|
| - if (!m_textDisplayContainer)
|
| + /*if (!m_textDisplayContainer)
|
| createTextTrackDisplay();
|
| - m_textDisplayContainer->show();
|
| + m_textDisplayContainer->show();*/
|
| }
|
|
|
| void MediaControls::hideTextTrackDisplay()
|
| {
|
| - if (!m_textDisplayContainer)
|
| + /*if (!m_textDisplayContainer)
|
| createTextTrackDisplay();
|
| - m_textDisplayContainer->hide();
|
| + m_textDisplayContainer->hide();*/
|
| }
|
|
|
| void MediaControls::updateTextTrackDisplay()
|
| {
|
| - if (!m_textDisplayContainer)
|
| + /*if (!m_textDisplayContainer)
|
| createTextTrackDisplay();
|
|
|
| - m_textDisplayContainer->updateDisplay();
|
| + m_textDisplayContainer->updateDisplay();*/
|
| +}
|
| +
|
| +String MediaControls::getResourceDataURL(String name)
|
| +{
|
| + // FIXME: Use cache
|
| + Image* image = Image::loadPlatformResource(name.utf8().data()).leakRef();
|
| +
|
| + // FIXME: This depends on the fact the resource image is PNG.
|
| + Vector<char> imageData;
|
| + imageData.append(image->data()->data(), image->data()->size());
|
| + Vector<char> base64Data;
|
| + WTF::base64Encode(imageData, base64Data);
|
| + return "data:image/png;base64," + base64Data;
|
| +}
|
| +
|
| +bool MediaControls::isOverlayPlayButtonEnabled()
|
| +{
|
| + return document().settings() && document().settings()->mediaControlsOverlayPlayButtonEnabled();
|
| +}
|
| +
|
| +bool MediaControls::shouldShowControls() const
|
| +{
|
| + return mediaElement().shouldShowControls();
|
| +}
|
| +
|
| +void MediaControls::setDivDisplayType(RefPtrWillBeRawPtr<HTMLElement> element, unsigned type)
|
| +{
|
| + RefPtrWillBeRawPtr<MediaControlDivElement> mediaDivElement = static_pointer_cast<MediaControlDivElement>(element);
|
| + mediaDivElement->setDisplayType(static_cast<MediaControlElementType>(type));
|
| +}
|
| +
|
| +void MediaControls::setInputDisplayType(RefPtrWillBeRawPtr<HTMLElement> element, unsigned type)
|
| +{
|
| + //RefPtrWillBeRawPtr<MediaControlInputElement> mediaInputElement = static_pointer_cast<MediaControlInputElement>(element);
|
| + // This doesn't work!!!
|
| + //mediaInputElement->setDisplayType(static_cast<MediaControlElementType>(type));
|
| +}
|
| +
|
| +bool MediaControls::fullscreenIsSupported() const
|
| +{
|
| + return blink::fullscreenIsSupported(document());
|
| +}
|
| +
|
| +bool MediaControls::hasAudio() const
|
| +{
|
| + return mediaElement().hasAudio();
|
| +}
|
| +
|
| +bool MediaControls::hasVideo() const
|
| +{
|
| + return mediaElement().hasVideo();
|
| +}
|
| +
|
| +bool MediaControls::hasClosedCaptions() const
|
| +{
|
| + return mediaElement().hasClosedCaptions();
|
| +}
|
| +
|
| +bool MediaControls::togglePlayStateWillPlay() const
|
| +{
|
| + return mediaElement().togglePlayStateWillPlay();
|
| +}
|
| +
|
| +void MediaControls::togglePlayState()
|
| +{
|
| + mediaElement().togglePlayState();
|
| +}
|
| +
|
| +void MediaControls::setCurrentTime(double time)
|
| +{
|
| + if (mediaElement().controller())
|
| + mediaElement().controller()->setCurrentTime(time, IGNORE_EXCEPTION);
|
| + else
|
| + mediaElement().setCurrentTime(time, IGNORE_EXCEPTION);
|
| +}
|
| +
|
| +bool MediaControls::isClosedCaptionsVisible() const
|
| +{
|
| + return mediaElement().closedCaptionsVisible();
|
| +}
|
| +
|
| +void MediaControls::toggleClosedCaptionsVisible()
|
| +{
|
| + mediaElement().setClosedCaptionsVisible(!mediaElement().closedCaptionsVisible());
|
| +}
|
| +
|
| +void MediaControls::toggleFullscreen()
|
| +{
|
| + if (mediaElement().isFullscreen())
|
| + mediaElement().exitFullscreen();
|
| + else
|
| + mediaElement().enterFullscreen();
|
| +}
|
| +
|
| +double MediaControls::getTextTrackContainerFontSize()
|
| +{
|
| + if (!document().isActive())
|
| + return 0;
|
| +
|
| + IntRect videoBox;
|
| +
|
| + if (!mediaElement().renderer() || !mediaElement().renderer()->isVideo())
|
| + return 0;
|
| + videoBox = toRenderVideo(mediaElement().renderer())->videoBox();
|
| +
|
| + m_videoDisplaySize = videoBox;
|
| +
|
| + float smallestDimension = std::min(videoBox.size().height(), videoBox.size().width());
|
| +
|
| + return smallestDimension * 0.05f;
|
| +}
|
| +
|
| +void MediaControls::updateTextTrackContainerDisplay(RefPtrWillBeRawPtr<HTMLElement> textTrackContainer)
|
| +{
|
| + if (!mediaElement().closedCaptionsVisible()) {
|
| + textTrackContainer->removeChildren();
|
| + return;
|
| + }
|
| +
|
| + // 1. If the media element is an audio element, or is another playback
|
| + // mechanism with no rendering area, abort these steps. There is nothing to
|
| + // render.
|
| + if (isHTMLAudioElement(mediaElement()))
|
| + return;
|
| +
|
| + // 2. Let video be the media element or other playback mechanism.
|
| + HTMLVideoElement& video = toHTMLVideoElement(mediaElement());
|
| +
|
| + // 3. Let output be an empty list of absolutely positioned CSS block boxes.
|
| +
|
| + // 4. If the user agent is exposing a user interface for video, add to
|
| + // output one or more completely transparent positioned CSS block boxes that
|
| + // cover the same region as the user interface.
|
| +
|
| + // 5. If the last time these rules were run, the user agent was not exposing
|
| + // a user interface for video, but now it is, let reset be true. Otherwise,
|
| + // let reset be false.
|
| +
|
| + // There is nothing to be done explicitly for 4th and 5th steps, as
|
| + // everything is handled through CSS. The caption box is on top of the
|
| + // controls box, in a container set with the -webkit-box display property.
|
| +
|
| + // 6. Let tracks be the subset of video's list of text tracks that have as
|
| + // their rules for updating the text track rendering these rules for
|
| + // updating the display of WebVTT text tracks, and whose text track mode is
|
| + // showing or showing by default.
|
| + // 7. Let cues be an empty list of text track cues.
|
| + // 8. For each track track in tracks, append to cues all the cues from
|
| + // track's list of cues that have their text track cue active flag set.
|
| + CueList activeCues = video.currentlyActiveCues();
|
| +
|
| + // 9. If reset is false, then, for each text track cue cue in cues: if cue's
|
| + // text track cue display state has a set of CSS boxes, then add those boxes
|
| + // to output, and remove cue from cues.
|
| +
|
| + // There is nothing explicitly to be done here, as all the caching occurs
|
| + // within the TextTrackCue instance itself. If parameters of the cue change,
|
| + // the display tree is cleared.
|
| +
|
| + // 10. For each text track cue cue in cues that has not yet had
|
| + // corresponding CSS boxes added to output, in text track cue order, run the
|
| + // following substeps:
|
| + for (size_t i = 0; i < activeCues.size(); ++i) {
|
| + TextTrackCue* cue = activeCues[i].data();
|
| +
|
| + ASSERT(cue->isActive());
|
| + if (!cue->track() || !cue->track()->isRendered() || !cue->isActive())
|
| + continue;
|
| +
|
| + cue->updateDisplay(m_videoDisplaySize.size(), *this);
|
| + }
|
| }
|
|
|
| void MediaControls::trace(Visitor* visitor)
|
|
|