From 921402f7a1124c63e90d536b95916cd9c95065b6 Mon Sep 17 00:00:00 2001 From: brahim <92426196+BrhmDev@users.noreply.github.com> Date: Tue, 1 Oct 2024 01:05:11 +0200 Subject: [PATCH] Disable back and forward button inside web panel when they can't be used. --- src/ZenSidebarManager.mjs | 49 +++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/src/ZenSidebarManager.mjs b/src/ZenSidebarManager.mjs index 12e1d69..2624bc8 100644 --- a/src/ZenSidebarManager.mjs +++ b/src/ZenSidebarManager.mjs @@ -8,12 +8,21 @@ var gZenBrowserManagerSidebar = { _hasRegisteredPinnedClickOutside: false, _isDragging: false, contextTab: null, + sidebar: null, + forwardButton: null, + backButton: null, + progressListener: null, DEFAULT_MOBILE_USER_AGENT: 'Mozilla/5.0 (Android 12; Mobile; rv:129.0) Gecko/20100101 Firefox/130.0', MAX_SIDEBAR_PANELS: 9, // +1 for the add panel button MAX_RUNS: 3, init() { + XPCOMUtils.defineLazyGetter(this, 'sidebar', () => document.getElementById('zen-sidebar-web-panel')); + XPCOMUtils.defineLazyGetter(this, 'forwardButton', () => document.getElementById('zen-sidebar-web-panel-forward')); + XPCOMUtils.defineLazyGetter(this, 'backButton', () => document.getElementById('zen-sidebar-web-panel-back')); + + this.initProgressListener(); this.update(); this.close(); // avoid caching this.listenForPrefChanges(); @@ -21,6 +30,36 @@ var gZenBrowserManagerSidebar = { this.addPositioningListeners(); }, + initProgressListener() { + this.progressListener = { + QueryInterface: ChromeUtils.generateQI([ + "nsIWebProgressListener", + "nsISupportsWeakReference", + ]), + onLocationChange: function(aWebProgress, aRequest, aLocation, aFlags) { + const browser = this._getCurrentBrowser(); + if (!browser) return; + const forwardDisabled = this.forwardButton.hasAttribute('disabled'); + const backDisabled = this.backButton.hasAttribute('disabled'); + + if (browser.canGoForward === forwardDisabled) { + if (browser.canGoForward) { + this.forwardButton.removeAttribute('disabled'); + } else { + this.forwardButton.setAttribute('disabled', true); + } + } + if (browser.canGoBack === backDisabled) { + if (browser.canGoBack) { + this.backButton.removeAttribute('disabled'); + } else { + this.backButton.setAttribute('disabled', true); + } + } + }.bind(gZenBrowserManagerSidebar), + } + }, + get sidebarData() { let services = Services.prefs.getStringPref('zen.sidebar.data'); if (services === '') { @@ -398,6 +437,8 @@ var gZenBrowserManagerSidebar = { this._hideAllWebPanels(); if (!this._currentPanel) { this.introductionPanel.removeAttribute('hidden'); + this.forwardButton.setAttribute('disabled', true); + this.backButton.setAttribute('disabled', true); return; } this.introductionPanel.setAttribute('hidden', 'true'); @@ -412,6 +453,7 @@ var gZenBrowserManagerSidebar = { let browser = this._createWebPanelBrowser(data); let browserContainers = document.getElementById('zen-sidebar-web-panel-browser-containers'); browserContainers.appendChild(browser); + browser.addProgressListener(this.progressListener, Ci.nsIWebProgress.NOTIFY_LOCATION); if (data.ua) { browser.browsingContext.customUserAgent = this.DEFAULT_MOBILE_USER_AGENT; browser.reload(); @@ -557,13 +599,6 @@ var gZenBrowserManagerSidebar = { return this._sidebarHeader; }, - get sidebar() { - if (!this._sidebar) { - this._sidebar = document.getElementById('zen-sidebar-web-panel'); - } - return this._sidebar; - }, - get sidebarWrapper() { if (!this._sideBarWrapper) { this._sideBarWrapper = document.getElementById('zen-sidebar-web-panel-wrapper');