diff --git a/docs/workspaces.md b/docs/workspaces.md
new file mode 100644
index 00000000..13fd78ae
--- /dev/null
+++ b/docs/workspaces.md
@@ -0,0 +1,19 @@
+
+# Workspaces Layout
+
+```
+{
+ "workspaces": [
+ {
+ "uuid": "uuid1",
+ "name": "workspace1",
+ "icon": "icon1",
+ "default": true
+ },
+ ...
+ ]
+}
+```
+To save the tabs and identity them, they will contain a `zen-workspace-uuid` attribute with the workspace uuid.
+
+We will make use of firefox's builtin session restore feature to save the tabs and windows after the user closes the browser.
diff --git a/src/browser/base/content/ZenUIManager.mjs b/src/browser/base/content/ZenUIManager.mjs
index 398dc179..e298d98a 100644
--- a/src/browser/base/content/ZenUIManager.mjs
+++ b/src/browser/base/content/ZenUIManager.mjs
@@ -8,5 +8,11 @@ var gZenUIManager = {
}
let tab = window.gBrowser.addTrustedTab(url, options);
window.gBrowser.selectedTab = tab;
- }
+ },
+
+ generateUuidv4() {
+ return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, c =>
+ (+c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> +c / 4).toString(16)
+ );
+ },
};
diff --git a/src/browser/base/content/ZenWorkspaces.mjs b/src/browser/base/content/ZenWorkspaces.mjs
index 8ad9dae7..37f9e774 100644
--- a/src/browser/base/content/ZenWorkspaces.mjs
+++ b/src/browser/base/content/ZenWorkspaces.mjs
@@ -25,20 +25,30 @@ var ZenWorkspaces = {
}
},
- async saveWorkspace(workspaceData, windowID) {
+ async saveWorkspace(workspaceData) {
let json = await IOUtils.readJSON(this._storeFile);
- json[windowID] = workspaceData;
+ if (!json.workspaces) {
+ json.workspaces = [];
+ }
+ json.workspaces.push(workspaceData);
+ console.log("Saving workspace", workspaceData);
await IOUtils.writeJSON(this._storeFile, json);
},
async loadWorkspace(windowID) {
let json = await IOUtils.readJSON(this._storeFile);
- return json[windowID];
+ if (!json.workspaces) {
+ return [];
+ }
+ return json.workspaces.filter(workspace => workspace.uuid === windowID);
},
async removeWorkspace(windowID) {
let json = await IOUtils.readJSON(this._storeFile);
- delete json[windowID];
+ if (!json.workspaces) {
+ return;
+ }
+ json.workspaces = json.workspaces.filter(workspace => workspace.uuid !== windowID);
await IOUtils.writeJSON(this._storeFile, json);
},
@@ -47,27 +57,33 @@ var ZenWorkspaces = {
return json;
},
- async getWorkspace(windowID) {
- let json = await IOUtils.readJSON(this._storeFile);
- return json[windowID];
- },
+ // Workspaces dialog UI management
+
+
// Workspaces management
- _createWorkspaceData(windowID) {
- let window = Services.wm.getOuterWindowWithId(windowID);
- let tabs = Array.from(window.gBrowser.tabs).map(tab => ({
- url: tab.linkedBrowser.currentURI.spec,
- title: tab.label,
- }));
- return {
- tabs,
- };
+ _prepareNewWorkspace(window) {
+ for (let tab of window.gBrowser.tabs) {
+ tab.addAttribute("zen-workspace-id", window.uuid);
+ }
+ window.document.documentElement.setAttribute("zen-workspace-id", window.uuid);
},
- async saveCurrentWorkspace(windowID) {
- let workspaceData = this._createWorkspaceData(windowID);
- await this.saveWorkspace(workspaceData, windowID);
+ _createWorkspaceData() {
+ let window = {
+ uuid: gZenUIManager.generateUuidv4(),
+ default: false,
+ icon: "",
+ name: `New Workspace`,
+ };
+ this._prepareNewWorkspace(window);
+ return window;
+ },
+
+ async createAndSaveWorkspace() {
+ let workspaceData = this._createWorkspaceData();
+ await this.saveWorkspace(workspaceData);
},
};
diff --git a/src/browser/base/content/appmenu-viewcache-inc-xhtml.patch b/src/browser/base/content/appmenu-viewcache-inc-xhtml.patch
deleted file mode 100644
index c58ade66..00000000
--- a/src/browser/base/content/appmenu-viewcache-inc-xhtml.patch
+++ /dev/null
@@ -1,11 +0,0 @@
-diff --git a/browser/base/content/appmenu-viewcache.inc.xhtml b/browser/base/content/appmenu-viewcache.inc.xhtml
-index 07b1765f18236835363fb74c898d3a690659cc9b..7b58cbb5de147ed29fbc48c0093c731fe5cca90b 100644
---- a/browser/base/content/appmenu-viewcache.inc.xhtml
-+++ b/browser/base/content/appmenu-viewcache.inc.xhtml
-@@ -765,5 +765,6 @@
-
-
-
-+#include zen-panels-ui.inc.xhtml
- #include ../../components/reportbrokensite/content/reportBrokenSitePanel.inc.xhtml
-
diff --git a/src/browser/base/content/zen-panels-ui.inc.xhtml b/src/browser/base/content/zen-panels-ui.inc.xhtml
deleted file mode 100644
index d00928d3..00000000
--- a/src/browser/base/content/zen-panels-ui.inc.xhtml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/browser/base/content/zen-popupset.inc.xhtml b/src/browser/base/content/zen-popupset.inc.xhtml
index b253ebc8..0abd8ce6 100644
--- a/src/browser/base/content/zen-popupset.inc.xhtml
+++ b/src/browser/base/content/zen-popupset.inc.xhtml
@@ -56,3 +56,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+