summaryrefslogtreecommitdiffstats
path: root/application/palemoon/base/content/browser-fullScreen.js
diff options
context:
space:
mode:
Diffstat (limited to 'application/palemoon/base/content/browser-fullScreen.js')
-rw-r--r--application/palemoon/base/content/browser-fullScreen.js306
1 files changed, 83 insertions, 223 deletions
diff --git a/application/palemoon/base/content/browser-fullScreen.js b/application/palemoon/base/content/browser-fullScreen.js
index 400340e77..6afd247be 100644
--- a/application/palemoon/base/content/browser-fullScreen.js
+++ b/application/palemoon/base/content/browser-fullScreen.js
@@ -5,16 +5,9 @@
var FullScreen = {
_XULNS: "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
- get _fullScrToggler() {
- delete this._fullScrToggler;
- return this._fullScrToggler = document.getElementById("fullscr-toggler");
- },
- toggle: function (event) {
- var enterFS = window.fullScreen;
- // We get the fullscreen event _before_ the window transitions into or out of FS mode.
- if (event && event.type == "fullscreen")
- enterFS = !enterFS;
+ toggle: function () {
+ var enterFS = window.fullScreen;
// Toggle the View:FullScreen command, which controls elements like the
// fullscreen menuitem, menubars, and the appmenu.
@@ -31,6 +24,12 @@ var FullScreen = {
document.getElementById("exitFullScreenItem").hidden = !enterFS;
#endif
+ if (!this._fullScrToggler) {
+ this._fullScrToggler = document.getElementById("fullscr-toggler");
+ this._fullScrToggler.addEventListener("mouseover", this._expandCallback, false);
+ this._fullScrToggler.addEventListener("dragenter", this._expandCallback, false);
+ }
+
// On OS X Lion we don't want to hide toolbars when entering fullscreen, unless
// we're entering DOM fullscreen, in which case we should hide the toolbars.
// If we're leaving fullscreen, then we'll go through the exit code below to
@@ -50,36 +49,17 @@ var FullScreen = {
this.showXULChrome("toolbar", !enterFS);
if (enterFS) {
- // Add a tiny toolbar to receive mouseover and dragenter events, and provide affordance.
- // This will help simulate the "collapse" metaphor while also requiring less code and
- // events than raw listening of mouse coords. We don't add the toolbar in DOM full-screen
- // mode, only browser full-screen mode.
- if (!document.mozFullScreen) {
- this._fullScrToggler.addEventListener("mouseover", this._expandCallback, false);
- this._fullScrToggler.addEventListener("dragenter", this._expandCallback, false);
- }
- if (gPrefService.getBoolPref("browser.fullscreen.autohide"))
- gBrowser.mPanelContainer.addEventListener("mousemove",
- this._collapseCallback, false);
-
document.addEventListener("keypress", this._keyToggleCallback, false);
document.addEventListener("popupshown", this._setPopupOpen, false);
document.addEventListener("popuphidden", this._setPopupOpen, false);
+ this._shouldAnimate = true;
// We don't animate the toolbar collapse if in DOM full-screen mode,
// as the size of the content area would still be changing after the
// mozfullscreenchange event fired, which could confuse content script.
- this._shouldAnimate = !document.mozFullScreen;
- this.mouseoverToggle(false);
-
- // Autohide prefs
- gPrefService.addObserver("browser.fullscreen", this, false);
+ this.hideNavToolbox(document.mozFullScreen);
}
else {
- // The user may quit fullscreen during an animation
- this._cancelAnimation();
- gNavToolbox.style.marginTop = "";
- if (this._isChromeCollapsed)
- this.mouseoverToggle(true);
+ this.showNavToolbox(false);
// This is needed if they use the context menu to quit fullscreen
this._isPopupOpen = false;
@@ -111,7 +91,7 @@ var FullScreen = {
if (!document.mozFullScreen)
return;
- // However, if we receive a "MozEnteredDomFullScreen" event for a document
+ // However, if we receive a "MozDOMFullscreen:NewOrigin" event for a document
// which is not a subdocument of a currently active (ie. visible) browser
// or iframe, we know that we've switched to a different frame since the
// request to enter full-screen was made, so we should exit full-screen
@@ -152,26 +132,16 @@ var FullScreen = {
// Cancel any "hide the toolbar" animation which is in progress, and make
// the toolbar hide immediately.
- this._cancelAnimation();
- this.mouseoverToggle(false);
-
- // Remove listeners on the full-screen toggler, so that mouseover
- // the top of the screen will not cause the toolbar to re-appear.
- this._fullScrToggler.removeEventListener("mouseover", this._expandCallback, false);
- this._fullScrToggler.removeEventListener("dragenter", this._expandCallback, false);
+ this.hideNavToolbox(true);
},
cleanup: function () {
- if (window.fullScreen) {
- gBrowser.mPanelContainer.removeEventListener("mousemove",
- this._collapseCallback, false);
+ if (!window.fullScreen) {
+ MousePosTracker.removeListener(this);
document.removeEventListener("keypress", this._keyToggleCallback, false);
document.removeEventListener("popupshown", this._setPopupOpen, false);
document.removeEventListener("popuphidden", this._setPopupOpen, false);
- gPrefService.removeObserver("browser.fullscreen", this);
- this._fullScrToggler.removeEventListener("mouseover", this._expandCallback, false);
- this._fullScrToggler.removeEventListener("dragenter", this._expandCallback, false);
this.cancelWarning();
gBrowser.tabContainer.removeEventListener("TabOpen", this.exitDomFullScreen);
gBrowser.tabContainer.removeEventListener("TabClose", this.exitDomFullScreen);
@@ -182,40 +152,30 @@ var FullScreen = {
}
},
- observe: function(aSubject, aTopic, aData)
+ getMouseTargetRect: function()
{
- if (aData == "browser.fullscreen.autohide") {
- if (gPrefService.getBoolPref("browser.fullscreen.autohide")) {
- gBrowser.mPanelContainer.addEventListener("mousemove",
- this._collapseCallback, false);
- }
- else {
- gBrowser.mPanelContainer.removeEventListener("mousemove",
- this._collapseCallback, false);
- }
- }
+ return this._mouseTargetRect;
},
// Event callbacks
_expandCallback: function()
{
- FullScreen.mouseoverToggle(true);
+ FullScreen.showNavToolbox();
},
- _collapseCallback: function()
+ onMouseEnter: function()
{
- FullScreen.mouseoverToggle(false);
+ FullScreen.hideNavToolbox();
},
_keyToggleCallback: function(aEvent)
{
// if we can use the keyboard (eg Ctrl+L or Ctrl+E) to open the toolbars, we
// should provide a way to collapse them too.
if (aEvent.keyCode == aEvent.DOM_VK_ESCAPE) {
- FullScreen._shouldAnimate = false;
- FullScreen.mouseoverToggle(false, true);
+ FullScreen.hideNavToolbox(true);
}
// F6 is another shortcut to the address bar, but its not covered in OpenLocation()
else if (aEvent.keyCode == aEvent.DOM_VK_F6)
- FullScreen.mouseoverToggle(true);
+ FullScreen.showNavToolbox();
},
// Checks whether we are allowed to collapse the chrome
@@ -269,47 +229,6 @@ var FullScreen = {
// Animate the toolbars disappearing
_shouldAnimate: true,
- _isAnimating: false,
- _animationTimeout: 0,
- _animationHandle: 0,
- _animateUp: function() {
- // check again, the user may have done something before the animation was due to start
- if (!window.fullScreen || !this._safeToCollapse(false)) {
- this._isAnimating = false;
- this._shouldAnimate = true;
- return;
- }
-
- this._animateStartTime = window.mozAnimationStartTime;
- if (!this._animationHandle)
- this._animationHandle = window.mozRequestAnimationFrame(this);
- },
-
- sample: function (timeStamp) {
- const duration = 1500;
- const timePassed = timeStamp - this._animateStartTime;
- const pos = timePassed >= duration ? 1 :
- 1 - Math.pow(1 - timePassed / duration, 4);
-
- if (pos >= 1) {
- // We've animated enough
- this._cancelAnimation();
- gNavToolbox.style.marginTop = "";
- this.mouseoverToggle(false);
- return;
- }
-
- gNavToolbox.style.marginTop = (gNavToolbox.boxObject.height * pos * -1) + "px";
- this._animationHandle = window.mozRequestAnimationFrame(this);
- },
-
- _cancelAnimation: function() {
- window.cancelAnimationFrame(this._animationHandle);
- this._animationHandle = 0;
- clearTimeout(this._animationTimeout);
- this._isAnimating = false;
- this._shouldAnimate = false;
- },
cancelWarning: function(event) {
if (!this.warningBox)
@@ -328,67 +247,20 @@ var FullScreen = {
this.warningBox.setAttribute("hidden", true);
this.warningBox.removeAttribute("fade-warning-out");
- this.warningBox.removeAttribute("obscure-browser");
this.warningBox = null;
},
- setFullscreenAllowed: function(isApproved) {
- // The "remember decision" checkbox is hidden when showing for documents that
- // the permission manager can't handle (documents with URIs without a host).
- // We simply require those to be approved every time instead.
- let rememberCheckbox = document.getElementById("full-screen-remember-decision");
- let uri = this.fullscreenDoc.nodePrincipal.URI;
- if (!rememberCheckbox.hidden) {
- if (rememberCheckbox.checked)
- Services.perms.add(uri,
- "fullscreen",
- isApproved ? Services.perms.ALLOW_ACTION : Services.perms.DENY_ACTION,
- Services.perms.EXPIRE_NEVER);
- else if (isApproved) {
- // The user has only temporarily approved fullscren for this fullscreen
- // session only. Add the permission (so Goanna knows to approve any further
- // fullscreen requests for this host in this fullscreen session) but add
- // a listener to revoke the permission when the chrome document exits
- // fullscreen.
- Services.perms.add(uri,
- "fullscreen",
- Services.perms.ALLOW_ACTION,
- Services.perms.EXPIRE_SESSION);
- let host = uri.host;
- var onFullscreenchange = function onFullscreenchange(event) {
- if (event.target == document && document.mozFullScreenElement == null) {
- // The chrome document has left fullscreen. Remove the temporary permission grant.
- Services.perms.remove(host, "fullscreen");
- document.removeEventListener("mozfullscreenchange", onFullscreenchange);
- }
- }
- document.addEventListener("mozfullscreenchange", onFullscreenchange);
- }
- }
- if (this.warningBox)
- this.warningBox.setAttribute("fade-warning-out", "true");
- // If the document has been granted fullscreen, notify Goanna so it can resume
- // any pending pointer lock requests, otherwise exit fullscreen; the user denied
- // the fullscreen request.
- if (isApproved)
- Services.obs.notifyObservers(this.fullscreenDoc, "fullscreen-approved", "");
- else
- document.mozCancelFullScreen();
- },
-
warningBox: null,
warningFadeOutTimeout: null,
fullscreenDoc: null,
- // Shows the fullscreen approval UI, or if the domain has already been approved
- // for fullscreen, shows a warning that the site has entered fullscreen for a short
- // duration.
+ // Shows a warning that the site has entered fullscreen for a short duration.
showWarning: function(targetDoc) {
- if (!document.mozFullScreen ||
- !gPrefService.getBoolPref("full-screen-api.approval-required"))
+ let timeout = gPrefService.getIntPref("full-screen-api.warning.timeout");
+ if (!document.mozFullScreen || timeout <= 0)
return;
- // Set the strings on the fullscreen approval UI.
+ // Set the strings on the fullscreen warning UI.
this.fullscreenDoc = targetDoc;
let uri = this.fullscreenDoc.nodePrincipal.URI;
let host = null;
@@ -396,11 +268,8 @@ var FullScreen = {
host = uri.host;
} catch (e) { }
let hostLabel = document.getElementById("full-screen-domain-text");
- let rememberCheckbox = document.getElementById("full-screen-remember-decision");
- let isApproved = false;
if (host) {
- // Document's principal's URI has a host. Display a warning including the hostname and
- // show UI to enable the user to permanently grant this host permission to enter fullscreen.
+ // Document's principal's URI has a host. Display a warning including the hostname.
let utils = {};
Cu.import("resource://gre/modules/DownloadUtils.jsm", utils);
let displayHost = utils.DownloadUtils.getURIHost(uri.spec)[0];
@@ -408,17 +277,8 @@ var FullScreen = {
hostLabel.textContent = bundle.formatStringFromName("fullscreen.entered", [displayHost], 1);
hostLabel.removeAttribute("hidden");
-
- rememberCheckbox.label = bundle.formatStringFromName("fullscreen.rememberDecision", [displayHost], 1);
- rememberCheckbox.checked = false;
- rememberCheckbox.removeAttribute("hidden");
-
- // Note we only allow documents whose principal's URI has a host to
- // store permission grants.
- isApproved = Services.perms.testPermission(uri, "fullscreen") == Services.perms.ALLOW_ACTION;
} else {
hostLabel.setAttribute("hidden", "true");
- rememberCheckbox.setAttribute("hidden", "true");
}
// Note: the warning box can be non-null if the warning box from the previous request
@@ -436,77 +296,77 @@ var FullScreen = {
this.warningBox.removeAttribute("fade-warning-out");
}
- // If fullscreen mode has not yet been approved for the fullscreen
- // document's domain, show the approval UI and don't auto fade out the
- // fullscreen warning box. Otherwise, we're just notifying of entry into
- // fullscreen mode. Note if the resource's host is null, we must be
- // showing a local file or a local data URI, and we require explicit
- // approval every time.
- let authUI = document.getElementById("full-screen-approval-pane");
- if (isApproved) {
- authUI.setAttribute("hidden", "true");
- this.warningBox.removeAttribute("obscure-browser");
- } else {
- // Partially obscure the <browser> element underneath the approval UI.
- this.warningBox.setAttribute("obscure-browser", "true");
- authUI.removeAttribute("hidden");
+ // Set a timeout to fade the warning out after a few moments.
+ this.warningFadeOutTimeout = setTimeout(() => {
+ if (this.warningBox) {
+ this.warningBox.setAttribute("fade-warning-out", "true");
+ }
+ }, timeout);
+ },
+
+ showNavToolbox: function(trackMouse = true) {
+ this._fullScrToggler.hidden = true;
+ gNavToolbox.removeAttribute("fullscreenShouldAnimate");
+ gNavToolbox.style.marginTop = "";
+
+ if (!this._isChromeCollapsed) {
+ return;
}
- // If we're not showing the fullscreen approval UI, we're just notifying the user
- // of the transition, so set a timeout to fade the warning out after a few moments.
- if (isApproved)
- this.warningFadeOutTimeout =
- setTimeout(
- function() {
- if (this.warningBox)
- this.warningBox.setAttribute("fade-warning-out", "true");
- }.bind(this),
- 3000);
+ // Track whether mouse is near the toolbox
+ this._isChromeCollapsed = false;
+ if (trackMouse) {
+ let rect = gBrowser.mPanelContainer.getBoundingClientRect();
+ this._mouseTargetRect = {
+ top: rect.top + 50,
+ bottom: rect.bottom,
+ left: rect.left,
+ right: rect.right
+ };
+ MousePosTracker.addListener(this);
+ }
},
- mouseoverToggle: function(aShow, forceHide)
- {
- // Don't do anything if:
- // a) we're already in the state we want,
- // b) we're animating and will become collapsed soon, or
- // c) we can't collapse because it would be undesirable right now
- if (aShow != this._isChromeCollapsed || (!aShow && this._isAnimating) ||
- (!aShow && !this._safeToCollapse(forceHide)))
+ hideNavToolbox: function(forceHide = false) {
+ this._fullScrToggler.hidden = document.mozFullScreen;
+ if (this._isChromeCollapsed) {
+ if (forceHide) {
+ gNavToolbox.removeAttribute("fullscreenShouldAnimate");
+ }
return;
+ }
+ if (!this._safeToCollapse(forceHide)) {
+ this._fullScrToggler.hidden = true;
+ return;
+ }
// browser.fullscreen.animateUp
// 0 - never animate up
// 1 - animate only for first collapse after entering fullscreen (default for perf's sake)
// 2 - animate every time it collapses
- if (gPrefService.getIntPref("browser.fullscreen.animateUp") == 0)
+ let animateUp = gPrefService.getIntPref("browser.fullscreen.animateUp");
+ if (animateUp == 0) {
this._shouldAnimate = false;
-
- if (!aShow && this._shouldAnimate) {
- this._isAnimating = true;
- this._shouldAnimate = false;
- this._animationTimeout = setTimeout(this._animateUp.bind(this), 800);
- return;
- }
-
- // The chrome is collapsed so don't spam needless mousemove events
- if (aShow) {
- gBrowser.mPanelContainer.addEventListener("mousemove",
- this._collapseCallback, false);
+ } else if (animateUp == 2) {
+ this._shouldAnimate = true;
}
- else {
- gBrowser.mPanelContainer.removeEventListener("mousemove",
- this._collapseCallback, false);
+ if (this._shouldAnimate && !forceHide) {
+ gNavToolbox.setAttribute("fullscreenShouldAnimate", true);
+ this._shouldAnimate = false;
+ // Hide the fullscreen toggler until the transition ends.
+ let listener = () => {
+ gNavToolbox.removeEventListener("transitionend", listener, true);
+ if (this._isChromeCollapsed)
+ this._fullScrToggler.hidden = false;
+ };
+ gNavToolbox.addEventListener("transitionend", listener, true);
+ this._fullScrToggler.hidden = true;
}
- // Hiding/collapsing the toolbox interferes with the tab bar's scrollbox,
- // so we just move it off-screen instead. See bug 430687.
gNavToolbox.style.marginTop =
- aShow ? "" : -gNavToolbox.getBoundingClientRect().height + "px";
-
- this._fullScrToggler.collapsed = aShow;
- this._isChromeCollapsed = !aShow;
- if (gPrefService.getIntPref("browser.fullscreen.animateUp") == 2)
- this._shouldAnimate = true;
+ -gNavToolbox.getBoundingClientRect().height + "px";
+ this._isChromeCollapsed = true;
+ MousePosTracker.removeListener(this);
},
showXULChrome: function(aTag, aShow)