Bug 1444489 - Part III, Workaround
bug 718107
The videocontrols binding will be destroyed and reattached when the video
enters/leaves fullscreen. This change accounts for that so that screen
orientation is correctly set on mobile.
MozReview-Commit-ID: 7D1gkiuXZtX
--- a/toolkit/content/widgets/videocontrols.xml
+++ b/toolkit/content/widgets/videocontrols.xml
@@ -223,16 +223,20 @@
// cause the bindings to detach and reattach, hence
// unsetting the attribute.
if (!this.isAudioOnly && !this.video.mozHasAudio) {
this.muteButton.setAttribute("noAudio", "true");
this.muteButton.setAttribute("disabled", "true");
}
}
+ // We should lock the orientation if we are already in
+ // fullscreen and were reattached because of bug 718107.
+ this.updateOrientationState(this.isVideoInFullScreen());
+
if (this.isAudioOnly) {
this.clickToPlay.hidden = true;
}
// If the first frame hasn't loaded, kick off a throbber fade-in.
if (this.video.readyState >= this.video.HAVE_CURRENT_DATA) {
this.firstFrameShown = true;
}
@@ -1095,23 +1099,43 @@
if (this.isVideoInFullScreen()) {
this.fullscreenButton.setAttribute("fullscreened", "true");
} else {
this.fullscreenButton.removeAttribute("fullscreened");
}
},
+ // XXX This should be the place where we update the control states and
+ // screen orientation upon entering/leaving fullscreen.
+ // Sadly because of bug 718107 as soon as this function exits
+ // the attached binding gets destructored and a new binding is then created.
+ // We therefore don't do anything here and leave it to the new binding to
+ // set state correctly from its constructor.
+ /*
onFullscreenChange() {
+ // Constructor and destructor will lock/unlock the orientation exactly
+ // once. Doing so here again will cause the videocontrols to
+ // lock-unlock-lock the orientation when entering the fullscreen.
this.updateOrientationState(this.isVideoInFullScreen());
+
+ // This is already broken by bug 718107 (controls will be hidden
+ // as soon as the video enters fullscreen).
+ // We can think about restoring the behavior here once the bug is
+ // fixed, or we could simply acknowledge the current behavior
+ // after-the-fact and try not to fix this.
if (this.isVideoInFullScreen()) {
Utils._hideControlsTimeout = setTimeout(this._hideControlsFn, this.HIDE_CONTROLS_TIMEOUT_MS);
}
+
+ // Constructor will handle this correctly on the new DOM content in
+ // the new binding.
this.setFullscreenButtonState();
},
+ */
updateOrientationState(lock) {
if (!this.video.mozOrientationLockEnabled) {
return;
}
if (lock) {
if (this.video.mozIsOrientationLocked) {
return;
@@ -1702,19 +1726,19 @@
// the control bar, instead of playing the video or toggle fullscreen.
if (!this.videocontrols.isTouchControls) {
addListener(this.controlsSpacer, "click", this.clickToPlayClickHandler);
addListener(this.controlsSpacer, "dblclick", this.toggleFullscreen);
}
addListener(this.videocontrols, "resizevideocontrols", this.adjustControlSize);
addListener(this.videocontrols, "transitionend", this.onTransitionEnd);
- addListener(this.video.ownerDocument, "mozfullscreenchange", this.onFullscreenChange);
addListener(this.controlBar, "transitionend", this.onControlBarTransitioned);
- addListener(this.video.ownerDocument, "fullscreenchange", this.onFullscreenChange);
+ // See comment at onFullscreenChange on bug 718107.
+ // addListener(this.video.ownerDocument, "fullscreenchange", this.onFullscreenChange);
addListener(this.video, "keypress", this.keyHandler, {capture: true});
// Prevent any click event within media controls from dispatching through to video.
addListener(this.videocontrols, "click", function(event) {
event.stopPropagation();
}, {mozSystemGroup: false});
addListener(this.videocontrols, "dragstart", function(event) {
event.preventDefault(); // prevent dragging of controls image (bug 517114)
});