mirror of
https://github.com/zen-browser/desktop.git
synced 2026-09-02 19:53:34 +00:00
Compare commits
2 Commits
dev
...
chore/upst
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5656eeecfc | ||
|
|
2fd2dbb272 |
8
.github/workflows/build.yml
vendored
8
.github/workflows/build.yml
vendored
@@ -298,7 +298,6 @@ jobs:
|
|||||||
secrets: inherit
|
secrets: inherit
|
||||||
with:
|
with:
|
||||||
use-sccache: ${{ inputs.use-sccache }}
|
use-sccache: ${{ inputs.use-sccache }}
|
||||||
force-candidate: ${{ !inputs.create_release }}
|
|
||||||
build-version: ${{ needs.build-data.outputs.version }}
|
build-version: ${{ needs.build-data.outputs.version }}
|
||||||
generate-pgo: true
|
generate-pgo: true
|
||||||
profile-data-path-archive: zen-windows-profile-data-and-jarlog.zip
|
profile-data-path-archive: zen-windows-profile-data-and-jarlog.zip
|
||||||
@@ -314,7 +313,6 @@ jobs:
|
|||||||
secrets: inherit
|
secrets: inherit
|
||||||
needs: [windows-step-1, build-data]
|
needs: [windows-step-1, build-data]
|
||||||
with:
|
with:
|
||||||
force-candidate: ${{ !inputs.create_release }}
|
|
||||||
build-version: ${{ needs.build-data.outputs.version }}
|
build-version: ${{ needs.build-data.outputs.version }}
|
||||||
profile-data-path-archive: zen.win64-pgo-stage-1.zip
|
profile-data-path-archive: zen.win64-pgo-stage-1.zip
|
||||||
release-branch: ${{ inputs.update_branch }}
|
release-branch: ${{ inputs.update_branch }}
|
||||||
@@ -329,7 +327,6 @@ jobs:
|
|||||||
if: ${{ !failure() && !cancelled() }}
|
if: ${{ !failure() && !cancelled() }}
|
||||||
needs: [build-data, windows-step-2, start-self-host, buildid]
|
needs: [build-data, windows-step-2, start-self-host, buildid]
|
||||||
with:
|
with:
|
||||||
force-candidate: ${{ !inputs.create_release }}
|
|
||||||
build-version: ${{ needs.build-data.outputs.version }}
|
build-version: ${{ needs.build-data.outputs.version }}
|
||||||
generate-pgo: false
|
generate-pgo: false
|
||||||
disable-pgo: ${{ inputs.disable-pgo }}
|
disable-pgo: ${{ inputs.disable-pgo }}
|
||||||
@@ -345,7 +342,6 @@ jobs:
|
|||||||
secrets: inherit
|
secrets: inherit
|
||||||
needs: [build-data, start-self-host, buildid]
|
needs: [build-data, start-self-host, buildid]
|
||||||
with:
|
with:
|
||||||
force-candidate: ${{ !inputs.create_release }}
|
|
||||||
build-version: ${{ needs.build-data.outputs.version }}
|
build-version: ${{ needs.build-data.outputs.version }}
|
||||||
release-branch: ${{ inputs.update_branch }}
|
release-branch: ${{ inputs.update_branch }}
|
||||||
MOZ_BUILD_DATE: ${{needs.buildid.outputs.buildids}}
|
MOZ_BUILD_DATE: ${{needs.buildid.outputs.buildids}}
|
||||||
@@ -362,7 +358,6 @@ jobs:
|
|||||||
secrets: inherit
|
secrets: inherit
|
||||||
with:
|
with:
|
||||||
use-sccache: ${{ inputs.use-sccache }}
|
use-sccache: ${{ inputs.use-sccache }}
|
||||||
force-candidate: ${{ !inputs.create_release }}
|
|
||||||
build-version: ${{ needs.build-data.outputs.version }}
|
build-version: ${{ needs.build-data.outputs.version }}
|
||||||
generate-pgo: true
|
generate-pgo: true
|
||||||
release-branch: ${{ inputs.update_branch }}
|
release-branch: ${{ inputs.update_branch }}
|
||||||
@@ -377,7 +372,6 @@ jobs:
|
|||||||
secrets: inherit
|
secrets: inherit
|
||||||
needs: [mac-step-1, build-data]
|
needs: [mac-step-1, build-data]
|
||||||
with:
|
with:
|
||||||
force-candidate: ${{ !inputs.create_release }}
|
|
||||||
build-version: ${{ needs.build-data.outputs.version }}
|
build-version: ${{ needs.build-data.outputs.version }}
|
||||||
release-branch: ${{ inputs.update_branch }}
|
release-branch: ${{ inputs.update_branch }}
|
||||||
|
|
||||||
@@ -391,7 +385,6 @@ jobs:
|
|||||||
if: ${{ !failure() && !cancelled() }}
|
if: ${{ !failure() && !cancelled() }}
|
||||||
needs: [build-data, mac-step-2, start-self-host, buildid]
|
needs: [build-data, mac-step-2, start-self-host, buildid]
|
||||||
with:
|
with:
|
||||||
force-candidate: ${{ !inputs.create_release }}
|
|
||||||
build-version: ${{ needs.build-data.outputs.version }}
|
build-version: ${{ needs.build-data.outputs.version }}
|
||||||
generate-pgo: false
|
generate-pgo: false
|
||||||
disable-pgo: ${{ inputs.disable-pgo }}
|
disable-pgo: ${{ inputs.disable-pgo }}
|
||||||
@@ -407,7 +400,6 @@ jobs:
|
|||||||
secrets: inherit
|
secrets: inherit
|
||||||
needs: [build-data, mac-step-3]
|
needs: [build-data, mac-step-3]
|
||||||
with:
|
with:
|
||||||
force-candidate: ${{ !inputs.create_release }}
|
|
||||||
build-version: ${{ needs.build-data.outputs.version }}
|
build-version: ${{ needs.build-data.outputs.version }}
|
||||||
release-branch: ${{ inputs.update_branch }}
|
release-branch: ${{ inputs.update_branch }}
|
||||||
|
|
||||||
|
|||||||
8
.github/workflows/linux-release-build.yml
vendored
8
.github/workflows/linux-release-build.yml
vendored
@@ -25,14 +25,6 @@ on:
|
|||||||
required: false
|
required: false
|
||||||
type: boolean
|
type: boolean
|
||||||
default: false
|
default: false
|
||||||
force-candidate:
|
|
||||||
description: "Force building against the Firefox release candidate"
|
|
||||||
required: false
|
|
||||||
type: boolean
|
|
||||||
default: false
|
|
||||||
|
|
||||||
env:
|
|
||||||
SURFER_FORCE_CANDIDATE: ${{ inputs.force-candidate && '1' || '' }}
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-linux:
|
build-linux:
|
||||||
|
|||||||
8
.github/workflows/macos-profile-build.yml
vendored
8
.github/workflows/macos-profile-build.yml
vendored
@@ -14,14 +14,6 @@ on:
|
|||||||
description: "The branch to build"
|
description: "The branch to build"
|
||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
force-candidate:
|
|
||||||
description: "Force building against the Firefox release candidate"
|
|
||||||
required: false
|
|
||||||
type: boolean
|
|
||||||
default: false
|
|
||||||
|
|
||||||
env:
|
|
||||||
SURFER_FORCE_CANDIDATE: ${{ inputs.force-candidate && '1' || '' }}
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
macos-profile-build:
|
macos-profile-build:
|
||||||
|
|||||||
8
.github/workflows/macos-release-build.yml
vendored
8
.github/workflows/macos-release-build.yml
vendored
@@ -32,14 +32,6 @@ on:
|
|||||||
required: true
|
required: true
|
||||||
type: boolean
|
type: boolean
|
||||||
default: false
|
default: false
|
||||||
force-candidate:
|
|
||||||
description: "Force building against the Firefox release candidate"
|
|
||||||
required: false
|
|
||||||
type: boolean
|
|
||||||
default: false
|
|
||||||
|
|
||||||
env:
|
|
||||||
SURFER_FORCE_CANDIDATE: ${{ inputs.force-candidate && '1' || '' }}
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
mac-build:
|
mac-build:
|
||||||
|
|||||||
@@ -11,14 +11,6 @@ on:
|
|||||||
description: "The branch to build"
|
description: "The branch to build"
|
||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
force-candidate:
|
|
||||||
description: "Force building against the Firefox release candidate"
|
|
||||||
required: false
|
|
||||||
type: boolean
|
|
||||||
default: false
|
|
||||||
|
|
||||||
env:
|
|
||||||
SURFER_FORCE_CANDIDATE: ${{ inputs.force-candidate && '1' || '' }}
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
mac-build:
|
mac-build:
|
||||||
|
|||||||
8
.github/workflows/windows-profile-build.yml
vendored
8
.github/workflows/windows-profile-build.yml
vendored
@@ -18,14 +18,6 @@ on:
|
|||||||
description: "The branch to build"
|
description: "The branch to build"
|
||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
force-candidate:
|
|
||||||
description: "Force building against the Firefox release candidate"
|
|
||||||
required: false
|
|
||||||
type: boolean
|
|
||||||
default: false
|
|
||||||
|
|
||||||
env:
|
|
||||||
SURFER_FORCE_CANDIDATE: ${{ inputs.force-candidate && '1' || '' }}
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
windows-profile-build:
|
windows-profile-build:
|
||||||
|
|||||||
7
.github/workflows/windows-release-build.yml
vendored
7
.github/workflows/windows-release-build.yml
vendored
@@ -35,13 +35,6 @@ on:
|
|||||||
required: true
|
required: true
|
||||||
type: boolean
|
type: boolean
|
||||||
default: false
|
default: false
|
||||||
force-candidate:
|
|
||||||
description: "Force building against the Firefox release candidate"
|
|
||||||
required: false
|
|
||||||
type: boolean
|
|
||||||
default: false
|
|
||||||
env:
|
|
||||||
SURFER_FORCE_CANDIDATE: ${{ inputs.force-candidate && '1' || '' }}
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
windows-build:
|
windows-build:
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ Zen is a firefox-based browser with the aim of pushing your productivity to a ne
|
|||||||
|
|
||||||
### Firefox Versions
|
### Firefox Versions
|
||||||
|
|
||||||
- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `154.0.1`!
|
- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `155.0`!
|
||||||
- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 155.0`!
|
- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 155.0`!
|
||||||
|
|
||||||
### Contributing
|
### Contributing
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
6b4abe0093721c1be89eb41b3fb060dd6336923d
|
20e5abbb642ab21d943bc1261864d9c531ba421a
|
||||||
@@ -435,10 +435,6 @@
|
|||||||
list-style-image: url("arrow-left.svg") !important;
|
list-style-image: url("arrow-left.svg") !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
#appmenu-moreTools-button {
|
|
||||||
list-style-image: url("customize.svg") !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
#zen-copy-current-url-button,
|
#zen-copy-current-url-button,
|
||||||
#share-tab-button,
|
#share-tab-button,
|
||||||
#zen-site-data-header-share {
|
#zen-site-data-header-share {
|
||||||
|
|||||||
@@ -14,8 +14,8 @@
|
|||||||
* skin/classic/browser/zen-icons/autoplay-media-fill.svg (../shared/zen-icons/nucleo/autoplay-media-fill.svg)
|
* skin/classic/browser/zen-icons/autoplay-media-fill.svg (../shared/zen-icons/nucleo/autoplay-media-fill.svg)
|
||||||
* skin/classic/browser/zen-icons/autoplay-media.svg (../shared/zen-icons/nucleo/autoplay-media.svg)
|
* skin/classic/browser/zen-icons/autoplay-media.svg (../shared/zen-icons/nucleo/autoplay-media.svg)
|
||||||
* skin/classic/browser/zen-icons/back.svg (../shared/zen-icons/nucleo/back.svg)
|
* skin/classic/browser/zen-icons/back.svg (../shared/zen-icons/nucleo/back.svg)
|
||||||
* skin/classic/browser/zen-icons/blocked-element.svg (../shared/zen-icons/nucleo/blocked-element.svg)
|
|
||||||
* skin/classic/browser/zen-icons/block.svg (../shared/zen-icons/nucleo/block.svg)
|
* skin/classic/browser/zen-icons/block.svg (../shared/zen-icons/nucleo/block.svg)
|
||||||
|
* skin/classic/browser/zen-icons/blocked-element.svg (../shared/zen-icons/nucleo/blocked-element.svg)
|
||||||
* skin/classic/browser/zen-icons/bolt.svg (../shared/zen-icons/nucleo/bolt.svg)
|
* skin/classic/browser/zen-icons/bolt.svg (../shared/zen-icons/nucleo/bolt.svg)
|
||||||
* skin/classic/browser/zen-icons/bookmark-hollow.svg (../shared/zen-icons/nucleo/bookmark-hollow.svg)
|
* skin/classic/browser/zen-icons/bookmark-hollow.svg (../shared/zen-icons/nucleo/bookmark-hollow.svg)
|
||||||
* skin/classic/browser/zen-icons/bookmark-star-on-tray.svg (../shared/zen-icons/nucleo/bookmark-star-on-tray.svg)
|
* skin/classic/browser/zen-icons/bookmark-star-on-tray.svg (../shared/zen-icons/nucleo/bookmark-star-on-tray.svg)
|
||||||
@@ -104,26 +104,27 @@
|
|||||||
* skin/classic/browser/zen-icons/popup-fill.svg (../shared/zen-icons/nucleo/popup-fill.svg)
|
* skin/classic/browser/zen-icons/popup-fill.svg (../shared/zen-icons/nucleo/popup-fill.svg)
|
||||||
* skin/classic/browser/zen-icons/popup.svg (../shared/zen-icons/nucleo/popup.svg)
|
* skin/classic/browser/zen-icons/popup.svg (../shared/zen-icons/nucleo/popup.svg)
|
||||||
* skin/classic/browser/zen-icons/print.svg (../shared/zen-icons/nucleo/print.svg)
|
* skin/classic/browser/zen-icons/print.svg (../shared/zen-icons/nucleo/print.svg)
|
||||||
* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/nucleo/privateBrowsing.svg)
|
* skin/classic/browser/zen-icons/private-window-small.svg (../shared/zen-icons/nucleo/private-window-small.svg)
|
||||||
* skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/nucleo/private-window.svg)
|
* skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/nucleo/private-window.svg)
|
||||||
|
* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/nucleo/privateBrowsing.svg)
|
||||||
* skin/classic/browser/zen-icons/reader-mode.svg (../shared/zen-icons/nucleo/reader-mode.svg)
|
* skin/classic/browser/zen-icons/reader-mode.svg (../shared/zen-icons/nucleo/reader-mode.svg)
|
||||||
* skin/classic/browser/zen-icons/reload.svg (../shared/zen-icons/nucleo/reload.svg)
|
* skin/classic/browser/zen-icons/reload.svg (../shared/zen-icons/nucleo/reload.svg)
|
||||||
* skin/classic/browser/zen-icons/save.svg (../shared/zen-icons/nucleo/save.svg)
|
* skin/classic/browser/zen-icons/save.svg (../shared/zen-icons/nucleo/save.svg)
|
||||||
* skin/classic/browser/zen-icons/screen-blocked.svg (../shared/zen-icons/nucleo/screen-blocked.svg)
|
* skin/classic/browser/zen-icons/screen-blocked.svg (../shared/zen-icons/nucleo/screen-blocked.svg)
|
||||||
* skin/classic/browser/zen-icons/screenshot.svg (../shared/zen-icons/nucleo/screenshot.svg)
|
|
||||||
* skin/classic/browser/zen-icons/screen.svg (../shared/zen-icons/nucleo/screen.svg)
|
* skin/classic/browser/zen-icons/screen.svg (../shared/zen-icons/nucleo/screen.svg)
|
||||||
|
* skin/classic/browser/zen-icons/screenshot.svg (../shared/zen-icons/nucleo/screenshot.svg)
|
||||||
* skin/classic/browser/zen-icons/search-glass.svg (../shared/zen-icons/nucleo/search-glass.svg)
|
* skin/classic/browser/zen-icons/search-glass.svg (../shared/zen-icons/nucleo/search-glass.svg)
|
||||||
* skin/classic/browser/zen-icons/search-page.svg (../shared/zen-icons/nucleo/search-page.svg)
|
* skin/classic/browser/zen-icons/search-page.svg (../shared/zen-icons/nucleo/search-page.svg)
|
||||||
* skin/classic/browser/zen-icons/security-broken.svg (../shared/zen-icons/nucleo/security-broken.svg)
|
* skin/classic/browser/zen-icons/security-broken.svg (../shared/zen-icons/nucleo/security-broken.svg)
|
||||||
* skin/classic/browser/zen-icons/security.svg (../shared/zen-icons/nucleo/security.svg)
|
|
||||||
* skin/classic/browser/zen-icons/security-warning.svg (../shared/zen-icons/nucleo/security-warning.svg)
|
* skin/classic/browser/zen-icons/security-warning.svg (../shared/zen-icons/nucleo/security-warning.svg)
|
||||||
|
* skin/classic/browser/zen-icons/security.svg (../shared/zen-icons/nucleo/security.svg)
|
||||||
* skin/classic/browser/zen-icons/send-to-device.svg (../shared/zen-icons/nucleo/send-to-device.svg)
|
* skin/classic/browser/zen-icons/send-to-device.svg (../shared/zen-icons/nucleo/send-to-device.svg)
|
||||||
* skin/classic/browser/zen-icons/settings-fill.svg (../shared/zen-icons/nucleo/settings-fill.svg)
|
* skin/classic/browser/zen-icons/settings-fill.svg (../shared/zen-icons/nucleo/settings-fill.svg)
|
||||||
* skin/classic/browser/zen-icons/settings.svg (../shared/zen-icons/nucleo/settings.svg)
|
* skin/classic/browser/zen-icons/settings.svg (../shared/zen-icons/nucleo/settings.svg)
|
||||||
* skin/classic/browser/zen-icons/share.svg (../shared/zen-icons/nucleo/share.svg)
|
* skin/classic/browser/zen-icons/share.svg (../shared/zen-icons/nucleo/share.svg)
|
||||||
* skin/classic/browser/zen-icons/sidebar-right.svg (../shared/zen-icons/nucleo/sidebar-right.svg)
|
* skin/classic/browser/zen-icons/sidebar-right.svg (../shared/zen-icons/nucleo/sidebar-right.svg)
|
||||||
* skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/nucleo/sidebars-right.svg)
|
|
||||||
* skin/classic/browser/zen-icons/sidebar.svg (../shared/zen-icons/nucleo/sidebar.svg)
|
* skin/classic/browser/zen-icons/sidebar.svg (../shared/zen-icons/nucleo/sidebar.svg)
|
||||||
|
* skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/nucleo/sidebars-right.svg)
|
||||||
* skin/classic/browser/zen-icons/sliders.svg (../shared/zen-icons/nucleo/sliders.svg)
|
* skin/classic/browser/zen-icons/sliders.svg (../shared/zen-icons/nucleo/sliders.svg)
|
||||||
* skin/classic/browser/zen-icons/sparkles.svg (../shared/zen-icons/nucleo/sparkles.svg)
|
* skin/classic/browser/zen-icons/sparkles.svg (../shared/zen-icons/nucleo/sparkles.svg)
|
||||||
* skin/classic/browser/zen-icons/spell-check.svg (../shared/zen-icons/nucleo/spell-check.svg)
|
* skin/classic/browser/zen-icons/spell-check.svg (../shared/zen-icons/nucleo/spell-check.svg)
|
||||||
@@ -164,8 +165,8 @@
|
|||||||
* skin/classic/browser/zen-icons/autoplay-media-fill.svg (../shared/zen-icons/nucleo/autoplay-media-fill.svg)
|
* skin/classic/browser/zen-icons/autoplay-media-fill.svg (../shared/zen-icons/nucleo/autoplay-media-fill.svg)
|
||||||
* skin/classic/browser/zen-icons/autoplay-media.svg (../shared/zen-icons/nucleo/autoplay-media.svg)
|
* skin/classic/browser/zen-icons/autoplay-media.svg (../shared/zen-icons/nucleo/autoplay-media.svg)
|
||||||
* skin/classic/browser/zen-icons/back.svg (../shared/zen-icons/nucleo/back.svg)
|
* skin/classic/browser/zen-icons/back.svg (../shared/zen-icons/nucleo/back.svg)
|
||||||
* skin/classic/browser/zen-icons/blocked-element.svg (../shared/zen-icons/nucleo/blocked-element.svg)
|
|
||||||
* skin/classic/browser/zen-icons/block.svg (../shared/zen-icons/nucleo/block.svg)
|
* skin/classic/browser/zen-icons/block.svg (../shared/zen-icons/nucleo/block.svg)
|
||||||
|
* skin/classic/browser/zen-icons/blocked-element.svg (../shared/zen-icons/nucleo/blocked-element.svg)
|
||||||
* skin/classic/browser/zen-icons/bolt.svg (../shared/zen-icons/nucleo/bolt.svg)
|
* skin/classic/browser/zen-icons/bolt.svg (../shared/zen-icons/nucleo/bolt.svg)
|
||||||
* skin/classic/browser/zen-icons/bookmark-hollow.svg (../shared/zen-icons/nucleo/bookmark-hollow.svg)
|
* skin/classic/browser/zen-icons/bookmark-hollow.svg (../shared/zen-icons/nucleo/bookmark-hollow.svg)
|
||||||
* skin/classic/browser/zen-icons/bookmark-star-on-tray.svg (../shared/zen-icons/nucleo/bookmark-star-on-tray.svg)
|
* skin/classic/browser/zen-icons/bookmark-star-on-tray.svg (../shared/zen-icons/nucleo/bookmark-star-on-tray.svg)
|
||||||
@@ -254,26 +255,27 @@
|
|||||||
* skin/classic/browser/zen-icons/popup-fill.svg (../shared/zen-icons/nucleo/popup-fill.svg)
|
* skin/classic/browser/zen-icons/popup-fill.svg (../shared/zen-icons/nucleo/popup-fill.svg)
|
||||||
* skin/classic/browser/zen-icons/popup.svg (../shared/zen-icons/nucleo/popup.svg)
|
* skin/classic/browser/zen-icons/popup.svg (../shared/zen-icons/nucleo/popup.svg)
|
||||||
* skin/classic/browser/zen-icons/print.svg (../shared/zen-icons/nucleo/print.svg)
|
* skin/classic/browser/zen-icons/print.svg (../shared/zen-icons/nucleo/print.svg)
|
||||||
* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/nucleo/privateBrowsing.svg)
|
* skin/classic/browser/zen-icons/private-window-small.svg (../shared/zen-icons/nucleo/private-window-small.svg)
|
||||||
* skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/nucleo/private-window.svg)
|
* skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/nucleo/private-window.svg)
|
||||||
|
* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/nucleo/privateBrowsing.svg)
|
||||||
* skin/classic/browser/zen-icons/reader-mode.svg (../shared/zen-icons/nucleo/reader-mode.svg)
|
* skin/classic/browser/zen-icons/reader-mode.svg (../shared/zen-icons/nucleo/reader-mode.svg)
|
||||||
* skin/classic/browser/zen-icons/reload.svg (../shared/zen-icons/nucleo/reload.svg)
|
* skin/classic/browser/zen-icons/reload.svg (../shared/zen-icons/nucleo/reload.svg)
|
||||||
* skin/classic/browser/zen-icons/save.svg (../shared/zen-icons/nucleo/save.svg)
|
* skin/classic/browser/zen-icons/save.svg (../shared/zen-icons/nucleo/save.svg)
|
||||||
* skin/classic/browser/zen-icons/screen-blocked.svg (../shared/zen-icons/nucleo/screen-blocked.svg)
|
* skin/classic/browser/zen-icons/screen-blocked.svg (../shared/zen-icons/nucleo/screen-blocked.svg)
|
||||||
* skin/classic/browser/zen-icons/screenshot.svg (../shared/zen-icons/nucleo/screenshot.svg)
|
|
||||||
* skin/classic/browser/zen-icons/screen.svg (../shared/zen-icons/nucleo/screen.svg)
|
* skin/classic/browser/zen-icons/screen.svg (../shared/zen-icons/nucleo/screen.svg)
|
||||||
|
* skin/classic/browser/zen-icons/screenshot.svg (../shared/zen-icons/nucleo/screenshot.svg)
|
||||||
* skin/classic/browser/zen-icons/search-glass.svg (../shared/zen-icons/nucleo/search-glass.svg)
|
* skin/classic/browser/zen-icons/search-glass.svg (../shared/zen-icons/nucleo/search-glass.svg)
|
||||||
* skin/classic/browser/zen-icons/search-page.svg (../shared/zen-icons/nucleo/search-page.svg)
|
* skin/classic/browser/zen-icons/search-page.svg (../shared/zen-icons/nucleo/search-page.svg)
|
||||||
* skin/classic/browser/zen-icons/security-broken.svg (../shared/zen-icons/nucleo/security-broken.svg)
|
* skin/classic/browser/zen-icons/security-broken.svg (../shared/zen-icons/nucleo/security-broken.svg)
|
||||||
* skin/classic/browser/zen-icons/security.svg (../shared/zen-icons/nucleo/security.svg)
|
|
||||||
* skin/classic/browser/zen-icons/security-warning.svg (../shared/zen-icons/nucleo/security-warning.svg)
|
* skin/classic/browser/zen-icons/security-warning.svg (../shared/zen-icons/nucleo/security-warning.svg)
|
||||||
|
* skin/classic/browser/zen-icons/security.svg (../shared/zen-icons/nucleo/security.svg)
|
||||||
* skin/classic/browser/zen-icons/send-to-device.svg (../shared/zen-icons/nucleo/send-to-device.svg)
|
* skin/classic/browser/zen-icons/send-to-device.svg (../shared/zen-icons/nucleo/send-to-device.svg)
|
||||||
* skin/classic/browser/zen-icons/settings-fill.svg (../shared/zen-icons/nucleo/settings-fill.svg)
|
* skin/classic/browser/zen-icons/settings-fill.svg (../shared/zen-icons/nucleo/settings-fill.svg)
|
||||||
* skin/classic/browser/zen-icons/settings.svg (../shared/zen-icons/nucleo/settings.svg)
|
* skin/classic/browser/zen-icons/settings.svg (../shared/zen-icons/nucleo/settings.svg)
|
||||||
* skin/classic/browser/zen-icons/share.svg (../shared/zen-icons/nucleo/share.svg)
|
* skin/classic/browser/zen-icons/share.svg (../shared/zen-icons/nucleo/share.svg)
|
||||||
* skin/classic/browser/zen-icons/sidebar-right.svg (../shared/zen-icons/nucleo/sidebar-right.svg)
|
* skin/classic/browser/zen-icons/sidebar-right.svg (../shared/zen-icons/nucleo/sidebar-right.svg)
|
||||||
* skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/nucleo/sidebars-right.svg)
|
|
||||||
* skin/classic/browser/zen-icons/sidebar.svg (../shared/zen-icons/nucleo/sidebar.svg)
|
* skin/classic/browser/zen-icons/sidebar.svg (../shared/zen-icons/nucleo/sidebar.svg)
|
||||||
|
* skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/nucleo/sidebars-right.svg)
|
||||||
* skin/classic/browser/zen-icons/sliders.svg (../shared/zen-icons/nucleo/sliders.svg)
|
* skin/classic/browser/zen-icons/sliders.svg (../shared/zen-icons/nucleo/sliders.svg)
|
||||||
* skin/classic/browser/zen-icons/sparkles.svg (../shared/zen-icons/nucleo/sparkles.svg)
|
* skin/classic/browser/zen-icons/sparkles.svg (../shared/zen-icons/nucleo/sparkles.svg)
|
||||||
* skin/classic/browser/zen-icons/spell-check.svg (../shared/zen-icons/nucleo/spell-check.svg)
|
* skin/classic/browser/zen-icons/spell-check.svg (../shared/zen-icons/nucleo/spell-check.svg)
|
||||||
@@ -314,8 +316,8 @@
|
|||||||
* skin/classic/browser/zen-icons/autoplay-media-fill.svg (../shared/zen-icons/nucleo/autoplay-media-fill.svg)
|
* skin/classic/browser/zen-icons/autoplay-media-fill.svg (../shared/zen-icons/nucleo/autoplay-media-fill.svg)
|
||||||
* skin/classic/browser/zen-icons/autoplay-media.svg (../shared/zen-icons/nucleo/autoplay-media.svg)
|
* skin/classic/browser/zen-icons/autoplay-media.svg (../shared/zen-icons/nucleo/autoplay-media.svg)
|
||||||
* skin/classic/browser/zen-icons/back.svg (../shared/zen-icons/nucleo/back.svg)
|
* skin/classic/browser/zen-icons/back.svg (../shared/zen-icons/nucleo/back.svg)
|
||||||
* skin/classic/browser/zen-icons/blocked-element.svg (../shared/zen-icons/nucleo/blocked-element.svg)
|
|
||||||
* skin/classic/browser/zen-icons/block.svg (../shared/zen-icons/nucleo/block.svg)
|
* skin/classic/browser/zen-icons/block.svg (../shared/zen-icons/nucleo/block.svg)
|
||||||
|
* skin/classic/browser/zen-icons/blocked-element.svg (../shared/zen-icons/nucleo/blocked-element.svg)
|
||||||
* skin/classic/browser/zen-icons/bolt.svg (../shared/zen-icons/nucleo/bolt.svg)
|
* skin/classic/browser/zen-icons/bolt.svg (../shared/zen-icons/nucleo/bolt.svg)
|
||||||
* skin/classic/browser/zen-icons/bookmark-hollow.svg (../shared/zen-icons/nucleo/bookmark-hollow.svg)
|
* skin/classic/browser/zen-icons/bookmark-hollow.svg (../shared/zen-icons/nucleo/bookmark-hollow.svg)
|
||||||
* skin/classic/browser/zen-icons/bookmark-star-on-tray.svg (../shared/zen-icons/nucleo/bookmark-star-on-tray.svg)
|
* skin/classic/browser/zen-icons/bookmark-star-on-tray.svg (../shared/zen-icons/nucleo/bookmark-star-on-tray.svg)
|
||||||
@@ -404,26 +406,27 @@
|
|||||||
* skin/classic/browser/zen-icons/popup-fill.svg (../shared/zen-icons/nucleo/popup-fill.svg)
|
* skin/classic/browser/zen-icons/popup-fill.svg (../shared/zen-icons/nucleo/popup-fill.svg)
|
||||||
* skin/classic/browser/zen-icons/popup.svg (../shared/zen-icons/nucleo/popup.svg)
|
* skin/classic/browser/zen-icons/popup.svg (../shared/zen-icons/nucleo/popup.svg)
|
||||||
* skin/classic/browser/zen-icons/print.svg (../shared/zen-icons/nucleo/print.svg)
|
* skin/classic/browser/zen-icons/print.svg (../shared/zen-icons/nucleo/print.svg)
|
||||||
* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/nucleo/privateBrowsing.svg)
|
* skin/classic/browser/zen-icons/private-window-small.svg (../shared/zen-icons/nucleo/private-window-small.svg)
|
||||||
* skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/nucleo/private-window.svg)
|
* skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/nucleo/private-window.svg)
|
||||||
|
* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/nucleo/privateBrowsing.svg)
|
||||||
* skin/classic/browser/zen-icons/reader-mode.svg (../shared/zen-icons/nucleo/reader-mode.svg)
|
* skin/classic/browser/zen-icons/reader-mode.svg (../shared/zen-icons/nucleo/reader-mode.svg)
|
||||||
* skin/classic/browser/zen-icons/reload.svg (../shared/zen-icons/nucleo/reload.svg)
|
* skin/classic/browser/zen-icons/reload.svg (../shared/zen-icons/nucleo/reload.svg)
|
||||||
* skin/classic/browser/zen-icons/save.svg (../shared/zen-icons/nucleo/save.svg)
|
* skin/classic/browser/zen-icons/save.svg (../shared/zen-icons/nucleo/save.svg)
|
||||||
* skin/classic/browser/zen-icons/screen-blocked.svg (../shared/zen-icons/nucleo/screen-blocked.svg)
|
* skin/classic/browser/zen-icons/screen-blocked.svg (../shared/zen-icons/nucleo/screen-blocked.svg)
|
||||||
* skin/classic/browser/zen-icons/screenshot.svg (../shared/zen-icons/nucleo/screenshot.svg)
|
|
||||||
* skin/classic/browser/zen-icons/screen.svg (../shared/zen-icons/nucleo/screen.svg)
|
* skin/classic/browser/zen-icons/screen.svg (../shared/zen-icons/nucleo/screen.svg)
|
||||||
|
* skin/classic/browser/zen-icons/screenshot.svg (../shared/zen-icons/nucleo/screenshot.svg)
|
||||||
* skin/classic/browser/zen-icons/search-glass.svg (../shared/zen-icons/nucleo/search-glass.svg)
|
* skin/classic/browser/zen-icons/search-glass.svg (../shared/zen-icons/nucleo/search-glass.svg)
|
||||||
* skin/classic/browser/zen-icons/search-page.svg (../shared/zen-icons/nucleo/search-page.svg)
|
* skin/classic/browser/zen-icons/search-page.svg (../shared/zen-icons/nucleo/search-page.svg)
|
||||||
* skin/classic/browser/zen-icons/security-broken.svg (../shared/zen-icons/nucleo/security-broken.svg)
|
* skin/classic/browser/zen-icons/security-broken.svg (../shared/zen-icons/nucleo/security-broken.svg)
|
||||||
* skin/classic/browser/zen-icons/security.svg (../shared/zen-icons/nucleo/security.svg)
|
|
||||||
* skin/classic/browser/zen-icons/security-warning.svg (../shared/zen-icons/nucleo/security-warning.svg)
|
* skin/classic/browser/zen-icons/security-warning.svg (../shared/zen-icons/nucleo/security-warning.svg)
|
||||||
|
* skin/classic/browser/zen-icons/security.svg (../shared/zen-icons/nucleo/security.svg)
|
||||||
* skin/classic/browser/zen-icons/send-to-device.svg (../shared/zen-icons/nucleo/send-to-device.svg)
|
* skin/classic/browser/zen-icons/send-to-device.svg (../shared/zen-icons/nucleo/send-to-device.svg)
|
||||||
* skin/classic/browser/zen-icons/settings-fill.svg (../shared/zen-icons/nucleo/settings-fill.svg)
|
* skin/classic/browser/zen-icons/settings-fill.svg (../shared/zen-icons/nucleo/settings-fill.svg)
|
||||||
* skin/classic/browser/zen-icons/settings.svg (../shared/zen-icons/nucleo/settings.svg)
|
* skin/classic/browser/zen-icons/settings.svg (../shared/zen-icons/nucleo/settings.svg)
|
||||||
* skin/classic/browser/zen-icons/share.svg (../shared/zen-icons/nucleo/share.svg)
|
* skin/classic/browser/zen-icons/share.svg (../shared/zen-icons/nucleo/share.svg)
|
||||||
* skin/classic/browser/zen-icons/sidebar-right.svg (../shared/zen-icons/nucleo/sidebar-right.svg)
|
* skin/classic/browser/zen-icons/sidebar-right.svg (../shared/zen-icons/nucleo/sidebar-right.svg)
|
||||||
* skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/nucleo/sidebars-right.svg)
|
|
||||||
* skin/classic/browser/zen-icons/sidebar.svg (../shared/zen-icons/nucleo/sidebar.svg)
|
* skin/classic/browser/zen-icons/sidebar.svg (../shared/zen-icons/nucleo/sidebar.svg)
|
||||||
|
* skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/nucleo/sidebars-right.svg)
|
||||||
* skin/classic/browser/zen-icons/sliders.svg (../shared/zen-icons/nucleo/sliders.svg)
|
* skin/classic/browser/zen-icons/sliders.svg (../shared/zen-icons/nucleo/sliders.svg)
|
||||||
* skin/classic/browser/zen-icons/sparkles.svg (../shared/zen-icons/nucleo/sparkles.svg)
|
* skin/classic/browser/zen-icons/sparkles.svg (../shared/zen-icons/nucleo/sparkles.svg)
|
||||||
* skin/classic/browser/zen-icons/spell-check.svg (../shared/zen-icons/nucleo/spell-check.svg)
|
* skin/classic/browser/zen-icons/spell-check.svg (../shared/zen-icons/nucleo/spell-check.svg)
|
||||||
@@ -459,8 +462,8 @@
|
|||||||
* skin/classic/browser/zen-icons/selectable/basket.svg (../shared/zen-icons/common/selectable/basket.svg)
|
* skin/classic/browser/zen-icons/selectable/basket.svg (../shared/zen-icons/common/selectable/basket.svg)
|
||||||
* skin/classic/browser/zen-icons/selectable/bed.svg (../shared/zen-icons/common/selectable/bed.svg)
|
* skin/classic/browser/zen-icons/selectable/bed.svg (../shared/zen-icons/common/selectable/bed.svg)
|
||||||
* skin/classic/browser/zen-icons/selectable/bell.svg (../shared/zen-icons/common/selectable/bell.svg)
|
* skin/classic/browser/zen-icons/selectable/bell.svg (../shared/zen-icons/common/selectable/bell.svg)
|
||||||
* skin/classic/browser/zen-icons/selectable/bookmark.svg (../shared/zen-icons/common/selectable/bookmark.svg)
|
|
||||||
* skin/classic/browser/zen-icons/selectable/book.svg (../shared/zen-icons/common/selectable/book.svg)
|
* skin/classic/browser/zen-icons/selectable/book.svg (../shared/zen-icons/common/selectable/book.svg)
|
||||||
|
* skin/classic/browser/zen-icons/selectable/bookmark.svg (../shared/zen-icons/common/selectable/bookmark.svg)
|
||||||
* skin/classic/browser/zen-icons/selectable/briefcase.svg (../shared/zen-icons/common/selectable/briefcase.svg)
|
* skin/classic/browser/zen-icons/selectable/briefcase.svg (../shared/zen-icons/common/selectable/briefcase.svg)
|
||||||
* skin/classic/browser/zen-icons/selectable/brush.svg (../shared/zen-icons/common/selectable/brush.svg)
|
* skin/classic/browser/zen-icons/selectable/brush.svg (../shared/zen-icons/common/selectable/brush.svg)
|
||||||
* skin/classic/browser/zen-icons/selectable/bug.svg (../shared/zen-icons/common/selectable/bug.svg)
|
* skin/classic/browser/zen-icons/selectable/bug.svg (../shared/zen-icons/common/selectable/bug.svg)
|
||||||
@@ -522,8 +525,8 @@
|
|||||||
* skin/classic/browser/zen-icons/selectable/shapes.svg (../shared/zen-icons/common/selectable/shapes.svg)
|
* skin/classic/browser/zen-icons/selectable/shapes.svg (../shared/zen-icons/common/selectable/shapes.svg)
|
||||||
* skin/classic/browser/zen-icons/selectable/shirt.svg (../shared/zen-icons/common/selectable/shirt.svg)
|
* skin/classic/browser/zen-icons/selectable/shirt.svg (../shared/zen-icons/common/selectable/shirt.svg)
|
||||||
* skin/classic/browser/zen-icons/selectable/skull.svg (../shared/zen-icons/common/selectable/skull.svg)
|
* skin/classic/browser/zen-icons/selectable/skull.svg (../shared/zen-icons/common/selectable/skull.svg)
|
||||||
* skin/classic/browser/zen-icons/selectable/squares.svg (../shared/zen-icons/common/selectable/squares.svg)
|
|
||||||
* skin/classic/browser/zen-icons/selectable/square.svg (../shared/zen-icons/common/selectable/square.svg)
|
* skin/classic/browser/zen-icons/selectable/square.svg (../shared/zen-icons/common/selectable/square.svg)
|
||||||
|
* skin/classic/browser/zen-icons/selectable/squares.svg (../shared/zen-icons/common/selectable/squares.svg)
|
||||||
* skin/classic/browser/zen-icons/selectable/star-1.svg (../shared/zen-icons/common/selectable/star-1.svg)
|
* skin/classic/browser/zen-icons/selectable/star-1.svg (../shared/zen-icons/common/selectable/star-1.svg)
|
||||||
* skin/classic/browser/zen-icons/selectable/star.svg (../shared/zen-icons/common/selectable/star.svg)
|
* skin/classic/browser/zen-icons/selectable/star.svg (../shared/zen-icons/common/selectable/star.svg)
|
||||||
* skin/classic/browser/zen-icons/selectable/stats-chart.svg (../shared/zen-icons/common/selectable/stats-chart.svg)
|
* skin/classic/browser/zen-icons/selectable/stats-chart.svg (../shared/zen-icons/common/selectable/stats-chart.svg)
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
#filter dumbComments emptyLines substitution
|
||||||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="context-fill" fill-opacity="context-fill-opacity" viewBox="0 -1 20 20"><path d="M12.75 10.5a3.25 3.25 0 1 1-3.19 2.632 1.25 1.25 0 0 0-1.119 0q.059.3.059.618a3.25 3.25 0 1 1-3.25-3.25 3.24 3.24 0 0 1 2.571 1.268 2.74 2.74 0 0 1 2.357 0A3.24 3.24 0 0 1 12.75 10.5M5.25 12a1.75 1.75 0 1 0 0 3.5 1.75 1.75 0 0 0 0-3.5m7.5 0a1.75 1.75 0 1 0 0 3.5 1.75 1.75 0 0 0 0-3.5m-.867-11c.87 0 1.61.64 1.732 1.503l.34 2.393L16.78 7.72A.75.75 0 0 1 16.25 9H1.75a.751.751 0 0 1-.53-1.28l2.823-2.824.342-2.393A1.75 1.75 0 0 1 6.117 1zM3.56 7.5h10.88L12.94 6H5.06zm2.557-5a.25.25 0 0 0-.237.17l-.011.045L5.614 4.5h6.772l-.255-1.785a.25.25 0 0 0-.248-.215z"/></svg>
|
||||||
@@ -1,7 +1,24 @@
|
|||||||
diff --git a/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs b/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs
|
diff --git a/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs b/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs
|
||||||
--- a/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs
|
--- a/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs
|
||||||
+++ b/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs
|
+++ b/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs
|
||||||
@@ -119,10 +119,19 @@
|
@@ -39,10 +39,16 @@
|
||||||
|
const TOGGLE_POSITION_PREF =
|
||||||
|
"media.videocontrols.picture-in-picture.video-toggle.position";
|
||||||
|
const TOGGLE_POSITION_RIGHT = "right";
|
||||||
|
const TOGGLE_POSITION_LEFT = "left";
|
||||||
|
const RESIZE_MARGIN_PX = 16;
|
||||||
|
+// Close reasons that should suppress auto-toggle when the originating tab is backgrounded
|
||||||
|
+const DELIBERATE_CLOSE_REASONS = [
|
||||||
|
+ "CloseButton",
|
||||||
|
+ "ClosePlayerShortcut",
|
||||||
|
+ "Shortcut",
|
||||||
|
+];
|
||||||
|
|
||||||
|
XPCOMUtils.defineLazyPreferenceGetter(
|
||||||
|
lazy,
|
||||||
|
"PIP_ENABLED",
|
||||||
|
"media.videocontrols.picture-in-picture.enabled",
|
||||||
|
@@ -119,10 +125,19 @@
|
||||||
}
|
}
|
||||||
case "PictureInPicture:VideoTabHidden": {
|
case "PictureInPicture:VideoTabHidden": {
|
||||||
if (!lazy.PIP_ENABLED || !lazy.PIP_WHEN_SWITCHING_TABS) {
|
if (!lazy.PIP_ENABLED || !lazy.PIP_WHEN_SWITCHING_TABS) {
|
||||||
@@ -21,12 +38,13 @@ diff --git a/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs b/tool
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
let actor = browsingContext.currentWindowGlobal.getActor(
|
let actor = browsingContext.currentWindowGlobal.getActor(
|
||||||
@@ -261,10 +270,12 @@
|
@@ -261,10 +276,13 @@
|
||||||
maxConcurrentPlayerCount: 0,
|
maxConcurrentPlayerCount: 0,
|
||||||
|
|
||||||
// Maps auto pip browser to PictureInPictureParent actor
|
// Maps auto pip browser to PictureInPictureParent actor
|
||||||
weakAutoPipBrowserToParent: new WeakMap(),
|
weakAutoPipBrowserToParent: new WeakMap(),
|
||||||
|
|
||||||
|
+ // Browsers with deliberately closed PiP windows; suppresses auto-toggle.
|
||||||
+ weakAutoPipBrowserClosedDeliberately: new WeakSet(),
|
+ weakAutoPipBrowserClosedDeliberately: new WeakSet(),
|
||||||
+
|
+
|
||||||
/**
|
/**
|
||||||
@@ -34,7 +52,28 @@ diff --git a/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs b/tool
|
|||||||
*
|
*
|
||||||
* @param {PictureInPictureParent} pipActorRef
|
* @param {PictureInPictureParent} pipActorRef
|
||||||
* Reference to the calling PictureInPictureParent actor
|
* Reference to the calling PictureInPictureParent actor
|
||||||
@@ -899,10 +910,17 @@
|
@@ -441,10 +459,20 @@
|
||||||
|
},
|
||||||
|
|
||||||
|
onPipSwappedBrowsers(event) {
|
||||||
|
let otherTab = event.detail;
|
||||||
|
if (otherTab) {
|
||||||
|
+ if (
|
||||||
|
+ this.weakAutoPipBrowserClosedDeliberately.has(
|
||||||
|
+ event.target.linkedBrowser
|
||||||
|
+ )
|
||||||
|
+ ) {
|
||||||
|
+ this.weakAutoPipBrowserClosedDeliberately.add(otherTab.linkedBrowser);
|
||||||
|
+ this.weakAutoPipBrowserClosedDeliberately.delete(
|
||||||
|
+ event.target.linkedBrowser
|
||||||
|
+ );
|
||||||
|
+ }
|
||||||
|
for (let win of Services.wm.getEnumerator(WINDOW_TYPE)) {
|
||||||
|
if (this.weakWinToBrowser.get(win) === event.target.linkedBrowser) {
|
||||||
|
this.weakWinToBrowser.set(win, otherTab.linkedBrowser);
|
||||||
|
this.removePiPBrowserFromWeakMap(event.target.linkedBrowser);
|
||||||
|
this.removeOriginatingWinFromWeakMap(event.target.linkedBrowser);
|
||||||
|
@@ -899,10 +927,20 @@
|
||||||
const { reason, actorRef } = closeData;
|
const { reason, actorRef } = closeData;
|
||||||
const win = this.getWeakPipPlayer(actorRef);
|
const win = this.getWeakPipPlayer(actorRef);
|
||||||
if (!win) {
|
if (!win) {
|
||||||
@@ -43,8 +82,11 @@ diff --git a/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs b/tool
|
|||||||
+
|
+
|
||||||
+ const browser = this.weakWinToBrowser.get(win);
|
+ const browser = this.weakWinToBrowser.get(win);
|
||||||
+
|
+
|
||||||
+ if (reason === "CloseButton") {
|
+ if (browser && DELIBERATE_CLOSE_REASONS.includes(reason)) {
|
||||||
+ PictureInPicture.weakAutoPipBrowserClosedDeliberately.add(browser);
|
+ const tabbrowser = browser.getTabBrowser();
|
||||||
|
+ if (tabbrowser && tabbrowser.selectedBrowser != browser) {
|
||||||
|
+ PictureInPicture.weakAutoPipBrowserClosedDeliberately.add(browser);
|
||||||
|
+ }
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
this.removePiPBrowserFromWeakMap(this.weakWinToBrowser.get(win));
|
this.removePiPBrowserFromWeakMap(this.weakWinToBrowser.get(win));
|
||||||
@@ -52,4 +94,69 @@ diff --git a/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs b/tool
|
|||||||
|
|
||||||
Glean.pictureinpicture["closedMethod" + reason].record();
|
Glean.pictureinpicture["closedMethod" + reason].record();
|
||||||
await this.closePipWindow(win);
|
await this.closePipWindow(win);
|
||||||
|
diff --git a/toolkit/components/pictureinpicture/tests/browser_autotoggle.js b/toolkit/components/pictureinpicture/tests/browser_autotoggle.js
|
||||||
|
--- a/toolkit/components/pictureinpicture/tests/browser_autotoggle.js
|
||||||
|
+++ b/toolkit/components/pictureinpicture/tests/browser_autotoggle.js
|
||||||
|
@@ -297,5 +297,61 @@
|
||||||
|
await new Promise(resolve => setTimeout(resolve, 2000));
|
||||||
|
assertNoPiPWindowsOpen();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Tests that closing a PiP window deliberately (via Shift+ESC) while the tab is backgrounded
|
||||||
|
+ * suppresses auto-toggle, but auto-toggle works normally on the next background.
|
||||||
|
+ */
|
||||||
|
+add_task(async function autopip_suppress_on_deliberate_close() {
|
||||||
|
+ await SpecialPowers.pushPrefEnv({
|
||||||
|
+ set: [[ALWAYS_SHOW_PREF, true]],
|
||||||
|
+ });
|
||||||
|
+
|
||||||
|
+ // Open a new window and save a handle for the first tab
|
||||||
|
+ let win1 = await BrowserTestUtils.openNewBrowserWindow();
|
||||||
|
+ let firstTab = win1.gBrowser.selectedTab;
|
||||||
|
+
|
||||||
|
+ // Open a new tab containing a video
|
||||||
|
+ let pipTab = await BrowserTestUtils.openNewForegroundTab(
|
||||||
|
+ win1.gBrowser,
|
||||||
|
+ TEST_PAGE
|
||||||
|
+ );
|
||||||
|
+ let browser = pipTab.linkedBrowser;
|
||||||
|
+
|
||||||
|
+ // Ensure the video is playing
|
||||||
|
+ let videoID = "with-controls";
|
||||||
|
+ await ensureVideosReady(browser);
|
||||||
|
+ await SpecialPowers.spawn(browser, [videoID], async videoID => {
|
||||||
|
+ await content.document.getElementById(videoID).play();
|
||||||
|
+ });
|
||||||
|
+
|
||||||
|
+ // Switch from the video tab to the first tab and check if the PiP window opened
|
||||||
|
+ let domWindowOpened = BrowserTestUtils.domWindowOpenedAndLoaded(null);
|
||||||
|
+ await BrowserTestUtils.switchTab(win1.gBrowser, firstTab);
|
||||||
|
+ let pipWin = await domWindowOpened;
|
||||||
|
+ ok(pipWin, "PiP window automatically opened.");
|
||||||
|
+
|
||||||
|
+ // Close the PiP window deliberately while the tab is backgrounded and check that it doesn't reopen
|
||||||
|
+ domWindowOpened = BrowserTestUtils.domWindowOpenedAndLoaded(null);
|
||||||
|
+ // A short delay is needed to make the test more robust
|
||||||
|
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
|
||||||
|
+ await new Promise(resolve => setTimeout(resolve, 2000));
|
||||||
|
+ EventUtils.synthesizeKey("KEY_Escape", { shiftKey: true }, pipWin);
|
||||||
|
+ let reopened = await Promise.race([
|
||||||
|
+ domWindowOpened.then(() => true),
|
||||||
|
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
|
||||||
|
+ new Promise(resolve => setTimeout(() => resolve(false), 2000)),
|
||||||
|
+ ]);
|
||||||
|
+ ok(!reopened, "PiP window should not reopen after deliberate close");
|
||||||
|
+
|
||||||
|
+ // Switch to the video tab and back to the first tab, which should automatically open the PiP window
|
||||||
|
+ domWindowOpened = BrowserTestUtils.domWindowOpenedAndLoaded(null);
|
||||||
|
+ await BrowserTestUtils.switchTab(win1.gBrowser, pipTab);
|
||||||
|
+ await BrowserTestUtils.switchTab(win1.gBrowser, firstTab);
|
||||||
|
+ pipWin = await domWindowOpened;
|
||||||
|
+ ok(pipWin, "PiP window automatically opened.");
|
||||||
|
+
|
||||||
|
+ await BrowserTestUtils.closeWindow(win1);
|
||||||
|
+});
|
||||||
|
|
||||||
|
|||||||
@@ -295,7 +295,7 @@
|
|||||||
|
|
||||||
&,
|
&,
|
||||||
.urlbar-background {
|
.urlbar-background {
|
||||||
border-radius: calc(12px * var(--zen-squircle-value)) !important;
|
border-radius: 12px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
&[breakout-extend][animate-searchmode="true"]::before {
|
&[breakout-extend][animate-searchmode="true"]::before {
|
||||||
@@ -639,7 +639,7 @@
|
|||||||
|
|
||||||
#urlbar-label-box,
|
#urlbar-label-box,
|
||||||
#urlbar-search-mode-indicator {
|
#urlbar-search-mode-indicator {
|
||||||
--urlbar-basic-component-size: 18px;
|
--urlbar-basic-component-size: auto;
|
||||||
background-color: color-mix(in srgb, var(--zen-primary-color) 50%, light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.2)) 50%) !important;
|
background-color: color-mix(in srgb, var(--zen-primary-color) 50%, light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.2)) 50%) !important;
|
||||||
color: white;
|
color: white;
|
||||||
padding: 4px 8px;
|
padding: 4px 8px;
|
||||||
|
|||||||
@@ -1476,14 +1476,19 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature {
|
|||||||
* @returns {string} The primary color in hex format.
|
* @returns {string} The primary color in hex format.
|
||||||
*/
|
*/
|
||||||
getAccentColorForUI(accentColor, isDarkMode) {
|
getAccentColorForUI(accentColor, isDarkMode) {
|
||||||
const [h, s, l] = this.rgbToHsl(...accentColor);
|
let [r, g, b] = accentColor;
|
||||||
if (isDarkMode) {
|
if (isDarkMode) {
|
||||||
return `rgb(${accentColor[0]}, ${accentColor[1]}, ${accentColor[2]})`;
|
return `rgb(${r}, ${g}, ${b})`;
|
||||||
}
|
}
|
||||||
|
// gh-15142: Special case for grayscale colors
|
||||||
|
if (r == g && g == b) {
|
||||||
|
return `rgb(${r}, ${g}, ${b})`;
|
||||||
|
}
|
||||||
|
const [h, s, l] = this.rgbToHsl(...accentColor);
|
||||||
const saturation = Math.min(1, s + 0.3);
|
const saturation = Math.min(1, s + 0.3);
|
||||||
const targetLightness = this.isDarkMode ? 0.62 : 0.42;
|
const targetLightness = this.isDarkMode ? 0.62 : 0.42;
|
||||||
const lightness = l * 0.4 + targetLightness * 0.6;
|
const lightness = l * 0.4 + targetLightness * 0.6;
|
||||||
const [r, g, b] = this.hslToRgb(h / 360, saturation, lightness);
|
[r, g, b] = this.hslToRgb(h / 360, saturation, lightness);
|
||||||
return `rgb(${r}, ${g}, ${b})`;
|
return `rgb(${r}, ${g}, ${b})`;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1504,7 +1509,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature {
|
|||||||
baseColor = this.blendColors(
|
baseColor = this.blendColors(
|
||||||
accentColor,
|
accentColor,
|
||||||
baseColor.slice(0, 3),
|
baseColor.slice(0, 3),
|
||||||
this.canBeTransparent ? 15 : 5
|
this.canBeTransparent ? 25 : 5
|
||||||
).concat(opacity);
|
).concat(opacity);
|
||||||
}
|
}
|
||||||
return baseColor;
|
return baseColor;
|
||||||
|
|||||||
@@ -2550,7 +2550,7 @@ class nsZenWorkspaces {
|
|||||||
"Default";
|
"Default";
|
||||||
name = this.isPrivateWindow ? "Incognito" : label;
|
name = this.isPrivateWindow ? "Incognito" : label;
|
||||||
if (this.isPrivateWindow) {
|
if (this.isPrivateWindow) {
|
||||||
icon = gZenEmojiPicker.getSVGURL("eye.svg");
|
icon = "chrome://browser/skin/zen-icons/private-window-small.svg";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let workspace = {
|
let workspace = {
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ async function openHistoryMenu(useContextMenu) {
|
|||||||
async function testBackForwardMenu(useContextMenu) {
|
async function testBackForwardMenu(useContextMenu) {
|
||||||
let tab = await BrowserTestUtils.openNewForegroundTab(
|
let tab = await BrowserTestUtils.openNewForegroundTab(
|
||||||
gBrowser,
|
gBrowser,
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
"http://example.com"
|
"http://example.com"
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -90,7 +90,7 @@ async function testBackForwardMenu(useContextMenu) {
|
|||||||
);
|
);
|
||||||
|
|
||||||
let node = popupEvent.target.lastElementChild;
|
let node = popupEvent.target.lastElementChild;
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
is(node.getAttribute("uri"), "http://example.com/", "'1' item uri");
|
is(node.getAttribute("uri"), "http://example.com/", "'1' item uri");
|
||||||
is(node.getAttribute("index"), "0", "'1' item index");
|
is(node.getAttribute("index"), "0", "'1' item index");
|
||||||
is(
|
is(
|
||||||
@@ -100,7 +100,7 @@ async function testBackForwardMenu(useContextMenu) {
|
|||||||
);
|
);
|
||||||
|
|
||||||
node = node.previousElementSibling;
|
node = node.previousElementSibling;
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
is(node.getAttribute("uri"), "http://example.com/2.html", "'2' item uri");
|
is(node.getAttribute("uri"), "http://example.com/2.html", "'2' item uri");
|
||||||
is(node.getAttribute("index"), "1", "'2' item index");
|
is(node.getAttribute("index"), "1", "'2' item index");
|
||||||
is(
|
is(
|
||||||
@@ -111,7 +111,7 @@ async function testBackForwardMenu(useContextMenu) {
|
|||||||
|
|
||||||
if (iter >= 3) {
|
if (iter >= 3) {
|
||||||
node = node.previousElementSibling;
|
node = node.previousElementSibling;
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
is(node.getAttribute("uri"), "http://example.com/3.html", "'3' item uri");
|
is(node.getAttribute("uri"), "http://example.com/3.html", "'3' item uri");
|
||||||
is(node.getAttribute("index"), "2", "'3' item index");
|
is(node.getAttribute("index"), "2", "'3' item index");
|
||||||
is(
|
is(
|
||||||
@@ -133,7 +133,7 @@ async function testBackForwardMenu(useContextMenu) {
|
|||||||
} else {
|
} else {
|
||||||
let newTabPromise = BrowserTestUtils.waitForNewTab(
|
let newTabPromise = BrowserTestUtils.waitForNewTab(
|
||||||
gBrowser,
|
gBrowser,
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
url => url == "http://example.com/"
|
url => url == "http://example.com/"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -88,32 +88,32 @@ add_task(async function test_contentPrincipal() {
|
|||||||
*/
|
*/
|
||||||
let tests = [
|
let tests = [
|
||||||
{
|
{
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
input: { uri: "http://example.com/", OA: {} },
|
input: { uri: "http://example.com/", OA: {} },
|
||||||
expected: `{"${contentId}":{"${content}":"http://example.com/"}}`,
|
expected: `{"${contentId}":{"${content}":"http://example.com/"}}`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
input: { uri: "http://mozilla1.com/", OA: {} },
|
input: { uri: "http://mozilla1.com/", OA: {} },
|
||||||
expected: `{"${contentId}":{"${content}":"http://mozilla1.com/"}}`,
|
expected: `{"${contentId}":{"${content}":"http://mozilla1.com/"}}`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
input: { uri: "http://mozilla2.com/", OA: { userContextId: 0 } },
|
input: { uri: "http://mozilla2.com/", OA: { userContextId: 0 } },
|
||||||
expected: `{"${contentId}":{"${content}":"http://mozilla2.com/"}}`,
|
expected: `{"${contentId}":{"${content}":"http://mozilla2.com/"}}`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
input: { uri: "http://mozilla3.com/", OA: { userContextId: 2 } },
|
input: { uri: "http://mozilla3.com/", OA: { userContextId: 2 } },
|
||||||
expected: `{"${contentId}":{"${content}":"http://mozilla3.com/","${suffix}":"^userContextId=2"}}`,
|
expected: `{"${contentId}":{"${content}":"http://mozilla3.com/","${suffix}":"^userContextId=2"}}`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
input: { uri: "http://mozilla4.com/", OA: { privateBrowsingId: 1 } },
|
input: { uri: "http://mozilla4.com/", OA: { privateBrowsingId: 1 } },
|
||||||
expected: `{"${contentId}":{"${content}":"http://mozilla4.com/","${suffix}":"^privateBrowsingId=1"}}`,
|
expected: `{"${contentId}":{"${content}":"http://mozilla4.com/","${suffix}":"^privateBrowsingId=1"}}`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
input: { uri: "http://mozilla5.com/", OA: { privateBrowsingId: 0 } },
|
input: { uri: "http://mozilla5.com/", OA: { privateBrowsingId: 0 } },
|
||||||
expected: `{"${contentId}":{"${content}":"http://mozilla5.com/"}}`,
|
expected: `{"${contentId}":{"${content}":"http://mozilla5.com/"}}`,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* eslint-disable @microsoft/sdl/no-insecure-url */
|
/* eslint-disable sdl/no-insecure-url */
|
||||||
/* Any copyright is dedicated to the Public Domain.
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|||||||
@@ -355,6 +355,7 @@ skip-if = [
|
|||||||
|
|
||||||
["browser_sizemodeBeforeMinimized.js"]
|
["browser_sizemodeBeforeMinimized.js"]
|
||||||
skip-if = [
|
skip-if = [
|
||||||
|
"os == 'linux' && os_version == '22.04' && arch == 'x86_64' && opt && nova", # Bug 2057856
|
||||||
"os == 'win' && os_version == '11.26200' && asan", # Bug 2019745
|
"os == 'win' && os_version == '11.26200' && asan", # Bug 2019745
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -436,6 +437,7 @@ disabled="Disabled by import_external_tests.py"
|
|||||||
skip-if = [
|
skip-if = [
|
||||||
"os == 'mac' && os_version == '15.30' && arch == 'aarch64'", # Bug 2023967
|
"os == 'mac' && os_version == '15.30' && arch == 'aarch64'", # Bug 2023967
|
||||||
]
|
]
|
||||||
|
|
||||||
["browser_tab_label_during_restore.js"]
|
["browser_tab_label_during_restore.js"]
|
||||||
disabled="Disabled by import_external_tests.py"
|
disabled="Disabled by import_external_tests.py"
|
||||||
https_first_disabled = true
|
https_first_disabled = true
|
||||||
|
|||||||
@@ -1,44 +1,26 @@
|
|||||||
const URL1 = "data:text/html;charset=utf-8,<body><p>Hello1</p></body>";
|
const URL1 = "data:text/html;charset=utf-8,<body><p>Hello1</p></body>";
|
||||||
const URL2 = "data:text/html;charset=utf-8,<body><p>Hello2</p></body>";
|
const URL2 = "data:text/html;charset=utf-8,<body><p>Hello2</p></body>";
|
||||||
|
|
||||||
async function getBFCacheComboTelemetry(probeInParent) {
|
async function getBFCacheComboValue(label) {
|
||||||
let bfcacheCombo;
|
await Services.fog.testFlushAllChildren();
|
||||||
await TestUtils.waitForCondition(() => {
|
return Glean.bfcache.combo[label].testGetValue();
|
||||||
let histograms;
|
|
||||||
if (probeInParent) {
|
|
||||||
histograms = Services.telemetry.getSnapshotForHistograms(
|
|
||||||
"main",
|
|
||||||
false /* clear */
|
|
||||||
).parent;
|
|
||||||
} else {
|
|
||||||
histograms = Services.telemetry.getSnapshotForHistograms(
|
|
||||||
"main",
|
|
||||||
false /* clear */
|
|
||||||
).content;
|
|
||||||
}
|
|
||||||
bfcacheCombo = histograms.BFCACHE_COMBO;
|
|
||||||
return bfcacheCombo;
|
|
||||||
});
|
|
||||||
return bfcacheCombo;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function test_bfcache_telemetry(probeInParent) {
|
add_task(async () => {
|
||||||
Services.telemetry.getHistogramById("BFCACHE_COMBO").clear();
|
await Services.fog.testFlushAllChildren();
|
||||||
|
Services.fog.testResetFOG();
|
||||||
|
|
||||||
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, URL1);
|
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, URL1);
|
||||||
|
|
||||||
BrowserTestUtils.startLoadingURIString(tab.linkedBrowser, URL2);
|
BrowserTestUtils.startLoadingURIString(tab.linkedBrowser, URL2);
|
||||||
await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
|
await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
|
||||||
|
|
||||||
let bfcacheCombo = await getBFCacheComboTelemetry(probeInParent);
|
await TestUtils.waitForCondition(
|
||||||
|
async () => (await getBFCacheComboValue("BFCache_Success")) !== null,
|
||||||
|
"Waiting for bfcache.combo 'BFCache_Success' to be recorded"
|
||||||
|
);
|
||||||
|
|
||||||
is(bfcacheCombo.values[0], 1, "1 bfcache success");
|
is(await getBFCacheComboValue("BFCache_Success"), 1, "1 bfcache success");
|
||||||
|
|
||||||
gBrowser.removeTab(tab);
|
gBrowser.removeTab(tab);
|
||||||
}
|
|
||||||
|
|
||||||
add_task(async () => {
|
|
||||||
await test_bfcache_telemetry(
|
|
||||||
Services.prefs.getBoolPref("fission.bfcacheInParent")
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -153,6 +153,7 @@ skip-if = [
|
|||||||
|
|
||||||
["browser_477657.js"]
|
["browser_477657.js"]
|
||||||
skip-if = [
|
skip-if = [
|
||||||
|
"os == 'linux' && os_version == '22.04' && arch == 'x86_64' && opt && nova", # Bug 2057857
|
||||||
"os == 'linux' && os_version == '24.04' && arch == 'x86_64' && display == 'x11'", # Bug 1610668
|
"os == 'linux' && os_version == '24.04' && arch == 'x86_64' && display == 'x11'", # Bug 1610668
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -182,6 +183,9 @@ skip-if = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
["browser_524745.js"]
|
["browser_524745.js"]
|
||||||
|
skip-if = [
|
||||||
|
"os == 'linux' && os_version == '22.04' && arch == 'x86_64' && debug && nova", # Bug 2057858
|
||||||
|
]
|
||||||
|
|
||||||
["browser_528776.js"]
|
["browser_528776.js"]
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ const BARPROP_NAMES = [
|
|||||||
"menubar",
|
"menubar",
|
||||||
"personalbar",
|
"personalbar",
|
||||||
"scrollbars",
|
"scrollbars",
|
||||||
"statusbar",
|
|
||||||
"toolbar",
|
"toolbar",
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -45,7 +44,6 @@ add_task(async function testRestoredWindowFeatures() {
|
|||||||
menubar: true,
|
menubar: true,
|
||||||
personalbar: true,
|
personalbar: true,
|
||||||
scrollbars: true,
|
scrollbars: true,
|
||||||
statusbar: true,
|
|
||||||
toolbar: true,
|
toolbar: true,
|
||||||
};
|
};
|
||||||
const TESTS = [
|
const TESTS = [
|
||||||
|
|||||||
@@ -18,8 +18,14 @@ async function check_tab_close_notification(openedTab, expectNotification) {
|
|||||||
}
|
}
|
||||||
Services.obs.addObserver(topicObserver, NOTIFY_CLOSED_OBJECTS_CHANGED);
|
Services.obs.addObserver(topicObserver, NOTIFY_CLOSED_OBJECTS_CHANGED);
|
||||||
|
|
||||||
|
// (Bug 2058570) Intermittently, the tab state wasn't fully up to date before closing the tab.
|
||||||
|
// This caused test_navigated_about_home to think there was no meaningful history beyond about:home.
|
||||||
|
// Try flushing the tab state and then waiting for a notification if one is expected.
|
||||||
|
let flushedPromise = TabStateFlusher.flush(openedTab.linkedBrowser);
|
||||||
|
|
||||||
BrowserTestUtils.removeTab(openedTab);
|
BrowserTestUtils.removeTab(openedTab);
|
||||||
await tabClosed;
|
await tabClosed;
|
||||||
|
await flushedPromise;
|
||||||
// SessionStore does a setTimeout(notify, 0) to notifyObservers when it handles TabClose
|
// SessionStore does a setTimeout(notify, 0) to notifyObservers when it handles TabClose
|
||||||
// We need to wait long enough to be confident the observer would have been notified
|
// We need to wait long enough to be confident the observer would have been notified
|
||||||
// if it was going to be.
|
// if it was going to be.
|
||||||
|
|||||||
@@ -385,3 +385,64 @@ class TestSmartWindowDefaultManualRestore(
|
|||||||
tab_count,
|
tab_count,
|
||||||
msg="Tab count should be preserved after restore",
|
msg="Tab count should be preserved after restore",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TestSmartWindowDefaultManualRestoreOverwritesNewTab(
|
||||||
|
SmartWindowDefaultMixin, SessionStoreTestCase
|
||||||
|
):
|
||||||
|
"""With Smart Window as default (startup.page=1), the startup window opens
|
||||||
|
showing the Smart new tab. Restoring a previously Smart session via
|
||||||
|
"Restore previous session" reuses that startup window (the types match),
|
||||||
|
and the restored tabs must *overwrite* the Smart new tab rather than being
|
||||||
|
appended alongside it."""
|
||||||
|
|
||||||
|
def test_smart_session_restored_overwrites_smart_new_tab(self):
|
||||||
|
self.marionette.execute_script(
|
||||||
|
"""
|
||||||
|
Services.prefs.setBoolPref("browser.sessionstore.persist_closed_tabs_between_sessions", true);
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
self.wait_for_windows(
|
||||||
|
self.all_windows, "Not all requested windows have been opened"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Make the saved session a Smart Window with the 3 content tabs from
|
||||||
|
# setUp (Tab 1/2/3), which are real pages, not the Smart new tab.
|
||||||
|
self.toggle_ai_window(True)
|
||||||
|
self.assertTrue(
|
||||||
|
self.is_ai_window(), msg="Window should be Smart before the restart"
|
||||||
|
)
|
||||||
|
tab_count = self.get_tab_count()
|
||||||
|
self.assertEqual(tab_count, 3, msg="Saved session should have 3 tabs")
|
||||||
|
|
||||||
|
self.marionette.quit()
|
||||||
|
self.marionette.start_session()
|
||||||
|
self.marionette.set_context("chrome")
|
||||||
|
|
||||||
|
# The new startup window opens Smart (Smart Window is the default) and
|
||||||
|
# shows a single Smart new tab.
|
||||||
|
self.assertTrue(
|
||||||
|
self.is_ai_window(),
|
||||||
|
msg="Startup window should open Smart when Smart Window is the default",
|
||||||
|
)
|
||||||
|
|
||||||
|
self.restore_last_session()
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
len(self.marionette.chrome_window_handles),
|
||||||
|
1,
|
||||||
|
msg="Smart session should restore into the existing startup window",
|
||||||
|
)
|
||||||
|
self.assertTrue(
|
||||||
|
self.is_ai_window(),
|
||||||
|
msg="Restored window should stay Smart",
|
||||||
|
)
|
||||||
|
|
||||||
|
# Asserts if Smart new tab was overwritten, not appended to.
|
||||||
|
self.assertEqual(
|
||||||
|
self.get_tab_count(),
|
||||||
|
tab_count,
|
||||||
|
msg="Restored tabs should overwrite the Smart new tab, not be "
|
||||||
|
"appended alongside it",
|
||||||
|
)
|
||||||
|
|||||||
@@ -0,0 +1,174 @@
|
|||||||
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
ChromeUtils.defineESModuleGetters(this, {
|
||||||
|
ShellService: "moz-src:///browser/components/shell/ShellService.sys.mjs",
|
||||||
|
sinon: "resource://testing-common/Sinon.sys.mjs",
|
||||||
|
});
|
||||||
|
|
||||||
|
const USER_CHOICE_PREF = "browser.shell.setDefaultBrowserUserChoice";
|
||||||
|
const REG_RENAME_PREF = "browser.shell.setDefaultBrowserUserChoice.regRename";
|
||||||
|
|
||||||
|
function mockNativeShellService(overrides) {
|
||||||
|
const mock = {
|
||||||
|
QueryInterface: ChromeUtils.generateQI([Ci.nsIWindowsShellService]),
|
||||||
|
checkAllProgIDsExist: () => true,
|
||||||
|
checkBrowserUserChoiceHashes: () => true,
|
||||||
|
isDefaultBrowser: () => false,
|
||||||
|
isUserChoiceProtectionDriverRunning: () => false,
|
||||||
|
canRenameUserChoiceAssociationKey: sinon.stub().returns(false),
|
||||||
|
...overrides,
|
||||||
|
};
|
||||||
|
sinon.stub(ShellService, "shellService").value(mock);
|
||||||
|
return mock;
|
||||||
|
}
|
||||||
|
|
||||||
|
registerCleanupFunction(() => {
|
||||||
|
sinon.restore();
|
||||||
|
Services.prefs.clearUserPref(USER_CHOICE_PREF);
|
||||||
|
Services.prefs.clearUserPref(REG_RENAME_PREF);
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(function test_pref_disabled() {
|
||||||
|
Services.prefs.setBoolPref(USER_CHOICE_PREF, false);
|
||||||
|
const native = mockNativeShellService({
|
||||||
|
checkAllProgIDsExist: () => {
|
||||||
|
Assert.ok(
|
||||||
|
false,
|
||||||
|
"Should not check capability when the user choice pref is off"
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
Assert.strictEqual(
|
||||||
|
ShellService.isOneClickSetDefaultEnabled(),
|
||||||
|
false,
|
||||||
|
"Should be false when the user choice pref is disabled, regardless of capability"
|
||||||
|
);
|
||||||
|
Assert.ok(
|
||||||
|
native.canRenameUserChoiceAssociationKey.notCalled,
|
||||||
|
"Should not probe the registry when the user choice pref is off"
|
||||||
|
);
|
||||||
|
|
||||||
|
sinon.restore();
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(function test_user_choice_impossible() {
|
||||||
|
Services.prefs.setBoolPref(USER_CHOICE_PREF, true);
|
||||||
|
const native = mockNativeShellService({
|
||||||
|
checkBrowserUserChoiceHashes: () => false,
|
||||||
|
});
|
||||||
|
|
||||||
|
Assert.strictEqual(
|
||||||
|
ShellService.isOneClickSetDefaultEnabled(),
|
||||||
|
false,
|
||||||
|
"Should be false when the existing UserChoice hashes can't be reproduced"
|
||||||
|
);
|
||||||
|
Assert.ok(
|
||||||
|
native.canRenameUserChoiceAssociationKey.notCalled,
|
||||||
|
"Should not probe the registry when a UserChoice write can't succeed anyway"
|
||||||
|
);
|
||||||
|
|
||||||
|
sinon.restore();
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(function test_ucpd_not_running() {
|
||||||
|
Services.prefs.setBoolPref(USER_CHOICE_PREF, true);
|
||||||
|
const native = mockNativeShellService({
|
||||||
|
isUserChoiceProtectionDriverRunning: () => false,
|
||||||
|
});
|
||||||
|
|
||||||
|
Assert.strictEqual(
|
||||||
|
ShellService.isOneClickSetDefaultEnabled(),
|
||||||
|
true,
|
||||||
|
"Should be true when UCPD isn't running to lock the UserChoice keys"
|
||||||
|
);
|
||||||
|
Assert.ok(
|
||||||
|
native.canRenameUserChoiceAssociationKey.notCalled,
|
||||||
|
"Should not probe the registry when UCPD isn't running"
|
||||||
|
);
|
||||||
|
|
||||||
|
sinon.restore();
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(function test_already_default_skips_probe() {
|
||||||
|
Services.prefs.setBoolPref(USER_CHOICE_PREF, true);
|
||||||
|
const native = mockNativeShellService({
|
||||||
|
isUserChoiceProtectionDriverRunning: () => true,
|
||||||
|
isDefaultBrowser: () => true,
|
||||||
|
});
|
||||||
|
|
||||||
|
Assert.strictEqual(
|
||||||
|
ShellService.isOneClickSetDefaultEnabled(),
|
||||||
|
true,
|
||||||
|
"Should be true without probing when Firefox is already the default"
|
||||||
|
);
|
||||||
|
Assert.ok(
|
||||||
|
native.canRenameUserChoiceAssociationKey.notCalled,
|
||||||
|
"Should not probe the registry when Firefox is already the default"
|
||||||
|
);
|
||||||
|
|
||||||
|
sinon.restore();
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(function test_ucpd_running_rename_blocked() {
|
||||||
|
Services.prefs.setBoolPref(USER_CHOICE_PREF, true);
|
||||||
|
const native = mockNativeShellService({
|
||||||
|
isUserChoiceProtectionDriverRunning: () => true,
|
||||||
|
canRenameUserChoiceAssociationKey: sinon.stub().returns(false),
|
||||||
|
});
|
||||||
|
|
||||||
|
Assert.strictEqual(
|
||||||
|
ShellService.isOneClickSetDefaultEnabled(),
|
||||||
|
false,
|
||||||
|
"Should be false when UCPD is running and blocks the registry rename"
|
||||||
|
);
|
||||||
|
Assert.ok(
|
||||||
|
native.canRenameUserChoiceAssociationKey.calledOnceWith("http"),
|
||||||
|
"Should probe the http association"
|
||||||
|
);
|
||||||
|
|
||||||
|
sinon.restore();
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(function test_ucpd_running_rename_permitted() {
|
||||||
|
Services.prefs.setBoolPref(USER_CHOICE_PREF, true);
|
||||||
|
mockNativeShellService({
|
||||||
|
isUserChoiceProtectionDriverRunning: () => true,
|
||||||
|
canRenameUserChoiceAssociationKey: sinon.stub().returns(true),
|
||||||
|
});
|
||||||
|
|
||||||
|
Assert.strictEqual(
|
||||||
|
ShellService.isOneClickSetDefaultEnabled(),
|
||||||
|
true,
|
||||||
|
"Should be true when UCPD is running but permits the registry rename"
|
||||||
|
);
|
||||||
|
|
||||||
|
sinon.restore();
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(function test_reg_rename_disabled() {
|
||||||
|
Services.prefs.setBoolPref(USER_CHOICE_PREF, true);
|
||||||
|
Services.prefs.setBoolPref(REG_RENAME_PREF, false);
|
||||||
|
const native = mockNativeShellService({
|
||||||
|
isUserChoiceProtectionDriverRunning: () => true,
|
||||||
|
canRenameUserChoiceAssociationKey: sinon.stub().returns(true),
|
||||||
|
});
|
||||||
|
|
||||||
|
Assert.strictEqual(
|
||||||
|
ShellService.isOneClickSetDefaultEnabled(),
|
||||||
|
false,
|
||||||
|
"Should be false when the rename pref is false, as renaming is the only " +
|
||||||
|
"way to reach a locked UserChoice key"
|
||||||
|
);
|
||||||
|
Assert.ok(
|
||||||
|
native.canRenameUserChoiceAssociationKey.notCalled,
|
||||||
|
"Should not probe the registry when a successful rename wouldn't be used"
|
||||||
|
);
|
||||||
|
|
||||||
|
sinon.restore();
|
||||||
|
Services.prefs.clearUserPref(REG_RENAME_PREF);
|
||||||
|
});
|
||||||
166
src/zen/tests/mochitests/shell/unit/test_taskbarPinningPolicy.js
Normal file
166
src/zen/tests/mochitests/shell/unit/test_taskbarPinningPolicy.js
Normal file
@@ -0,0 +1,166 @@
|
|||||||
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
|
* https://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
const { MockRegistry } = ChromeUtils.importESModule(
|
||||||
|
"resource://testing-common/MockRegistry.sys.mjs"
|
||||||
|
);
|
||||||
|
|
||||||
|
const EXPLORER_POLICY_KEY = String.raw`Software\Policies\Microsoft\Windows\Explorer`;
|
||||||
|
const POLICY_LOG_PREFIX = "Pinning disabled by policy";
|
||||||
|
|
||||||
|
const HIVES = {
|
||||||
|
HKCU: Ci.nsIWindowsRegKey.ROOT_KEY_CURRENT_USER,
|
||||||
|
HKLM: Ci.nsIWindowsRegKey.ROOT_KEY_LOCAL_MACHINE,
|
||||||
|
};
|
||||||
|
const POLICIES = ["NoPinningToTaskbar", "TaskbarNoPinnedList"];
|
||||||
|
|
||||||
|
const shellService = Cc["@mozilla.org/browser/shell-service;1"].getService(
|
||||||
|
Ci.nsIWindowsShellService
|
||||||
|
);
|
||||||
|
|
||||||
|
let gRegistry;
|
||||||
|
let gLogFile;
|
||||||
|
|
||||||
|
add_setup(async function () {
|
||||||
|
// The pinning policy diagnostic only reaches MOZ_LOG, never the console
|
||||||
|
// service, so route the module to a file and read it back.
|
||||||
|
// logging.config.sync flushes each line, so the message is on disk by the
|
||||||
|
// time canPinToTaskbar() returns.
|
||||||
|
const logBase = PathUtils.join(
|
||||||
|
do_get_profile().path,
|
||||||
|
"taskbar_policy_test.log"
|
||||||
|
);
|
||||||
|
gLogFile = `${logBase}-main.${Services.appinfo.processID}.moz_log`;
|
||||||
|
|
||||||
|
Services.prefs.setBoolPref("logging.config.sync", true);
|
||||||
|
Services.prefs.setCharPref("logging.config.LOG_FILE", logBase);
|
||||||
|
Services.prefs.setIntPref("logging.shell_windows::taskbar", 3);
|
||||||
|
|
||||||
|
gRegistry = new MockRegistry();
|
||||||
|
|
||||||
|
registerCleanupFunction(async () => {
|
||||||
|
gRegistry.shutdown();
|
||||||
|
Services.prefs.clearUserPref("logging.shell_windows::taskbar");
|
||||||
|
Services.prefs.clearUserPref("logging.config.LOG_FILE");
|
||||||
|
Services.prefs.clearUserPref("logging.config.sync");
|
||||||
|
await IOUtils.remove(gLogFile, { ignoreAbsent: true });
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
async function readLog() {
|
||||||
|
if (!(await IOUtils.exists(gLogFile))) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return IOUtils.readUTF8(gLogFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
function clearPolicies() {
|
||||||
|
for (const root of Object.values(HIVES)) {
|
||||||
|
for (const policy of POLICIES) {
|
||||||
|
gRegistry.setValue(root, EXPLORER_POLICY_KEY, policy, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setPolicy(hive, policy, value) {
|
||||||
|
clearPolicies();
|
||||||
|
gRegistry.setValue(
|
||||||
|
HIVES[hive],
|
||||||
|
EXPLORER_POLICY_KEY,
|
||||||
|
policy,
|
||||||
|
value,
|
||||||
|
Ci.nsIWindowsRegKey.TYPE_INT
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calls canPinToTaskbar and returns what it threw (if anything) along with the
|
||||||
|
// log output it produced. The log file accumulates across tasks, so only the
|
||||||
|
// appended portion is returned.
|
||||||
|
async function callCanPinToTaskbar() {
|
||||||
|
const offset = (await readLog()).length;
|
||||||
|
|
||||||
|
let error = null;
|
||||||
|
try {
|
||||||
|
shellService.canPinToTaskbar();
|
||||||
|
} catch (e) {
|
||||||
|
error = e;
|
||||||
|
}
|
||||||
|
|
||||||
|
let log = (await readLog()).slice(offset);
|
||||||
|
|
||||||
|
return { error, log };
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set of hive/group policy combinations known to block pinning.
|
||||||
|
const BLOCKING_POLICIES = [
|
||||||
|
["HKCU", "NoPinningToTaskbar"],
|
||||||
|
["HKCU", "TaskbarNoPinnedList"],
|
||||||
|
["HKLM", "TaskbarNoPinnedList"],
|
||||||
|
];
|
||||||
|
|
||||||
|
add_task(async function test_policiesBlockPinning() {
|
||||||
|
for (const [hive, policy] of BLOCKING_POLICIES) {
|
||||||
|
info(`Testing ${policy} in ${hive}`);
|
||||||
|
setPolicy(hive, policy, 1);
|
||||||
|
|
||||||
|
const { error, log } = await callCanPinToTaskbar();
|
||||||
|
|
||||||
|
Assert.equal(
|
||||||
|
error?.result,
|
||||||
|
Cr.NS_ERROR_NOT_AVAILABLE,
|
||||||
|
`canPinToTaskbar threw NS_ERROR_NOT_AVAILABLE for ${policy} in ${hive}`
|
||||||
|
);
|
||||||
|
Assert.stringContains(
|
||||||
|
log,
|
||||||
|
`${POLICY_LOG_PREFIX} ${policy} in hive ${hive}.`,
|
||||||
|
`The blocking policy ${policy} in ${hive} was logged`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Policies that apply in other hives, but not the ones paired here.
|
||||||
|
const INVALID_HIVE_FOR_POLICY = [["HKLM", "NoPinningToTaskbar"]];
|
||||||
|
|
||||||
|
add_task(async function test_invalidPoliciesDoNotBlockPinning() {
|
||||||
|
for (const [hive, policy] of INVALID_HIVE_FOR_POLICY) {
|
||||||
|
info(`Testing ${policy} in ${hive}`);
|
||||||
|
setPolicy(hive, policy, 1);
|
||||||
|
|
||||||
|
// Whether pinning is actually available depends on the host machine, so only
|
||||||
|
// the absence of the policy diagnostic is asserted here.
|
||||||
|
const { log } = await callCanPinToTaskbar();
|
||||||
|
|
||||||
|
Assert.ok(
|
||||||
|
!log.includes(POLICY_LOG_PREFIX),
|
||||||
|
`The policy ${policy} in ${hive} is invalid and should not block pinning`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(async function test_policySetToZeroDoesNotBlockPinning() {
|
||||||
|
setPolicy("HKCU", "NoPinningToTaskbar", 0);
|
||||||
|
|
||||||
|
// Whether pinning is actually available depends on the host machine, so only
|
||||||
|
// the absence of the policy diagnostic is asserted here.
|
||||||
|
const { log } = await callCanPinToTaskbar();
|
||||||
|
|
||||||
|
Assert.ok(
|
||||||
|
!log.includes(POLICY_LOG_PREFIX),
|
||||||
|
"A policy present but set to zero does not block pinning"
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(async function test_noPoliciesSet() {
|
||||||
|
clearPolicies();
|
||||||
|
|
||||||
|
// Whether pinning is actually available depends on the host machine, so only
|
||||||
|
// the absence of the policy diagnostic is asserted here.
|
||||||
|
const { log } = await callCanPinToTaskbar();
|
||||||
|
|
||||||
|
Assert.ok(
|
||||||
|
!log.includes(POLICY_LOG_PREFIX),
|
||||||
|
"No policy is reported when none are set"
|
||||||
|
);
|
||||||
|
});
|
||||||
@@ -30,6 +30,11 @@ support-files = [
|
|||||||
]
|
]
|
||||||
tags = ["portal"]
|
tags = ["portal"]
|
||||||
|
|
||||||
|
["test_isOneClickSetDefaultEnabled.js"]
|
||||||
|
run-if = [
|
||||||
|
"os == 'win'",
|
||||||
|
]
|
||||||
|
|
||||||
["test_linuxDesktopEntry.js"]
|
["test_linuxDesktopEntry.js"]
|
||||||
run-if = [
|
run-if = [
|
||||||
"os == 'linux'",
|
"os == 'linux'",
|
||||||
@@ -45,6 +50,11 @@ run-if = [
|
|||||||
"os == 'win'"
|
"os == 'win'"
|
||||||
]
|
]
|
||||||
|
|
||||||
|
["test_taskbarPinningPolicy.js"]
|
||||||
|
run-if = [
|
||||||
|
"os == 'win'",
|
||||||
|
]
|
||||||
|
|
||||||
["test_writeShortcutIcon.js"]
|
["test_writeShortcutIcon.js"]
|
||||||
run-if = [
|
run-if = [
|
||||||
"os == 'win'",
|
"os == 'win'",
|
||||||
|
|||||||
@@ -97,7 +97,10 @@ function loadWebExtensionTestFunctions() {
|
|||||||
const path = webExtensionsTestPath("/head_sync.js");
|
const path = webExtensionsTestPath("/head_sync.js");
|
||||||
let file = do_get_file(path);
|
let file = do_get_file(path);
|
||||||
let uri = Services.io.newFileURI(file);
|
let uri = Services.io.newFileURI(file);
|
||||||
Services.scriptloader.loadSubScript(uri.spec, gGlobalScope);
|
Services.scriptloader.loadSubScriptWithOptions(uri.spec, {
|
||||||
|
target: gGlobalScope,
|
||||||
|
allowUnsafeURL: true,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -47,10 +47,10 @@ function server_404(metadata, response) {
|
|||||||
response.bodyOutputStream.write(body, body.length);
|
response.bodyOutputStream.write(body, body.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
var pacFetched = false;
|
var pacFetched;
|
||||||
function server_pac(metadata, response) {
|
function server_pac(metadata, response) {
|
||||||
_("Invoked PAC handler.");
|
_("Invoked PAC handler.");
|
||||||
pacFetched = true;
|
pacFetched.resolve();
|
||||||
let body = 'function FindProxyForURL(url, host) { return "DIRECT"; }';
|
let body = 'function FindProxyForURL(url, host) { return "DIRECT"; }';
|
||||||
response.setStatusLine(metadata.httpVersion, 200, "OK");
|
response.setStatusLine(metadata.httpVersion, 200, "OK");
|
||||||
response.setHeader(
|
response.setHeader(
|
||||||
@@ -189,12 +189,13 @@ add_task(async function test_proxy_auth_redirect() {
|
|||||||
|
|
||||||
PACSystemSettings.PACURI = server.baseURI + "/pac2";
|
PACSystemSettings.PACURI = server.baseURI + "/pac2";
|
||||||
installFakePAC();
|
installFakePAC();
|
||||||
|
pacFetched = Promise.withResolvers();
|
||||||
let res = new Resource(server.baseURI + "/open");
|
let res = new Resource(server.baseURI + "/open");
|
||||||
let result = await res.get();
|
let result = await res.get();
|
||||||
Assert.ok(pacFetched);
|
await pacFetched.promise;
|
||||||
Assert.ok(fetched);
|
Assert.ok(fetched);
|
||||||
Assert.equal("This path exists", result.data);
|
Assert.equal("This path exists", result.data);
|
||||||
pacFetched = fetched = false;
|
fetched = false;
|
||||||
uninstallFakePAC();
|
uninstallFakePAC();
|
||||||
await promiseStopServer(server);
|
await promiseStopServer(server);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -45,6 +45,8 @@ https_first_disabled = true
|
|||||||
|
|
||||||
["browser_sound_indicator_silent_video.js"]
|
["browser_sound_indicator_silent_video.js"]
|
||||||
|
|
||||||
|
["browser_sound_indicator_tab_move.js"]
|
||||||
|
|
||||||
["browser_webAudio_hideSoundPlayingIcon.js"]
|
["browser_webAudio_hideSoundPlayingIcon.js"]
|
||||||
|
|
||||||
["browser_webAudio_silentData.js"]
|
["browser_webAudio_silentData.js"]
|
||||||
|
|||||||
@@ -179,31 +179,6 @@ add_task(async function testSoundIndicatorWhenChangingMediaVolume() {
|
|||||||
/**
|
/**
|
||||||
* Following are helper functions
|
* Following are helper functions
|
||||||
*/
|
*/
|
||||||
function initMediaPlaybackDocument(
|
|
||||||
tab,
|
|
||||||
fileName,
|
|
||||||
{ preload, createVideo, muted = false, volume = 1.0 } = {}
|
|
||||||
) {
|
|
||||||
return SpecialPowers.spawn(
|
|
||||||
tab.linkedBrowser,
|
|
||||||
[fileName, preload, createVideo, muted, volume],
|
|
||||||
// eslint-disable-next-line no-shadow
|
|
||||||
async (fileName, preload, createVideo, muted, volume) => {
|
|
||||||
if (createVideo) {
|
|
||||||
content.media = content.document.createElement("video");
|
|
||||||
} else {
|
|
||||||
content.media = content.document.createElement("audio");
|
|
||||||
}
|
|
||||||
if (preload) {
|
|
||||||
content.media.preload = preload;
|
|
||||||
}
|
|
||||||
content.media.muted = muted;
|
|
||||||
content.media.volume = volume;
|
|
||||||
content.media.src = fileName;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function initMediaStreamPlaybackDocument(tab) {
|
function initMediaStreamPlaybackDocument(tab) {
|
||||||
return SpecialPowers.spawn(tab.linkedBrowser, [], async _ => {
|
return SpecialPowers.spawn(tab.linkedBrowser, [], async _ => {
|
||||||
content.media = content.document.createElement("audio");
|
content.media = content.document.createElement("audio");
|
||||||
@@ -212,26 +187,6 @@ function initMediaStreamPlaybackDocument(tab) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function playMedia(tab, { resolveOnTimeupdate } = {}) {
|
|
||||||
return SpecialPowers.spawn(
|
|
||||||
tab.linkedBrowser,
|
|
||||||
[resolveOnTimeupdate],
|
|
||||||
// eslint-disable-next-line no-shadow
|
|
||||||
async resolveOnTimeupdate => {
|
|
||||||
await content.media.play();
|
|
||||||
if (resolveOnTimeupdate) {
|
|
||||||
await new Promise(r => (content.media.ontimeupdate = r));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function pauseMedia(tab) {
|
|
||||||
return SpecialPowers.spawn(tab.linkedBrowser, [], async _ => {
|
|
||||||
content.media.pause();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function assignNewSourceForAudio(tab, fileName) {
|
function assignNewSourceForAudio(tab, fileName) {
|
||||||
// eslint-disable-next-line no-shadow
|
// eslint-disable-next-line no-shadow
|
||||||
return SpecialPowers.spawn(tab.linkedBrowser, [fileName], async fileName => {
|
return SpecialPowers.spawn(tab.linkedBrowser, [fileName], async fileName => {
|
||||||
|
|||||||
@@ -0,0 +1,76 @@
|
|||||||
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
|
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Moving a tab to another window hands its browsing context to a different
|
||||||
|
* browser, which also changes the media controller the tab has to listen to.
|
||||||
|
* For each way a tab can reach another window, these tests check that the sound
|
||||||
|
* indicator still appears when audio starts and still clears when audio stops.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const MOVE_MODES = [
|
||||||
|
{ name: "moving it to a new window", moveTab: moveTabToNewWindow },
|
||||||
|
{ name: "adopting it into another window", moveTab: adoptTabIntoOtherWindow },
|
||||||
|
];
|
||||||
|
|
||||||
|
for (const { name, moveTab } of MOVE_MODES) {
|
||||||
|
add_task(async function testSoundIndicatorAppearsAfterMovingTab() {
|
||||||
|
info("create a tab loading media document");
|
||||||
|
const tab = await createBlankForegroundTab();
|
||||||
|
await initMediaPlaybackDocument(tab, "audio.ogg");
|
||||||
|
|
||||||
|
info(`move the silent tab by ${name}`);
|
||||||
|
const { win, movedTab } = await moveTab(tab);
|
||||||
|
|
||||||
|
info("sound indicator should appear when audible audio starts playing");
|
||||||
|
await playMedia(movedTab);
|
||||||
|
await waitForTabSoundIndicatorAppears(movedTab);
|
||||||
|
|
||||||
|
info("stop media and close window");
|
||||||
|
await pauseMedia(movedTab);
|
||||||
|
await BrowserTestUtils.closeWindow(win);
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(async function testSoundIndicatorDisappearsAfterMovingTab() {
|
||||||
|
info("create a tab loading media document");
|
||||||
|
const tab = await createBlankForegroundTab();
|
||||||
|
await initMediaPlaybackDocument(tab, "audio.ogg");
|
||||||
|
|
||||||
|
info("sound indicator should appear when audible audio starts playing");
|
||||||
|
await playMedia(tab);
|
||||||
|
await waitForTabSoundIndicatorAppears(tab);
|
||||||
|
|
||||||
|
info(`move the audible tab by ${name}`);
|
||||||
|
const { win, movedTab } = await moveTab(tab);
|
||||||
|
ok(movedTab.soundPlaying, "Tab sound indicator is kept after moving");
|
||||||
|
|
||||||
|
info("sound indicator should disappear when audio stops playing");
|
||||||
|
await pauseMedia(movedTab);
|
||||||
|
await waitForTabSoundIndicatorDisappears(movedTab);
|
||||||
|
|
||||||
|
info("close window");
|
||||||
|
await BrowserTestUtils.closeWindow(win);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Following are helper functions.
|
||||||
|
|
||||||
|
async function moveTabToNewWindow(tab) {
|
||||||
|
const win = gBrowser.replaceTabWithWindow(tab);
|
||||||
|
await TestUtils.topicObserved(
|
||||||
|
"browser-delayed-startup-finished",
|
||||||
|
subject => subject == win
|
||||||
|
);
|
||||||
|
return { win, movedTab: win.gBrowser.selectedTab };
|
||||||
|
}
|
||||||
|
|
||||||
|
async function adoptTabIntoOtherWindow(tab) {
|
||||||
|
const win = await BrowserTestUtils.openNewBrowserWindow();
|
||||||
|
const movedTab = win.gBrowser.adoptTab(tab, { selectTab: true });
|
||||||
|
if (!movedTab) {
|
||||||
|
throw new Error("adoptTab refused to swap the tab into the other window");
|
||||||
|
}
|
||||||
|
return { win, movedTab };
|
||||||
|
}
|
||||||
@@ -12,8 +12,8 @@ const gEMPTY_PAGE_URL = GetTestWebBasedURL("file_empty.html");
|
|||||||
* if set, then return a url with different origin
|
* if set, then return a url with different origin
|
||||||
*/
|
*/
|
||||||
function GetTestWebBasedURL(fileName, cors = false) {
|
function GetTestWebBasedURL(fileName, cors = false) {
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
const origin = cors ? "http://example.org" : "http://example.com";
|
const origin = cors ? "http://example.org" : "http://example.com";
|
||||||
return (
|
return (
|
||||||
getRootDirectory(gTestPath).replace("chrome://mochitests/content", origin) +
|
getRootDirectory(gTestPath).replace("chrome://mochitests/content", origin) +
|
||||||
@@ -163,3 +163,52 @@ function disableNonTestMouse(disable) {
|
|||||||
let utils = window.windowUtils;
|
let utils = window.windowUtils;
|
||||||
utils.disableNonTestMouseEvents(disable);
|
utils.disableNonTestMouseEvents(disable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a media element in the given tab and point it at fileName. The element
|
||||||
|
* is stored on the content window as `content.media` for playMedia/pauseMedia.
|
||||||
|
*/
|
||||||
|
function initMediaPlaybackDocument(
|
||||||
|
tab,
|
||||||
|
fileName,
|
||||||
|
{ preload, createVideo, muted = false, volume = 1.0 } = {}
|
||||||
|
) {
|
||||||
|
return SpecialPowers.spawn(
|
||||||
|
tab.linkedBrowser,
|
||||||
|
[fileName, preload, createVideo, muted, volume],
|
||||||
|
// eslint-disable-next-line no-shadow
|
||||||
|
async (fileName, preload, createVideo, muted, volume) => {
|
||||||
|
if (createVideo) {
|
||||||
|
content.media = content.document.createElement("video");
|
||||||
|
} else {
|
||||||
|
content.media = content.document.createElement("audio");
|
||||||
|
}
|
||||||
|
if (preload) {
|
||||||
|
content.media.preload = preload;
|
||||||
|
}
|
||||||
|
content.media.muted = muted;
|
||||||
|
content.media.volume = volume;
|
||||||
|
content.media.src = fileName;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function playMedia(tab, { resolveOnTimeupdate } = {}) {
|
||||||
|
return SpecialPowers.spawn(
|
||||||
|
tab.linkedBrowser,
|
||||||
|
[resolveOnTimeupdate],
|
||||||
|
// eslint-disable-next-line no-shadow
|
||||||
|
async resolveOnTimeupdate => {
|
||||||
|
await content.media.play();
|
||||||
|
if (resolveOnTimeupdate) {
|
||||||
|
await new Promise(r => (content.media.ontimeupdate = r));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function pauseMedia(tab) {
|
||||||
|
return SpecialPowers.spawn(tab.linkedBrowser, [], async _ => {
|
||||||
|
content.media.pause();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ function test() {
|
|||||||
(async function () {
|
(async function () {
|
||||||
gTestTab = BrowserTestUtils.addTab(gBrowser);
|
gTestTab = BrowserTestUtils.addTab(gBrowser);
|
||||||
await FullZoomHelper.selectTabAndWaitForLocationChange(gTestTab);
|
await FullZoomHelper.selectTabAndWaitForLocationChange(gTestTab);
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
await FullZoomHelper.load(gTestTab, "http://example.org" + TEST_PAGE);
|
await FullZoomHelper.load(gTestTab, "http://example.org" + TEST_PAGE);
|
||||||
})().then(testInitialZoom, FullZoomHelper.failAndContinue(finish));
|
})().then(testInitialZoom, FullZoomHelper.failAndContinue(finish));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
var gTestPage =
|
var gTestPage =
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
"http://example.org/browser/browser/base/content/test/zoom/zoom_test.html";
|
"http://example.org/browser/browser/base/content/test/zoom/zoom_test.html";
|
||||||
var gTestImage =
|
var gTestImage =
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
"http://example.org/browser/browser/base/content/test/general/moz.png";
|
"http://example.org/browser/browser/base/content/test/general/moz.png";
|
||||||
var gTab1, gTab2, gTab3;
|
var gTab1, gTab2, gTab3;
|
||||||
var gLevel;
|
var gLevel;
|
||||||
|
|||||||
@@ -4,9 +4,9 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
add_task(async function test_multidomain_global_zoom() {
|
add_task(async function test_multidomain_global_zoom() {
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
const TEST_PAGE_URL_1 = "http://example.com/";
|
const TEST_PAGE_URL_1 = "http://example.com/";
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
const TEST_PAGE_URL_2 = "http://example.org/";
|
const TEST_PAGE_URL_2 = "http://example.org/";
|
||||||
|
|
||||||
// Prepare the test tabs
|
// Prepare the test tabs
|
||||||
@@ -95,9 +95,9 @@ add_task(async function test_multidomain_global_zoom() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
add_task(async function test_site_specific_global_zoom() {
|
add_task(async function test_site_specific_global_zoom() {
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
const TEST_PAGE_URL_1 = "http://example.net/";
|
const TEST_PAGE_URL_1 = "http://example.net/";
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
const TEST_PAGE_URL_2 = "http://example.net/";
|
const TEST_PAGE_URL_2 = "http://example.net/";
|
||||||
|
|
||||||
// Prepare the test tabs
|
// Prepare the test tabs
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
function test() {
|
function test() {
|
||||||
let tab1, tab2;
|
let tab1, tab2;
|
||||||
const TEST_IMAGE =
|
const TEST_IMAGE =
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
"http://example.org/browser/browser/base/content/test/general/moz.png";
|
"http://example.org/browser/browser/base/content/test/general/moz.png";
|
||||||
|
|
||||||
waitForExplicitFinish();
|
waitForExplicitFinish();
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
const TEST_PAGE =
|
const TEST_PAGE =
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
"http://example.org/browser/browser/base/content/test/zoom/zoom_test.html";
|
"http://example.org/browser/browser/base/content/test/zoom/zoom_test.html";
|
||||||
|
|
||||||
var gTab1, gTab2, gLevel1;
|
var gTab1, gTab2, gLevel1;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ function test() {
|
|||||||
|
|
||||||
(async function () {
|
(async function () {
|
||||||
let testPage =
|
let testPage =
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
"http://example.org/browser/browser/base/content/test/zoom/zoom_test.html";
|
"http://example.org/browser/browser/base/content/test/zoom/zoom_test.html";
|
||||||
let tab1 = BrowserTestUtils.addTab(gBrowser);
|
let tab1 = BrowserTestUtils.addTab(gBrowser);
|
||||||
await FullZoomHelper.selectTabAndWaitForLocationChange(tab1);
|
await FullZoomHelper.selectTabAndWaitForLocationChange(tab1);
|
||||||
|
|||||||
@@ -4,10 +4,10 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
const TEST_PAGE =
|
const TEST_PAGE =
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
"http://example.org/browser/browser/base/content/test/zoom/zoom_test.html";
|
"http://example.org/browser/browser/base/content/test/zoom/zoom_test.html";
|
||||||
const TEST_VIDEO =
|
const TEST_VIDEO =
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
"http://example.org/browser/browser/base/content/test/general/video.webm";
|
"http://example.org/browser/browser/base/content/test/general/video.webm";
|
||||||
|
|
||||||
var gTab1, gTab2, gLevel1;
|
var gTab1, gTab2, gLevel1;
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ function test() {
|
|||||||
waitForExplicitFinish();
|
waitForExplicitFinish();
|
||||||
|
|
||||||
const TEST_PAGE_URL = 'data:text/html,<body><iframe src=""></iframe></body>';
|
const TEST_PAGE_URL = 'data:text/html,<body><iframe src=""></iframe></body>';
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
const TEST_IFRAME_URL = "http://test2.example.org/";
|
const TEST_IFRAME_URL = "http://test2.example.org/";
|
||||||
|
|
||||||
(async function () {
|
(async function () {
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ function test() {
|
|||||||
Services.prefs.setBoolPref("browser.zoom.siteSpecific", true);
|
Services.prefs.setBoolPref("browser.zoom.siteSpecific", true);
|
||||||
|
|
||||||
let uri =
|
let uri =
|
||||||
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
// eslint-disable-next-line sdl/no-insecure-url
|
||||||
"http://example.org/browser/browser/base/content/test/zoom/zoom_test.html";
|
"http://example.org/browser/browser/base/content/test/zoom/zoom_test.html";
|
||||||
|
|
||||||
(async function () {
|
(async function () {
|
||||||
|
|||||||
@@ -189,7 +189,7 @@
|
|||||||
document.getElementById("zen-welcome-start").remove();
|
document.getElementById("zen-welcome-start").remove();
|
||||||
const pages = document.getElementById("zen-welcome-pages");
|
const pages = document.getElementById("zen-welcome-pages");
|
||||||
pages.style.display = "flex";
|
pages.style.display = "flex";
|
||||||
animate(pages, { opacity: [0, 1] }, { ...kFade, duration: 0.2 });
|
animate(pages, { opacity: [0, 1] }, { ...kFade, duration: 0.45 });
|
||||||
this.backButton.addEventListener("click", () => this.back());
|
this.backButton.addEventListener("click", () => this.back());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -501,7 +501,7 @@
|
|||||||
// 20 is the shadow width * 2
|
// 20 is the shadow width * 2
|
||||||
anchor.style.height =
|
anchor.style.height =
|
||||||
panelRect.height -
|
panelRect.height -
|
||||||
(AppConstants.platform == "macosx" ? -72 : 20) +
|
(AppConstants.platform == "macosx" ? -90 : 20) +
|
||||||
"px";
|
"px";
|
||||||
anchor.style.width = panelRect.width - 20 + "px";
|
anchor.style.width = panelRect.width - 20 + "px";
|
||||||
},
|
},
|
||||||
@@ -687,7 +687,7 @@
|
|||||||
chars,
|
chars,
|
||||||
{ opacity: [0, 1], y: [50, 0] },
|
{ opacity: [0, 1], y: [50, 0] },
|
||||||
{
|
{
|
||||||
delay: getMotion().stagger(0.035, { startDelay: 0.2 }),
|
delay: getMotion().stagger(0.035, { startDelay: 0.8 }),
|
||||||
type: "spring",
|
type: "spring",
|
||||||
bounce: 0.3,
|
bounce: 0.3,
|
||||||
visualDuration: 0.45,
|
visualDuration: 0.45,
|
||||||
@@ -700,7 +700,11 @@
|
|||||||
await animate(
|
await animate(
|
||||||
"#zen-welcome-title .zen-welcome-char, #zen-welcome-start-button",
|
"#zen-welcome-title .zen-welcome-char, #zen-welcome-start-button",
|
||||||
{ opacity: [1, 0], y: [0, -14] },
|
{ opacity: [1, 0], y: [0, -14] },
|
||||||
{ ...kSpring, delay: getMotion().stagger(0.012) }
|
{
|
||||||
|
duration: 0.3,
|
||||||
|
ease: "easeIn",
|
||||||
|
delay: getMotion().stagger(0.012),
|
||||||
|
}
|
||||||
);
|
);
|
||||||
new nsZenWelcomePages(getWelcomePages());
|
new nsZenWelcomePages(getWelcomePages());
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -74,7 +74,7 @@
|
|||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
will-change: transform;
|
will-change: transform;
|
||||||
transition: scale 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
|
transition: scale 0.15s ease-out;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
scale: 1.03;
|
scale: 1.03;
|
||||||
@@ -110,7 +110,7 @@
|
|||||||
fill: white !important;
|
fill: white !important;
|
||||||
|
|
||||||
will-change: transform;
|
will-change: transform;
|
||||||
transition: scale 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
|
transition: scale 0.15s ease-out;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
scale: 1.03;
|
scale: 1.03;
|
||||||
@@ -294,6 +294,7 @@
|
|||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
padding-top: 6rem;
|
padding-top: 6rem;
|
||||||
padding-bottom: 6rem;
|
padding-bottom: 6rem;
|
||||||
|
scrollbar-width: none;
|
||||||
|
|
||||||
mask-image: linear-gradient(
|
mask-image: linear-gradient(
|
||||||
transparent,
|
transparent,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
"binaryName": "zen",
|
"binaryName": "zen",
|
||||||
"version": {
|
"version": {
|
||||||
"product": "firefox",
|
"product": "firefox",
|
||||||
"version": "154.0.1",
|
"version": "155.0",
|
||||||
"candidate": "155.0",
|
"candidate": "155.0",
|
||||||
"candidateBuild": 1
|
"candidateBuild": 1
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user