Commit dadcd476 authored by kdsilva's avatar kdsilva Committed by Commit bot

Implementation of media controls download button.

BUG=601247

Review-Url: https://codereview.chromium.org/2334803002
Cr-Commit-Position: refs/heads/master@{#418540}
parent 3a718463
<!DOCTYPE html>
<title>Clicking on the download button should download media.</title>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="media-controls.js"></script>
<script src="media-file.js"></script>
<script src="overflow-menu.js"></script>
<!--Padding ensures the overflow menu is visible for the tests. -->
<body style="padding-top: 200px; padding-left: 100px">
<video controls></video>
<script>
if (window.testRunner) {
// Ensures that a file is downloaded and the printed output of the test
// is the same as video-controls-download-button-saves-media-expected.txt
testRunner.waitUntilExternalURLLoad();
}
async_test(function(t) {
if (window.internals)
window.internals.runtimeFlags.mediaControlsDownloadButtonEnabled = true;
// Set up video
var video = document.querySelector("video");
video.src = findMediaFile("video", "content/test");
var controlID = "-internal-download-button";
var downloadButton = mediaControlsElement(internals.shadowRoot(video).firstChild, controlID);
video.onloadeddata = t.step_func(function() {
// Click on the download button
var coords = elementCoordinates(downloadButton);
clickAtCoordinates(coords[0], coords[1]);
});
});
</script>
</body>
......@@ -11,6 +11,8 @@
<video controls></video>
<script>
async_test(function(t) {
if (window.internals)
window.internals.runtimeFlags.mediaControlsDownloadButtonEnabled = true;
// Set up video
var video = document.querySelector("video");
video.src = findMediaFile("video", "content/test");
......
<!DOCTYPE html>
<title>Clicking on the overflow download button should download media.</title>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="media-controls.js"></script>
<script src="media-file.js"></script>
<script src="overflow-menu.js"></script>
<!--Padding ensures the overflow menu is visible for the tests. -->
<body style="padding-top: 200px; padding-left: 100px">
<video controls></video>
<script>
if (window.testRunner) {
testRunner.waitUntilExternalURLLoad();
}
async_test(function(t) {
if (window.internals)
window.internals.runtimeFlags.mediaControlsDownloadButtonEnabled = true;
// Set up video
var video = document.querySelector("video");
video.src = findMediaFile("video", "content/test");
video.setAttribute("width", "60");
var controlID = "-internal-download-button";
var downloadButton = mediaControlsElement(internals.shadowRoot(video).firstChild, controlID);
video.onloadeddata = t.step_func(function() {
var overflowList = getOverflowList(video);
var overflowMenu = getOverflowMenuButton(video);
// Click on the overflow menu button
var coords = elementCoordinates(overflowMenu);
clickAtCoordinates(coords[0], coords[1]);
// Click on download button
var coords = elementCoordinates(overflowList.children[OverflowMenuButtons.DOWNLOAD]);
clickAtCoordinates(coords[0], coords[1]);
});
});
</script>
</body>
......@@ -11,6 +11,8 @@
<video controls></video>
<script>
async_test(function(t) {
if (window.internals)
window.internals.runtimeFlags.mediaControlsDownloadButtonEnabled = true;
// Set up video
var video = document.querySelector("video");
video.src = findMediaFile("video", "content/test");
......@@ -20,7 +22,6 @@ async_test(function(t) {
internals.mediaPlayerRemoteRouteAvailabilityChanged(video, true);
video.onloadeddata = t.step_func_done(function() {
window.internals.runtimeFlags.MediaControlsDownloadButton = true;
var overflowList = getOverflowList(video);
var children = overflowList.children;
// Ensure that all of the buttons are visible in the right order
......
......@@ -11,6 +11,8 @@
<video controls></video>
<script>
async_test(function(t) {
if (window.internals)
window.internals.runtimeFlags.mediaControlsDownloadButtonEnabled = true;
// Set up video
var video = document.querySelector("video");
video.src = findMediaFile("video", "content/test");
......
......@@ -36,6 +36,7 @@
#include "core/dom/shadow/ShadowRoot.h"
#include "core/events/MouseEvent.h"
#include "core/frame/LocalFrame.h"
#include "core/html/HTMLAnchorElement.h"
#include "core/html/HTMLLabelElement.h"
#include "core/html/HTMLMediaSource.h"
#include "core/html/HTMLSpanElement.h"
......@@ -632,7 +633,7 @@ MediaControlDownloadButtonElement::MediaControlDownloadButtonElement(MediaContro
{
}
MediaControlDownloadButtonElement* MediaControlDownloadButtonElement::create(MediaControls& mediaControls, Document* document)
MediaControlDownloadButtonElement* MediaControlDownloadButtonElement::create(MediaControls& mediaControls)
{
MediaControlDownloadButtonElement* button = new MediaControlDownloadButtonElement(mediaControls);
button->ensureUserAgentShadowRoot();
......@@ -650,7 +651,8 @@ WebLocalizedString::Name MediaControlDownloadButtonElement::getOverflowStringNam
bool MediaControlDownloadButtonElement::shouldDisplayDownloadButton()
{
const KURL& url = mediaElement().currentSrc();
if (!HTMLMediaElement::isMediaStreamURL(url.getString()) && !url.protocolIs("blob") && !HTMLMediaSource::lookup(url)) {
if (!url.isNull() && !url.isEmpty() && !HTMLMediaElement::isMediaStreamURL(url.getString()) && !url.protocolIs("blob") && !HTMLMediaSource::lookup(url)) {
return true;
}
return false;
......@@ -658,8 +660,23 @@ bool MediaControlDownloadButtonElement::shouldDisplayDownloadButton()
void MediaControlDownloadButtonElement::defaultEventHandler(Event* event)
{
// TODO(kdsilva): The implementation will be finished as part of
// https://crbug.com/601247
const KURL& url = mediaElement().currentSrc();
if (event->type() == EventTypeNames::click && !(url.isNull() || url.isEmpty())) {
if (!m_anchor) {
HTMLAnchorElement* anchor = HTMLAnchorElement::create(document());
anchor->setAttribute(HTMLNames::downloadAttr, "");
m_anchor = anchor;
}
m_anchor->setURL(url);
m_anchor->dispatchSimulatedClick(event);
}
MediaControlInputElement::defaultEventHandler(event);
}
DEFINE_TRACE(MediaControlDownloadButtonElement)
{
visitor->trace(m_anchor);
MediaControlInputElement::trace(visitor);
}
// ----------------------------
......
......@@ -219,18 +219,25 @@ private:
// downloadable.
class MediaControlDownloadButtonElement final : public MediaControlInputElement {
public:
static MediaControlDownloadButtonElement* create(MediaControls&, Document*);
static MediaControlDownloadButtonElement* create(MediaControls&);
WebLocalizedString::Name getOverflowStringName() override;
bool hasOverflowButton() override { return true; }
// Returns true if the download button should be shown. We should
// show the button for only non-MSE, non-EME, and non-MediaStream content.
bool shouldDisplayDownloadButton();
DECLARE_VIRTUAL_TRACE();
private:
explicit MediaControlDownloadButtonElement(MediaControls&);
void defaultEventHandler(Event*) override;
// Points to an anchor element that contains the URL of the media file.
Member<HTMLAnchorElement> m_anchor;
};
class MediaControlTimelineElement final : public MediaControlInputElement {
......
......@@ -235,7 +235,7 @@ void MediaControls::initializeControls()
m_fullscreenButton = fullscreenButton;
panel->appendChild(fullscreenButton);
MediaControlDownloadButtonElement* downloadButton = MediaControlDownloadButtonElement::create(*this, &document());
MediaControlDownloadButtonElement* downloadButton = MediaControlDownloadButtonElement::create(*this);
m_downloadButton = downloadButton;
panel->appendChild(downloadButton);
......@@ -263,7 +263,7 @@ void MediaControls::initializeControls()
m_overflowList->appendChild(m_toggleClosedCaptionsButton->createOverflowElement(*this, MediaControlToggleClosedCaptionsButtonElement::create(*this)));
m_overflowList->appendChild(m_fullscreenButton->createOverflowElement(*this, MediaControlFullscreenButtonElement::create(*this)));
m_overflowList->appendChild(m_playButton->createOverflowElement(*this, MediaControlPlayButtonElement::create(*this)));
m_overflowList->appendChild(m_downloadButton->createOverflowElement(*this, MediaControlDownloadButtonElement::create(*this, &document())));
m_overflowList->appendChild(m_downloadButton->createOverflowElement(*this, MediaControlDownloadButtonElement::create(*this)));
}
void MediaControls::reset()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment