blob: 2fe8c588db2f114829d568b63d5da4c593438f2c [file] [log] [blame]
function createControls(root, video, host)
{
return new ControllerGtk(root, video, host);
};
function ControllerGtk(root, video, host)
{
Controller.call(this, root, video, host);
};
function contains(list, obj)
{
var i = list.length;
while (i--)
if (list[i] === obj)
return true;
return false;
};
ControllerGtk.prototype = {
createControls: function()
{
Controller.prototype.createControls.apply(this);
this.controls.currentTime.classList.add(this.ClassNames.hidden);
this.controls.remainingTime.classList.add(this.ClassNames.hidden);
this.controls.volumeBox.classList.add(this.ClassNames.hiding);
this.listenFor(this.controls.muteBox, 'mouseout', this.handleVolumeBoxMouseOut);
this.listenFor(this.controls.muteButton, 'mouseover', this.handleMuteButtonMouseOver);
this.listenFor(this.controls.volumeBox, 'mouseover', this.handleMuteButtonMouseOver);
this.listenFor(this.controls.volume, 'mouseover', this.handleMuteButtonMouseOver);
this.listenFor(this.controls.captionButton, 'mouseover', this.handleCaptionButtonMouseOver);
this.listenFor(this.controls.captionButton, 'mouseout', this.handleCaptionButtonMouseOut);
var enclosure = this.controls.enclosure = document.createElement('div');
enclosure.setAttribute('pseudo', '-webkit-media-controls-enclosure');
},
configureInlineControls: function()
{
this.controls.panel.appendChild(this.controls.playButton);
this.controls.panel.appendChild(this.controls.timeline);
this.controls.panel.appendChild(this.controls.currentTime);
this.controls.panel.appendChild(this.controls.remainingTime);
this.controls.panel.appendChild(this.controls.captionButton);
this.controls.panel.appendChild(this.controls.fullscreenButton);
this.controls.panel.appendChild(this.controls.muteBox);
this.controls.muteBox.appendChild(this.controls.muteButton);
this.controls.muteBox.appendChild(this.controls.volumeBox);
this.controls.volumeBox.appendChild(this.controls.volume);
this.controls.enclosure.appendChild(this.controls.panel);
},
shouldHaveControls: function()
{
if (!this.isAudio() && !this.host.allowsInlineMediaPlayback)
return true;
return this.video.controls || this.isFullScreen();
},
reconnectControls: function()
{
Controller.prototype.disconnectControls.apply(this, arguments);
this.configureInlineControls();
if (this.shouldHaveControls())
this.addControls();
},
setStatusHidden: function(hidden)
{
},
updateTime: function(forceUpdate)
{
if (!forceUpdate && this.controlsAreHidden())
return;
var currentTime = this.video.currentTime;
var duration = this.video.duration;
this.controls.currentTime.innerText = this.formatTime(currentTime);
this.controls.timeline.value = currentTime;
if (duration === Infinity || duration === NaN)
this.controls.remainingTime.classList.add(this.ClassNames.hidden);
else {
this.controls.currentTime.innerText += " / " + this.formatTime(duration);
this.controls.remainingTime.innerText = this.formatTime(duration);
if (this.controls.currentTime.classList.contains(this.ClassNames.hidden))
this.controls.remainingTime.classList.remove(this.ClassNames.hidden);
}
if (currentTime > 0)
this.showCurrentTime();
},
showCurrentTime: function()
{
this.controls.currentTime.classList.remove(this.ClassNames.hidden);
this.controls.remainingTime.classList.add(this.ClassNames.hidden);
},
handlePlay: function(event)
{
Controller.prototype.handlePlay.apply(this, arguments);
this.showCurrentTime();
if (!this.isLive)
this.showCurrentTime();
},
handleTimeUpdate: function(event)
{
this.updateTime();
},
handleMuteButtonMouseOver: function(event)
{
if (this.video.offsetTop + this.controls.enclosure.offsetTop < 105) {
this.controls.volumeBox.classList.add(this.ClassNames.down);
this.controls.panel.classList.add(this.ClassNames.down);
} else {
this.controls.volumeBox.classList.remove(this.ClassNames.down);
this.controls.panel.classList.remove(this.ClassNames.down);
}
this.controls.volumeBox.classList.remove(this.ClassNames.hiding);
return true;
},
handleVolumeBoxMouseOut: function(event)
{
this.controls.volumeBox.classList.add(this.ClassNames.hiding);
return true;
},
removeControls: function()
{
if (this.controls.enclosure.parentNode)
this.controls.enclosure.parentNode.removeChild(this.controls.enclosure);
this.destroyCaptionMenu();
},
addControls: function()
{
this.base.appendChild(this.controls.enclosure);
},
updateReadyState: function()
{
if (this.host.supportsFullscreen && this.video.videoTracks.length)
this.controls.fullscreenButton.classList.remove(this.ClassNames.hidden);
else
this.controls.fullscreenButton.classList.add(this.ClassNames.hidden);
this.updateVolume();
},
updateDuration: function()
{
Controller.prototype.updateDuration.apply(this, arguments);
if (this.isLive)
this.controls.timeline.max = 0;
},
setIsLive: function(live)
{
Controller.prototype.setIsLive.apply(this, arguments);
this.controls.timeline.disabled = this.isLive;
},
updatePlaying: function()
{
Controller.prototype.updatePlaying.apply(this, arguments);
if (!this.canPlay())
this.showControls();
},
handleCaptionButtonClicked: function(event)
{
this.handleCaptionButtonShowMenu(event)
return true;
},
buildCaptionMenu: function()
{
Controller.prototype.buildCaptionMenu.apply(this, arguments);
this.listenFor(this.captionMenu, 'mouseout', this.handleCaptionMouseOut);
this.listenFor(this.captionMenu, 'transitionend', this.captionMenuTransitionEnd);
this.captionMenu.captionMenuTreeElements = this.captionMenu.getElementsByTagName("*");
// Caption menu has to be centered to the caption button.
var captionButtonCenter = this.controls.panel.offsetLeft + this.controls.captionButton.offsetLeft +
this.controls.captionButton.offsetWidth / 2;
var captionMenuLeft = (captionButtonCenter - this.captionMenu.offsetWidth / 2);
if (captionMenuLeft + this.captionMenu.offsetWidth > this.controls.panel.offsetLeft + this.controls.panel.offsetWidth)
this.captionMenu.classList.add(this.ClassNames.out);
this.captionMenu.style.left = captionMenuLeft + 'px';
// As height is not in the css, it needs to be specified to animate it.
this.captionMenu.height = this.captionMenu.offsetHeight;
this.captionMenu.style.height = 0;
},
destroyCaptionMenu: function()
{
this.hideCaptionMenu();
},
showCaptionMenu: function()
{
this.captionMenu.style.height = this.captionMenu.height + 'px';
},
hideCaptionMenu: function()
{
this.captionMenu.style.height = 0;
},
captionMenuTransitionEnd: function(event)
{
if (this.captionMenu.offsetHeight === 0)
Controller.prototype.destroyCaptionMenu.apply(this, arguments);
},
handleCaptionButtonMouseOver: function(event)
{
this.handleCaptionButtonShowMenu(event);
return true;
},
handleCaptionButtonShowMenu: function(event)
{
if (!this.captionMenu)
this.buildCaptionMenu();
if (!contains(this.captionMenu.captionMenuTreeElements, event.relatedTarget))
this.showCaptionMenu();
return true;
},
handleCaptionButtonMouseOut: function(event)
{
if (this.captionMenu && !contains(this.captionMenu.captionMenuTreeElements, event.relatedTarget))
this.hideCaptionMenu();
return true;
},
handleCaptionMouseOut: function(event)
{
if (event.relatedTarget != this.controls.captionButton &&
!contains(this.captionMenu.captionMenuTreeElements, event.relatedTarget))
this.hideCaptionMenu();
return true;
},
};
Object.create(Controller.prototype).extend(ControllerGtk.prototype);
Object.defineProperty(ControllerGtk.prototype, 'constructor', { enumerable:false, value:ControllerGtk });