Compare commits
37 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dc1c166ac2 | ||
|
|
279849debe | ||
|
|
07c5474cf2 | ||
|
|
bd5fc861df | ||
|
|
6988060269 | ||
|
|
cf6ed8c382 | ||
|
|
d536f3e93c | ||
|
|
cc2262dbaf | ||
|
|
f3fa0eb849 | ||
|
|
7c9bca1325 | ||
|
|
493f299cce | ||
|
|
5d7248d4c7 | ||
|
|
d9e8fb3469 | ||
|
|
a5051e116a | ||
|
|
3358d0e3d7 | ||
|
|
ca183c7de6 | ||
|
|
b39961e43e | ||
|
|
59e8c120e2 | ||
|
|
382dcc8d0c | ||
|
|
beab1632b3 | ||
|
|
e84cb34b8d | ||
|
|
457c2131e4 | ||
|
|
35f38a116a | ||
|
|
054f628192 | ||
|
|
b844859799 | ||
|
|
ddaeec85d4 | ||
|
|
a84d62f307 | ||
|
|
b4724cff18 | ||
|
|
1e72461806 | ||
|
|
41617183ab | ||
|
|
9aa48b2645 | ||
|
|
20ab35fbf9 | ||
|
|
de0884d654 | ||
|
|
c285427fe2 | ||
|
|
61bbcbda37 | ||
|
|
7468f6304c | ||
|
|
ac915b0373 |
1
.github/workflows/build.yml
vendored
1
.github/workflows/build.yml
vendored
@@ -693,6 +693,7 @@ jobs:
|
||||
rm -rf zen-browser
|
||||
rm -rf archive.tar
|
||||
rm -rf zen.linux-x86_64.tar.xz
|
||||
rm -rf zen.linux-aarch64.tar.xz
|
||||
|
||||
- name: Upload Flatpak manifest
|
||||
uses: actions/upload-artifact@v4
|
||||
|
||||
34
.github/workflows/linux-release-build.yml
vendored
34
.github/workflows/linux-release-build.yml
vendored
@@ -26,6 +26,11 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
arch: [x86_64, aarch64]
|
||||
env:
|
||||
SCCACHE_GHA_ENABLED: 'true'
|
||||
CARGO_TERM_COLOR: always
|
||||
RUSTC_WRAPPER: 'sccache'
|
||||
CARGO_INCREMENTAL: 0
|
||||
name: Build Linux - ${{ matrix.arch }}
|
||||
|
||||
steps:
|
||||
@@ -45,6 +50,11 @@ jobs:
|
||||
with:
|
||||
node-version-file: '.nvmrc'
|
||||
|
||||
- name: Run sccache-cache
|
||||
uses: mozilla-actions/sccache-action@main
|
||||
with:
|
||||
disable_annotations: true
|
||||
|
||||
- name: Setup Git
|
||||
run: |
|
||||
git config --global user.email "mauro-balades@users.noreply.github.com"
|
||||
@@ -57,30 +67,6 @@ jobs:
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y python3 python3-pip dos2unix yasm nasm build-essential libgtk2.0-dev libpython3-dev m4 uuid libasound2-dev libcurl4-openssl-dev libdbus-1-dev libdrm-dev libdbus-glib-1-dev libgtk-3-dev libpulse-dev libx11-xcb-dev libxt-dev xvfb lld llvm
|
||||
|
||||
- name: Configure sccache
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
|
||||
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');
|
||||
|
||||
- name: Setup sccache
|
||||
env:
|
||||
LINK: https://github.com/mozilla/sccache/releases/download
|
||||
SCCACHE_VERSION: 0.2.13
|
||||
run: |
|
||||
SCCACHE_FILE=sccache-$SCCACHE_VERSION-x86_64-unknown-linux-musl
|
||||
mkdir -p $HOME/.local/bin
|
||||
curl -L "$LINK/$SCCACHE_VERSION/$SCCACHE_FILE.tar.gz" | tar xz
|
||||
mv -f $SCCACHE_FILE/sccache $HOME/.local/bin/sccache
|
||||
echo "$HOME/.local/bin" >> $GITHUB_PATH
|
||||
|
||||
- name: Save sccache
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: /home/runner/.cache/sccache
|
||||
key: ${{ runner.os }}-sccache
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
npm install
|
||||
|
||||
13
.github/workflows/macos-release-build.yml
vendored
13
.github/workflows/macos-release-build.yml
vendored
@@ -25,7 +25,11 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
arch: [x86_64, aarch64]
|
||||
|
||||
env:
|
||||
SCCACHE_GHA_ENABLED: 'true'
|
||||
CARGO_TERM_COLOR: always
|
||||
RUSTC_WRAPPER: 'sccache'
|
||||
CARGO_INCREMENTAL: 0
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
@@ -38,6 +42,11 @@ jobs:
|
||||
with:
|
||||
node-version-file: '.nvmrc'
|
||||
|
||||
- name: Run sccache-cache
|
||||
uses: mozilla-actions/sccache-action@main
|
||||
with:
|
||||
disable_annotations: true
|
||||
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v5
|
||||
# note: This will use the version defined in '.python-version' by default
|
||||
@@ -50,7 +59,7 @@ jobs:
|
||||
- name: Install system dependencies
|
||||
run: |
|
||||
brew update
|
||||
brew install cairo sccache gnu-tar mercurial
|
||||
brew install cairo gnu-tar mercurial
|
||||
sudo pip install setuptools
|
||||
|
||||
brew uninstall --ignore-dependencies python3.12 -f
|
||||
|
||||
@@ -44,7 +44,7 @@ jobs:
|
||||
- name: Install system dependencies
|
||||
run: |
|
||||
brew update
|
||||
brew install cairo sccache gnu-tar mercurial
|
||||
brew install cairo gnu-tar mercurial
|
||||
sudo pip install setuptools
|
||||
|
||||
brew uninstall --ignore-dependencies python3.12 -f
|
||||
|
||||
18
.github/workflows/windows-release-build.yml
vendored
18
.github/workflows/windows-release-build.yml
vendored
@@ -28,7 +28,11 @@ jobs:
|
||||
name: Build Windows - ${{ matrix.arch }}
|
||||
# aarch64 does not need full 16x, and we also dont use full LTO when generating GPO
|
||||
runs-on: ${{ (inputs.release-branch == 'release' && !inputs.generate-gpo && matrix.arch == 'x86_64') && 'self-hosted' || 'ubuntu-latest' }}
|
||||
|
||||
env:
|
||||
SCCACHE_GHA_ENABLED: 'true'
|
||||
CARGO_TERM_COLOR: always
|
||||
RUSTC_WRAPPER: 'sccache'
|
||||
CARGO_INCREMENTAL: 0
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
@@ -52,6 +56,11 @@ jobs:
|
||||
with:
|
||||
node-version-file: '.nvmrc'
|
||||
|
||||
- name: Run sccache-cache
|
||||
uses: mozilla-actions/sccache-action@main
|
||||
with:
|
||||
disable_annotations: true
|
||||
|
||||
- name: Setup Git
|
||||
run: |
|
||||
git config --global user.email "mauro-balades@users.noreply.github.com"
|
||||
@@ -79,13 +88,6 @@ jobs:
|
||||
path: ${HOME}/win-cross
|
||||
key: win-cross
|
||||
|
||||
- name: Configure sccache
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
|
||||
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');
|
||||
|
||||
- name: Setup for Windows
|
||||
if: steps.cache-win-cross.outputs.cache-hit != 'true' && !(inputs.generate-gpo && matrix.arch == 'aarch64')
|
||||
run: |
|
||||
|
||||
16
README.md
16
README.md
@@ -28,9 +28,9 @@
|
||||
|
||||
## 🖥️ Compatibility
|
||||
|
||||
Zen is currently built using firefox version `135.0.1`! 🚀
|
||||
Zen is currently built using Firefox version `135.0.1`! 🚀
|
||||
|
||||
- [`Zen Twilight`](https://zen-browser.app/download?twilight) - Is currently built using firefox version `RC 135.0.1`!
|
||||
- [`Zen Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 135.0.1`!
|
||||
- Check out the latest [release notes](https://zen-browser.app/release-notes)!
|
||||
- Part of our mission is to keep Zen up-to-date with the latest version of Firefox, so you can enjoy the latest features and security updates!
|
||||
|
||||
@@ -40,11 +40,11 @@ Zen is an open-source project, and we welcome contributions from the community!
|
||||
|
||||
### Issue metrics
|
||||
|
||||
We keep track of how many issues are closed at the end of the month in [docs/issue-metrics](./docs/issue-metrics). This is to keep track of how many issues are being closed, because who doesn't like to see progress? 📈
|
||||
We keep track of how many issues are closed at the end of the month in [docs/issue-metrics](./docs/issue-metrics). We use this to keep track of our issues and see our progress! 📈
|
||||
|
||||
### Versioning
|
||||
|
||||
Zen uses [Semantic Versioning](https://semver.org/) for versioning. Meaning, versions are displayed as `a.bc.d` where:
|
||||
Zen uses [Semantic Versioning](https://semver.org/), meaning versions are displayed as `a.bc.d` where:
|
||||
|
||||
- `a` is the major version
|
||||
- `b` is the minor version
|
||||
@@ -67,7 +67,7 @@ Zen is built with performance in mind, and we have optimized the browser to be a
|
||||
|
||||
Zen is available for Linux, macOS, and Windows. You can download the latest version from the official website at [zen-browser.app](https://zen-browser.app/download), or from the [GitHub Releases](https://github.com/zen-browser/desktop/releases) page.
|
||||
|
||||
If you dont see your OS listed below, that's because we already have it in our [downloads page](https://zen-browser.app/download)! Make sure to check it out!
|
||||
If you don't see your OS listed below, that's because we already have it in our [downloads page](https://zen-browser.app/download)! Make sure to check it out!
|
||||
|
||||
#### Windows
|
||||
|
||||
@@ -117,7 +117,7 @@ Some components used by @zen-browser as an attempt to make firefox forks a bette
|
||||
|
||||
#### `Run Locally`
|
||||
|
||||
In order to download and run zen locally, please follow [these instructions](https://docs.zen-browser.app/building).
|
||||
In order to download and run Zen locally, please follow [these instructions](https://docs.zen-browser.app/building).
|
||||
|
||||
#### `Special Thanks`
|
||||
|
||||
@@ -133,10 +133,10 @@ Zen couldn't be in its current state without the help of these amazing projects!
|
||||
|
||||
### 🖥️ Comparison with other browsers
|
||||
|
||||
Thanks everyone for making zen stand out among these giants!
|
||||
Thanks everyone for making Zen stand out among these giants!
|
||||
|
||||
[](https://star-history.com/#zen-browser/desktop&chromium/chromium&brave/brave-browser&Date)
|
||||
|
||||
## 📄 License
|
||||
|
||||
Zen browser is under the [MPL LICENSE](./LICENSE). All the code is open-source and free to use! Attributions are appreciated but not required.
|
||||
Zen browser is under the [MPL LICENSE](./LICENSE). All the code is open-source and free to use! Attribution is appreciated but not required.
|
||||
|
||||
@@ -25,10 +25,16 @@ export MOZ_INCLUDE_SOURCE_INFO=1
|
||||
|
||||
ac_add_options --enable-application=browser
|
||||
|
||||
if test -x "$(command -v sccache)"; then
|
||||
ac_add_options --with-ccache=sccache
|
||||
elif test -f "$HOME/.mozbuild/sccache/sccache"; then
|
||||
ac_add_options --with-ccache="$HOME"/.mozbuild/sccache/sccache
|
||||
fi
|
||||
|
||||
if test "$ZEN_RELEASE"; then
|
||||
|
||||
ac_add_options --enable-clang-plugin
|
||||
ac_add_options --enable-bootstrap
|
||||
ac_add_options --enable-bootstrap=-sccache
|
||||
|
||||
ac_add_options --enable-release
|
||||
ac_add_options --disable-debug
|
||||
|
||||
@@ -59,12 +59,4 @@ if test "$ZEN_RELEASE"; then
|
||||
ac_add_options --enable-install-strip
|
||||
ac_add_options --enable-strip
|
||||
export STRIP_FLAGS="--strip-debug --strip-unneeded"
|
||||
|
||||
# Using sccache if available
|
||||
if [ -f /home/runner/.mozbuild/sccache/sccache ]; then
|
||||
mk_add_options 'export RUSTC_WRAPPER=/home/runner/.mozbuild/sccache/sccache'
|
||||
mk_add_options 'export CCACHE_CPP2=yes'
|
||||
ac_add_options --with-ccache=/home/runner/.mozbuild/sccache/sccache
|
||||
mk_add_options 'export SCCACHE_GHA_ENABLED=on'
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -220,7 +220,7 @@ var gZenUIManager = {
|
||||
urlbarTrim(aURL) {
|
||||
if (gZenVerticalTabsManager._hasSetSingleToolbar) {
|
||||
let url = BrowserUIUtils.removeSingleTrailingSlashFromURL(aURL);
|
||||
return url.startsWith('http://') || url.startsWith('https://') ? url.split('/')[2] : url;
|
||||
return url.startsWith('https://') ? url.split('/')[2] : url;
|
||||
}
|
||||
return BrowserUIUtils.trimURL(aURL);
|
||||
},
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
|
||||
index 019b168c1aeae7e1c97a3ae58c99a48a27f54134..89045fd46888d2a15ccee1b35ed83692faaad364 100644
|
||||
index 019b168c1aeae7e1c97a3ae58c99a48a27f54134..22dcf304591290d7a1b60f01998b6cf4782c0cdc 100644
|
||||
--- a/browser/base/content/browser.js
|
||||
+++ b/browser/base/content/browser.js
|
||||
@@ -32,6 +32,7 @@ ChromeUtils.defineESModuleGetters(this, {
|
||||
@@ -51,13 +51,12 @@ index 019b168c1aeae7e1c97a3ae58c99a48a27f54134..89045fd46888d2a15ccee1b35ed83692
|
||||
for (let i = 0; i < browsers.length; i++) {
|
||||
let browser = browsers[i];
|
||||
let browserCompare = cleanURL(
|
||||
@@ -6392,7 +6402,9 @@ function switchToTabHavingURI(
|
||||
@@ -6392,7 +6402,7 @@ function switchToTabHavingURI(
|
||||
}
|
||||
|
||||
if (!doAdopt) {
|
||||
+ aWindow.ZenWorkspaces.switchIfNeeded(browser).then(() => {
|
||||
aWindow.gBrowser.tabContainer.selectedIndex = i;
|
||||
+ });
|
||||
- aWindow.gBrowser.tabContainer.selectedIndex = i;
|
||||
+ aWindow.ZenWorkspaces.switchIfNeeded(browser, i);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
@@ -95,6 +95,7 @@
|
||||
position: relative;
|
||||
background: var(--zen-dialog-background);
|
||||
border: 1px solid var(--zen-colors-border-contrast);
|
||||
width: calc(100% - var(--zen-toolbox-padding));
|
||||
|
||||
:root[zen-single-toolbar='true'] {
|
||||
padding-top: 0 !important;
|
||||
@@ -312,8 +313,7 @@
|
||||
}
|
||||
|
||||
& #urlbar {
|
||||
transform: translateY(-50%);
|
||||
transition: transform 0.1s ease-in-out;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
@media (-moz-bool-pref: 'zen.view.compact.color-toolbar') {
|
||||
@@ -336,10 +336,6 @@
|
||||
overflow: initial;
|
||||
max-height: unset;
|
||||
|
||||
& #urlbar {
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
&::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
@@ -353,6 +349,15 @@
|
||||
opacity: var(--zen-grainy-background-opacity, 0);
|
||||
mix-blend-mode: overlay;
|
||||
}
|
||||
|
||||
& #urlbar {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
& #urlbar[breakout-extend='true']:not([zen-floating-urlbar='true']) {
|
||||
top: 2px !important;
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,8 +47,8 @@
|
||||
|
||||
#PanelUI-zen-gradient-generator-color-custom-add {
|
||||
position: absolute;
|
||||
right: 2px;
|
||||
top: 4px;
|
||||
right: 0px;
|
||||
top: 0px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
|
||||
@@ -847,8 +847,8 @@
|
||||
position: relative;
|
||||
height: calc(100% - var(--tab-block-margin) * 2);
|
||||
margin-left: calc(-1 * var(--tab-inline-padding) + var(--tab-block-margin));
|
||||
margin-right: 4px;
|
||||
padding: 0 calc(var(--toolbarbutton-inner-padding)) 0 calc(var(--toolbarbutton-inner-padding) / 4 + var(--tab-inline-padding) - 2px);
|
||||
margin-right: 8px;
|
||||
padding: 0 calc(var(--toolbarbutton-inner-padding) - 2px) 0 calc(var(--toolbarbutton-inner-padding) / 4 + var(--tab-inline-padding) - 2px);
|
||||
border-radius: 0;
|
||||
border-top-left-radius: var(--border-radius-medium);
|
||||
width: unset;
|
||||
@@ -872,10 +872,10 @@
|
||||
height: 16px;
|
||||
background: light-dark(rgba(88, 79, 79, 0.02), rgba(255, 255, 255, 0.3));
|
||||
position: absolute;
|
||||
right: calc(var(--tab-inline-padding) / 2 - 1px);
|
||||
right: 0;
|
||||
top: 50%;
|
||||
border-radius: 2px;
|
||||
transform: rotate(10deg) translateY(-50%);
|
||||
transform: rotate(15deg) translateY(-50%);
|
||||
}
|
||||
|
||||
&:hover::after {
|
||||
|
||||
@@ -460,7 +460,7 @@
|
||||
position: absolute;
|
||||
max-height: var(--zen-workspace-indicator-height);
|
||||
min-height: var(--zen-workspace-indicator-height);
|
||||
gap: 12px;
|
||||
gap: var(--tab-icon-end-margin);
|
||||
align-items: center;
|
||||
flex-direction: row !important;
|
||||
max-width: 100%;
|
||||
|
||||
@@ -153,7 +153,8 @@ var gZenCompactModeManager = {
|
||||
animateCompactMode() {
|
||||
this._animating = true;
|
||||
const isCompactMode = this.preference;
|
||||
const canHideSidebar = Services.prefs.getBoolPref('zen.view.compact.hide-tabbar');
|
||||
const canHideSidebar =
|
||||
Services.prefs.getBoolPref('zen.view.compact.hide-tabbar') || gZenVerticalTabsManager._hasSetSingleToolbar;
|
||||
const canAnimate =
|
||||
lazyCompactMode.COMPACT_MODE_CAN_ANIMATE_SIDEBAR &&
|
||||
!this.sidebar.hasAttribute('zen-user-show') &&
|
||||
|
||||
@@ -131,7 +131,6 @@
|
||||
|
||||
async _refreshPinnedTabs({ init = false } = {}) {
|
||||
await ZenWorkspaces.promiseSectionsInitialized;
|
||||
console.log('Refreshing pinned tabs');
|
||||
await this._initializePinsCache();
|
||||
await this._initializePinnedTabs(init);
|
||||
}
|
||||
@@ -220,79 +219,83 @@
|
||||
|
||||
// Third pass: create new tabs for pins that don't have tabs
|
||||
for (let pin of pins) {
|
||||
if (!pinsToCreate.has(pin.uuid)) {
|
||||
continue; // Skip pins that already have tabs
|
||||
}
|
||||
try {
|
||||
if (!pinsToCreate.has(pin.uuid)) {
|
||||
continue; // Skip pins that already have tabs
|
||||
}
|
||||
|
||||
let params = {
|
||||
skipAnimation: true,
|
||||
allowInheritPrincipal: false,
|
||||
skipBackgroundNotify: true,
|
||||
userContextId: pin.containerTabId || 0,
|
||||
createLazyBrowser: true,
|
||||
skipLoad: true,
|
||||
noInitialLabel: false,
|
||||
};
|
||||
|
||||
// Create and initialize the tab
|
||||
let newTab = gBrowser.addTrustedTab(pin.url, params);
|
||||
newTab.setAttribute('zenDefaultUserContextId', true);
|
||||
|
||||
// Set initial label/title
|
||||
if (pin.title) {
|
||||
gBrowser.setInitialTabTitle(newTab, pin.title);
|
||||
}
|
||||
|
||||
// Set the icon if we have it cached
|
||||
if (pin.iconUrl) {
|
||||
gBrowser.setIcon(newTab, pin.iconUrl);
|
||||
}
|
||||
|
||||
newTab.setAttribute('zen-pin-id', pin.uuid);
|
||||
|
||||
if (pin.workspaceUuid) {
|
||||
newTab.setAttribute('zen-workspace-id', pin.workspaceUuid);
|
||||
}
|
||||
|
||||
if (pin.isEssential) {
|
||||
newTab.setAttribute('zen-essential', 'true');
|
||||
}
|
||||
|
||||
if (pin.editedTitle) {
|
||||
newTab.setAttribute('zen-has-static-label', 'true');
|
||||
}
|
||||
|
||||
// Initialize browser state if needed
|
||||
if (!newTab.linkedBrowser._remoteAutoRemoved) {
|
||||
let state = {
|
||||
entries: [
|
||||
{
|
||||
url: pin.url,
|
||||
title: pin.title,
|
||||
triggeringPrincipal_base64: E10SUtils.SERIALIZED_SYSTEMPRINCIPAL,
|
||||
},
|
||||
],
|
||||
let params = {
|
||||
skipAnimation: true,
|
||||
allowInheritPrincipal: false,
|
||||
skipBackgroundNotify: true,
|
||||
userContextId: pin.containerTabId || 0,
|
||||
image: pin.iconUrl,
|
||||
createLazyBrowser: true,
|
||||
skipLoad: true,
|
||||
noInitialLabel: false,
|
||||
};
|
||||
|
||||
SessionStore.setTabState(newTab, state);
|
||||
}
|
||||
// Create and initialize the tab
|
||||
let newTab = gBrowser.addTrustedTab(pin.url, params);
|
||||
newTab.setAttribute('zenDefaultUserContextId', true);
|
||||
|
||||
this.log(`Created new pinned tab for pin ${pin.uuid} (isEssential: ${pin.isEssential})`);
|
||||
gBrowser.pinTab(newTab);
|
||||
if (!pin.isEssential) {
|
||||
const container = document.querySelector(
|
||||
`#vertical-pinned-tabs-container .zen-workspace-tabs-section[zen-workspace-id="${pin.workspaceUuid}"]`
|
||||
);
|
||||
if (container) {
|
||||
container.insertBefore(newTab, container.lastChild);
|
||||
// Set initial label/title
|
||||
if (pin.title) {
|
||||
gBrowser.setInitialTabTitle(newTab, pin.title);
|
||||
}
|
||||
}
|
||||
gBrowser.tabContainer._invalidateCachedTabs();
|
||||
newTab.initialize();
|
||||
if (!ZenWorkspaces.essentialShouldShowTab(newTab)) {
|
||||
gBrowser.hideTab(newTab, undefined, true);
|
||||
|
||||
// Set the icon if we have it cached
|
||||
if (pin.iconUrl) {
|
||||
gBrowser.setIcon(newTab, pin.iconUrl);
|
||||
}
|
||||
|
||||
newTab.setAttribute('zen-pin-id', pin.uuid);
|
||||
|
||||
if (pin.workspaceUuid) {
|
||||
newTab.setAttribute('zen-workspace-id', pin.workspaceUuid);
|
||||
}
|
||||
|
||||
if (pin.isEssential) {
|
||||
newTab.setAttribute('zen-essential', 'true');
|
||||
}
|
||||
|
||||
if (pin.editedTitle) {
|
||||
newTab.setAttribute('zen-has-static-label', 'true');
|
||||
}
|
||||
|
||||
// Initialize browser state if needed
|
||||
if (!newTab.linkedBrowser._remoteAutoRemoved) {
|
||||
let state = {
|
||||
entries: [
|
||||
{
|
||||
url: pin.url,
|
||||
title: pin.title,
|
||||
triggeringPrincipal_base64: E10SUtils.SERIALIZED_SYSTEMPRINCIPAL,
|
||||
},
|
||||
],
|
||||
userContextId: pin.containerTabId || 0,
|
||||
image: pin.iconUrl,
|
||||
};
|
||||
|
||||
SessionStore.setTabState(newTab, state);
|
||||
}
|
||||
|
||||
this.log(`Created new pinned tab for pin ${pin.uuid} (isEssential: ${pin.isEssential})`);
|
||||
gBrowser.pinTab(newTab);
|
||||
if (!pin.isEssential) {
|
||||
const container = document.querySelector(
|
||||
`#vertical-pinned-tabs-container .zen-workspace-tabs-section[zen-workspace-id="${pin.workspaceUuid}"]`
|
||||
);
|
||||
if (container) {
|
||||
container.insertBefore(newTab, container.lastChild);
|
||||
}
|
||||
}
|
||||
gBrowser.tabContainer._invalidateCachedTabs();
|
||||
newTab.initialize();
|
||||
if (!ZenWorkspaces.essentialShouldShowTab(newTab)) {
|
||||
gBrowser.hideTab(newTab, undefined, true);
|
||||
}
|
||||
} catch (ex) {
|
||||
console.error('Failed to initialize pinned tabs:', ex);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -140,7 +140,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
|
||||
|
||||
_initializeEmptyTab() {
|
||||
gBrowser._forZenEmptyTab = true;
|
||||
this._emptyTab = gBrowser.addTrustedTab('about:blank', { inBackground: true });
|
||||
this._emptyTab = gBrowser.addTrustedTab('about:blank', { inBackground: true, userContextId: 0 });
|
||||
this._emptyTab.setAttribute('zen-empty-tab', 'true');
|
||||
}
|
||||
|
||||
@@ -267,9 +267,9 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
|
||||
// remove tab from list
|
||||
tabs.splice(tabs.indexOf(tab), 1);
|
||||
if (tab.pinned) {
|
||||
pinnedSection.appendChild(tab);
|
||||
pinnedSection.insertBefore(tab, pinnedSection.nextSibling);
|
||||
} else {
|
||||
section.appendChild(tab);
|
||||
section.insertBefore(tab, section.lastChild);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1805,6 +1805,16 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
|
||||
|
||||
// Fix ctrl+tab behavior. Note, we dont call it with "await" because we dont want to wait for it
|
||||
this._fixCtrlTabBehavior();
|
||||
|
||||
// Bug: When updating from previous versions, we used to hide the tabs not used in the new workspace
|
||||
// we now need to show them again
|
||||
if (onInit) {
|
||||
for (const tab of this.allStoredTabs) {
|
||||
if (!tab.hasAttribute('zen-essential')) {
|
||||
gBrowser.showTab(tab);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async _fixCtrlTabBehavior() {
|
||||
@@ -1989,7 +1999,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
|
||||
const contaienr = document.querySelector(
|
||||
`#vertical-pinned-tabs-container .zen-workspace-tabs-section[zen-workspace-id="${workspaceId}"]`
|
||||
);
|
||||
contaienr.insertBefore(tab, contaienr.firstChild);
|
||||
contaienr.insertBefore(tab, contaienr.lastChild);
|
||||
changed = true;
|
||||
}
|
||||
if (changed) {
|
||||
@@ -2293,14 +2303,25 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
|
||||
}
|
||||
}
|
||||
|
||||
switchIfNeeded(browser) {
|
||||
return new Promise(async (resolve) => {
|
||||
const tab = gBrowser.getTabForBrowser(browser);
|
||||
const workspaceId = tab.getAttribute('zen-workspace-id');
|
||||
if (!tab.hasAttribute('zen-essential') && workspaceId !== this.activeWorkspace) {
|
||||
await this.changeWorkspace({ uuid: workspaceId });
|
||||
}
|
||||
resolve();
|
||||
});
|
||||
async switchIfNeeded(browser, i) {
|
||||
const tab = gBrowser.getTabForBrowser(browser);
|
||||
const workspaceId = tab.getAttribute('zen-workspace-id');
|
||||
if (!tab.hasAttribute('zen-essential') && workspaceId !== this.activeWorkspace) {
|
||||
await this.changeWorkspace({ uuid: workspaceId });
|
||||
}
|
||||
gBrowser.selectedTab = tab;
|
||||
}
|
||||
|
||||
getDefaultContainer() {
|
||||
if (!this.workspaceEnabled) {
|
||||
return 0;
|
||||
}
|
||||
const workspaces = this._workspaceCache;
|
||||
if (!workspaces) {
|
||||
return 0;
|
||||
}
|
||||
const activeWorkspace = this.activeWorkspace;
|
||||
const workspace = workspaces.workspaces.find((workspace) => workspace.uuid === activeWorkspace);
|
||||
return workspace.containerTabId;
|
||||
}
|
||||
})();
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
diff --git a/browser/components/places/PlacesUIUtils.sys.mjs b/browser/components/places/PlacesUIUtils.sys.mjs
|
||||
index 0f79ba5dd42116d626445b86f6b24731d2fa8aad..76d692db1731e84b28d9035b03e34c176c12bd23 100644
|
||||
index fbdd6a34b12d4d957f7a2d9d95df0bfd65ba3f61..4d27f7fc108ca76e071707a737209bf5ea4ea07e 100644
|
||||
--- a/browser/components/places/PlacesUIUtils.sys.mjs
|
||||
+++ b/browser/components/places/PlacesUIUtils.sys.mjs
|
||||
@@ -58,6 +58,7 @@ class BookmarkState {
|
||||
@@ -157,3 +157,12 @@ index 0f79ba5dd42116d626445b86f6b24731d2fa8aad..76d692db1731e84b28d9035b03e34c17
|
||||
/**
|
||||
* Append transactions to update tags by given information.
|
||||
*
|
||||
@@ -902,7 +1011,7 @@ export var PlacesUIUtils = {
|
||||
aNode,
|
||||
aWhere,
|
||||
aWindow,
|
||||
- { aPrivate = false, userContextId = 0 } = {}
|
||||
+ { aPrivate = false, userContextId = aWindow.ZenWorkspaces.getDefaultContainer() } = {}
|
||||
) {
|
||||
if (
|
||||
aNode &&
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
diff --git a/browser/components/sessionstore/SessionStore.sys.mjs b/browser/components/sessionstore/SessionStore.sys.mjs
|
||||
index 334c041c1748564094c6a177bb24f146791d96d8..e301cc1df604e4a23fcf260d5952736f5b791803 100644
|
||||
index 908743177d9f95e2e6549c689e7a493ca8668701..181c4819b052e444e56e75f1cb40b4bc299569fb 100644
|
||||
--- a/browser/components/sessionstore/SessionStore.sys.mjs
|
||||
+++ b/browser/components/sessionstore/SessionStore.sys.mjs
|
||||
@@ -3848,6 +3848,7 @@ var SessionStoreInternal = {
|
||||
@@ -27,3 +27,19 @@ index 334c041c1748564094c6a177bb24f146791d96d8..e301cc1df604e4a23fcf260d5952736f
|
||||
continue;
|
||||
}
|
||||
let tabData = lazy.TabState.collect(tab, TAB_CUSTOM_VALUES.get(tab));
|
||||
@@ -6042,6 +6043,15 @@ var SessionStoreInternal = {
|
||||
|
||||
// Most of tabData has been restored, now continue with restoring
|
||||
// attributes that may trigger external events.
|
||||
+ if (tabData.zenEssential) {
|
||||
+ tab.setAttribute("zen-essential", "true");
|
||||
+ }
|
||||
+ if (tabData.zenIsEmpty) {
|
||||
+ tab.setAttribute("zen-empty-tab", "true");
|
||||
+ }
|
||||
+ if (tabData.zenPinnedId) {
|
||||
+ tab.setAttribute("zen-pin-id", tabData.zenPinnedId);
|
||||
+ }
|
||||
|
||||
if (tabData.pinned) {
|
||||
tabbrowser.pinTab(tab);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
diff --git a/browser/components/tabbrowser/content/tab.js b/browser/components/tabbrowser/content/tab.js
|
||||
index d41c486c02a6f09dcff5741a59ad8b617294c481..efa900725f32d8606ba6d3bb8bff2d0dcb511e78 100644
|
||||
index d41c486c02a6f09dcff5741a59ad8b617294c481..8e902dcb3792c75238ac13a8bf9199b34451aa51 100644
|
||||
--- a/browser/components/tabbrowser/content/tab.js
|
||||
+++ b/browser/components/tabbrowser/content/tab.js
|
||||
@@ -16,6 +16,7 @@
|
||||
@@ -80,3 +80,12 @@ index d41c486c02a6f09dcff5741a59ad8b617294c481..efa900725f32d8606ba6d3bb8bff2d0d
|
||||
}
|
||||
|
||||
on_dblclick(event) {
|
||||
@@ -576,6 +590,8 @@
|
||||
animate: true,
|
||||
triggeringEvent: event,
|
||||
});
|
||||
+ } else if (this.hasAttribute('zen-essential') && !event.target.classList.contains("tab-icon-overlay")) {
|
||||
+ gZenPinnedTabManager._onTabResetPinButton(event, this, 'reset');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js
|
||||
index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf32921591731291f8e9db 100644
|
||||
index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..20c92611723587e4eeed5889b2b1741d86368263 100644
|
||||
--- a/browser/components/tabbrowser/content/tabbrowser.js
|
||||
+++ b/browser/components/tabbrowser/content/tabbrowser.js
|
||||
@@ -406,11 +406,52 @@
|
||||
@@ -406,11 +406,50 @@
|
||||
return this.tabContainer.visibleTabs;
|
||||
}
|
||||
|
||||
@@ -19,20 +19,18 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
+ return i;
|
||||
+ }
|
||||
+
|
||||
+ get _numVisiblePinTabsWithoutGlance() {
|
||||
+ get _numZenEssentials() {
|
||||
+ let i = 0;
|
||||
+ for (let tab of this.tabs) {
|
||||
+ if (!tab.pinned) {
|
||||
+ if (!tab.hasAttribute("zen-essential") && !tab.hasAttribute("zen-glance-tab")) {
|
||||
+ break;
|
||||
+ }
|
||||
+ if (!tab.hidden && !tab.hasAttribute("zen-glance-tab")) {
|
||||
+ i++;
|
||||
+ }
|
||||
+ i += !tab.hasAttribute("zen-glance-tab");
|
||||
+ }
|
||||
+ return i;
|
||||
+ }
|
||||
+
|
||||
+ get _numZenEssentials() {
|
||||
+ get _numZenVisibleEssentials() {
|
||||
+ let i = 0;
|
||||
+ for (let tab of this.tabs) {
|
||||
+ if (!tab.hasAttribute("zen-essential") && !tab.hasAttribute("zen-glance-tab")) {
|
||||
@@ -57,7 +55,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
}
|
||||
return i;
|
||||
}
|
||||
@@ -807,7 +848,7 @@
|
||||
@@ -807,7 +846,7 @@
|
||||
this.showTab(aTab);
|
||||
if (this.tabContainer.verticalMode) {
|
||||
this._handleTabMove(aTab, () =>
|
||||
@@ -66,7 +64,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
);
|
||||
} else {
|
||||
this.moveTabTo(aTab, this.pinnedTabCount, { forceStandaloneTab: true });
|
||||
@@ -828,7 +869,7 @@
|
||||
@@ -828,7 +867,7 @@
|
||||
// the moving of a tab from the vertical pinned tabs container
|
||||
// and back into arrowscrollbox.
|
||||
aTab.removeAttribute("pinned");
|
||||
@@ -75,7 +73,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
});
|
||||
} else {
|
||||
this.moveTabTo(aTab, this.pinnedTabCount - 1, {
|
||||
@@ -1055,6 +1096,8 @@
|
||||
@@ -1055,6 +1094,8 @@
|
||||
|
||||
let LOCAL_PROTOCOLS = ["chrome:", "about:", "resource:", "data:"];
|
||||
|
||||
@@ -84,7 +82,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
if (
|
||||
aIconURL &&
|
||||
!aLoadingPrincipal &&
|
||||
@@ -1065,6 +1108,9 @@
|
||||
@@ -1065,6 +1106,9 @@
|
||||
);
|
||||
return;
|
||||
}
|
||||
@@ -94,7 +92,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
|
||||
let browser = this.getBrowserForTab(aTab);
|
||||
browser.mIconURL = aIconURL;
|
||||
@@ -1310,6 +1356,7 @@
|
||||
@@ -1310,6 +1354,7 @@
|
||||
if (!this._previewMode) {
|
||||
newTab.recordTimeFromUnloadToReload();
|
||||
newTab.updateLastAccessed();
|
||||
@@ -102,7 +100,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
oldTab.updateLastAccessed();
|
||||
// if this is the foreground window, update the last-seen timestamps.
|
||||
if (this.ownerGlobal == BrowserWindowTracker.getTopWindow()) {
|
||||
@@ -1462,6 +1509,9 @@
|
||||
@@ -1462,6 +1507,9 @@
|
||||
}
|
||||
|
||||
let activeEl = document.activeElement;
|
||||
@@ -112,7 +110,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
// If focus is on the old tab, move it to the new tab.
|
||||
if (activeEl == oldTab) {
|
||||
newTab.focus();
|
||||
@@ -1785,7 +1835,7 @@
|
||||
@@ -1785,7 +1833,7 @@
|
||||
}
|
||||
|
||||
_setTabLabel(aTab, aLabel, { beforeTabOpen, isContentTitle, isURL } = {}) {
|
||||
@@ -121,7 +119,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1888,7 +1938,7 @@
|
||||
@@ -1888,7 +1936,7 @@
|
||||
newIndex = this.selectedTab._tPos + 1;
|
||||
}
|
||||
|
||||
@@ -130,7 +128,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
let browser;
|
||||
if (targetTab) {
|
||||
browser = this.getBrowserForTab(targetTab);
|
||||
@@ -2222,7 +2272,8 @@
|
||||
@@ -2222,7 +2270,8 @@
|
||||
b.setAttribute("name", name);
|
||||
}
|
||||
|
||||
@@ -140,7 +138,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
b.setAttribute("transparent", "true");
|
||||
}
|
||||
|
||||
@@ -2387,7 +2438,7 @@
|
||||
@@ -2387,7 +2436,7 @@
|
||||
|
||||
let panel = this.getPanel(browser);
|
||||
let uniqueId = this._generateUniquePanelID();
|
||||
@@ -149,7 +147,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
aTab.linkedPanel = uniqueId;
|
||||
|
||||
// Inject the <browser> into the DOM if necessary.
|
||||
@@ -2446,8 +2497,8 @@
|
||||
@@ -2446,8 +2495,8 @@
|
||||
// If we transitioned from one browser to two browsers, we need to set
|
||||
// hasSiblings=false on both the existing browser and the new browser.
|
||||
if (this.tabs.length == 2) {
|
||||
@@ -160,7 +158,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
} else {
|
||||
aTab.linkedBrowser.browsingContext.hasSiblings = this.tabs.length > 1;
|
||||
}
|
||||
@@ -2679,6 +2730,12 @@
|
||||
@@ -2679,6 +2728,12 @@
|
||||
);
|
||||
}
|
||||
|
||||
@@ -173,7 +171,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
if (!UserInteraction.running("browser.tabs.opening", window)) {
|
||||
UserInteraction.start("browser.tabs.opening", "initting", window);
|
||||
}
|
||||
@@ -2742,6 +2799,12 @@
|
||||
@@ -2742,6 +2797,12 @@
|
||||
noInitialLabel,
|
||||
skipBackgroundNotify,
|
||||
});
|
||||
@@ -186,7 +184,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
if (insertTab) {
|
||||
// insert the tab into the tab container in the correct position
|
||||
this._insertTabAtIndex(t, {
|
||||
@@ -2885,6 +2948,9 @@
|
||||
@@ -2885,6 +2946,9 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -196,7 +194,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
// Additionally send pinned tab events
|
||||
if (pinned) {
|
||||
this._notifyPinnedStatus(t);
|
||||
@@ -3403,6 +3469,24 @@
|
||||
@@ -3403,6 +3467,24 @@
|
||||
) {
|
||||
tabWasReused = true;
|
||||
tab = this.selectedTab;
|
||||
@@ -221,7 +219,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
if (!tabData.pinned) {
|
||||
this.unpinTab(tab);
|
||||
} else {
|
||||
@@ -3416,6 +3500,7 @@
|
||||
@@ -3416,6 +3498,7 @@
|
||||
restoreTabsLazily && !select && !tabData.pinned;
|
||||
|
||||
let url = "about:blank";
|
||||
@@ -229,7 +227,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
if (tabData.entries?.length) {
|
||||
let activeIndex = (tabData.index || tabData.entries.length) - 1;
|
||||
// Ensure the index is in bounds.
|
||||
@@ -3451,7 +3536,24 @@
|
||||
@@ -3451,7 +3534,24 @@
|
||||
skipLoad: true,
|
||||
preferredRemoteType,
|
||||
});
|
||||
@@ -255,7 +253,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
if (select) {
|
||||
tabToSelect = tab;
|
||||
}
|
||||
@@ -3464,8 +3566,8 @@
|
||||
@@ -3464,8 +3564,8 @@
|
||||
// inserted in the DOM. If the tab is not yet in the DOM,
|
||||
// just insert it in the right place from the start.
|
||||
if (!tab.parentNode) {
|
||||
@@ -266,7 +264,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
tab.toggleAttribute("pinned", true);
|
||||
this.tabContainer._invalidateCachedTabs();
|
||||
// Then ensure all the tab open/pinning information is sent.
|
||||
@@ -3729,7 +3831,7 @@
|
||||
@@ -3729,7 +3829,7 @@
|
||||
// Ensure we have an index if one was not provided.
|
||||
if (typeof index != "number") {
|
||||
// Move the new tab after another tab if needed, to the end otherwise.
|
||||
@@ -275,7 +273,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
if (
|
||||
!bulkOrderedOpen &&
|
||||
((openerTab &&
|
||||
@@ -3780,7 +3882,7 @@
|
||||
@@ -3780,7 +3880,7 @@
|
||||
}
|
||||
|
||||
/** @type {MozTabbrowserTab|undefined} */
|
||||
@@ -284,7 +282,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
this.tabContainer._invalidateCachedTabs();
|
||||
|
||||
if (tabGroup) {
|
||||
@@ -4095,6 +4197,9 @@
|
||||
@@ -4095,6 +4195,9 @@
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -294,7 +292,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
this.removeTabs(selectedTabs);
|
||||
}
|
||||
|
||||
@@ -4427,6 +4532,7 @@
|
||||
@@ -4427,6 +4530,7 @@
|
||||
skipSessionStore,
|
||||
} = {}
|
||||
) {
|
||||
@@ -302,7 +300,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
if (UserInteraction.running("browser.tabs.opening", window)) {
|
||||
UserInteraction.finish("browser.tabs.opening", window);
|
||||
}
|
||||
@@ -4443,6 +4549,12 @@
|
||||
@@ -4443,6 +4547,12 @@
|
||||
TelemetryStopwatch.start("FX_TAB_CLOSE_TIME_NO_ANIM_MS", aTab);
|
||||
}
|
||||
|
||||
@@ -315,7 +313,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
// Handle requests for synchronously removing an already
|
||||
// asynchronously closing tab.
|
||||
if (!animate && aTab.closing) {
|
||||
@@ -4457,7 +4569,9 @@
|
||||
@@ -4457,7 +4567,9 @@
|
||||
// frame created for it (for example, by updating the visually selected
|
||||
// state).
|
||||
let tabWidth = window.windowUtils.getBoundsWithoutFlushing(aTab).width;
|
||||
@@ -326,7 +324,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
if (
|
||||
!this._beginRemoveTab(aTab, {
|
||||
closeWindowFastpath: true,
|
||||
@@ -4471,7 +4585,6 @@
|
||||
@@ -4471,7 +4583,6 @@
|
||||
TelemetryStopwatch.cancel("FX_TAB_CLOSE_TIME_NO_ANIM_MS", aTab);
|
||||
return;
|
||||
}
|
||||
@@ -334,7 +332,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
let lockTabSizing =
|
||||
!this.tabContainer.verticalMode &&
|
||||
!aTab.pinned &&
|
||||
@@ -4610,14 +4723,14 @@
|
||||
@@ -4610,14 +4721,14 @@
|
||||
!!this.tabsInCollapsedTabGroups.length;
|
||||
if (
|
||||
aTab.visible &&
|
||||
@@ -351,7 +349,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
|
||||
if (closeWindow) {
|
||||
// We've already called beforeunload on all the relevant tabs if we get here,
|
||||
@@ -4641,6 +4754,7 @@
|
||||
@@ -4641,6 +4752,7 @@
|
||||
|
||||
newTab = true;
|
||||
}
|
||||
@@ -359,7 +357,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
aTab._endRemoveArgs = [closeWindow, newTab];
|
||||
|
||||
// swapBrowsersAndCloseOther will take care of closing the window without animation.
|
||||
@@ -4681,9 +4795,7 @@
|
||||
@@ -4681,9 +4793,7 @@
|
||||
aTab._mouseleave();
|
||||
|
||||
if (newTab) {
|
||||
@@ -370,7 +368,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
} else {
|
||||
TabBarVisibility.update();
|
||||
}
|
||||
@@ -4812,6 +4924,8 @@
|
||||
@@ -4812,6 +4922,8 @@
|
||||
this.tabs[i]._tPos = i;
|
||||
}
|
||||
|
||||
@@ -379,7 +377,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
if (!this._windowIsClosing) {
|
||||
if (wasPinned) {
|
||||
this.tabContainer._positionPinnedTabs();
|
||||
@@ -5025,7 +5139,7 @@
|
||||
@@ -5025,7 +5137,7 @@
|
||||
!excludeTabs.has(aTab.owner) &&
|
||||
Services.prefs.getBoolPref("browser.tabs.selectOwnerOnClose")
|
||||
) {
|
||||
@@ -388,7 +386,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
}
|
||||
|
||||
// Try to find a remaining tab that comes after the given tab
|
||||
@@ -5047,7 +5161,7 @@
|
||||
@@ -5047,7 +5159,7 @@
|
||||
}
|
||||
|
||||
if (tab) {
|
||||
@@ -397,7 +395,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
}
|
||||
|
||||
// If no qualifying visible tab was found, see if there is a tab in
|
||||
@@ -5465,10 +5579,10 @@
|
||||
@@ -5465,10 +5577,10 @@
|
||||
SessionStore.deleteCustomTabValue(aTab, "hiddenBy");
|
||||
}
|
||||
|
||||
@@ -410,28 +408,25 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
aTab.selected ||
|
||||
aTab.closing ||
|
||||
// Tabs that are sharing the screen, microphone or camera cannot be hidden.
|
||||
@@ -5706,9 +5820,9 @@
|
||||
@@ -5706,7 +5818,7 @@
|
||||
|
||||
// Don't allow mixing pinned and unpinned tabs.
|
||||
if (aTab.pinned) {
|
||||
- aIndex = Math.min(aIndex, this.pinnedTabCount - 1);
|
||||
+ aIndex = Math.min(aIndex, (aTab.hasAttribute('zen-essential') ? this._numZenEssentials : this._numVisiblePinTabsWithoutGlance) - 1);
|
||||
+ aIndex = aTab.hasAttribute('zen-essential') ? Math.min(aIndex, this._numZenEssentials - 1) : Math.min(aIndex, this.pinnedTabCount - 1);
|
||||
} else {
|
||||
- aIndex = Math.max(aIndex, this.pinnedTabCount);
|
||||
+ aIndex = Math.max(aIndex, this._numVisiblePinTabsWithoutGlance);
|
||||
aIndex = Math.max(aIndex, this.pinnedTabCount);
|
||||
}
|
||||
if (aTab._tPos == aIndex) {
|
||||
return;
|
||||
@@ -5717,7 +5831,7 @@
|
||||
@@ -5717,7 +5829,7 @@
|
||||
this._lastRelatedTabMap = new WeakMap();
|
||||
|
||||
this._handleTabMove(aTab, () => {
|
||||
- let neighbor = this.tabs[aIndex];
|
||||
+ let neighbor = this.tabs.filter(tab => !tab.hasAttribute("zen-glance-tab"))[aIndex];
|
||||
+ let neighbor = this.tabs.filter(tab => !tab.hasAttribute("zen-glance-tab") && !tab.hasAttribute("zen-empty-tab"))[aIndex];
|
||||
if (forceStandaloneTab && neighbor.group) {
|
||||
neighbor = neighbor.group;
|
||||
}
|
||||
@@ -5802,7 +5916,7 @@
|
||||
@@ -5802,7 +5914,7 @@
|
||||
createLazyBrowser,
|
||||
};
|
||||
|
||||
@@ -440,7 +435,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
if (aIndex < numPinned || (aTab.pinned && aIndex == numPinned)) {
|
||||
params.pinned = true;
|
||||
}
|
||||
@@ -7443,6 +7557,7 @@
|
||||
@@ -7443,6 +7555,7 @@
|
||||
aWebProgress.isTopLevel
|
||||
) {
|
||||
this.mTab.setAttribute("busy", "true");
|
||||
@@ -448,7 +443,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
gBrowser._tabAttrModified(this.mTab, ["busy"]);
|
||||
this.mTab._notselectedsinceload = !this.mTab.selected;
|
||||
gBrowser.syncThrobberAnimations(this.mTab);
|
||||
@@ -8411,7 +8526,7 @@ var TabContextMenu = {
|
||||
@@ -8411,7 +8524,7 @@ var TabContextMenu = {
|
||||
);
|
||||
contextUnpinSelectedTabs.hidden =
|
||||
!this.contextTab.pinned || !multiselectionContext;
|
||||
@@ -457,7 +452,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
// Move Tab items
|
||||
let contextMoveTabOptions = document.getElementById(
|
||||
"context_moveTabOptions"
|
||||
@@ -8444,7 +8559,7 @@ var TabContextMenu = {
|
||||
@@ -8444,7 +8557,7 @@ var TabContextMenu = {
|
||||
let contextMoveTabToStart = document.getElementById("context_moveToStart");
|
||||
let isFirstTab =
|
||||
tabsToMove[0] == visibleTabs[0] ||
|
||||
@@ -466,7 +461,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..04056ab93316968babcf329215917312
|
||||
contextMoveTabToStart.disabled = isFirstTab && allSelectedTabsAdjacent;
|
||||
|
||||
document.getElementById("context_openTabInWindow").disabled =
|
||||
@@ -8677,6 +8792,7 @@ var TabContextMenu = {
|
||||
@@ -8677,6 +8790,7 @@ var TabContextMenu = {
|
||||
if (this.contextTab.multiselected) {
|
||||
gBrowser.removeMultiSelectedTabs();
|
||||
} else {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
diff --git a/browser/components/tabbrowser/content/tabs.js b/browser/components/tabbrowser/content/tabs.js
|
||||
index 8aeb244ffca9f48661805f5b7d860b5896055562..2b988219f279f7b6e1178518e436a7f2b437ce20 100644
|
||||
index 8aeb244ffca9f48661805f5b7d860b5896055562..8300aa0533cb0037be26766acf1d82af295c7369 100644
|
||||
--- a/browser/components/tabbrowser/content/tabs.js
|
||||
+++ b/browser/components/tabbrowser/content/tabs.js
|
||||
@@ -94,7 +94,7 @@
|
||||
@@ -33,7 +33,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..2b988219f279f7b6e1178518e436a7f2
|
||||
// In expanded vertical mode, the max number of pinned tabs per row is dynamic
|
||||
// Set this before adjusting dragged tab's position
|
||||
- let pinnedTabs = this.visibleTabs.slice(0, gBrowser.pinnedTabCount);
|
||||
+ let pinnedTabs = this.visibleTabs.slice(0, gBrowser._numVisiblePinTabs);
|
||||
+ let pinnedTabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab")).slice(0, gBrowser._numZenVisibleEssentials);
|
||||
let tabsPerRow = 0;
|
||||
let position = 0;
|
||||
for (let pinnedTab of pinnedTabs) {
|
||||
@@ -325,7 +325,7 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..2b988219f279f7b6e1178518e436a7f2
|
||||
}
|
||||
|
||||
- let tabs = this.visibleTabs.slice(0, gBrowser.pinnedTabCount);
|
||||
+ let tabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab")).slice(0, gBrowser._numVisiblePinTabs);
|
||||
+ let tabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab")).slice(0, gBrowser._numZenVisibleEssentials);
|
||||
|
||||
let directionX = screenX > dragData.animLastScreenX;
|
||||
let directionY = screenY > dragData.animLastScreenY;
|
||||
|
||||
22
src/toolkit/profile/nsToolkitProfileService-cpp.patch
Normal file
22
src/toolkit/profile/nsToolkitProfileService-cpp.patch
Normal file
@@ -0,0 +1,22 @@
|
||||
diff --git a/toolkit/profile/nsToolkitProfileService.cpp b/toolkit/profile/nsToolkitProfileService.cpp
|
||||
index b5510497e20b6d989c9dd8fff0c04b585bdc75bd..25fd837240fd849fd26b4cb8b8172423f6f7d8fc 100644
|
||||
--- a/toolkit/profile/nsToolkitProfileService.cpp
|
||||
+++ b/toolkit/profile/nsToolkitProfileService.cpp
|
||||
@@ -82,6 +82,8 @@ using namespace mozilla;
|
||||
#define INSTALL_PREFIX_LENGTH 7
|
||||
#define STORE_ID_PREF "toolkit.profiles.storeID"
|
||||
|
||||
+#include "zenToolkitProfileServiceDefaultOverride.h"
|
||||
+
|
||||
struct KeyValue {
|
||||
KeyValue(const char* aKey, const char* aValue) : key(aKey), value(aValue) {}
|
||||
|
||||
@@ -1409,7 +1411,7 @@ nsresult nsToolkitProfileService::CreateDefaultProfile(
|
||||
if (mUseDevEditionProfile) {
|
||||
name.AssignLiteral(DEV_EDITION_NAME);
|
||||
} else if (mUseDedicatedProfile) {
|
||||
- name.AppendPrintf("default-%s", mUpdateChannel.get());
|
||||
+ name.AppendPrintf("Default (%s)", mUpdateChannel.get());
|
||||
} else {
|
||||
name.AssignLiteral(DEFAULT_NAME);
|
||||
}
|
||||
@@ -19,7 +19,7 @@
|
||||
"brandShortName": "Zen",
|
||||
"brandFullName": "Zen Browser",
|
||||
"release": {
|
||||
"displayVersion": "1.8b",
|
||||
"displayVersion": "1.8.2b",
|
||||
"github": {
|
||||
"repo": "zen-browser/desktop"
|
||||
},
|
||||
@@ -39,7 +39,7 @@
|
||||
"brandShortName": "Twilight",
|
||||
"brandFullName": "Zen Twilight",
|
||||
"release": {
|
||||
"displayVersion": "1.8t",
|
||||
"displayVersion": "1.8.2t",
|
||||
"github": {
|
||||
"repo": "zen-browser/desktop"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user