diff --git a/.github/workflows/twilight-release-schedule.yml b/.github/workflows/twilight-release-schedule.yml index c3fb8d8c..f0163ab7 100644 --- a/.github/workflows/twilight-release-schedule.yml +++ b/.github/workflows/twilight-release-schedule.yml @@ -14,7 +14,7 @@ on: description: 'Use sccache' required: false type: boolean - default: true + default: false jobs: twilight-release-schedule: diff --git a/.github/workflows/windows-release-build.yml b/.github/workflows/windows-release-build.yml index 6ed9881b..e57320e5 100644 --- a/.github/workflows/windows-release-build.yml +++ b/.github/workflows/windows-release-build.yml @@ -280,21 +280,16 @@ jobs: if: ${{ !inputs.generate-gpo }} run: | set -x - if test "${{ matrix.arch }}" = "aarch64"; then - find engine/obj-aarch64-pc-windows-msvc/ -mindepth 1 -maxdepth 1 -type d -not -name 'dist' -exec rm -rf {} \; - find engine/obj-aarch64-pc-windows-msvc/ -mindepth 1 -maxdepth 1 -type f -not -name 'dist' -exec rm -f {} \; - else - find engine/obj-x86_64-pc-windows-msvc/ -mindepth 1 -maxdepth 1 -type d -not -name 'dist' -exec rm -rf {} \; - find engine/obj-x86_64-pc-windows-msvc/ -mindepth 1 -maxdepth 1 -type f -not -name 'dist' -exec rm -f {} \; - fi + mkdir obj-${{ matrix.arch }}-pc-windows-msvc/ + cp -r --no-dereference engine/obj-${{ matrix.arch }}-pc-windows-msvc/* obj-${{ matrix.arch }}-pc-windows-msvc/ || true - name: Upload dist object if: ${{ !inputs.generate-gpo }} uses: actions/upload-artifact@v4 with: - retention-days: 5 + retention-days: 2 name: windows-x64-obj-${{ matrix.arch == 'aarch64' && 'arm64' || matrix.arch }} - path: engine/obj-${{ matrix.arch == 'aarch64' && 'aarch64' || 'x86_64' }}-pc-windows-msvc/ + path: obj-${{ matrix.arch }}-pc-windows-msvc - name: Upload artifact (if Twilight branch, binary) if: ${{ inputs.release-branch == 'twilight' && !inputs.generate-gpo }} diff --git a/build/winsign/sign.ps1 b/build/winsign/sign.ps1 index e3a96cb7..cb3d0b83 100644 --- a/build/winsign/sign.ps1 +++ b/build/winsign/sign.ps1 @@ -6,6 +6,7 @@ param( $ErrorActionPreference = "Stop" echo "Preparing environment" +git pull --recurse mkdir windsign-temp -ErrorAction SilentlyContinue # Download in parallel @@ -18,18 +19,34 @@ mkdir windsign-temp -ErrorAction SilentlyContinue # echo "Downloaded git objects repo to" #} -Verbose -ArgumentList $PWD -Debug +Start-Job -Name "DownloadGitl10n" -ScriptBlock { + param($PWD) + cd $PWD + $env:ZEN_L10N_CURR_DIR=[regex]::replace($PWD, "^([A-Z]):", { "/" + $args.value.Substring(0, 1).toLower() }) -replace "\\", "/" + C:\mozilla-build\start-shell.bat $PWD\scripts\download-language-packs.sh + echo "Fetched l10n and firefox's one" +} -Verbose -ArgumentList $PWD -Debug + gh run download $GithubRunId --name windows-x64-obj-arm64 -D windsign-temp\windows-x64-obj-arm64 echo "Downloaded arm64 artifacts" gh run download $GithubRunId --name windows-x64-obj-x86_64 -D windsign-temp\windows-x64-obj-x86_64 echo "Downloaded x86_64 artifacts" - -#Wait-Job -Name "DownloadGitObjectsRepo" +Wait-Job -Name "DownloadGitl10n" mkdir engine\obj-x86_64-pc-windows-msvc\ -ErrorAction SilentlyContinue surfer -- ci --brand release +# Collect all .exe and .dll files into a list +$files = Get-ChildItem windsign-temp\windows-x64-obj-x86_64\ -Recurse -Include *.exe +$files += Get-ChildItem windsign-temp\windows-x64-obj-x86_64\ -Recurse -Include *.dll + +$files = Get-ChildItem windsign-temp\windows-x64-obj-arm64\ -Recurse -Include *.exe +$files += Get-ChildItem windsign-temp\windows-x64-obj-arm64\ -Recurse -Include *.dll + +signtool.exe sign /n "$SignIdentity" /t http://time.certum.pl/ /fd sha256 /v $files + function SignAndPackage($name) { echo "Executing on $name" rmdir .\dist -Recurse -ErrorAction SilentlyContinue @@ -37,13 +54,7 @@ function SignAndPackage($name) { cp windsign-temp\windows-x64-obj-$name engine\obj-x86_64-pc-windows-msvc\ -Recurse echo "Signing $name" - # Collect all .exe and .dll files into a list - $files = Get-ChildItem engine\obj-x86_64-pc-windows-msvc\ -Recurse -Include *.exe - $files += Get-ChildItem engine\obj-x86_64-pc-windows-msvc\ -Recurse -Include *.dll - - signtool.exe sign /n "$SignIdentity" /t http://time.certum.pl/ /fd sha256 /v $files echo "Packaging $name" - $env:SURFER_SIGNING_MODE="sign" $env:MAR="..\\build\\winsign\\mar.exe" if ($name -eq "arm64") { $env:SURFER_COMPAT="aarch64" @@ -61,7 +72,6 @@ function SignAndPackage($name) { # - update_manifest/* # - windows.mar # - zen.installer.exe - # - zen.win-x86_64.zip echo "Creating tar for $name" rm .\windsign-temp\windows-x64-signed-$name -Recurse -ErrorAction SilentlyContinue mkdir windsign-temp\windows-x64-signed-$name @@ -82,27 +92,9 @@ function SignAndPackage($name) { mv .\dist\zen.installer.exe windsign-temp\windows-x64-signed-$name\zen.installer.exe } - # Move the zip - echo "Moving zip for $name" - if ($name -eq "arm64") { - mv (Get-Item .\dist\*.en-US.win64-aarch64.zip) windsign-temp\windows-x64-signed-$name\zen.win-arm64.zip - } else { - mv (Get-Item .\dist\*.en-US.win64.zip) windsign-temp\windows-x64-signed-$name\zen.win-$name.zip - } - - # Extract the zip, sign everything inside, and repackage it - #Expand-Archive -Path windsign-temp\windows-x64-signed-$name\zen.win-$name.zip -DestinationPath windsign-temp\windows-x64-signed-$name\zen.win-$name - #rm windsign-temp\windows-x64-signed-$name\zen.win-$name.zip - #$files = Get-ChildItem windsign-temp\windows-x64-signed-$name\zen.win-$name -Recurse -Include *.exe - #$files += Get-ChildItem windsign-temp\windows-x64-signed-$name\zen.win-$name -Recurse -Include *.dll - #signtool.exe sign /n "$SignIdentity" /t http://time.certum.pl/ /fd sha256 /v $files - #Compress-Archive -Path windsign-temp\windows-x64-signed-$name\zen.win-$name -DestinationPath windsign-temp\windows-x64-signed-$name\zen.win-$name.zip - rmdir windsign-temp\windows-x64-signed-$name\zen.win-$name -Recurse -ErrorAction SilentlyContinue - # Move the manifest mv .\dist\update\. windsign-temp\windows-x64-signed-$name\update_manifest - echo "Invoking tar for $name" # note: We need to sign it into a parent folder, called windows-x64-signed-$name rmdir .\windsign-temp\windows-binaries\windows-x64-signed-$name -Recurse -ErrorAction SilentlyContinue mv windsign-temp\windows-x64-signed-$name .\windsign-temp\windows-binaries -Force @@ -113,6 +105,9 @@ function SignAndPackage($name) { SignAndPackage arm64 SignAndPackage x86_64 +$files = Get-ChildItem .\windsign-temp\windows-binaries -Recurse -Include *.exe +signtool.exe sign /n "$SignIdentity" /t http://time.certum.pl/ /fd sha256 /v $files + echo "All artifacts signed and packaged, ready for release!" echo "Commiting the changes to the repository" cd windsign-temp\windows-binaries diff --git a/scripts/download-language-packs.sh b/scripts/download-language-packs.sh index 2c4b929d..869d8882 100644 --- a/scripts/download-language-packs.sh +++ b/scripts/download-language-packs.sh @@ -1,5 +1,9 @@ set -ex +if ! [ -z "$ZEN_L10N_CURR_DIR" ]; then + cd $ZEN_L10N_CURR_DIR +fi + CURRENT_DIR=$(pwd) git config --global init.defaultBranch main diff --git a/src/browser/base/content/zen-media-player.inc.xhtml b/src/browser/base/content/zen-media-controls.inc.xhtml similarity index 86% rename from src/browser/base/content/zen-media-player.inc.xhtml rename to src/browser/base/content/zen-media-controls.inc.xhtml index 1e53438c..6bb12354 100644 --- a/src/browser/base/content/zen-media-player.inc.xhtml +++ b/src/browser/base/content/zen-media-controls.inc.xhtml @@ -36,6 +36,12 @@ class="toolbarbutton-1" /> + + + + diff --git a/src/browser/base/content/zen-sidebar-icons.inc.xhtml b/src/browser/base/content/zen-sidebar-icons.inc.xhtml index 2d26c0a9..2bfe8caf 100644 --- a/src/browser/base/content/zen-sidebar-icons.inc.xhtml +++ b/src/browser/base/content/zen-sidebar-icons.inc.xhtml @@ -1,4 +1,4 @@ -#include zen-media-player.inc.xhtml +#include zen-media-controls.inc.xhtml toolbarbutton:not(:first-child) { + display: none; + + #media-device-buttons { + display: flex; + } + } + &:not([can-pip]) { #zen-media-info-vbox { width: calc(100% - 26px); @@ -206,7 +224,7 @@ } #zen-media-info-vbox { - #zen-media-controls-toolbar:not([media-position-hidden='true']) & { + #zen-media-controls-toolbar:not([media-position-hidden]) & { transition-delay: 0.01s !important; } overflow-x: hidden; @@ -251,7 +269,7 @@ align-items: center; padding-top: 0px !important; - #zen-media-controls-toolbar[media-position-hidden='true'] & { + #zen-media-controls-toolbar[media-position-hidden] & { display: none; } } diff --git a/src/browser/base/zen-components/ZenGlanceManager.mjs b/src/browser/base/zen-components/ZenGlanceManager.mjs index ed0e4db4..6f89f764 100644 --- a/src/browser/base/zen-components/ZenGlanceManager.mjs +++ b/src/browser/base/zen-components/ZenGlanceManager.mjs @@ -464,8 +464,12 @@ this.#currentGlanceID = tab.getAttribute('glance-id'); if (gBrowser.selectedTab === this.#currentParentTab && this.#currentBrowser) { const curTab = this.#currentTab; + const prevTab = event.detail.previousTab; setTimeout(() => { gBrowser.selectedTab = curTab; + if (prevTab?.linkedBrowser) { + prevTab.linkedBrowser.closest('.browserSidebarContainer').classList.remove('deck-selected'); + } }, 0); } else if (gBrowser.selectedTab === this.#currentTab) { setTimeout(this.onLocationChangeOpenGlance.bind(this), 0); diff --git a/src/browser/base/zen-components/ZenMediaController.mjs b/src/browser/base/zen-components/ZenMediaController.mjs index 8e839b1b..83f9d703 100644 --- a/src/browser/base/zen-components/ZenMediaController.mjs +++ b/src/browser/base/zen-components/ZenMediaController.mjs @@ -27,6 +27,8 @@ _tabTimeout = null; _controllerSwitchTimeout = null; + #isSeeking = false; + init() { if (!Services.prefs.getBoolPref('zen.mediacontrols.enabled', true)) return; @@ -50,6 +52,11 @@ } #initEventListeners() { + this.mediaControlBar.addEventListener('mousedown', (event) => { + if (event.target.closest(':is(toolbarbutton,#zen-media-progress-hbox)')) return; + else this.onMediaFocus(); + }); + this.mediaControlBar.addEventListener('command', (event) => { const button = event.target.closest('toolbarbutton'); if (!button) return; @@ -75,6 +82,12 @@ case 'zen-media-playpause-button': this.onMediaToggle(); break; + case 'zen-media-mute-mic-button': + this.onMicrophoneMuteToggle(); + break; + case 'zen-media-mute-camera-button': + this.onCameraMuteToggle(); + break; } }); @@ -82,6 +95,8 @@ this.mediaProgressBar.addEventListener('change', this.onMediaSeekComplete.bind(this)); window.addEventListener('TabSelect', (event) => { + if (this.isSharing) return; + const linkedBrowser = event.target.linkedBrowser; this.switchController(); @@ -123,25 +138,29 @@ }); window.addEventListener('DOMAudioPlaybackStopped', () => this.updateMuteState()); + window.webrtcUI.on('peer-request-allowed', this._onMediaShareStart.bind(this)); } onTabDiscardedOrClosed(event) { - const linkedBrowser = event.target.linkedBrowser; - if (!linkedBrowser?.browsingContext?.mediaController) return; - this.deinitMediaController( - linkedBrowser.browsingContext.mediaController, - true, - linkedBrowser.browserId === this._currentBrowser?.browserId, - true - ); + const { linkedBrowser } = event.target; + + if (linkedBrowser?.browserId === this._currentBrowser?.browserId) { + this.deinitMediaSharingControls(linkedBrowser); + this.hideMediaControls(); + } + + if (linkedBrowser?.browsingContext.mediaController) { + this.deinitMediaController( + linkedBrowser.browsingContext.mediaController, + true, + linkedBrowser.browserId === this._currentBrowser?.browserId, + true + ); + } } async deinitMediaController(mediaController, shouldForget = true, shouldOverride = true, shouldHide = true) { - if (!mediaController) return; - - const retrievedMediaController = this.mediaControllersMap.get(mediaController.id); - - if (shouldForget) { + if (shouldForget && mediaController) { mediaController.removeEventListener('pictureinpicturemodechange', this.onPipModeChange); mediaController.removeEventListener('positionstatechange', this.onPositionstateChange); mediaController.removeEventListener('playbackstatechange', this.onPlaybackstateChange); @@ -167,6 +186,26 @@ } } + get isSharing() { + return this.mediaControlBar.hasAttribute('media-sharing'); + } + + set isSharing(value) { + if (this._currentBrowser && !value) { + const webRTC = this._currentBrowser.browsingContext.currentWindowGlobal.getActor('WebRTC'); + webRTC.sendAsyncMessage('webrtc:UnmuteMicrophone'); + webRTC.sendAsyncMessage('webrtc:UnmuteCamera'); + } + + if (!value) { + this.mediaControlBar.removeAttribute('mic-muted'); + this.mediaControlBar.removeAttribute('camera-muted'); + } else { + this.mediaControlBar.setAttribute('media-position-hidden', ''); + this.mediaControlBar.setAttribute('media-sharing', ''); + } + } + hideMediaControls() { if (this.mediaControlBar.hasAttribute('hidden')) return; @@ -183,18 +222,22 @@ ) .then(() => { this.mediaControlBar.setAttribute('hidden', 'true'); + this.mediaControlBar.removeAttribute('media-sharing'); gZenUIManager.updateTabsToolbar(); gZenUIManager.restoreScrollbarState(); }); } showMediaControls() { - if (!this._currentMediaController) return; - - if (this._currentMediaController.isBeingUsedInPIPModeOrFullscreen) return this.hideMediaControls(); if (!this.mediaControlBar.hasAttribute('hidden')) return; - this.updatePipButton(); + if (!this.isSharing) { + if (!this._currentMediaController) return; + if (this._currentMediaController.isBeingUsedInPIPModeOrFullscreen) return this.hideMediaControls(); + + this.updatePipButton(); + } + const mediaInfoElements = [this.mediaTitle, this.mediaArtist]; for (const element of mediaInfoElements) { element.removeAttribute('overflow'); // So we can properly recalculate the overflow @@ -282,7 +325,7 @@ lastUpdated: Date.now(), }); - if (!this._currentBrowser) { + if (!this._currentBrowser && !this.isSharing) { this.setupMediaController(mediaController, browser); this.setupMediaControlUI(metadata, positionState); } @@ -295,6 +338,70 @@ mediaController.addEventListener('deactivated', this.onDeactivated); } + activateMediaDeviceControls(browser) { + if (browser?.browsingContext.currentWindowGlobal.hasActivePeerConnections()) { + this.mediaControlBar.removeAttribute('can-pip'); + this._currentBrowser = browser; + + const tab = window.gBrowser.getTabForBrowser(browser); + const iconURL = browser.mIconURL || `page-icon:${browser.currentURI.spec}`; + + this.isSharing = true; + + this.mediaFocusButton.style.listStyleImage = `url(${iconURL})`; + this.mediaTitle.textContent = tab.label; + this.mediaArtist.textContent = ''; + + this.showMediaControls(); + tab.addEventListener('TabAttrModified', this._onTabAttrModified.bind(this)); + } + } + + deinitMediaSharingControls(browser) { + const tab = window.gBrowser.getTabForBrowser(browser); + if (tab) tab.removeEventListener('TabAttrModified', this._onTabAttrModified.bind(this)); + + this.isSharing = false; + this._currentBrowser = null; + } + + _onTabAttrModified(event) { + const { changed } = event.detail; + const { linkedBrowser } = event.target; + + if (changed.includes('sharing') && !linkedBrowser.browsingContext.currentWindowGlobal.hasActivePeerConnections()) { + if (this._currentBrowser?.browserId === linkedBrowser.browserId) { + event.target.removeEventListener('TabAttrModified', this._onTabAttrModified.bind(this)); + this.deinitMediaSharingControls(linkedBrowser); + + this.hideMediaControls(); + this.switchController(true); + } + } + } + + _onMediaShareStart(event) { + const { innerWindowID } = event; + + for (const browser of window.gBrowser.browsers) { + if (browser.innerWindowID === innerWindowID) { + const webRTC = browser.browsingContext.currentWindowGlobal.getActor('WebRTC'); + webRTC.sendAsyncMessage('webrtc:UnmuteMicrophone'); + webRTC.sendAsyncMessage('webrtc:UnmuteCamera'); + + if (this._currentBrowser) this.deinitMediaSharingControls(this._currentBrowser); + if (this._currentMediaController) { + this._currentMediaController.pause(); + this.deinitMediaController(this._currentMediaController, true, true).then(() => + this.activateMediaDeviceControls(browser) + ); + } else this.activateMediaDeviceControls(browser); + + break; + } + } + } + _onDeactivated(event) { this.deinitMediaController(event.target, true, event.target.id === this._currentMediaController.id, true); this.switchController(); @@ -339,6 +446,9 @@ switchController(force = false) { let timeout = 3000; + if (this.isSharing) return; + if (this.#isSeeking) return; + if (this._controllerSwitchTimeout) { clearTimeout(this._controllerSwitchTimeout); this._controllerSwitchTimeout = null; @@ -466,6 +576,8 @@ } onMediaSeekDrag(event) { + this.#isSeeking = true; + this._currentMediaController?.pause(); const newTime = (event.target.value / 100) * this._currentDuration; this.mediaCurrentTime.textContent = this.formatSecondsToTime(newTime); @@ -477,11 +589,18 @@ this._currentMediaController.seekTo(newPosition); this._currentMediaController.play(); } + + this.#isSeeking = false; } onMediaFocus() { if (!this._currentBrowser) return; - this._currentMediaController?.focus(); + + if (this._currentMediaController) this._currentMediaController.focus(); + else if (this._currentBrowser) { + const tab = window.gBrowser.getTabForBrowser(this._currentBrowser); + if (tab) window.ZenWorkspaces.switchTabIfNeeded(tab); + } } onMediaMute() { @@ -503,9 +622,13 @@ } onControllerClose() { - this._currentMediaController?.pause(); + if (this._currentMediaController) { + this._currentMediaController.pause(); + this.deinitMediaController(this._currentMediaController); + } else if (this.isSharing) this.deinitMediaSharingControls(this._currentBrowser); + + this.hideMediaControls(); this.switchController(true); - this.deinitMediaController(this._currentMediaController); } onMediaPip() { @@ -514,22 +637,37 @@ .sendAsyncMessage('PictureInPicture:KeyToggle'); } + onMicrophoneMuteToggle() { + if (this._currentBrowser) { + const shouldMute = this.mediaControlBar.hasAttribute('mic-muted') ? 'webrtc:UnmuteMicrophone' : 'webrtc:MuteMicrophone'; + + this._currentBrowser.browsingContext.currentWindowGlobal.getActor('WebRTC').sendAsyncMessage(shouldMute); + this.mediaControlBar.toggleAttribute('mic-muted'); + } + } + + onCameraMuteToggle() { + if (this._currentBrowser) { + const shouldMute = this.mediaControlBar.hasAttribute('camera-muted') ? 'webrtc:UnmuteCamera' : 'webrtc:MuteCamera'; + + this._currentBrowser.browsingContext.currentWindowGlobal.getActor('WebRTC').sendAsyncMessage(shouldMute); + this.mediaControlBar.toggleAttribute('camera-muted'); + } + } + updateMuteState() { if (!this._currentBrowser) return; - if (this._currentBrowser._audioMuted) { - this.mediaControlBar.setAttribute('muted', ''); - } else { - this.mediaControlBar.removeAttribute('muted'); - } + this.mediaControlBar.toggleAttribute('muted', this._currentBrowser._audioMuted); } updatePipButton() { if (!this._currentBrowser) return; - const { totalPipCount, totalPipDisabled } = PictureInPicture.getEligiblePipVideoCount(this._currentBrowser); + if (this.isSharing) return; - if (totalPipCount === 1 || (totalPipDisabled > 0 && lazy.RESPECT_PIP_DISABLED)) - this.mediaControlBar.setAttribute('can-pip', ''); - else this.mediaControlBar.removeAttribute('can-pip'); + const { totalPipCount, totalPipDisabled } = PictureInPicture.getEligiblePipVideoCount(this._currentBrowser); + const canPip = totalPipCount === 1 || (totalPipDisabled > 0 && lazy.RESPECT_PIP_DISABLED); + + this.mediaControlBar.toggleAttribute('can-pip', canPip); } } diff --git a/src/browser/base/zen-components/ZenViewSplitter.mjs b/src/browser/base/zen-components/ZenViewSplitter.mjs index c094f190..6841721d 100644 --- a/src/browser/base/zen-components/ZenViewSplitter.mjs +++ b/src/browser/base/zen-components/ZenViewSplitter.mjs @@ -189,7 +189,8 @@ class ZenViewSplitter extends ZenDOMOperatedFeature { !this._lastOpenedTab || (this._lastOpenedTab && this._lastOpenedTab.getAttribute('zen-workspace-id') !== draggedTab.getAttribute('zen-workspace-id') && - !this._lastOpenedTab.hasAttribute('zen-essential')) + !this._lastOpenedTab.hasAttribute('zen-essential')) || + draggedTab === this._lastOpenedTab ) { return; } diff --git a/src/browser/themes/shared/zen-icons/icons.css b/src/browser/themes/shared/zen-icons/icons.css index 13ca3d7d..b671195c 100644 --- a/src/browser/themes/shared/zen-icons/icons.css +++ b/src/browser/themes/shared/zen-icons/icons.css @@ -1181,6 +1181,24 @@ menupopup > menuitem:is([type='checkbox']) .menu-iconic-left { list-style-image: url('close.svg') !important; } +#zen-media-mute-mic-button { + list-style-image: url('microphone-fill.svg') !important; +} + +#zen-media-controls-toolbar[mic-muted] #zen-media-mute-mic-button { + list-style-image: url('microphone-blocked-fill.svg') !important; + fill: rgb(224, 41, 29); +} + +#zen-media-mute-camera-button { + list-style-image: url('video-fill.svg') !important; +} + +#zen-media-controls-toolbar[camera-muted] #zen-media-mute-camera-button { + list-style-image: url('video-blocked-fill.svg') !important; + fill: rgb(224, 41, 29); +} + #zen-media-pip-button { list-style-image: url('chrome://global/skin/media/picture-in-picture-open.svg') !important; } diff --git a/src/browser/themes/shared/zen-icons/jar.inc.mn b/src/browser/themes/shared/zen-icons/jar.inc.mn index 515c183f..1bafe6ce 100644 --- a/src/browser/themes/shared/zen-icons/jar.inc.mn +++ b/src/browser/themes/shared/zen-icons/jar.inc.mn @@ -75,7 +75,9 @@ skin/classic/browser/zen-icons/media-unmute.svg (../shared/zen-icons/lin/media-unmute.svg) skin/classic/browser/zen-icons/menu-bar.svg (../shared/zen-icons/lin/menu-bar.svg) skin/classic/browser/zen-icons/menu.svg (../shared/zen-icons/lin/menu.svg) + skin/classic/browser/zen-icons/microphone-blocked-fill.svg (../shared/zen-icons/lin/microphone-blocked-fill.svg) skin/classic/browser/zen-icons/microphone-blocked.svg (../shared/zen-icons/lin/microphone-blocked.svg) + skin/classic/browser/zen-icons/microphone-fill.svg (../shared/zen-icons/lin/microphone-fill.svg) skin/classic/browser/zen-icons/microphone.svg (../shared/zen-icons/lin/microphone.svg) skin/classic/browser/zen-icons/midi.svg (../shared/zen-icons/lin/midi.svg) skin/classic/browser/zen-icons/move-tab.svg (../shared/zen-icons/lin/move-tab.svg) @@ -125,8 +127,10 @@ skin/classic/browser/zen-icons/tracking-protection.svg (../shared/zen-icons/lin/tracking-protection.svg) skin/classic/browser/zen-icons/translations.svg (../shared/zen-icons/lin/translations.svg) skin/classic/browser/zen-icons/unpin.svg (../shared/zen-icons/lin/unpin.svg) + skin/classic/browser/zen-icons/video-blocked-fill.svg (../shared/zen-icons/lin/video-blocked-fill.svg) skin/classic/browser/zen-icons/video-open.svg (../shared/zen-icons/lin/video-open.svg) skin/classic/browser/zen-icons/video-save.svg (../shared/zen-icons/lin/video-save.svg) + skin/classic/browser/zen-icons/video-fill.svg (../shared/zen-icons/lin/video-fill.svg) skin/classic/browser/zen-icons/window.svg (../shared/zen-icons/lin/window.svg) skin/classic/browser/zen-icons/xr-blocked.svg (../shared/zen-icons/lin/xr-blocked.svg) skin/classic/browser/zen-icons/xr.svg (../shared/zen-icons/lin/xr.svg) @@ -209,7 +213,9 @@ skin/classic/browser/zen-icons/media-unmute.svg (../shared/zen-icons/lin/media-unmute.svg) skin/classic/browser/zen-icons/menu-bar.svg (../shared/zen-icons/lin/menu-bar.svg) skin/classic/browser/zen-icons/menu.svg (../shared/zen-icons/lin/menu.svg) + skin/classic/browser/zen-icons/microphone-blocked-fill.svg (../shared/zen-icons/lin/microphone-blocked-fill.svg) skin/classic/browser/zen-icons/microphone-blocked.svg (../shared/zen-icons/lin/microphone-blocked.svg) + skin/classic/browser/zen-icons/microphone-fill.svg (../shared/zen-icons/lin/microphone-fill.svg) skin/classic/browser/zen-icons/microphone.svg (../shared/zen-icons/lin/microphone.svg) skin/classic/browser/zen-icons/midi.svg (../shared/zen-icons/lin/midi.svg) skin/classic/browser/zen-icons/move-tab.svg (../shared/zen-icons/lin/move-tab.svg) @@ -259,8 +265,10 @@ skin/classic/browser/zen-icons/tracking-protection.svg (../shared/zen-icons/lin/tracking-protection.svg) skin/classic/browser/zen-icons/translations.svg (../shared/zen-icons/lin/translations.svg) skin/classic/browser/zen-icons/unpin.svg (../shared/zen-icons/lin/unpin.svg) + skin/classic/browser/zen-icons/video-blocked-fill.svg (../shared/zen-icons/lin/video-blocked-fill.svg) skin/classic/browser/zen-icons/video-open.svg (../shared/zen-icons/lin/video-open.svg) skin/classic/browser/zen-icons/video-save.svg (../shared/zen-icons/lin/video-save.svg) + skin/classic/browser/zen-icons/video-fill.svg (../shared/zen-icons/lin/video-fill.svg) skin/classic/browser/zen-icons/window.svg (../shared/zen-icons/lin/window.svg) skin/classic/browser/zen-icons/xr-blocked.svg (../shared/zen-icons/lin/xr-blocked.svg) skin/classic/browser/zen-icons/xr.svg (../shared/zen-icons/lin/xr.svg) @@ -343,7 +351,9 @@ skin/classic/browser/zen-icons/media-unmute.svg (../shared/zen-icons/lin/media-unmute.svg) skin/classic/browser/zen-icons/menu-bar.svg (../shared/zen-icons/lin/menu-bar.svg) skin/classic/browser/zen-icons/menu.svg (../shared/zen-icons/lin/menu.svg) + skin/classic/browser/zen-icons/microphone-blocked-fill.svg (../shared/zen-icons/lin/microphone-blocked-fill.svg) skin/classic/browser/zen-icons/microphone-blocked.svg (../shared/zen-icons/lin/microphone-blocked.svg) + skin/classic/browser/zen-icons/microphone-fill.svg (../shared/zen-icons/lin/microphone-fill.svg) skin/classic/browser/zen-icons/microphone.svg (../shared/zen-icons/lin/microphone.svg) skin/classic/browser/zen-icons/midi.svg (../shared/zen-icons/lin/midi.svg) skin/classic/browser/zen-icons/move-tab.svg (../shared/zen-icons/lin/move-tab.svg) @@ -393,8 +403,10 @@ skin/classic/browser/zen-icons/tracking-protection.svg (../shared/zen-icons/lin/tracking-protection.svg) skin/classic/browser/zen-icons/translations.svg (../shared/zen-icons/lin/translations.svg) skin/classic/browser/zen-icons/unpin.svg (../shared/zen-icons/lin/unpin.svg) + skin/classic/browser/zen-icons/video-blocked-fill.svg (../shared/zen-icons/lin/video-blocked-fill.svg) skin/classic/browser/zen-icons/video-open.svg (../shared/zen-icons/lin/video-open.svg) skin/classic/browser/zen-icons/video-save.svg (../shared/zen-icons/lin/video-save.svg) + skin/classic/browser/zen-icons/video-fill.svg (../shared/zen-icons/lin/video-fill.svg) skin/classic/browser/zen-icons/window.svg (../shared/zen-icons/lin/window.svg) skin/classic/browser/zen-icons/xr-blocked.svg (../shared/zen-icons/lin/xr-blocked.svg) skin/classic/browser/zen-icons/xr.svg (../shared/zen-icons/lin/xr.svg) diff --git a/src/browser/themes/shared/zen-icons/lin/microphone-blocked-fill.svg b/src/browser/themes/shared/zen-icons/lin/microphone-blocked-fill.svg new file mode 100644 index 00000000..53cd4cd9 --- /dev/null +++ b/src/browser/themes/shared/zen-icons/lin/microphone-blocked-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/browser/themes/shared/zen-icons/lin/microphone-fill.svg b/src/browser/themes/shared/zen-icons/lin/microphone-fill.svg new file mode 100644 index 00000000..55692b81 --- /dev/null +++ b/src/browser/themes/shared/zen-icons/lin/microphone-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/browser/themes/shared/zen-icons/lin/video-blocked-fill.svg b/src/browser/themes/shared/zen-icons/lin/video-blocked-fill.svg new file mode 100644 index 00000000..74f845dc --- /dev/null +++ b/src/browser/themes/shared/zen-icons/lin/video-blocked-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/browser/themes/shared/zen-icons/lin/video-fill.svg b/src/browser/themes/shared/zen-icons/lin/video-fill.svg new file mode 100644 index 00000000..87b2bf58 --- /dev/null +++ b/src/browser/themes/shared/zen-icons/lin/video-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file