From 8bdda39c355c136a6d0a700672d0d779b21c79ba Mon Sep 17 00:00:00 2001 From: Mauro Balades Date: Sat, 27 Apr 2024 16:46:57 +0200 Subject: [PATCH] Fixed browser panels, they are not tabs anymore --- src/browser/app/profile/zen-browser.js | 2 +- .../base/content/ZenSidebarManager.mjs | 80 ++++++++++++++----- .../places/content/zenNewWebPanel.js | 43 ++++++++++ .../places/content/zenNewWebPanel.xhtml | 44 ++++++++++ src/browser/components/places/jar-mn.patch | 10 +++ .../en-US/browser/zen-web-side-panels.ftl | 20 +++++ .../locales/en-US/browser/zenNewWebPanel.ftl | 7 ++ .../shared/preferences/zen-preferences.css | 7 +- .../themes/shared/zen-browser-shared.css | 2 +- src/browser/themes/shared/zen-icons/icons.css | 3 +- .../themes/shared/zen-sidebar-panels.css | 5 ++ src/toolkit/themes/shared/zen-popup.css | 3 +- 12 files changed, 200 insertions(+), 26 deletions(-) create mode 100644 src/browser/components/places/content/zenNewWebPanel.js create mode 100644 src/browser/components/places/content/zenNewWebPanel.xhtml create mode 100644 src/browser/components/places/jar-mn.patch create mode 100644 src/browser/locales/en-US/browser/zen-web-side-panels.ftl create mode 100644 src/browser/locales/en-US/browser/zenNewWebPanel.ftl diff --git a/src/browser/app/profile/zen-browser.js b/src/browser/app/profile/zen-browser.js index 5baa156de..c5166f287 100644 --- a/src/browser/app/profile/zen-browser.js +++ b/src/browser/app/profile/zen-browser.js @@ -139,5 +139,5 @@ pref('dom.security.sanitizer.enabled', true); //pref("browser.profiles.enabled", true); // Zen Sidebar -pref('zen.sidebar.data', "{\"data\":{\"p1\":{\"url\":\"https://google.com\"}},\"index\":[\"p1\"]}"); +pref('zen.sidebar.data', "{\"data\":\n {\"p1\":{\n \"url\":\"https://web.whatsapp.com/\"\n },\n\"p2\":{\n \"url\":\"https://open.spotify.com/\",\n\"ua\": true\n },\n\"p3\": {\n \"url\": \"https://www.youtube.com/\",\n\"ua\": true\n}},\n\"index\":[\"p1\",\"p2\",\"p3\"]\n}"); pref('zen.sidebar.enabled', true); \ No newline at end of file diff --git a/src/browser/base/content/ZenSidebarManager.mjs b/src/browser/base/content/ZenSidebarManager.mjs index b16f976e0..69095f5f9 100644 --- a/src/browser/base/content/ZenSidebarManager.mjs +++ b/src/browser/base/content/ZenSidebarManager.mjs @@ -5,9 +5,12 @@ export var gZenBrowserManagerSidebar = { contextTab: null, DEFAULT_MOBILE_USER_AGENT: "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36 Edg/114.0.1823.79", + MAX_SIDEBAR_PANELS: 8, // +1 for the add panel button init() { + this._closeSidebarPanel(); // avoid caching this.update(); + this.listenForPrefChanges(); }, get sidebarData() { @@ -18,6 +21,15 @@ export var gZenBrowserManagerSidebar = { return JSON.parse(services); }, + listenForPrefChanges() { + Services.prefs.addObserver("zen.sidebar.data", this.handleEvent.bind(this)); + Services.prefs.addObserver("zen.sidebar.enabled", this.handleEvent.bind(this)); + }, + + handleEvent() { + this.update(); + }, + update() { this._updateWebPanels(); }, @@ -25,6 +37,7 @@ export var gZenBrowserManagerSidebar = { _updateWebPanels() { if (Services.prefs.getBoolPref("zen.sidebar.enabled")) { this.sidebarElement.removeAttribute("hidden"); + this._hideAllWebPanels(); } else { this.sidebarElement.setAttribute("hidden", "true"); return; @@ -45,10 +58,30 @@ export var gZenBrowserManagerSidebar = { button.setAttribute("flex", "1"); button.setAttribute("zen-sidebar-id", site); button.setAttribute("context", "zenWebPanelContextMenu"); - button.style.listStyleImage = this._getWebPanelIcon(panel.url); + this._getWebPanelIcon(panel.url, button); button.addEventListener("click", this._handleClick.bind(this)); this.sidebarElement.appendChild(button); } + if (data.index.length < this.MAX_SIDEBAR_PANELS) { + this.sidebarElement.appendChild(document.createXULElement("toolbarseparator")); + let addPanelButton = document.createXULElement("toolbarbutton"); + addPanelButton.id = "zen-sidebar-add-panel-button"; + addPanelButton.classList.add("zen-sidebar-panel-button", "toolbarbutton-1", "chromeclass-toolbar-additional"); + addPanelButton.addEventListener("click", this._openAddPanelDialog.bind(this)); + this.sidebarElement.appendChild(addPanelButton); + } + }, + + async _openAddPanelDialog() { + let dialogURL = "chrome://browser/content/places/zenNewWebPanel.xhtml"; + let features = "centerscreen,chrome,modal,resizable=no"; + let aParentWindow = Services.wm.getMostRecentWindow("navigator:browser"); + + if (aParentWindow?.gDialogBox) { + await aParentWindow.gDialogBox.open(dialogURL, {}); + } else { + aParentWindow.openDialog(dialogURL, "", features, {}); + } }, _openAndGetWebPanelWrapper() { @@ -105,11 +138,11 @@ export var gZenBrowserManagerSidebar = { let data = this._getWebPanelData(this._currentPanel); let browser = this._createWebPanelBrowser(data); let browserContainers = document.getElementById("zen-sidebar-web-panel-browser-containers"); - browserContainers.appendChild(browser.linkedBrowser.closest(".browserContainer")); + browserContainers.appendChild(browser); if (data.ua) { - browser.linkedBrowser.browsingContext.customUserAgent = this.DEFAULT_MOBILE_USER_AGENT; + browser.browsingContext.customUserAgent = this.DEFAULT_MOBILE_USER_AGENT; } - browser.linkedBrowser.browsingContext.isActive = true; + browser.browsingContext.isActive = true; }, _getWebPanelData(id) { @@ -125,22 +158,30 @@ export var gZenBrowserManagerSidebar = { }, _createWebPanelBrowser(data) { - let tab = gBrowser.addTab(data.url, { - insertTab: false, - triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(), - }); - tab.linkedBrowser.setAttribute("disablefullscreen", "true"); - tab.linkedBrowser.setAttribute("src", data.url); - tab.linkedBrowser.setAttribute("zen-sidebar-id", data.id); - tab.linkedBrowser.setAttribute("disableglobalhistory", "true"); - tab.linkedBrowser.setAttribute("autoscroll", "false"); - tab.linkedBrowser.setAttribute("autocompletepopup", "PopupAutoComplete"); - tab.linkedBrowser.setAttribute("contextmenu", "contentAreaContextMenu"); - return tab; + let browser = gBrowser.createBrowser({}); + browser.setAttribute("disablefullscreen", "true"); + browser.setAttribute("src", data.url); + browser.setAttribute("zen-sidebar-id", data.id); + browser.setAttribute("disableglobalhistory", "true"); + browser.setAttribute("autoscroll", "false"); + browser.setAttribute("autocompletepopup", "PopupAutoComplete"); + browser.setAttribute("contextmenu", "contentAreaContextMenu"); + return browser; }, - _getWebPanelIcon(url) { - return `url(page-icon:${url})`; + _getWebPanelIcon(url, element) { + let { preferredURI } = Services.uriFixup.getFixupURIInfo(url); + element.setAttribute("image", `page-icon:${preferredURI.spec}`); + fetch(`https://s2.googleusercontent.com/s2/favicons?domain_url=${preferredURI.spec}`).then(async response => { + if (response.ok) { + let blob = await response.blob(); + let reader = new FileReader(); + reader.onload = function() { + element.setAttribute("image", reader.result); + }; + reader.readAsDataURL(blob); + } + }); }, _getBrowserById(id) { @@ -245,11 +286,10 @@ export var gZenBrowserManagerSidebar = { let data = this.sidebarData; delete data.data[this.contextTab]; data.index = data.index.filter(id => id !== this.contextTab); - Services.prefs.setStringPref("zen.sidebar.data", JSON.stringify(data)); - this._updateWebPanels(); let browser = this._getBrowserById(this.contextTab); browser.remove(); this._closeSidebarPanel(); + Services.prefs.setStringPref("zen.sidebar.data", JSON.stringify(data)); }, contextUnload() { diff --git a/src/browser/components/places/content/zenNewWebPanel.js b/src/browser/components/places/content/zenNewWebPanel.js new file mode 100644 index 000000000..0da57fe49 --- /dev/null +++ b/src/browser/components/places/content/zenNewWebPanel.js @@ -0,0 +1,43 @@ + +var gZenNewWebPanel = { + init: function() { + document.addEventListener("dialogaccept", this.handleDialogAccept.bind(this)); + }, + + handleURLChange: async function(aURL) { + try { + let url = new URL(aURL.value); + } catch (_) { + // TODO: Show error message + return; + } + }, + + handleDialogAccept: async function(aEvent) { + document.commandDispatcher.focusedElement?.blur(); + let url = document.getElementById("zenNWP_url"); + let ua = document.getElementById("zenNWP_userAgent"); + if (!url || !ua) { + return; + } + try { + new URL(url.value); + } catch (_) { + return; + } + if (!url.value || !ua.value) { + return; + } + let newSite = { + url: url.value, + ua: ua.value, + }; + let currentData = JSON.parse(Services.prefs.getStringPref("zen.sidebar.data")); + let newName = "p" + new Date().getTime(); + currentData.index.push(newName); + currentData.data[newName] = newSite; + Services.prefs.setStringPref("zen.sidebar.data", JSON.stringify(currentData)); + }, +}; + +gZenNewWebPanel.init(); \ No newline at end of file diff --git a/src/browser/components/places/content/zenNewWebPanel.xhtml b/src/browser/components/places/content/zenNewWebPanel.xhtml new file mode 100644 index 000000000..4187bb8c7 --- /dev/null +++ b/src/browser/components/places/content/zenNewWebPanel.xhtml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + +