mirror of
				https://github.com/zen-browser/desktop.git
				synced 2025-11-04 01:34:35 +00:00 
			
		
		
		
	Started working on workspaces
This commit is contained in:
		
							
								
								
									
										19
									
								
								docs/workspaces.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								docs/workspaces.md
									
									
									
									
									
										Normal file
									
								
							@@ -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.
 | 
			
		||||
@@ -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)
 | 
			
		||||
    );
 | 
			
		||||
  },  
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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 @@
 | 
			
		||||
     </vbox>
 | 
			
		||||
   </panelview>
 | 
			
		||||
 
 | 
			
		||||
+#include zen-panels-ui.inc.xhtml
 | 
			
		||||
 #include ../../components/reportbrokensite/content/reportBrokenSitePanel.inc.xhtml
 | 
			
		||||
 </html:template>
 | 
			
		||||
@@ -1,18 +0,0 @@
 | 
			
		||||
<panelview id="PanelUI-zen-profiles" position="bottomleft topleft" mainview="true" side="right">
 | 
			
		||||
  <vbox>
 | 
			
		||||
    <html:div id="PanelUI-zen-profiles-header">
 | 
			
		||||
      <html:div id="PanelUI-zen-profiles-user-picture"></html:div>
 | 
			
		||||
    </html:div>
 | 
			
		||||
    <vbox id="PanelUI-zen-profiles-current-info">
 | 
			
		||||
      <label id="PanelUI-zen-profiles-current-name"></label>
 | 
			
		||||
      <p id="PanelUI-zen-profiles-current-profile-current" data-l10n-id="zen-panel-ui-current-profile-text"></p>
 | 
			
		||||
    </vbox>
 | 
			
		||||
    <hbox id="PanelUI-zen-profiles-actions">
 | 
			
		||||
      <toolbarbutton id="PanelUI-zen-profiles-managePrfs" oncommand="switchToTabHavingURI('about:profiles', true);" data-l10n-id="appmenu-manage-profiles" class="subviewbutton"></toolbarbutton>
 | 
			
		||||
      <toolbarbutton id="PanelUI-zen-profiles-privateWin" command="Tools:PrivateBrowsing" data-l10n-id="appmenuitem-new-private-window" class="subviewbutton"></toolbarbutton>
 | 
			
		||||
      <toolbarbutton id="PanelUI-zen-profiles-newProfile" oncommand="ZenProfileDialogUI.createProfileWizard();" data-l10n-id="appmenu-create-profile" class="subviewbutton"></toolbarbutton>
 | 
			
		||||
    </hbox>
 | 
			
		||||
    <vbox id="PanelUI-zen-profiles-list">      
 | 
			
		||||
    </vbox>
 | 
			
		||||
  </vbox>
 | 
			
		||||
</panelview>
 | 
			
		||||
@@ -56,3 +56,22 @@
 | 
			
		||||
  </panelmultiview>
 | 
			
		||||
</panel>
 | 
			
		||||
</html:template>
 | 
			
		||||
 | 
			
		||||
<panelview id="PanelUI-zen-profiles" position="bottomleft topleft" mainview="true" side="right">
 | 
			
		||||
  <vbox>
 | 
			
		||||
    <html:div id="PanelUI-zen-profiles-header">
 | 
			
		||||
      <html:div id="PanelUI-zen-profiles-user-picture"></html:div>
 | 
			
		||||
    </html:div>
 | 
			
		||||
    <vbox id="PanelUI-zen-profiles-current-info">
 | 
			
		||||
      <label id="PanelUI-zen-profiles-current-name"></label>
 | 
			
		||||
      <p id="PanelUI-zen-profiles-current-profile-current" data-l10n-id="zen-panel-ui-current-profile-text"></p>
 | 
			
		||||
    </vbox>
 | 
			
		||||
    <hbox id="PanelUI-zen-profiles-actions">
 | 
			
		||||
      <toolbarbutton id="PanelUI-zen-profiles-managePrfs" oncommand="switchToTabHavingURI('about:profiles', true);" data-l10n-id="appmenu-manage-profiles" class="subviewbutton"></toolbarbutton>
 | 
			
		||||
      <toolbarbutton id="PanelUI-zen-profiles-privateWin" command="Tools:PrivateBrowsing" data-l10n-id="appmenuitem-new-private-window" class="subviewbutton"></toolbarbutton>
 | 
			
		||||
      <toolbarbutton id="PanelUI-zen-profiles-newProfile" oncommand="ZenProfileDialogUI.createProfileWizard();" data-l10n-id="appmenu-create-profile" class="subviewbutton"></toolbarbutton>
 | 
			
		||||
    </hbox>
 | 
			
		||||
    <vbox id="PanelUI-zen-profiles-list">      
 | 
			
		||||
    </vbox>
 | 
			
		||||
  </vbox>
 | 
			
		||||
</panelview>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user