From 5316ff8e47dcc6a7c3044bf8198ddc0c999aa04d Mon Sep 17 00:00:00 2001 From: Mauro Balades Date: Tue, 6 Aug 2024 20:14:03 +0200 Subject: [PATCH] chore: Update Zen browser components submodule commit reference --- .../base/content/ZenSidebarManager.mjs | 551 ------------------ src/browser/base/content/ZenViewSplitter.mjs | 96 --- src/browser/base/content/ZenWorkspaces.mjs | 426 -------------- .../content/navigator-toolbox-inc-xhtml.patch | 21 +- src/browser/base/content/zen-components | 2 +- .../base/content/zen-scripts.inc.xhtml | 14 +- .../base/content/zen-scripts.jar.inc.mn | 15 +- src/browser/themes/shared/zen-panel-ui.css | 6 +- 8 files changed, 17 insertions(+), 1114 deletions(-) delete mode 100644 src/browser/base/content/ZenSidebarManager.mjs delete mode 100644 src/browser/base/content/ZenViewSplitter.mjs delete mode 100644 src/browser/base/content/ZenWorkspaces.mjs diff --git a/src/browser/base/content/ZenSidebarManager.mjs b/src/browser/base/content/ZenSidebarManager.mjs deleted file mode 100644 index b7b3a3171..000000000 --- a/src/browser/base/content/ZenSidebarManager.mjs +++ /dev/null @@ -1,551 +0,0 @@ - - - -var gZenBrowserManagerSidebar = { - _sidebarElement: null, - _currentPanel: null, - _lastOpenedPanel: null, - _hasChangedConfig: true, - _splitterElement: null, - _hSplitterElement: null, - _hasRegisteredPinnedClickOutside: false, - _isDragging: false, - 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 - MAX_RUNS: 3, - - init() { - this.update(); - this.close(); // avoid caching - this.listenForPrefChanges(); - this.insertIntoContextMenu(); - }, - - get sidebarData() { - let services = Services.prefs.getStringPref("zen.sidebar.data"); - if (services === "") { - return {}; - } - return JSON.parse(services); - }, - - get shouldCloseOnBlur() { - return Services.prefs.getBoolPref("zen.sidebar.close-on-blur"); - }, - - listenForPrefChanges() { - Services.prefs.addObserver("zen.sidebar.data", this.handleEvent.bind(this)); - Services.prefs.addObserver("zen.sidebar.enabled", this.handleEvent.bind(this)); - - let sidebar = document.getElementById("zen-sidebar-web-panel"); - this.splitterElement.addEventListener("mousedown", (function(event) { - let computedStyle = window.getComputedStyle(sidebar); - let maxWidth = parseInt(computedStyle.getPropertyValue("max-width").replace("px", "")); - let minWidth = parseInt(computedStyle.getPropertyValue("min-width").replace("px", "")); - - if (!this._isDragging) { // Prevent multiple resizes - this._isDragging = true; - let sidebarWidth = sidebar.getBoundingClientRect().width; - let startX = event.clientX; - let startWidth = sidebarWidth; - let mouseMove = (function(e) { - let newWidth = startWidth + e.clientX - startX; - if (newWidth <= minWidth+10) { - newWidth = minWidth+1; - } else if (newWidth >= maxWidth-10) { - newWidth = maxWidth-1; - } - sidebar.style.width = `${newWidth}px`; - }); - let mouseUp = (function() { - this.handleEvent(); - this._isDragging = false; - document.removeEventListener("mousemove", mouseMove); - document.removeEventListener("mouseup", mouseUp); - }).bind(this); - document.addEventListener("mousemove", mouseMove); - document.addEventListener("mouseup", mouseUp); - } - }).bind(this)); - - this.hSplitterElement.addEventListener("mousedown", (function(event) { - let computedStyle = window.getComputedStyle(sidebar); - const parent = sidebar.parentElement; - // relative to avoid the top margin - // 20px is the padding - let parentRelativeHeight = parent.getBoundingClientRect().height - parent.getBoundingClientRect().top + 20; - let minHeight = parseInt(computedStyle.getPropertyValue("min-height").replace("px", "")); - if (!this._isDragging) { // Prevent multiple resizes - this._isDragging = true; - let sidebarHeight = sidebar.getBoundingClientRect().height; - let startY = event.clientY; - let startHeight = sidebarHeight; - let mouseMove = (function(e) { - let newHeight = startHeight + e.clientY - startY; - if (newHeight <= minHeight+10) { - newHeight = minHeight+1; - } else if (newHeight >= parentRelativeHeight) { // 10px is the padding - newHeight = parentRelativeHeight; - } - sidebar.style.height = `${newHeight}px`; - }); - let mouseUp = (function() { - this.handleEvent(); - this._isDragging = false; - document.removeEventListener("mousemove", mouseMove); - document.removeEventListener("mouseup", mouseUp); - }).bind(this); - document.addEventListener("mousemove", mouseMove); - document.addEventListener("mouseup", mouseUp); - } - }).bind(this)); - - this.handleEvent(); - }, - - get isFloating() { - return document.getElementById("zen-sidebar-web-panel").hasAttribute("pinned"); - }, - - handleEvent() { - this._hasChangedConfig = true; - this.update(); - this._hasChangedConfig = false; - - // https://stackoverflow.com/questions/11565471/removing-event-listener-which-was-added-with-bind - var clickOutsideHandler = this._handleClickOutside.bind(this); - let isFloating = this.isFloating; - if (isFloating && !this._hasRegisteredPinnedClickOutside) { - document.addEventListener("mouseup", clickOutsideHandler); - this._hasRegisteredPinnedClickOutside = true; - } else if (!isFloating && this._hasRegisteredPinnedClickOutside) { - document.removeEventListener("mouseup", clickOutsideHandler); - this._hasRegisteredPinnedClickOutside = false; - } - - const button = document.getElementById("zen-sidepanel-button"); - if (Services.prefs.getBoolPref("zen.sidebar.enabled")) { - button.removeAttribute("hidden"); - } else { - button.setAttribute("hidden", "true"); - this._closeSidebarPanel(); - return; - } - }, - - _handleClickOutside(event) { - let sidebar = document.getElementById("zen-sidebar-web-panel"); - if (!sidebar.hasAttribute("pinned") || this._isDragging || !this.shouldCloseOnBlur) { - return; - } - let target = event.target; - const closestSelector = [ - "#zen-sidebar-web-panel", - "#zen-sidebar-panels-wrapper", - "#zenWebPanelContextMenu", - "#zen-sidebar-web-panel-splitter", - "#contentAreaContextMenu" - ].join(", "); - if (target.closest(closestSelector)) { - return; - } - this.close(); - }, - - toggle() { - if (!this._currentPanel) { - this._currentPanel = this._lastOpenedPanel; - } - if (document.getElementById("zen-sidebar-web-panel").hasAttribute("hidden")) { - this.open(); - return; - } - this.close(); - }, - - open() { - let sidebar = document.getElementById("zen-sidebar-web-panel"); - sidebar.removeAttribute("hidden"); - this.update(); - }, - - update() { - this._updateWebPanels(); - this._updateSidebarButton(); - this._updateWebPanel(); - this._updateButtons(); - }, - - _updateSidebarButton() { - let button = document.getElementById("zen-sidepanel-button"); - if (!document.getElementById("zen-sidebar-web-panel").hasAttribute("hidden")) { - button.setAttribute("open", "true"); - } else { - button.removeAttribute("open"); - } - }, - - _updateWebPanels() { - if (Services.prefs.getBoolPref("zen.sidebar.enabled")) { - this.sidebarElement.removeAttribute("hidden"); - } else { - this.sidebarElement.setAttribute("hidden", "true"); - this._closeSidebarPanel(); - return; - } - - let data = this.sidebarData; - if (!data.data || !data.index) { - return; - } - this.sidebarElement.innerHTML = ""; - for (let site of data.index) { - let panel = data.data[site]; - if (!panel || !panel.url) { - continue; - } - let button = document.createXULElement("toolbarbutton"); - button.classList.add("zen-sidebar-panel-button", "toolbarbutton-1", "chromeclass-toolbar-additional"); - button.setAttribute("flex", "1"); - button.setAttribute("zen-sidebar-id", site); - button.setAttribute("context", "zenWebPanelContextMenu"); - this._getWebPanelIcon(panel.url, button); - button.addEventListener("click", this._handleClick.bind(this)); - this.sidebarElement.appendChild(button); - } - const addButton = document.getElementById("zen-sidebar-add-panel-button"); - if (data.index.length < this.MAX_SIDEBAR_PANELS) { - addButton.removeAttribute("hidden"); - } else { - addButton.setAttribute("hidden", "true"); - } - }, - - 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, {}); - } - }, - - _setPinnedToElements() { - let sidebar = document.getElementById("zen-sidebar-web-panel"); - sidebar.setAttribute("pinned", "true"); - document.getElementById("zen-sidebar-web-panel-pinned").setAttribute("pinned", "true"); - }, - - _removePinnedFromElements() { - let sidebar = document.getElementById("zen-sidebar-web-panel"); - sidebar.removeAttribute("pinned"); - document.getElementById("zen-sidebar-web-panel-pinned").removeAttribute("pinned"); - }, - - _closeSidebarPanel() { - let sidebar = document.getElementById("zen-sidebar-web-panel"); - sidebar.setAttribute("hidden", "true"); - this._lastOpenedPanel = this._currentPanel; - this._currentPanel = null; - }, - - _handleClick(event) { - let target = event.target; - let panelId = target.getAttribute("zen-sidebar-id"); - if (this._currentPanel === panelId) { - return; - } - this._currentPanel = panelId; - this._updateWebPanel(); - }, - - _createNewPanel(url) { - let data = this.sidebarData; - let newName = "p" + new Date().getTime(); - data.index.push(newName); - data.data[newName] = { - url: url, - ua: false, - }; - Services.prefs.setStringPref("zen.sidebar.data", JSON.stringify(data)); - this._currentPanel = newName; - this.open(); - }, - - _updateButtons() { - for (let button of this.sidebarElement.querySelectorAll(".zen-sidebar-panel-button")) { - if (button.getAttribute("zen-sidebar-id") === this._currentPanel) { - button.setAttribute("selected", "true"); - } else { - button.removeAttribute("selected"); - } - } - }, - - _hideAllWebPanels() { - let sidebar = document.getElementById("zen-sidebar-web-panel"); - for (let browser of sidebar.querySelectorAll("browser[zen-sidebar-id]")) { - browser.setAttribute("hidden", "true"); - browser.docShellIsActive = false; - } - }, - - get introductionPanel() { - return document.getElementById("zen-sidebar-introduction-panel"); - }, - - _updateWebPanel() { - this._updateButtons(); - let sidebar = document.getElementById("zen-sidebar-web-panel"); - this._hideAllWebPanels(); - if (!this._currentPanel) { - this.introductionPanel.removeAttribute("hidden"); - return; - } - this.introductionPanel.setAttribute("hidden", "true"); - let existantWebview = this._getCurrentBrowser(); - if (existantWebview) { - existantWebview.docShellIsActive = true; - existantWebview.removeAttribute("hidden"); - document.getElementById("zen-sidebar-web-panel-title").textContent = existantWebview.contentTitle; - return; - } - let data = this._getWebPanelData(this._currentPanel); - let browser = this._createWebPanelBrowser(data); - let browserContainers = document.getElementById("zen-sidebar-web-panel-browser-containers"); - browserContainers.appendChild(browser); - if (data.ua) { - browser.browsingContext.customUserAgent = this.DEFAULT_MOBILE_USER_AGENT; - } - browser.docShellIsActive = true; - }, - - _getWebPanelData(id) { - let data = this.sidebarData; - let panel = data.data[id]; - if (!panel || !panel.url) { - return {}; - } - return { - id: id, - ...panel, - }; - }, - - _createWebPanelBrowser(data) { - const titleContainer = document.getElementById("zen-sidebar-web-panel-title"); - titleContainer.textContent = "Loading..."; - 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"); - browser.setAttribute("disablesecurity", "true"); - browser.addEventListener("pagetitlechanged", (function(event) { - let browser = event.target; - let title = browser.contentTitle; - if (!title) { - return; - } - let id = browser.getAttribute("zen-sidebar-id"); - if (id === this._currentPanel) { - titleContainer.textContent = title; - } - }).bind(this)); - return browser; - }, - - _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) { - let sidebar = document.getElementById("zen-sidebar-web-panel"); - return sidebar.querySelector(`browser[zen-sidebar-id="${id}"]`); - }, - - _getCurrentBrowser() { - return this._getBrowserById(this._currentPanel); - }, - - reload() { - let browser = this._getCurrentBrowser(); - if (browser) { - browser.reload(); - } - }, - - forward() { - let browser = this._getCurrentBrowser(); - if (browser) { - browser.goForward(); - } - }, - - back() { - let browser = this._getCurrentBrowser(); - if (browser) { - browser.goBack(); - } - }, - - home() { - let browser = this._getCurrentBrowser(); - if (browser) { - browser.gotoIndex(); - } - }, - - close() { - this._hideAllWebPanels(); - this._closeSidebarPanel(); - this._updateSidebarButton(); - }, - - togglePinned(elem) { - let sidebar = document.getElementById("zen-sidebar-web-panel"); - if (sidebar.hasAttribute("pinned")) { - this._removePinnedFromElements(); - } else { - this._setPinnedToElements(); - } - this.update(); - }, - - get sidebarElement() { - if (!this._sidebarElement) { - this._sidebarElement = document.getElementById("zen-sidebar-panels-sites"); - } - return this._sidebarElement; - }, - - get splitterElement() { - if (!this._splitterElement) { - this._splitterElement = document.getElementById("zen-sidebar-web-panel-splitter"); - } - return this._splitterElement; - }, - - get hSplitterElement() { - if (!this._hSplitterElement) { - this._hSplitterElement = document.getElementById("zen-sidebar-web-panel-hsplitter"); - } - return this._hSplitterElement; - }, - - // Context menu - - updateContextMenu(aPopupMenu) { - let panel = - aPopupMenu.triggerNode && - (aPopupMenu.triggerNode || aPopupMenu.triggerNode.closest("toolbarbutton[zen-sidebar-id]")); - if (!panel) { - return; - } - let id = panel.getAttribute("zen-sidebar-id"); - this.contextTab = id; - let data = this._getWebPanelData(id); - let browser = this._getBrowserById(id); - let isMuted = browser && browser.audioMuted; - let mutedContextItem = document.getElementById("context_zenToggleMuteWebPanel"); - document.l10n.setAttributes(mutedContextItem, - !isMuted ? "zen-web-side-panel-context-mute-panel" : "zen-web-side-panel-context-unmute-panel"); - if (!isMuted) { - mutedContextItem.setAttribute("muted", "true"); - } else { - mutedContextItem.removeAttribute("muted"); - } - document.l10n.setAttributes(document.getElementById("context_zenToogleUAWebPanel"), - data.ua ? "zen-web-side-panel-context-disable-ua" : "zen-web-side-panel-context-enable-ua"); - if (!browser) { - document.getElementById("context_zenUnloadWebPanel").setAttribute("disabled", "true"); - } else { - document.getElementById("context_zenUnloadWebPanel").removeAttribute("disabled"); - } - }, - - contextOpenNewTab() { - let browser = this._getBrowserById(this.contextTab); - let data = this.sidebarData; - let panel = data.data[this.contextTab]; - let url = (browser == null) ? panel.url : browser.currentURI.spec; - gZenUIManager.openAndChangeToTab(url); - this.close(); - }, - - contextToggleMuteAudio() { - let browser = this._getBrowserById(this.contextTab); - if (browser.audioMuted) { - browser.unmute(); - } else { - browser.mute(); - } - }, - - contextToggleUserAgent() { - let browser = this._getBrowserById(this.contextTab); - browser.browsingContext.customUserAgent = browser.browsingContext.customUserAgent ? null : this.DEFAULT_MOBILE_USER_AGENT; - let data = this.sidebarData; - data.data[this.contextTab].ua = !data.data[this.contextTab].ua; - Services.prefs.setStringPref("zen.sidebar.data", JSON.stringify(data)); - browser.reload(); - }, - - contextDelete() { - let data = this.sidebarData; - delete data.data[this.contextTab]; - data.index = data.index.filter(id => id !== this.contextTab); - let browser = this._getBrowserById(this.contextTab); - if (browser) { - browser.remove(); - } - this._currentPanel = null; - this._lastOpenedPanel = null; - this.update(); - Services.prefs.setStringPref("zen.sidebar.data", JSON.stringify(data)); - }, - - contextUnload() { - let browser = this._getBrowserById(this.contextTab); - browser.remove(); - this._closeSidebarPanel(); - this.close(); - this._lastOpenedPanel = null; - }, - - insertIntoContextMenu() { - const sibling = document.getElementById("context-stripOnShareLink"); - const menuitem = document.createXULElement("menuitem"); - menuitem.setAttribute("id", "context-zenAddToWebPanel"); - menuitem.setAttribute("hidden", "true"); - menuitem.setAttribute("oncommand", "gZenBrowserManagerSidebar.addPanelFromContextMenu();"); - menuitem.setAttribute("data-l10n-id", "zen-web-side-panel-context-add-to-panel"); - sibling.insertAdjacentElement("afterend", menuitem); - }, - - addPanelFromContextMenu() { - const url = gContextMenu.linkURL || gContextMenu.target.ownerDocument.location.href; - this._createNewPanel(url); - }, -}; - -gZenBrowserManagerSidebar.init(); diff --git a/src/browser/base/content/ZenViewSplitter.mjs b/src/browser/base/content/ZenViewSplitter.mjs deleted file mode 100644 index 10577dd55..000000000 --- a/src/browser/base/content/ZenViewSplitter.mjs +++ /dev/null @@ -1,96 +0,0 @@ - -var gZenViewSplitter = { - init() { - this.initializeUI(); - console.log(gZenSplitViewsBase) - }, - - initializeUI() { - this.initializeUpdateContextMenuItems(); - this.initializeTabContextMenu(); - }, - - initializeTabContextMenu() { - const fragment = window.MozXULElement.parseXULToFragment(` - - - `); - document.getElementById("tabContextMenu").appendChild(fragment); - }, - - initializeUpdateContextMenuItems() { - const contentAreaContextMenu = document.getElementById("tabContextMenu"); - - contentAreaContextMenu.addEventListener("popupshowing", () => { - const tabCountInfo = JSON.stringify({ - tabCount: window.gBrowser.selectedTabs.length, - }); - console.log(tabCountInfo); - console.log(window.gContextMenu); - document - .getElementById("context_zenSplitTabs") - .setAttribute("data-l10n-args", tabCountInfo); - document.getElementById("context_zenSplitTabs").disabled = - !this.contextCanSplitTabs(); - }); - }, - - onLocationChange(browser) { - gZenSplitViewsBase.onLocationChange(browser); - }, - - async openSplitViewPanel(event) { - let panel = this._modifierElement; - let target = event.target.parentNode; - for (const gridType of ['horizontal', 'vertical', 'grid', 'unsplit']) { - let selector = panel.querySelector(`.zen-split-view-modifier-preview.${gridType}`); - selector.classList.remove("active"); - if (gZenSplitViewsBase.getActiveViewType() === gridType) { - selector.classList.add("active"); - } - if (this.__hasSetMenuListener) { - continue; - } - selector.addEventListener("click", ((gridType) => { - // TODO: Implement the split view - panel.hidePopup(); - }).bind(this, gridType)); - } - this.__hasSetMenuListener = true; - PanelMultiView.openPopup(panel, target, { - position: "bottomright topright", - triggerEvent: event, - }).catch(console.error); - }, - - contextCanSplitTabs() { - let tabs = window.gBrowser.selectedTabs; - if (tabs.length < 2) { - return false; - } - // Check if there are 2 tabs in different groups - // Or if all the selected tabs are in the same group - let group = gZenSplitViewsBase.getTabView(tabs[0]); - for (let i = 1; i < tabs.length; i++) { - // Check if they are not in the same group, but we do allow - // if they are ungrouped - let tabGroup = gZenSplitViewsBase.getTabView(tabs[i]); - if (tabGroup === -1) { - continue; - } - if (group !== tabGroup) { - return false; - } - } - return true; - }, - - contextSplitTabs() { - let selectedTabs = gBrowser.selectedTabs; - - }, -}; - -gZenViewSplitter.init(); diff --git a/src/browser/base/content/ZenWorkspaces.mjs b/src/browser/base/content/ZenWorkspaces.mjs deleted file mode 100644 index 606836bc1..000000000 --- a/src/browser/base/content/ZenWorkspaces.mjs +++ /dev/null @@ -1,426 +0,0 @@ - -var ZenWorkspaces = { - async init() { - let docElement = document.documentElement; - if (docElement.getAttribute("chromehidden").includes("toolbar") - || docElement.getAttribute("chromehidden").includes("menubar") - || docElement.hasAttribute("privatebrowsingmode")) { - console.warn("ZenWorkspaces: !!! ZenWorkspaces is disabled in hidden windows !!!"); - return; // We are in a hidden window, don't initialize ZenWorkspaces - } - console.log("ZenWorkspaces: Initializing ZenWorkspaces..."); - await this.initializeWorkspaces(); - console.log("ZenWorkspaces: ZenWorkspaces initialized"); - }, - - get workspaceEnabled() { - return Services.prefs.getBoolPref("zen.workspaces.enabled", false); - }, - - // Wrorkspaces saving/loading - get _storeFile() { - return PathUtils.join( - PathUtils.profileDir, - "zen-workspaces", - "Workspaces.json", - ); - }, - - async _workspaces() { - if (!this._workspaceCache) { - this._workspaceCache = await IOUtils.readJSON(this._storeFile); - if (!this._workspaceCache.workspaces) { - this._workspaceCache.workspaces = []; - } - } - return this._workspaceCache; - }, - - onWorkspacesEnabledChanged() { - if (this.workspaceEnabled) { - this.initializeWorkspaces(); - } else { - this._workspaceCache = null; - document.getElementById("zen-workspaces-button")?.remove(); - for (let tab of gBrowser.tabs) { - gBrowser.showTab(tab); - } - } - }, - - async initializeWorkspaces() { - Services.prefs.addObserver("zen.workspaces.enabled", this.onWorkspacesEnabledChanged.bind(this)); - this.initializeWorkspacesButton(); - let file = new FileUtils.File(this._storeFile); - if (!file.exists()) { - await IOUtils.writeJSON(this._storeFile, {}); - } - if (this.workspaceEnabled) { - let workspaces = await this._workspaces(); - if (workspaces.workspaces.length === 0) { - await this.createAndSaveWorkspace("Default Workspace", true); - } else { - let activeWorkspace = workspaces.workspaces.find(workspace => workspace.default); - if (!activeWorkspace) { - activeWorkspace = workspaces.workspaces.find(workspace => workspace.used); - activeWorkspace.used = true; - await this.saveWorkspaces(); - } - if (!activeWorkspace) { - activeWorkspace = workspaces.workspaces[0]; - activeWorkspace.used = true; - await this.saveWorkspaces(); - } - await this.changeWorkspace(activeWorkspace); - } - this._initializeWorkspaceIcons(); - } - }, - - _initializeWorkspaceIcons() { - const kIcons = ["🏠", "📄", "💹", "💼", "📧", "✅", "👥"]; - let container = document.getElementById("PanelUI-zen-workspaces-create-icons-container"); - for (let icon of kIcons) { - let button = document.createXULElement("toolbarbutton"); - button.className = "toolbarbutton-1"; - button.setAttribute("label", icon); - button.onclick = ((event) => { - for (let button of container.children) { - button.removeAttribute("selected"); - } - button.setAttribute("selected", "true"); - }).bind(this, button); - container.appendChild(button); - } - }, - - async saveWorkspace(workspaceData) { - let json = await IOUtils.readJSON(this._storeFile); - if (typeof json.workspaces === "undefined") { - json.workspaces = []; - } - json.workspaces.push(workspaceData); - console.log("ZenWorkspaces: Saving workspace", workspaceData); - await IOUtils.writeJSON(this._storeFile, json); - this._workspaceCache = null; - }, - - async removeWorkspace(windowID) { - let json = await this._workspaces(); - console.log("ZenWorkspaces: Removing workspace", windowID); - await this.changeWorkspace(json.workspaces.find(workspace => workspace.uuid !== windowID)); - this._deleteAllTabsInWorkspace(windowID); - json.workspaces = json.workspaces.filter(workspace => workspace.uuid !== windowID); - await this.unsafeSaveWorkspaces(json); - await this._propagateWorkspaceData(); - }, - - async saveWorkspaces() { - await IOUtils.writeJSON(this._storeFile, await this._workspaces()); - this._workspaceCache = null; - }, - - async unsafeSaveWorkspaces(workspaces) { - await IOUtils.writeJSON(this._storeFile, workspaces); - this._workspaceCache = null; - }, - - // Workspaces dialog UI management - - openSaveDialog() { - let parentPanel = document.getElementById("PanelUI-zen-workspaces-multiview"); - PanelUI.showSubView("PanelUI-zen-workspaces-create", parentPanel); - }, - - cancelWorkspaceCreation() { - let parentPanel = document.getElementById("PanelUI-zen-workspaces-multiview"); - parentPanel.goBack(); - }, - - workspaceHasIcon(workspace) { - return typeof workspace.icon !== "undefined" && workspace.icon !== ""; - }, - - getWorkspaceIcon(workspace) { - if (this.workspaceHasIcon(workspace)) { - return workspace.icon; - } - return workspace.name[0].toUpperCase(); - }, - - async _propagateWorkspaceData() { - let currentContainer = document.getElementById("PanelUI-zen-workspaces-current-info"); - let workspaceList = document.getElementById("PanelUI-zen-workspaces-list"); - const createWorkspaceElement = (workspace) => { - let element = document.createXULElement("toolbarbutton"); - element.className = "subviewbutton"; - element.setAttribute("tooltiptext", workspace.name); - element.setAttribute("zen-workspace-id", workspace.uuid); - //element.setAttribute("context", "zenWorkspaceActionsMenu"); - let childs = window.MozXULElement.parseXULToFragment(` -
- ${this.getWorkspaceIcon(workspace)} -
-
- ${workspace.name} -
- - - - `); - childs.querySelector(".zen-workspace-actions").addEventListener("command", ((event) => { - let button = event.target; - this._contextMenuId = button.closest("toolbarbutton[zen-workspace-id]").getAttribute("zen-workspace-id"); - const popup = button.ownerDocument.getElementById( - "zenWorkspaceActionsMenu" - ); - popup.openPopup(button, "after_end"); - }).bind(this)); - element.appendChild(childs); - element.onclick = (async () => { - if (event.target.closest(".zen-workspace-actions")) { - return; // Ignore clicks on the actions button - } - await this.changeWorkspace(workspace) - let panel = document.getElementById("PanelUI-zen-workspaces"); - PanelMultiView.hidePopup(panel); - }).bind(this, workspace); - return element; - } - let workspaces = await this._workspaces(); - let activeWorkspace = workspaces.workspaces.find(workspace => workspace.used); - currentContainer.innerHTML = ""; - workspaceList.innerHTML = ""; - workspaceList.parentNode.style.display = "flex"; - if (workspaces.workspaces.length - 1 <= 0) { - workspaceList.innerHTML = "No workspaces available"; - workspaceList.setAttribute("empty", "true"); - } else { - workspaceList.removeAttribute("empty"); - } - if (activeWorkspace) { - let currentWorkspace = createWorkspaceElement(activeWorkspace); - currentContainer.appendChild(currentWorkspace); - } - for (let workspace of workspaces.workspaces) { - if (workspace.used) { - continue; - } - let workspaceElement = createWorkspaceElement(workspace); - workspaceList.appendChild(workspaceElement); - } - }, - - async openWorkspacesDialog(event) { - if (!this.workspaceEnabled) { - return; - } - let target = event.target; - let panel = document.getElementById("PanelUI-zen-workspaces"); - await this._propagateWorkspaceData(); - PanelMultiView.openPopup(panel, target, { - position: "bottomright topright", - triggerEvent: event, - }).catch(console.error); - }, - - initializeWorkspacesButton() { - if (!this.workspaceEnabled) { - return; - } else if (document.getElementById("zen-workspaces-button")) { - let button = document.getElementById("zen-workspaces-button"); - button.removeAttribute("hidden"); - return; - } - let browserTabs = document.getElementById("tabbrowser-tabs"); - let button = document.createElement("toolbarbutton"); - button.id = "zen-workspaces-button"; - button.className = "toolbarbutton-1 chromeclass-toolbar-additional"; - button.setAttribute("label", "Workspaces"); - button.setAttribute("tooltiptext", "Workspaces"); - button.onclick = this.openWorkspacesDialog.bind(this); - browserTabs.insertAdjacentElement("beforebegin", button); - }, - - async _updateWorkspacesButton() { - let button = document.getElementById("zen-workspaces-button"); - if (!button) { - return; - } - let activeWorkspace = (await this._workspaces()).workspaces.find(workspace => workspace.used); - if (activeWorkspace) { - button.innerHTML = ` -
- ${this.getWorkspaceIcon(activeWorkspace)} -
-
- ${activeWorkspace.name} -
- `; - if (!this.workspaceHasIcon(activeWorkspace)) { - button.querySelector(".zen-workspace-sidebar-icon").setAttribute("no-icon", "true"); - } - } - }, - - // Workspaces management - - get _workspaceInput() { - return document.getElementById("PanelUI-zen-workspaces-create-input"); - }, - - _deleteAllTabsInWorkspace(workspaceID) { - for (let tab of gBrowser.tabs) { - if (tab.getAttribute("zen-workspace-id") === workspaceID) { - gBrowser.removeTab(tab, { - animate: true, - skipSessionStore: true, - closeWindowWithLastTab: false, - }); - } - } - }, - - _prepareNewWorkspace(window) { - document.documentElement.setAttribute("zen-workspace-id", window.uuid); - let tabCount = 0; - for (let tab of gBrowser.tabs) { - if (!tab.hasAttribute("zen-workspace-id")) { - tab.setAttribute("zen-workspace-id", window.uuid); - tabCount++; - } - } - if (tabCount === 0) { - this._createNewTabForWorkspace(window); - } - }, - - _createNewTabForWorkspace(window) { - let tab = gZenUIManager.openAndChangeToTab(Services.prefs.getStringPref("browser.startup.homepage")); - tab.setAttribute("zen-workspace-id", window.uuid); - }, - - async saveWorkspaceFromInput() { - // Go to the next view - let parentPanel = document.getElementById("PanelUI-zen-workspaces-multiview"); - PanelUI.showSubView("PanelUI-zen-workspaces-create-icons", parentPanel); - }, - - async saveWorkspaceFromIcon() { - let workspaceName = this._workspaceInput.value; - if (!workspaceName) { - return; - } - this._workspaceInput.value = ""; - let icon = document.querySelector("#PanelUI-zen-workspaces-create-icons-container [selected]"); - icon?.removeAttribute("selected"); - await this.createAndSaveWorkspace(workspaceName, false, icon?.label); - document.getElementById("PanelUI-zen-workspaces").hidePopup(true); - }, - - onWorkspaceNameChange(event) { - let button = document.getElementById("PanelUI-zen-workspaces-create-save"); - if (this._workspaceInput.value === "") { - button.setAttribute("disabled", "true"); - return; - } - button.removeAttribute("disabled"); - }, - - async changeWorkspace(window) { - if (!this.workspaceEnabled) { - return; - } - let firstTab = undefined; - let workspaces = await this._workspaces(); - for (let workspace of workspaces.workspaces) { - workspace.used = workspace.uuid === window.uuid; - } - this.unsafeSaveWorkspaces(workspaces); - console.log("ZenWorkspaces: Changing workspace to", window.uuid); - for (let tab of gBrowser.tabs) { - if (tab.getAttribute("zen-workspace-id") === window.uuid && !tab.pinned) { - if (!firstTab) { - firstTab = tab; - gBrowser.selectedTab = firstTab; - } - gBrowser.showTab(tab); - } - } - if (typeof firstTab === "undefined") { - this._createNewTabForWorkspace(window); - } - for (let tab of gBrowser.tabs) { - if (tab.getAttribute("zen-workspace-id") !== window.uuid) { - gBrowser.hideTab(tab); - } - } - document.documentElement.setAttribute("zen-workspace-id", window.uuid); - await this.saveWorkspaces(); - await this._updateWorkspacesButton(); - await this._propagateWorkspaceData(); - }, - - _createWorkspaceData(name, isDefault, icon) { - let window = { - uuid: gZenUIManager.generateUuidv4(), - default: isDefault, - used: true, - icon: icon, - name: name, - }; - this._prepareNewWorkspace(window); - return window; - }, - - async createAndSaveWorkspace(name = "New Workspace", isDefault = false, icon = undefined) { - if (!this.workspaceEnabled) { - return; - } - let workspaceData = this._createWorkspaceData(name, isDefault, icon); - await this.saveWorkspace(workspaceData); - await this.changeWorkspace(workspaceData); - }, - - async onLocationChange(browser) { - let tab = gBrowser.getTabForBrowser(browser); - let workspaceID = tab.getAttribute("zen-workspace-id"); - if (!workspaceID) { - let workspaces = await this._workspaces(); - let activeWorkspace = workspaces.workspaces.find(workspace => workspace.used); - if (!activeWorkspace) { - return; - } - tab.setAttribute("zen-workspace-id", activeWorkspace.uuid); - } - }, - - // Context menu management - - _contextMenuId: null, - async updateContextMenu(_) { - console.assert(this._contextMenuId, "No context menu ID set"); - document.querySelector(`#PanelUI-zen-workspaces [zen-workspace-id="${this._contextMenuId}"] .zen-workspace-actions`).setAttribute("active", "true"); - const workspaces = await this._workspaces(); - let deleteMenuItem = document.getElementById("context_zenDeleteWorkspace"); - if (workspaces.workspaces.length <= 1 || workspaces.workspaces.find(workspace => workspace.uuid === this._contextMenuId).default) { - deleteMenuItem.setAttribute("disabled", "true"); - } else { - deleteMenuItem.removeAttribute("disabled"); - } - }, - - onContextMenuClose() { - let target = document.querySelector(`#PanelUI-zen-workspaces [zen-workspace-id="${this._contextMenuId}"] .zen-workspace-actions`); - if (target) { - target.removeAttribute("active"); - } - this._contextMenuId = null; - }, - - async contextDelete() { - await this.removeWorkspace(this._contextMenuId); - } -}; - -ZenWorkspaces.init(); diff --git a/src/browser/base/content/navigator-toolbox-inc-xhtml.patch b/src/browser/base/content/navigator-toolbox-inc-xhtml.patch index 2b06133ca..42d5aa58b 100644 --- a/src/browser/base/content/navigator-toolbox-inc-xhtml.patch +++ b/src/browser/base/content/navigator-toolbox-inc-xhtml.patch @@ -1,5 +1,5 @@ diff --git a/browser/base/content/navigator-toolbox.inc.xhtml b/browser/base/content/navigator-toolbox.inc.xhtml -index 390a1300a1213af2b411ba09c67e3c25750ee6c3..253d7abfcc1ade419c8f70289719cdc53898cab4 100644 +index 390a1300a1213af2b411ba09c67e3c25750ee6c3..a7ab07f8e8a0c5f91a6c12eb5d27c56edbd7405c 100644 --- a/browser/base/content/navigator-toolbox.inc.xhtml +++ b/browser/base/content/navigator-toolbox.inc.xhtml @@ -2,7 +2,7 @@ @@ -53,22 +53,7 @@ index 390a1300a1213af2b411ba09c67e3c25750ee6c3..253d7abfcc1ade419c8f70289719cdc5 -@@ -409,6 +412,14 @@ - - -+ - - - -@@ -450,6 +461,7 @@ +@@ -450,6 +453,7 @@ diff --git a/src/browser/base/content/zen-components b/src/browser/base/content/zen-components index f5f5f4b9c..ea286eb8a 160000 --- a/src/browser/base/content/zen-components +++ b/src/browser/base/content/zen-components @@ -1 +1 @@ -Subproject commit f5f5f4b9c1a525134e8f3302aac0dd00d4b854b9 +Subproject commit ea286eb8a6af66d42a8bb4f7cc9ad4b576a3d772 diff --git a/src/browser/base/content/zen-scripts.inc.xhtml b/src/browser/base/content/zen-scripts.inc.xhtml index f5564b46c..053da7f12 100644 --- a/src/browser/base/content/zen-scripts.inc.xhtml +++ b/src/browser/base/content/zen-scripts.inc.xhtml @@ -1,16 +1,8 @@ \ No newline at end of file diff --git a/src/browser/base/content/zen-scripts.jar.inc.mn b/src/browser/base/content/zen-scripts.jar.inc.mn index 680bd60c9..c03098b46 100644 --- a/src/browser/base/content/zen-scripts.jar.inc.mn +++ b/src/browser/base/content/zen-scripts.jar.inc.mn @@ -1,8 +1,7 @@ - content/browser/zen-browser-places.js (content/zen-browser-places.js) - content/browser/zenThemeModifier.js (content/zenThemeModifier.js) - content/browser/ZenSidebarManager.mjs (content/ZenSidebarManager.mjs) - content/browser/ZenUIManager.mjs (content/ZenUIManager.mjs) - content/browser/ZenViewSplitter.mjs (content/ZenViewSplitter.mjs) - content/browser/ZenWorkspaces.mjs (content/ZenWorkspaces.mjs) - - content/browser/zen-components/browser-splitViews.mjs (content/zen-components/src/browser-splitViews.mjs) \ No newline at end of file + content/browser/zen-browser-places.js (content/zen-browser-places.js) + content/browser/zenThemeModifier.js (content/zenThemeModifier.js) + content/browser/ZenUIManager.mjs (content/ZenUIManager.mjs) + content/browser/zen-components/ZenViewSplitter.mjs (content/zen-components/src/ZenViewSplitter.mjs) + content/browser/zen-components/ZenWorkspaces.mjs (content/zen-components/src/ZenWorkspaces.mjs) + content/browser/zen-components/ZenSidebarManager.mjs (content/zen-components/src/ZenSidebarManager.mjs) + \ No newline at end of file diff --git a/src/browser/themes/shared/zen-panel-ui.css b/src/browser/themes/shared/zen-panel-ui.css index c1bfc5b87..179247d07 100644 --- a/src/browser/themes/shared/zen-panel-ui.css +++ b/src/browser/themes/shared/zen-panel-ui.css @@ -209,17 +209,17 @@ height: 100%; } -#zenSplitViewModifierViewDefault .zen-split-view-modifier-preview.horizontal { +#zenSplitViewModifierViewDefault .zen-split-view-modifier-preview.hsep { display: flex; flex-direction: column; justify-content: space-between; } -#zenSplitViewModifierViewDefault .zen-split-view-modifier-preview.horizontal box:last-child { +#zenSplitViewModifierViewDefault .zen-split-view-modifier-preview.hsep box:last-child { margin-top: 5px; } -#zenSplitViewModifierViewDefault .zen-split-view-modifier-preview.vertical box:last-child { +#zenSplitViewModifierViewDefault .zen-split-view-modifier-preview.vsep box:last-child { margin-left: 5px; }