mirror of
https://github.com/zen-browser/desktop.git
synced 2025-09-05 19:08:18 +00:00
Refactor ZenPinnedTabsStorage initialization and improve workspace handling
This commit is contained in:
@@ -400,6 +400,8 @@ pref("browser.newtabpage.activity-stream.telemetry", false, locked);
|
||||
pref("browser.ping-centre.telemetry", false);
|
||||
pref("browser.attribution.enabled", false);
|
||||
pref("toolkit.telemetry.pioneer-new-studies-available", false);
|
||||
pref("app.normandy.enabled", false);
|
||||
pref("app.normandy.api_url", "");
|
||||
|
||||
// Common UI changes
|
||||
pref("browser.privatebrowsing.vpnpromourl", "", locked);
|
||||
|
@@ -38,7 +38,6 @@
|
||||
<script src="chrome://browser/content/zen-components/ZenPinnedTabsStorage.mjs" />
|
||||
<script src="chrome://browser/content/zen-components/ZenPinnedTabManager.mjs" />
|
||||
<script src="chrome://browser/content/zen-components/ZenWorkspacesStorage.mjs" />
|
||||
<script src="chrome://browser/content/zen-components/ZenWorkspacesSync.mjs" />
|
||||
<script src="chrome://browser/content/zen-components/ZenGradientGenerator.mjs" />
|
||||
<script src="chrome://browser/content/zen-components/ZenViewSplitter.mjs"/>
|
||||
<script src="chrome://browser/content/zen-components/ZenProfileDialogUI.mjs" />
|
||||
|
@@ -4,4 +4,6 @@
|
||||
<script type="text/javascript">
|
||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenCommonUtils.mjs", this);
|
||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenKeyboardShortcuts.mjs", this);
|
||||
</script>
|
||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenWorkspacesSync.mjs", this);
|
||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenWorkspacesStorage.mjs", this);
|
||||
</script>
|
||||
|
@@ -92,7 +92,6 @@
|
||||
this.initContextMenu();
|
||||
this.initThemePicker();
|
||||
|
||||
|
||||
this._hasInitialized = true;
|
||||
this.onDarkModeChange(null);
|
||||
}
|
||||
@@ -521,10 +520,10 @@
|
||||
return `linear-gradient(${this.currentRotation}deg, ${themedColors.map(color => this.getSingleRGBColor(color, forToolbar)).join(', ')})`;
|
||||
}
|
||||
|
||||
getTheme(colors, opacity = 0.5, rotation = 45, texture = 0) {
|
||||
static getTheme(colors = [], opacity = 0.5, rotation = 45, texture = 0) {
|
||||
return {
|
||||
type: 'gradient',
|
||||
gradientColors: colors.filter(color => color), // remove undefined
|
||||
gradientColors: colors ? colors.filter(color => color) : [], // remove undefined
|
||||
opacity,
|
||||
rotation,
|
||||
texture,
|
||||
@@ -723,7 +722,7 @@
|
||||
const isCustom = dot.classList.contains('custom');
|
||||
return {c: isCustom ? color : color.match(/\d+/g).map(Number), isCustom};
|
||||
});
|
||||
const gradient = this.getTheme(colors, this.currentOpacity, this.currentRotation, this.currentTexture);
|
||||
const gradient = ZenThemePicker.getTheme(colors, this.currentOpacity, this.currentRotation, this.currentTexture);
|
||||
let currentWorkspace = await ZenWorkspaces.getActiveWorkspace();
|
||||
|
||||
if(!skipSave) {
|
||||
|
@@ -71,9 +71,6 @@
|
||||
}
|
||||
|
||||
async _refreshPinnedTabs(currentWorkspace,{ init = false } = {}) {
|
||||
if(init) {
|
||||
await ZenPinnedTabsStorage.init();
|
||||
}
|
||||
await this._initializePinsCache();
|
||||
await this._initializePinnedTabs(init,currentWorkspace);
|
||||
}
|
||||
|
@@ -5,48 +5,52 @@ var ZenPinnedTabsStorage = {
|
||||
},
|
||||
|
||||
async _ensureTable() {
|
||||
await PlacesUtils.withConnectionWrapper('ZenPinnedTabsStorage._ensureTable', async (db) => {
|
||||
// Create the pins table if it doesn't exist
|
||||
await db.execute(`
|
||||
CREATE TABLE IF NOT EXISTS zen_pins (
|
||||
id INTEGER PRIMARY KEY,
|
||||
uuid TEXT UNIQUE NOT NULL,
|
||||
title TEXT NOT NULL,
|
||||
url TEXT,
|
||||
container_id INTEGER,
|
||||
workspace_uuid TEXT,
|
||||
position INTEGER NOT NULL DEFAULT 0,
|
||||
is_essential BOOLEAN NOT NULL DEFAULT 0,
|
||||
is_group BOOLEAN NOT NULL DEFAULT 0,
|
||||
parent_uuid TEXT,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL,
|
||||
FOREIGN KEY (parent_uuid) REFERENCES zen_pins(uuid) ON DELETE SET NULL
|
||||
return new Promise(async (resolve, reject) => {
|
||||
await PlacesUtils.withConnectionWrapper('ZenPinnedTabsStorage._ensureTable', async (db) => {
|
||||
console.log('ZenPinnedTabsStorage: Ensuring tables...');
|
||||
// Create the pins table if it doesn't exist
|
||||
await db.execute(`
|
||||
CREATE TABLE IF NOT EXISTS zen_pins (
|
||||
id INTEGER PRIMARY KEY,
|
||||
uuid TEXT UNIQUE NOT NULL,
|
||||
title TEXT NOT NULL,
|
||||
url TEXT,
|
||||
container_id INTEGER,
|
||||
workspace_uuid TEXT,
|
||||
position INTEGER NOT NULL DEFAULT 0,
|
||||
is_essential BOOLEAN NOT NULL DEFAULT 0,
|
||||
is_group BOOLEAN NOT NULL DEFAULT 0,
|
||||
parent_uuid TEXT,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL,
|
||||
FOREIGN KEY (parent_uuid) REFERENCES zen_pins(uuid) ON DELETE SET NULL
|
||||
)
|
||||
`);
|
||||
|
||||
|
||||
// Create indices
|
||||
await db.execute(`
|
||||
CREATE INDEX IF NOT EXISTS idx_zen_pins_uuid ON zen_pins(uuid)
|
||||
`);
|
||||
|
||||
await db.execute(`
|
||||
CREATE INDEX IF NOT EXISTS idx_zen_pins_parent_uuid ON zen_pins(parent_uuid)
|
||||
`);
|
||||
|
||||
// Create the changes tracking table if it doesn't exist
|
||||
await db.execute(`
|
||||
CREATE TABLE IF NOT EXISTS zen_pins_changes (
|
||||
uuid TEXT PRIMARY KEY,
|
||||
timestamp INTEGER NOT NULL
|
||||
)
|
||||
`);
|
||||
`);
|
||||
|
||||
|
||||
// Create indices
|
||||
await db.execute(`
|
||||
CREATE INDEX IF NOT EXISTS idx_zen_pins_uuid ON zen_pins(uuid)
|
||||
`);
|
||||
|
||||
await db.execute(`
|
||||
CREATE INDEX IF NOT EXISTS idx_zen_pins_parent_uuid ON zen_pins(parent_uuid)
|
||||
`);
|
||||
|
||||
// Create the changes tracking table if it doesn't exist
|
||||
await db.execute(`
|
||||
CREATE TABLE IF NOT EXISTS zen_pins_changes (
|
||||
uuid TEXT PRIMARY KEY,
|
||||
timestamp INTEGER NOT NULL
|
||||
)
|
||||
`);
|
||||
|
||||
// Create an index on the uuid column for changes tracking table
|
||||
await db.execute(`
|
||||
CREATE INDEX IF NOT EXISTS idx_zen_pins_changes_uuid ON zen_pins_changes(uuid)
|
||||
`);
|
||||
// Create an index on the uuid column for changes tracking table
|
||||
await db.execute(`
|
||||
CREATE INDEX IF NOT EXISTS idx_zen_pins_changes_uuid ON zen_pins_changes(uuid)
|
||||
`);
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
@@ -337,3 +341,5 @@ var ZenPinnedTabsStorage = {
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
ZenPinnedTabsStorage.init();
|
||||
|
@@ -73,7 +73,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
|
||||
);
|
||||
ChromeUtils.defineLazyGetter(this, 'tabContainer', () => document.getElementById('tabbrowser-tabs'));
|
||||
this._activeWorkspace = Services.prefs.getStringPref('zen.workspaces.active', '');
|
||||
await ZenWorkspacesStorage.init();
|
||||
this._delayedStartup();
|
||||
}
|
||||
|
||||
async _delayedStartup() {
|
||||
@@ -435,10 +435,11 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
|
||||
window.addEventListener('TabBrowserInserted', this.onTabBrowserInserted.bind(this));
|
||||
await SessionStore.promiseInitialized;
|
||||
let workspaces = await this._workspaces();
|
||||
let activeWorkspace = null;
|
||||
if (workspaces.workspaces.length === 0) {
|
||||
await this.createAndSaveWorkspace('Default Workspace', true, '🏠');
|
||||
activeWorkspace = await this.createAndSaveWorkspace('Default Workspace', true, '🏠');
|
||||
} else {
|
||||
let activeWorkspace = await this.getActiveWorkspace();
|
||||
activeWorkspace = await this.getActiveWorkspace();
|
||||
if (!activeWorkspace) {
|
||||
activeWorkspace = workspaces.workspaces.find((workspace) => workspace.default);
|
||||
this.activeWorkspace = activeWorkspace?.uuid;
|
||||
@@ -450,7 +451,9 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
|
||||
await this.changeWorkspace(activeWorkspace, true);
|
||||
}
|
||||
try {
|
||||
window.gZenThemePicker = new ZenThemePicker();
|
||||
if (activeWorkspace) {
|
||||
window.gZenThemePicker = new ZenThemePicker();
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('ZenWorkspaces: Error initializing theme picker', e);
|
||||
}
|
||||
@@ -658,9 +661,14 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
|
||||
if (workspace.default) {
|
||||
element.setAttribute('default', 'true');
|
||||
}
|
||||
const containerGroup = browser.ContextualIdentityService.getPublicIdentities().find(
|
||||
(container) => container.userContextId === workspace.containerTabId
|
||||
);
|
||||
let containerGroup = undefined;
|
||||
try {
|
||||
containerGroup = browser.ContextualIdentityService.getPublicIdentities().find(
|
||||
(container) => container.userContextId === workspace.containerTabId
|
||||
);
|
||||
} catch (e) {
|
||||
console.warn('ZenWorkspaces: Error setting container color', e);
|
||||
}
|
||||
if (containerGroup) {
|
||||
element.classList.add('identity-color-' + containerGroup.color);
|
||||
element.setAttribute('data-usercontextid', containerGroup.userContextId);
|
||||
@@ -668,7 +676,6 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
|
||||
if (this.isReorderModeOn(browser)) {
|
||||
element.setAttribute('draggable', 'true');
|
||||
}
|
||||
|
||||
element.addEventListener(
|
||||
'dragstart',
|
||||
function (event) {
|
||||
@@ -1426,6 +1433,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
|
||||
default: isDefault,
|
||||
icon: icon,
|
||||
name: name,
|
||||
theme: ZenThemePicker.getTheme([]),
|
||||
};
|
||||
this._prepareNewWorkspace(window);
|
||||
return window;
|
||||
@@ -1438,6 +1446,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
|
||||
let workspaceData = this._createWorkspaceData(name, isDefault, icon);
|
||||
await this.saveWorkspace(workspaceData);
|
||||
await this.changeWorkspace(workspaceData);
|
||||
return workspaceData;
|
||||
}
|
||||
|
||||
async onTabBrowserInserted(event) {
|
||||
|
@@ -1,13 +1,18 @@
|
||||
var ZenWorkspacesStorage = {
|
||||
lazy: {},
|
||||
|
||||
async init() {
|
||||
ChromeUtils.defineESModuleGetters(this.lazy, {
|
||||
PlacesUtils: "resource://gre/modules/PlacesUtils.sys.mjs",
|
||||
});
|
||||
|
||||
console.log('ZenWorkspacesStorage: Initializing...');
|
||||
await this._ensureTable();
|
||||
await ZenWorkspaceBookmarksStorage.init();
|
||||
ZenWorkspaces._delayedStartup();
|
||||
},
|
||||
|
||||
async _ensureTable() {
|
||||
await PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage._ensureTable', async (db) => {
|
||||
await this.lazy.PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage._ensureTable', async (db) => {
|
||||
// Create the main workspaces table if it doesn't exist
|
||||
await db.execute(`
|
||||
CREATE TABLE IF NOT EXISTS zen_workspaces (
|
||||
@@ -100,7 +105,7 @@ var ZenWorkspacesStorage = {
|
||||
async saveWorkspace(workspace, notifyObservers = true) {
|
||||
const changedUUIDs = new Set();
|
||||
|
||||
await PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.saveWorkspace', async (db) => {
|
||||
await this.lazy.PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.saveWorkspace', async (db) => {
|
||||
await db.executeTransaction(async () => {
|
||||
const now = Date.now();
|
||||
|
||||
@@ -171,7 +176,7 @@ var ZenWorkspacesStorage = {
|
||||
},
|
||||
|
||||
async getWorkspaces() {
|
||||
const db = await PlacesUtils.promiseDBConnection();
|
||||
const db = await this.lazy.PlacesUtils.promiseDBConnection();
|
||||
const rows = await db.executeCached(`
|
||||
SELECT * FROM zen_workspaces ORDER BY created_at ASC
|
||||
`);
|
||||
@@ -195,7 +200,7 @@ var ZenWorkspacesStorage = {
|
||||
async removeWorkspace(uuid, notifyObservers = true) {
|
||||
const changedUUIDs = [uuid];
|
||||
|
||||
await PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.removeWorkspace', async (db) => {
|
||||
await this.lazy.PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.removeWorkspace', async (db) => {
|
||||
await db.execute(
|
||||
`
|
||||
DELETE FROM zen_workspaces WHERE uuid = :uuid
|
||||
@@ -222,7 +227,7 @@ var ZenWorkspacesStorage = {
|
||||
},
|
||||
|
||||
async wipeAllWorkspaces() {
|
||||
await PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.wipeAllWorkspaces', async (db) => {
|
||||
await this.lazy.PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.wipeAllWorkspaces', async (db) => {
|
||||
await db.execute(`DELETE FROM zen_workspaces`);
|
||||
await db.execute(`DELETE FROM zen_workspaces_changes`);
|
||||
await this.updateLastChangeTimestamp(db);
|
||||
@@ -232,7 +237,7 @@ var ZenWorkspacesStorage = {
|
||||
async setDefaultWorkspace(uuid, notifyObservers = true) {
|
||||
const changedUUIDs = [];
|
||||
|
||||
await PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.setDefaultWorkspace', async (db) => {
|
||||
await this.lazy.PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.setDefaultWorkspace', async (db) => {
|
||||
await db.executeTransaction(async () => {
|
||||
const now = Date.now();
|
||||
// Unset the default flag for all other workspaces
|
||||
@@ -269,7 +274,7 @@ var ZenWorkspacesStorage = {
|
||||
},
|
||||
|
||||
async markChanged(uuid) {
|
||||
await PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.markChanged', async (db) => {
|
||||
await this.lazy.PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.markChanged', async (db) => {
|
||||
const now = Date.now();
|
||||
await db.execute(`
|
||||
INSERT OR REPLACE INTO zen_workspaces_changes (uuid, timestamp)
|
||||
@@ -283,7 +288,7 @@ var ZenWorkspacesStorage = {
|
||||
|
||||
async saveWorkspaceTheme(uuid, theme, notifyObservers = true) {
|
||||
const changedUUIDs = [uuid];
|
||||
await PlacesUtils.withConnectionWrapper('saveWorkspaceTheme', async (db) => {
|
||||
await this.lazy.PlacesUtils.withConnectionWrapper('saveWorkspaceTheme', async (db) => {
|
||||
await db.execute(`
|
||||
UPDATE zen_workspaces
|
||||
SET
|
||||
@@ -314,7 +319,7 @@ var ZenWorkspacesStorage = {
|
||||
},
|
||||
|
||||
async getChangedIDs() {
|
||||
const db = await PlacesUtils.promiseDBConnection();
|
||||
const db = await this.lazy.PlacesUtils.promiseDBConnection();
|
||||
const rows = await db.execute(`
|
||||
SELECT uuid, timestamp FROM zen_workspaces_changes
|
||||
`);
|
||||
@@ -326,7 +331,7 @@ var ZenWorkspacesStorage = {
|
||||
},
|
||||
|
||||
async clearChangedIDs() {
|
||||
await PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.clearChangedIDs', async (db) => {
|
||||
await this.lazy.PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.clearChangedIDs', async (db) => {
|
||||
await db.execute(`DELETE FROM zen_workspaces_changes`);
|
||||
});
|
||||
},
|
||||
@@ -363,7 +368,7 @@ var ZenWorkspacesStorage = {
|
||||
},
|
||||
|
||||
async getLastChangeTimestamp() {
|
||||
const db = await PlacesUtils.promiseDBConnection();
|
||||
const db = await this.lazy.PlacesUtils.promiseDBConnection();
|
||||
const result = await db.executeCached(`
|
||||
SELECT value FROM moz_meta WHERE key = 'zen_workspaces_last_change'
|
||||
`);
|
||||
@@ -373,7 +378,7 @@ var ZenWorkspacesStorage = {
|
||||
async updateWorkspacePositions(workspaces) {
|
||||
const changedUUIDs = new Set();
|
||||
|
||||
await PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.updateWorkspacePositions', async (db) => {
|
||||
await this.lazy.PlacesUtils.withConnectionWrapper('ZenWorkspacesStorage.updateWorkspacePositions', async (db) => {
|
||||
await db.executeTransaction(async () => {
|
||||
const now = Date.now();
|
||||
|
||||
@@ -414,7 +419,7 @@ var ZenWorkspaceBookmarksStorage = {
|
||||
},
|
||||
|
||||
async _ensureTable() {
|
||||
await PlacesUtils.withConnectionWrapper('ZenWorkspaceBookmarksStorage.init', async (db) => {
|
||||
await ZenWorkspacesStorage.lazy.PlacesUtils.withConnectionWrapper('ZenWorkspaceBookmarksStorage.init', async (db) => {
|
||||
// Create table using GUIDs instead of IDs
|
||||
await db.execute(`
|
||||
CREATE TABLE IF NOT EXISTS zen_bookmarks_workspaces (
|
||||
@@ -475,7 +480,7 @@ var ZenWorkspaceBookmarksStorage = {
|
||||
* @returns {Promise<number>} The timestamp of the last change.
|
||||
*/
|
||||
async getLastChangeTimestamp() {
|
||||
const db = await PlacesUtils.promiseDBConnection();
|
||||
const db = await ZenWorkspacesStorage.lazy.PlacesUtils.promiseDBConnection();
|
||||
const result = await db.executeCached(`
|
||||
SELECT value FROM moz_meta WHERE key = 'zen_bookmarks_workspaces_last_change'
|
||||
`);
|
||||
@@ -483,7 +488,7 @@ var ZenWorkspaceBookmarksStorage = {
|
||||
},
|
||||
|
||||
async getBookmarkWorkspaces(bookmarkGuid) {
|
||||
const db = await PlacesUtils.promiseDBConnection();
|
||||
const db = await ZenWorkspacesStorage.lazy.PlacesUtils.promiseDBConnection();
|
||||
|
||||
const rows = await db.execute(`
|
||||
SELECT workspace_uuid
|
||||
@@ -505,7 +510,7 @@ var ZenWorkspaceBookmarksStorage = {
|
||||
* }
|
||||
*/
|
||||
async getBookmarkGuidsByWorkspace() {
|
||||
const db = await PlacesUtils.promiseDBConnection();
|
||||
const db = await ZenWorkspacesStorage.lazy.PlacesUtils.promiseDBConnection();
|
||||
|
||||
const rows = await db.execute(`
|
||||
SELECT workspace_uuid, GROUP_CONCAT(bookmark_guid) as bookmark_guids
|
||||
@@ -528,9 +533,9 @@ var ZenWorkspaceBookmarksStorage = {
|
||||
* @returns {Promise<Object>} An object mapping bookmark+workspace pairs to their change data.
|
||||
*/
|
||||
async getChangedIDs() {
|
||||
const db = await PlacesUtils.promiseDBConnection();
|
||||
const db = await ZenWorkspacesStorage.lazy.PlacesUtils.promiseDBConnection();
|
||||
const rows = await db.execute(`
|
||||
SELECT bookmark_guid, workspace_uuid, change_type, timestamp
|
||||
SELECT bookmark_guid, workspace_uuid, change_type, timestamp
|
||||
FROM zen_bookmarks_workspaces_changes
|
||||
`);
|
||||
|
||||
@@ -549,9 +554,11 @@ var ZenWorkspaceBookmarksStorage = {
|
||||
* Clear all recorded changes.
|
||||
*/
|
||||
async clearChangedIDs() {
|
||||
await PlacesUtils.withConnectionWrapper('ZenWorkspaceBookmarksStorage.clearChangedIDs', async (db) => {
|
||||
await ZenWorkspacesStorage.lazy.PlacesUtils.withConnectionWrapper('ZenWorkspaceBookmarksStorage.clearChangedIDs', async (db) => {
|
||||
await db.execute(`DELETE FROM zen_bookmarks_workspaces_changes`);
|
||||
});
|
||||
},
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
ZenWorkspacesStorage.init();
|
||||
|
Reference in New Issue
Block a user