Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(49)

Unified Diff: Source/core/html/shadow/MediaControls.js

Issue 456323002: [WIP] Re-implement MediaControls in Blink-in-JS (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/html/shadow/MediaControls.js
diff --git a/Source/core/html/shadow/MediaControls.js b/Source/core/html/shadow/MediaControls.js
new file mode 100644
index 0000000000000000000000000000000000000000..4412f569ede4578220e8a63b214f1c1b813d6a72
--- /dev/null
+++ b/Source/core/html/shadow/MediaControls.js
@@ -0,0 +1,251 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+'use strict';
+
+installClass('MediaControls', function(global, MediaControlsPrototype) {
+
+ var kFadeInDuration = 0.1;
+ var kFadeOutDuration = 0.3;
+
+ function show(element) {
+ element.style.removeProperty('display');
+ }
+
+ function hide(element) {
+ element.style.setProperty('display', 'none')
+ }
+
+ function createElement(parent, pseudoId) {
+ var e = global.document.createElement(parent);
+ if (!e) {
+ return null;
+ }
+ e.setAttribute('pseudo', pseudoId);
+ return e;
+ }
+
+ function createPanel() {
+ var panel = createElement('div', '-webkit-media-controls-panel')
+ panel.isDisplayed_ = false;
+ panel.opaque_ = true;
+ panel.transitionTimer_ = null;
+ panel.startTimer = function() {
+ stopTimer();
+ this.transitionTimer_ = setTimeout(kFadeOutDuration, this.transitionTimerFired);
abarth-chromium 2014/08/11 18:04:12 Why not listen for the transition end event?
hajimehoshi 2014/08/12 06:54:09 I'm just copying implementation from C++. Now I st
+ };
+ panel.stopTimer = function() {
+ if (this.transitionTimer_ !== null) {
+ clearTimeout(this.this.transitionTimer_);
+ this.transitionTimer_ = null;
+ }
+ };
+ panel.transitionTimerFired = function() {
+ if (!this.opaque_) {
+ hide();
+ }
+ this.stopTimer();
+ };
abarth-chromium 2014/08/11 18:04:12 Should we use a web animation instead of a CSS tra
hajimehoshi 2014/08/12 06:54:09 Same as above.
+ panel.makeOpaque = function() {
+ if (this.opaque_) {
+ return;
+ }
+ this.style.transformProperty = 'opacity';
+ this.style.transformDuration = kFadeInDuration + 's';
+ this.style.opacity = 1.0;
+ this.opaque_ = true;
+ if (this.isDisplayed_) {
+ show(this);
+ }
+ };
+ panel.makeTransparent = function() {
+ if (!this.opaque_) {
+ return;
+ }
+ this.style.transformProperty = 'opacity';
+ this.style.transformDuration = kFadeOutDuration + 's';
+ this.style.opacity = 0.0;
+ this.opacity_ = false;
+ this.startTimer();
+ };
+ panel.setIsDisplayed = function(isDisplayed) {
+ this.isDisplayed = isDisplayed;
+ };
+ return panel;
+ }
+
+ function createTimeline() {
+ var timeline = createElement('input', '-webkit-media-controls-timeline');
+ timeline.setAttribute('type', 'range');
+ timeline.setAttribute('step', 'any');
+ timeline.defaultEventHandler = function(event) {
+ // TODO
+ };
+ timeline.willRespondToMouseClickEvents = function() {
+ // TODO
+ };
+ timeline.setPosition = function(currentTime) {
+ this.value = currentTime;
+ };
+ timeline.setDuration = function(duration) {
+ this.setAttribute('max', isFinite(duration) ? duration : 0);
+ };
+ return timeline;
+ }
+
+ MediaControlsPrototype.createdCallback = function(mediaElement) {
+ this.mediaElement_ = mediaElement;
+
+ this.setAttribute('pseudo', '-webkit-media-controls');
+
+ // TODO: Maybe OverlayEnclosure is needed
+
+ var enclosure = createElement('div', '-webkit-media-controls-enclosure');
+ this.panel_ = createPanel();
+
+ var playButton = createElement('input', '-webkit-media-controls-play-button');
+ this.panel_.appendChild(playButton);
+ this.timeline_ = createTimeline();
+ this.panel_.appendChild(this.timeline_);
+ var currentTimeDisplay = createElement('div', '-webkit-media-controls-current-time-display');
+ this.panel_.appendChild(currentTimeDisplay);
+ this.durationDisplay_ = createElement('div', '-webkit-media-controls-time-remaining-display');
+ this.panel_.appendChild(this.durationDisplay_);
+ var muteButton = createElement('input', '-webkit-media-controls-mute-button');
+ this.panel_.appendChild(muteButton);
+ this.volumeSlider_ = createElement('input', '-webkit-media-controls-volume-slider');
+ this.panel_.appendChild(this.volumeSlider_);
+ this.fullscreenButton_ = createElement('input', '-webkit-media-controls-fullscreen-button');
+ this.panel_.appendChild(this.fullscreenButton_);
+
+ enclosure.appendChild(this.panel_);
+ this.appendChild(enclosure);
+ };
+
+ MediaControlsPrototype.reset = function() {
+ var duration = this.mediaElement_.duration;
+ this.durationDisplay_.innerText = "foo"; // TODO
+ //this.durationDisplay_.setCurrentValue(duration);
+ this.updatePlayState();
+ this.updateCurrentTimeDisplay();
+ this.timeline_.setDuration(duration);
+ this.timeline_.setPosition(this.mediaElement_.currentTime);
+ if (this.mediaElement_.hasAudio()) {
+ hide(this.volumeSlider_);
+ } else {
+ show(this.volumeSlider_);
+ }
+ this.updateVolume();
+ this.refreshClosedCaptionsButtonVisibility();
+ if (this.mediaElement_.hasVideo() && this.fullscreenIsSupported()) {
+ show(this.fullscreenButton_);
+ } else {
+ hide(this.fullscreenButton_);
+ }
+ };
+
+ MediaControlsPrototype.show = function() {
+ // TODO
haraken 2014/08/11 11:09:33 Nit: Blink uses FIXME instead of TODO.
+ };
+
+ MediaControlsPrototype.mediaElementFocused = function() {
+ // TODO
+ };
+
+ MediaControlsPrototype.hide = function() {
+ // TODO
+ };
+
+ MediaControlsPrototype.makeOpaque = function() {
+ this.panel_.makeOpaque();
+ };
+
+ MediaControlsPrototype.makeTransparent = function() {
+ this.panel_.makeTransparent();
+ };
+
+ MediaControlsPrototype.shouldHideMediaControls = function(behaviorFlags) {
+ // TODO
+ };
+
+ MediaControlsPrototype.playbackStarted = function() {
+ // TODO
+ };
+
+ MediaControlsPrototype.updatePlayState = function() {
+ // TODO
+ };
+
+ MediaControlsPrototype.beginScrubbing = function() {
+ // TODO
+ };
+
+ MediaControlsPrototype.endScrubbing = function() {
+ // TODO
+ };
+
+ MediaControlsPrototype.updateCurrentTimeDisplay = function() {
+ // TODO
+ };
+
+ MediaControlsPrototype.updateVolume = function() {
+ // TODO
+ };
+
+ MediaControlsPrototype.changedClosedCaptionsVisibility = function() {
+ // TODO
+ };
+
+ MediaControlsPrototype.refreshClosedCaptionsButtonVisibility = function() {
+ // TODO
+ };
+
+ MediaControlsPrototype.closedCaptionTracksChanged = function() {
+ // TODO
+ };
+
+ MediaControlsPrototype.enteredFullscreen = function() {
+ // TODO
+ };
+
+ MediaControlsPrototype.exitedFullscreen = function() {
+ // TODO
+ };
+
+ MediaControlsPrototype.defaultEventHandler = function(event) {
+ // TODO
+ };
+
+ MediaControlsPrototype.hideMediaControlsTimerFired = function(timer) {
+ // TODO
+ };
+
+ MediaControlsPrototype.startHideMediaControlsTimer = function() {
+ // TODO
+ };
+
+ MediaControlsPrototype.stopHideMediaControlsTimer = function() {
+ // TODO
+ };
+
+ MediaControlsPrototype.containsRelatedTarget = function(event) {
+ // TODO
+ };
+
+ MediaControlsPrototype.createTextTrackDisplay = function() {
+ // TODO
+ };
+
+ MediaControlsPrototype.showTextTarckDisplay = function() {
+ // TODO
+ };
+
+ MediaControlsPrototype.hideTextTrackDisplay = function() {
+ // TODO
+ };
+
+ MediaControlsPrototype.updateTextTrackDisplay = function() {
+ // TODO
+ };
+});
« Source/core/html/HTMLVideoElement.js ('K') | « Source/core/html/shadow/MediaControls.idl ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698