summaryrefslogtreecommitdiffstats
path: root/application/basilisk/components/customizableui/ScrollbarSampler.jsm
diff options
context:
space:
mode:
authorwolfbeast <mcwerewolf@gmail.com>2018-06-04 13:17:38 +0200
committerwolfbeast <mcwerewolf@gmail.com>2018-06-04 13:17:38 +0200
commita1be17c1cea81ebb1e8b131a662c698d78f3f7f2 (patch)
treea92f7de513be600cc07bac458183e9af40e00c06 /application/basilisk/components/customizableui/ScrollbarSampler.jsm
parentbf11fdd304898ac675e39b01b280d39550e419d0 (diff)
downloadUXP-a1be17c1cea81ebb1e8b131a662c698d78f3f7f2.tar
UXP-a1be17c1cea81ebb1e8b131a662c698d78f3f7f2.tar.gz
UXP-a1be17c1cea81ebb1e8b131a662c698d78f3f7f2.tar.lz
UXP-a1be17c1cea81ebb1e8b131a662c698d78f3f7f2.tar.xz
UXP-a1be17c1cea81ebb1e8b131a662c698d78f3f7f2.zip
Issue #303 Part 1: Move basilisk files from /browser to /application/basilisk
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);