chore: Update Zen browser components submodule commit reference

This commit is contained in:
Mauro Balades
2024-08-06 20:14:03 +02:00
parent 214e290af3
commit 5316ff8e47
8 changed files with 17 additions and 1114 deletions

View File

@@ -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();

View File

@@ -1,96 +0,0 @@
var gZenViewSplitter = {
init() {
this.initializeUI();
console.log(gZenSplitViewsBase)
},
initializeUI() {
this.initializeUpdateContextMenuItems();
this.initializeTabContextMenu();
},
initializeTabContextMenu() {
const fragment = window.MozXULElement.parseXULToFragment(`
<menuseparator/>
<menuitem id="context_zenSplitTabs"
data-lazy-l10n-id="tab-zen-split-tabs"
oncommand="gZenViewSplitter.contextSplitTabs();"/>
`);
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();

View File

@@ -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(`
<div class="zen-workspace-icon">
${this.getWorkspaceIcon(workspace)}
</div>
<div class="zen-workspace-name">
${workspace.name}
</div>
<toolbarbutton closemenu="none" class="toolbarbutton-1 zen-workspace-actions">
<image class="toolbarbutton-icon" id="zen-workspace-actions-menu-icon"></image>
</toolbarbutton>
`);
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 = `
<div class="zen-workspace-sidebar-icon">
${this.getWorkspaceIcon(activeWorkspace)}
</div>
<div class="zen-workspace-sidebar-name">
${activeWorkspace.name}
</div>
`;
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();

View File

@@ -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
</toolbar>
</vbox>
@@ -409,6 +412,14 @@
<image id="star-button"
class="urlbar-icon"/>
</hbox>
+ <hbox id="zen-split-views-box"
+ hidden="true"
+ role="button"
+ class="urlbar-page-action"
+ onclick="gZenViewSplitter.openSplitViewPanel(event);">
+ <image id="zen-split-views-button"
+ class="urlbar-icon"/>
+ </hbox>
</hbox>
</hbox>
</hbox>
@@ -450,6 +461,7 @@
@@ -450,6 +453,7 @@
<toolbarbutton id="fxa-toolbar-menu-button" class="toolbarbutton-1 chromeclass-toolbar-additional subviewbutton-nav"
badged="true"
@@ -76,7 +61,7 @@ index 390a1300a1213af2b411ba09c67e3c25750ee6c3..253d7abfcc1ade419c8f70289719cdc5
delegatesanchor="true"
onmousedown="gSync.toggleAccountPanel(this, event)"
onkeypress="gSync.toggleAccountPanel(this, event)"
@@ -501,6 +513,8 @@
@@ -501,6 +505,8 @@
consumeanchor="PanelUI-button"
data-l10n-id="appmenu-menu-button-closed2"/>
</toolbaritem>

View File

@@ -1,16 +1,8 @@
<script type="text/javascript">
window.addEventListener("DOMContentLoaded", async () => {
Services.scriptloader.loadSubScript("chrome://browser/content/ZenUIManager.mjs");
Services.scriptloader.loadSubScript("chrome://browser/content/ZenWorkspaces.mjs");
Services.scriptloader.loadSubScript("chrome://browser/content/ZenSidebarManager.mjs");
// Split view (Leave it at the end)
window.gZenSplitViewsBase = new (await import("chrome://browser/content/zen-components/browser-splitViews.mjs")).SplitViews({
splitIndicator: "zen-split",
browserName: "Zen",
defaultSplitView: "grid",
debug: true,
});
Services.scriptloader.loadSubScript("chrome://browser/content/ZenViewSplitter.mjs");
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenSidebarManager.mjs");
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenWorkspaces.mjs");
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenViewSplitter.mjs");
}, { once: true });
</script>

View File

@@ -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)
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)

View File

@@ -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;
}