From 3d9a40beb9d4851ab76a71f19fca71f98f7c7c2e Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sun, 27 Apr 2025 19:52:06 +0200 Subject: [PATCH 1/3] feat: Added better privacy and less connections on startup, b=(no-bug), c=common, configs, tabs, welcome --- configs/common/mozconfig | 3 ++ src/browser/app/profile/zen-browser.js | 3 -- src/zen/common/ZenUIManager.mjs | 2 +- src/zen/tabs/ZenPinnedTabManager.mjs | 4 ++- src/zen/welcome/ZenWelcome.mjs | 38 ++++++++++++++++++-------- 5 files changed, 34 insertions(+), 16 deletions(-) diff --git a/configs/common/mozconfig b/configs/common/mozconfig index 364464cd..02fcdc3b 100644 --- a/configs/common/mozconfig +++ b/configs/common/mozconfig @@ -107,6 +107,9 @@ mk_add_options MOZ_DATA_REPORTING= mk_add_options MOZ_SERVICES_HEALTHREPORT= mk_add_options MOZ_TELEMETRY_REPORTING= +ac_add_options MOZ_DATA_REPORTING= +ac_add_options MOZ_TELEMETRY_REPORTING= + # Allow loading unsigned extensions export MOZ_REQUIRE_SIGNING= mk_add_options MOZ_REQUIRE_SIGNING= diff --git a/src/browser/app/profile/zen-browser.js b/src/browser/app/profile/zen-browser.js index 8d3d824e..c960c391 100644 --- a/src/browser/app/profile/zen-browser.js +++ b/src/browser/app/profile/zen-browser.js @@ -279,9 +279,6 @@ pref('browser.download.open_pdf_attachments_inline', true); pref('browser.download.alwaysOpenPanel', false); // Tracking protection -pref("urlclassifier.trackingSkipURLs", "*.reddit.com, *.x.com, *.twimg.com, *.tiktok.com"); -pref("urlclassifier.features.socialtracking.skipURLs", "*.instagram.com, *.x.com, *.twimg.com"); -pref("network.cookie.sameSite.noneRequiresSecure", true); pref("browser.helperApps.deleteTempFileOnExit", true); pref("browser.uitour.enabled", false); diff --git a/src/zen/common/ZenUIManager.mjs b/src/zen/common/ZenUIManager.mjs index 19b32702..0afb0ca0 100644 --- a/src/zen/common/ZenUIManager.mjs +++ b/src/zen/common/ZenUIManager.mjs @@ -631,7 +631,7 @@ var gZenVerticalTabsManager = { try { gURLBar.zenUpdateLayoutBreakout(); } catch (e) { - console.error(e); + console.warn(e); } } }, diff --git a/src/zen/tabs/ZenPinnedTabManager.mjs b/src/zen/tabs/ZenPinnedTabManager.mjs index 118dc55b..af7998c4 100644 --- a/src/zen/tabs/ZenPinnedTabManager.mjs +++ b/src/zen/tabs/ZenPinnedTabManager.mjs @@ -1008,7 +1008,9 @@ if (!pin) { return; } - if (pin.url === 'about:blank' && tab.linkedBrowser.currentURI.spec !== 'about:blank') { + tab._recalculateAfterPinning = true; + if ((pin.url === 'about:blank' && tab.linkedBrowser.currentURI.spec !== 'about:blank') || tab._recalculateAfterPinning) { + delete tab._recalculateAfterPinning; await this.replacePinnedUrlWithCurrent(tab); } } diff --git a/src/zen/welcome/ZenWelcome.mjs b/src/zen/welcome/ZenWelcome.mjs index 8f0e188b..cc81a4a5 100644 --- a/src/zen/welcome/ZenWelcome.mjs +++ b/src/zen/welcome/ZenWelcome.mjs @@ -43,12 +43,19 @@ } function openInitialPinTab() { - const tabs = ['https://reddit.com/r/zen_browser', 'https://x.com/zen_browser']; - for (const url of tabs) { - const tab = window.gBrowser.addTrustedTab(url, { + const tabs = [ + ['https://reddit.com/r/zen_browser', 'Zen on Reddit', 'https://private-cdn.zen-browser.app/reddit.png'], + ['https://x.com/zen_browser', 'Zen on Twitter', 'https://private-cdn.zen-browser.app/twitter.ico'], + ]; + for (const site of tabs) { + const tab = window.gBrowser.addTrustedTab(site[0], { inBackground: true, skipAnimation: true, + createLazyBrowser: true, + lazyTabTitle: site[1], }); + gBrowser.setIcon(tab, site[2], site[2], Services.scriptSecurityManager.getSystemPrincipal()); + tab._recalculateAfterPinning = true; _tabsToPin.push(tab); } } @@ -210,6 +217,7 @@ gBrowser.pinTab(tab); } for (const tab of _tabsToPinEssentials) { + tab._recalculateAfterPinning = true; gZenPinnedTabManager.addToEssentials(tab); } } @@ -329,42 +337,42 @@ - + - + - + - + - + - + - + - + @@ -400,7 +408,15 @@ const url = tab.getAttribute('data-url'); const createdTab = window.gBrowser.addTrustedTab(url, { inBackground: true, + skipAnimation: true, + createLazyBrowser: true, }); + gBrowser.setIcon( + createdTab, + tab.style.getPropertyValue('--zen-tab-icon'), + tab.style.getPropertyValue('--zen-tab-icon'), + Services.scriptSecurityManager.getSystemPrincipal() + ); _tabsToPinEssentials.push(createdTab); } openInitialPinTab(); From 2b6f2980ce6217bde590b433435b15306419853c Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sun, 27 Apr 2025 19:53:03 +0200 Subject: [PATCH 2/3] fix: Fixed constantly recalculating pinned tabs, b=(no-bug), c=tabs --- src/zen/tabs/ZenPinnedTabManager.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zen/tabs/ZenPinnedTabManager.mjs b/src/zen/tabs/ZenPinnedTabManager.mjs index af7998c4..6caecd5c 100644 --- a/src/zen/tabs/ZenPinnedTabManager.mjs +++ b/src/zen/tabs/ZenPinnedTabManager.mjs @@ -1008,7 +1008,7 @@ if (!pin) { return; } - tab._recalculateAfterPinning = true; + if ((pin.url === 'about:blank' && tab.linkedBrowser.currentURI.spec !== 'about:blank') || tab._recalculateAfterPinning) { delete tab._recalculateAfterPinning; await this.replacePinnedUrlWithCurrent(tab); From 73842430ea0825aa9fbe7826dde5233382e6e178 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sun, 27 Apr 2025 21:46:39 +0200 Subject: [PATCH 3/3] fix: Fixed fetching icons on new windows, b=(no-bug), c=tabs, welcome --- src/zen/tabs/ZenPinnedTabManager.mjs | 5 +- src/zen/welcome/ZenWelcome.mjs | 86 ++++++++++++++++++++-------- 2 files changed, 63 insertions(+), 28 deletions(-) diff --git a/src/zen/tabs/ZenPinnedTabManager.mjs b/src/zen/tabs/ZenPinnedTabManager.mjs index 6caecd5c..f68fa117 100644 --- a/src/zen/tabs/ZenPinnedTabManager.mjs +++ b/src/zen/tabs/ZenPinnedTabManager.mjs @@ -290,7 +290,7 @@ container.insertBefore(newTab, container.lastChild); } } else { - document.getElementById('zen-essentials-container').appendChild(newTab); + ZenWorkspaces.getEssentialsSection(pin.containerTabId).appendChild(newTab); } gBrowser.tabContainer._invalidateCachedTabs(); newTab.initialize(); @@ -1009,8 +1009,7 @@ return; } - if ((pin.url === 'about:blank' && tab.linkedBrowser.currentURI.spec !== 'about:blank') || tab._recalculateAfterPinning) { - delete tab._recalculateAfterPinning; + if (pin.url === 'about:blank' && tab.linkedBrowser.currentURI.spec !== 'about:blank') { await this.replacePinnedUrlWithCurrent(tab); } } diff --git a/src/zen/welcome/ZenWelcome.mjs b/src/zen/welcome/ZenWelcome.mjs index cc81a4a5..5a7083ef 100644 --- a/src/zen/welcome/ZenWelcome.mjs +++ b/src/zen/welcome/ZenWelcome.mjs @@ -42,20 +42,57 @@ window.MozXULElement.insertFTLIfNeeded('browser/zen-welcome.ftl'); } - function openInitialPinTab() { + var _iconToData = {}; + + async function getIconData(iconURL) { + if (_iconToData[iconURL]) { + return _iconToData[iconURL]; + } + const response = await fetch(iconURL); + if (!response.ok) { + console.error(`Failed to fetch icon: ${iconURL}`); + return null; + } + const blob = await response.blob(); + const reader = new FileReader(); + const data = await new Promise((resolve) => { + reader.onloadend = () => { + const base64Data = reader.result.split(',')[1]; + _iconToData[iconURL] = `data:${blob.type};base64,${base64Data}`; + resolve(_iconToData[iconURL]); + }; + reader.readAsDataURL(blob); + }); + return data; + } + + async function setCachedFaviconForURL(pageUrl, iconURL) { + try { + // TODO: This always return "NS_ERROR_NOT_AVAILABLE" for some reason, figure out why + await PlacesUtils.favicons.setFaviconForPage( + Services.io.newURI(pageUrl), + Services.io.newURI('fake-favicon-uri:' + pageUrl), + Services.io.newURI(iconURL) + ); + } catch (ex) { + console.error(`Failed to set cached favicon for ${pageUrl}: ${ex}`); + } + } + + async function openInitialPinTab() { const tabs = [ - ['https://reddit.com/r/zen_browser', 'Zen on Reddit', 'https://private-cdn.zen-browser.app/reddit.png'], - ['https://x.com/zen_browser', 'Zen on Twitter', 'https://private-cdn.zen-browser.app/twitter.ico'], + ['https://reddit.com/r/zen_browser', 'Zen on Reddit', 'https://zen-browser.github.io/static-cdn/reddit.png'], + ['https://x.com/zen_browser', 'Zen on Twitter', 'https://zen-browser.github.io/static-cdn/x.png'], ]; for (const site of tabs) { const tab = window.gBrowser.addTrustedTab(site[0], { inBackground: true, - skipAnimation: true, createLazyBrowser: true, lazyTabTitle: site[1], }); - gBrowser.setIcon(tab, site[2], site[2], Services.scriptSecurityManager.getSystemPrincipal()); - tab._recalculateAfterPinning = true; + const iconData = await getIconData(site[2]); + await setCachedFaviconForURL(site[0], iconData); + gBrowser.setIcon(tab, iconData); _tabsToPin.push(tab); } } @@ -195,6 +232,7 @@ } async finish() { + _iconToData = undefined; // Unload icon data ZenWorkspaces.reorganizeTabsAfterWelcome(); await animate('#zen-welcome-page-content', { x: [0, '100%'] }, { bounce: 0 }); document.getElementById('zen-welcome-page-content').remove(); @@ -217,7 +255,6 @@ gBrowser.pinTab(tab); } for (const tab of _tabsToPinEssentials) { - tab._recalculateAfterPinning = true; gZenPinnedTabManager.addToEssentials(tab); } } @@ -337,47 +374,47 @@ - + - + - + - + - + - + - + - + - + @@ -400,7 +437,7 @@ tab.toggleAttribute('visuallyselected'); }); }, - fadeOut() { + async fadeOut() { const selectedTabs = document .getElementById('zen-welcome-initial-essentials-browser-sidebar-essentials') .querySelectorAll('.tabbrowser-tab[visuallyselected]'); @@ -408,18 +445,17 @@ const url = tab.getAttribute('data-url'); const createdTab = window.gBrowser.addTrustedTab(url, { inBackground: true, - skipAnimation: true, createLazyBrowser: true, }); - gBrowser.setIcon( - createdTab, - tab.style.getPropertyValue('--zen-tab-icon'), - tab.style.getPropertyValue('--zen-tab-icon'), - Services.scriptSecurityManager.getSystemPrincipal() - ); + let essentialIconUrl = tab.style.getPropertyValue('--zen-tab-icon'); + // Remove url() from the icon URL + essentialIconUrl = essentialIconUrl.replace(/url\(['"]?/, '').replace(/['"]?\)/, ''); + essentialIconUrl = await getIconData(essentialIconUrl); + await setCachedFaviconForURL(url, essentialIconUrl); + gBrowser.setIcon(createdTab, essentialIconUrl); _tabsToPinEssentials.push(createdTab); } - openInitialPinTab(); + await openInitialPinTab(); }, }, {