summaryrefslogtreecommitdiffstats
path: root/application/basilisk/components/customizableui/ScrollbarSampler.jsm
diff options
context:
space:
mode:
authorwolfbeast <mcwerewolf@gmail.com>2018-07-18 08:24:24 +0200
committerwolfbeast <mcwerewolf@gmail.com>2018-07-18 08:24:24 +0200
commitfc61780b35af913801d72086456f493f63197da6 (patch)
treef85891288a7bd988da9f0f15ae64e5c63f00d493 /application/basilisk/components/customizableui/ScrollbarSampler.jsm
parent69f7f9e5f1475891ce11cc4f431692f965b0cd30 (diff)
parent50d3e596bbe89c95615f96eb71f6bc5be737a1db (diff)
downloadUXP-9ccb235f04529c1ec345d87dad6521cb567d20bb.tar
UXP-9ccb235f04529c1ec345d87dad6521cb567d20bb.tar.gz
UXP-9ccb235f04529c1ec345d87dad6521cb567d20bb.tar.lz
UXP-9ccb235f04529c1ec345d87dad6521cb567d20bb.tar.xz
UXP-9ccb235f04529c1ec345d87dad6521cb567d20bb.zip
Merge commit '50d3e596bbe89c95615f96eb71f6bc5be737a1db' into Basilisk-releasev2018.07.18
# Conflicts: # browser/app/profile/firefox.js # browser/components/preferences/jar.mn
Diffstat (limited to 'application/basilisk/components/customizableui/ScrollbarSampler.jsm')
-rw-r--r--application/basilisk/components/customizableui/ScrollbarSampler.jsm65
1 files changed, 65 insertions, 0 deletions
diff --git a/application/basilisk/components/customizableui/ScrollbarSampler.jsm b/application/basilisk/components/customizableui/ScrollbarSampler.jsm
new file mode 100644
index 000000000..44736e4c4
--- /dev/null
+++ b/application/basilisk/components/customizableui/ScrollbarSampler.jsm
@@ -0,0 +1,65 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+this.EXPORTED_SYMBOLS = ["ScrollbarSampler"];
+
+const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+var gSystemScrollbarWidth = null;
+
+this.ScrollbarSampler = {
+ getSystemScrollbarWidth: function() {
+ if (gSystemScrollbarWidth !== null) {
+ return Promise.resolve(gSystemScrollbarWidth);
+ }
+
+ return new Promise(resolve => {
+ this._sampleSystemScrollbarWidth().then(function(systemScrollbarWidth) {
+ gSystemScrollbarWidth = systemScrollbarWidth;
+ resolve(gSystemScrollbarWidth);
+ });
+ });
+ },
+
+ resetSystemScrollbarWidth: function() {
+ gSystemScrollbarWidth = null;
+ },
+
+ _sampleSystemScrollbarWidth: function() {
+ let hwin = Services.appShell.hiddenDOMWindow;
+ let hdoc = hwin.document.documentElement;
+ let iframe = hwin.document.createElementNS("http://www.w3.org/1999/xhtml",
+ "html:iframe");
+ iframe.setAttribute("srcdoc", '<body style="overflow-y: scroll"></body>');
+ hdoc.appendChild(iframe);
+
+ let cwindow = iframe.contentWindow;
+ let utils = cwindow.QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIDOMWindowUtils);
+
+ return new Promise(resolve => {
+ cwindow.addEventListener("load", function onLoad(aEvent) {
+ cwindow.removeEventListener("load", onLoad);
+ let sbWidth = {};
+ try {
+ utils.getScrollbarSize(true, sbWidth, {});
+ } catch (e) {
+ Cu.reportError("Could not sample scrollbar size: " + e + " -- " +
+ e.stack);
+ sbWidth.value = 0;
+ }
+ // Minimum width of 10 so that we have enough padding:
+ sbWidth.value = Math.max(sbWidth.value, 10);
+ resolve(sbWidth.value);
+ iframe.remove();
+ });
+ });
+ }
+};
+Object.freeze(this.ScrollbarSampler);