Compare commits

..

2 Commits

Author SHA1 Message Date
Leah Rowe 80118a24b8 experimental asus a88hm-e support
no auto-downloading or inserting of vga roms
and other files yet. i did this for someone one
irc who wanted an easier build

i deleted all other boards, just for this
branch. this branch *only* builds that one board.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2023-11-10 18:05:36 +00:00
Leah Rowe fcf27a5719 delete all boards
Signed-off-by: Leah Rowe <leah@libreboot.org>
2023-11-10 18:05:13 +00:00
493 changed files with 21465 additions and 37480 deletions
+2 -17
View File
@@ -1,9 +1,8 @@
*~
*.o
/cache/
/lbmk.err.log
/repo/
/docs/
/cbutils/
/pciroms/
/util/dell-flash-unlock/dell_flash_unlock
/TODO
@@ -24,23 +23,9 @@
/push
/version
/versiondate
/.version
/.versiondate
/vendorfiles/
*me.bin
*sch5545ec.bin
/mrc/
/util/nvmutil/nvm
/src/
/CHANGELOG
/todo.txt
/lock
/hash/
/dump/
/qrun*.sh
*.tar.*
/m
/f
/r
/e
/xbmkpath/
/xbmkwd/
-6
View File
@@ -1,9 +1,3 @@
NOTE: This applies to lwmk.git, a fork of LibreBook MaKe (lbmk).
The Libreboot build system was used as a base, to produce the
new LibreWolf build system. This file was just "COPYING" in the
original lbmk, as that build system was largely provided under
the following, terrible license:
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
+123 -322
View File
@@ -1,322 +1,123 @@
<div align="center">
![Librewolf Logo](./patches/pref-pane/category-librewolf.svg)
**THIS WILL BE REMOVED AT A LATER DATE.**
It's a proof of concept showing early modifications of lbmk, turning it into
lwmk - LibreWolf MaKe, for building librewolf releases. I'm doing this for
fun, to replace LibreWolf's source.git and bsys6.git build systems. Most
features not added yet, but lbmk's "mkhelper" feature can (and will) be used
to implement custom logic e.g. interacting with the mach build system in
firefox. This will be a unified package manager for building *many* firefox
derivatives, starting with LibreWolf, with the aim that all of the mozilla
forks later use it, and perhaps work more closely with each other. I will
publish this on a separate website when it's ready. **You are looking at
an old version of it. I'm much further ahead locally. I will release it
when it's finished!"
# LibreWolf
This repository contains all the patches and theming that make up LibreWolf,
as well as the LibreWolf preferences (in [settings/](./settings)) and the
scripts and Makefile to build LibreWolf.
This is a re-design of the LibreWolf build system, called LibreWolf MaKe, or
just lwmk for short. It is a fork of the LibreBoot MaKe (lbmk) build system,
which Libreboot uses to build coreboot images. It was decided that this design
is beneficial for LibreWolf, as it offers advanced features by comparison, such
as:
* Automatic caching of sources when downloading (Git repositories are used)
* Redundant repository links are possible, for reliability in the future
* Ability to declare custom git submodules, regardless of whether a project
uses them; actual git submodules are unused. The lwmk design allows
systematic patching and revision resets on submodules.
* Ability to download files as submodules as well, hash-checking everything.
Both git repositories and files are checked relentlessly, even when using
local cache, to ensure integrity and general reproducibility.
* Multi-tree design: projects like firefox can be build single- or multi-tree.
In lwmk nomenclature, this means that a given project can have multiple
targets, or just build one target. Multi-tree is preferred, where feasible;
in lwmk, you can specify multiple revisions of Firefox, and multiple targets
off of each tree name on the given revision. An application for this might
be providing LibreWolf along with variants like LibreWolf-Hellfire, or
more opiniated forks of LibreWolf that mostly just change a few configs.
* Completely generalised design. The `mk` script and `include/` directory do
not generally contain project-specific build logic. Each project can use
mkhelpers to specify custom steps e.g. pre-configure, post-build, and so on,
much like on a BSD ports system. This design is reminiscent of a Linux distro,
because indeed it was first implemented for Libreboot which is a coreboot
distro; this design generalises the downloading, patching and building
of any source tree. It is highly flexible and configurable.
* Ease of use. Despite high configurability, the overarching philosophy is
like that for OpenBSD: Knobs are for nobs. We want everything to be as simple
as possible for the user, with sane defaults for everything. The design
of the entire build system reflects this philosophy.
The lwmk build system can generate binaries on the spot, and it does so
using out-of-tree building. It can also generate clean source tarballs of
sources e.g. Firefox sources.
The multi-tree nature of LibreWolf MaKe mean that you can support any number
of actual Firefox derivatives. This build system is designed for use with
the LibreWolf project, but it is intended that this design be used on every
other Firefox fork; perhaps the projects can even work with each other, or
there can be another project that uses this design and generalises all of
the Mozilla forks. This might be useful for Linux distros, which can then
just do something like:
./mk -b firefox
This would build every variant of Firefox in lwmk. Every defined tree, at each
defined revision, for each target defined referencing each tree. The best
part: because it uses the same design from the Libreboot build system, there
are *no make files* in the tree, until you run `./mk -f`.
One caveat: this is a very much Linux- and BSD-brained build system. It is
NOT designed to run on others like Windows or Mac. That being said, it can
generate source tarballs of Firefox and its variants such as LibreWolf. These
tarballs are cross-platform, and that will always be the case.
</div>
## Infra
### Overview
```mermaid
graph LR
FFSRC(Firefox Source)
FFSRC--Tarball--->Source
subgraph LibreWolf/
Website(Website<br><br>- Documentation<br>- FAQ)
subgraph Browser/
Source(Source<br><br>- Patches<br>- Theming<br>- Settings<br>- Weblate<br>- Build scripts)
bsys6(bsys6<br><br>New Docker building<br>repository)
AppImage
ArchGentoo["Arch / Gentoo"]
end
end
Website-->librewolf.net
Source--"Source tarball"-->bsys6
AppImage--".appimage"-->librewolf.net
bsys6--"Windows setup.exe"--->librewolf.net
bsys6--"Windows portable.zip"--->librewolf.net
bsys6--"Windows .msix"--->MS("Microsoft Store")
bsys6--"Windows .nupkg"--->Chocolatey
bsys6--"Linux binary tarball"--->Flathub
bsys6--"Linux binary tarball"--> AppImage
bsys6--"Linux .deb"--->repo.librewolf.net
bsys6--"Linux .rpm"--->repo.librewolf.net
bsys6--"Linux binary tarball<br>for 'librewolf-bin'"--> ArchGentoo
Source--"Source tarball<br>for 'librewolf'"-->ArchGentoo
ArchGentoo-->AUR_Overlay["AUR / Overlay"]
```
### Packages
These are the locations where people have their repositories and build artifacts.
Active:
- [Arch](https://archlinux.org/packages/extra/x86_64/librewolf/) - Arch Linux package
- [BSYS6](https://librewolf.dev/librewolf/bsys6) - Linux Mint, Fedora,
Ubuntu, MacOS, portable and setup for Windows
- [Gentoo](https://codeberg.org/librewolf/gentoo) - Gentoo GNU/Linux package
Downstream:
- [Alpine Linux](https://pkgs.alpinelinux.org/packages?name=librewolf&arch=)
### Forks
Previous:
- [CachyOS Browser](https://github.com/cachyos/cachyos-browser-settings)
- [FireDragon Browser](https://github.com/dr460nf1r3/firedragon-browser)
## Build
There are two ways to build LibreWolf.
You can either use the source tarball
or compile directly with this repository.
### Build: Tarball
1. Let's **[download the latest tarball](https://librewolf.dev/librewolf/source/releases)**.
This tarball is the latest produced by the [CI](https://librewolf.dev/librewolf/source/actions?workflow=source-release.yaml).
You can also check the `sha256sum` of the tarball there:
```bash
tar xf <tarball>
cd <folder>
```
2. Then, you have to bootstrap your system to be able to build LibreWolf.
You only have to do this one time.
It is done by running the following command:
```bash
./mach --no-interactive bootstrap --application-choice=browser
```
3. Build LibreWolf and then package or run it with the following commands:
```bash
./mach build && ./mach package
# or
./mach build && ./mach run
```
> [!NOTE]
>
> To get all parameters of `./mach`, use:
>
> ```bash
> ./mach configure -- --help | less
> ```
### Build: Repository
1. Clone this repository with Git:
```bash
git clone --recursive git@librewolf.dev:librewolf/source.git librewolf-source --depth=1 && cd librewolf-source
```
2. Build LibreWolf source code,
also you have to bootstrap your system to be able to build LibreWolf.
You only have to do this one time.
```bash
make dir && make bootstrap
```
3. Package LibreWolf or run it with the following commands:
```bash
make build && make package
# or
make build && make run
```
## Translations
We use Weblate to localize all LibreWolf-specific strings.
You can help us by translating LibreWolf into your language at
<https://translate.codeberg.org/engage/librewolf>.
Here is the current translation status:
<a href="https://translate.codeberg.org/engage/librewolf/">
<img src="https://translate.codeberg.org/widget/librewolf/multi-auto.svg" alt="Translation status"/>
</a>
## Development
### Development: Creating a patch
The easiest way to make patches is to go to the LibreWolf source folder:
```bash
cd librewolf-$(cat version)
git init
git add <path_to_file_you_changed>
git commit -am initial-commit
git diff > ../mypatch.patch
```
We have Gitter / Matrix rooms,
and on the website we have links to the various issue trackers.
### Development: Existing patches
The easiest way to make patches is to go to the LibreWolf source folder:
```bash
make fetch
./scripts/git-patchtree.sh patches/sed-patches/disable-pocket.patch
```
Now change the source tree the way you want,
keeping in mind to `git add` new files.
When done, you can create the new patch with:
```bash
cd firefox-<version>
git diff 4b825dc642cb6eb9a060e54bf8d69288fbee4904 HEAD > ../my-patch-name.patch
```
This ID is the hash value of the first commit, which is called `initial`.
Don't forget to commit changes before doing this diff,
or the patch will be incomplete.
### Development: Creating a patch for problems in Mozilla's [Bugzilla](https://bugzilla.mozilla.org)
Well, first of all:
- [Create an account](https://bugzilla.mozilla.org/createaccount.cgi).
- Handy link: [Bugs Filed Today](https://bugzilla.mozilla.org/buglist.cgi?cmdtype=dorem&remaction=run&namedcmd=Bugs%20Filed%20Today&sharer_id=1&list_id=15939480).
- The essential: [Firefox Source Tree Documentation](https://firefox-source-docs.mozilla.org/).
Now that you have a patch in LibreWolf, that's not enough to upload to Mozilla.
See, Mozilla only accepts patches against Nightly.
So here is how to do that:
1. If you have not done so already,
create the `mozilla-unified` folder and build Firefox with it:
```bash
hg clone https://hg.mozilla.org/mozilla-unified && cd mozilla-unified
hg update
MOZBUILD_STATE_PATH=$HOME/.mozbuild ./mach --no-interactive bootstrap --application-choice=browser
./mach build
./mach run
```
2. If you skipped the previous step, you could ensure that you're up to date with:
```bash
cd mozilla-unified
hg pull && hg update
```
3. Now you can apply your patch to Nightly:
```bash
patch -p1 -i ../mypatch.patch
```
4. Now, let Mercurial create the patch:
```bash
hg diff > ../my-nightly-patch.patch
```
5. After this, it can be uploaded to Bugzilla.
#### Development: Contributing
Time to start hacking! You should join us on [Matrix](https://chat.mozilla.org),
say hello in the [Introduction channel](https://chat.mozilla.org/#/room/#introduction:mozilla.org),
and [find a bug to start working on](https://codetribute.mozilla.org).
See the [Firefox Contributors' Quick Reference](https://firefox-source-docs.mozilla.org/contributing/contribution_quickref.html#firefox-contributors-quick-reference)
to learn how to test your changes,
send patches to Mozilla,
update your source code locally, and more.
## MacOS and Windows
We understand, life isn't always fair 😺.
The same steps as above apply you will just have to walk through
the beginning part of the guides for:
- [MacOS](https://firefox-source-docs.mozilla.org/setup/macos_build.html):
The cross-compiled Mac `.dmg` files are somewhat new.
They should work, perhaps with the exception of the `make setup-wasi` step.
- [Windows](https://firefox-source-docs.mozilla.org/setup/windows_build.html):
Building on Windows is not very well tested.
Help with testing these targets is always welcome.
Libreboot
=========
Find libreboot documentation at <https://libreboot.org/>
The `libreboot` project provides
[libre](https://libreboot.org/freedom-status.html) *boot
firmware* that initializes the hardware (e.g. memory controller, CPU,
peripherals) on specific Intel/AMD x86 and ARM targets, which
then starts a bootloader for your operating system. Linux/BSD are
well-supported. It replaces proprietary BIOS/UEFI firmware. Help is available
via [\#libreboot IRC](https://web.libera.chat/#libreboot)
on [Libera](https://libera.chat/) IRC.
Why use Libreboot?
==================
Why should you use *libreboot*?
----------------------------
Libreboot gives you freedoms that you otherwise can't get with most other
boot firmware. It's extremely powerful and configurable for many use cases.
You have rights. The right to privacy, freedom of thought, freedom of speech
and the right to read. In this context, Libreboot gives you these rights.
Your freedom matters.
[Right to repair](https://vid.puffyan.us/watch?v=Npd_xDuNi9k) matters.
Many people use proprietary (non-libre)
boot firmware, even if they use [a libre OS](https://www.openbsd.org/).
Proprietary firmware often contains backdoors (more info on the FAQ), and it
and can be buggy. The libreboot project was founded in December 2013,
with the express purpose of making coreboot firmware accessible for
non-technical users.
The `libreboot` project uses [coreboot](https://www.coreboot.org/) for [hardware
initialisation](https://doc.coreboot.org/getting_started/architecture.html).
Coreboot is notoriously difficult to install for most non-technical users; it
handles only basic initialization and jumps to a separate
[payload](https://doc.coreboot.org/payloads.html) program (e.g.
[GRUB](https://www.gnu.org/software/grub/),
[Tianocore](https://www.tianocore.org/)), which must also be configured.
*The libreboot software solves this problem*; it is a *coreboot distribution* with
an automated build system (named *lbmk*) that builds complete *ROM images*, for
more robust installation. Documentation is provided.
How does Libreboot differ from coreboot?
========================================
In the same way that *Debian* is a GNU+Linux distribution, `libreboot` is
a *coreboot distribution*. If you want to build a ROM image from scratch, you
otherwise have to perform expert-level configuration of coreboot, GRUB and
whatever other software you need, to prepare the ROM image. With *libreboot*,
you can literally download from Git or a source archive, and run `make`, and it
will build entire ROM images. An automated build system, named `lbmk`
(Libreboot MaKe), builds these ROM images automatically, without any user input
or intervention required. Configuration has already been performed in advance.
If you were to build regular coreboot, without using libreboot's automated
build system, it would require a lot more intervention and decent technical
knowledge to produce a working configuration.
Regular binary releases of `libreboot` provide these
ROM images pre-compiled, and you can simply install them, with no special
knowledge or skill except the ability to follow installation instructions
and run commands BSD/Linux.
Project goals
=============
- *Support as much hardware as possible!* Libreboot aims to eventually
have *maintainers* for every board supported by coreboot, at every
point in time.
- *Make coreboot easy to use*. Coreboot is notoriously difficult
to install, due to an overall lack of user-focused documentation
and support. Most people will simply give up before attempting to
install coreboot. Libreboot's automated build system and user-friendly
installation instructions solves this problem.
Libreboot attempts to bridge this divide by providing a build system
automating much of the coreboot image creation and customization.
Secondly, the project produces documentation aimed at non-technical users.
Thirdly, the project attempts to provide excellent user support via IRC.
Libreboot already comes with a payload (GRUB), flashrom and other
needed parts. Everything is fully integrated, in a way where most of
the complicated steps that are otherwise required, are instead done
for the user in advance.
You can download ROM images for your libreboot system and install
them without having to build anything from source. If, however, you are
interested in building your own image, the build system makes it relatively
easy to do so.
Not a coreboot fork!
--------------------
Libreboot is not a fork of coreboot. Every so often, the project
re-bases on the latest version of coreboot, with the number of custom
patches in use minimized. Tested, *stable* (static) releases are then provided
in Libreboot, based on specific coreboot revisions.
How to help
===========
You can check bugs listed on
the [bug tracker](https://codeberg.org/libreboot/lbmk/issues).
If you spot a bug and have a fix, the website has instructions for how to send
patches, and you can also report it. Also, this entire website is
written in Markdown and hosted in a [separate
repository](https://codeberg.org/libreboot/lbwww) where you can send patches.
Any and all development discussion and user support are all done on the IRC
channel. More information is on https://libreboot.org/contact.html.
LICENSE FOR THIS README
=======================
It's just a README file. This README file is released under the terms of the
Creative Commons Zero license, version 1.0 of the license, which you can
read here:
<https://creativecommons.org/publicdomain/zero/1.0/legalcode.txt>
Executable
+165
View File
@@ -0,0 +1,165 @@
#!/usr/bin/env sh
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2014,2015,2020,2021,2023 Leah Rowe <leah@libreboot.org>
# SPDX-FileCopyrightText: 2015 Patrick "P. J." McDermott <pj@pehjota.net>
# SPDX-FileCopyrightText: 2015, 2016 Klemens Nanni <contact@autoboot.org>
# SPDX-FileCopyrightText: 2022, Caleb La Grange <thonkpeasant@protonmail.com>
[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e
export LC_COLLATE=C
export LC_ALL=C
. "include/err.sh"
. "include/option.sh"
eval "$(setvars "" option aur_notice tmpdir)"
tmpdir_was_set="y"
set | grep TMPDIR 1>/dev/null 2>/dev/null || tmpdir_was_set="n"
if [ "${tmpdir_was_set}" = "y" ]; then
tmpdir="${TMPDIR##*/}"
tmpdir="${TMPDIR%_*}"
if [ "${tmpdir}" = "lbmk" ]; then
tmpdir=""
tmpdir_was_set="n"
fi
fi
if [ "${tmpdir_was_set}" = "n" ]; then
export TMPDIR="/tmp"
tmpdir="$(mktemp -d -t lbmk_XXXXXXXX)"
export TMPDIR="${tmpdir}"
else
export TMPDIR="${TMPDIR}"
fi
tmpdir="${TMPDIR}"
linkpath="${0}"
linkname="${linkpath##*/}"
buildpath="./script/${linkname}"
main()
{
xx_ id -u 1>/dev/null 2>/dev/null
[ $# -lt 1 ] && fail "Too few arguments. Try: ${0} help"
if [ "${1}" = "dependencies" ]; then
xx_ install_packages $@
lbmk_exit 0
fi
initialise_command $@ && shift 1
check_git
check_project "fail"
git_init
execute_command $@
lbmk_exit 0
}
initialise_command()
{
[ "$(id -u)" != "0" ] || fail "this command as root is not permitted"
check_project
case "${1}" in
help)
usage ${0}
lbmk_exit 0 ;;
list)
items "${buildpath}"
lbmk_exit 0 ;;
version)
mkversion
lbmk_exit 0 ;;
esac
option="${1}"
}
install_packages()
{
if [ $# -lt 2 ]; then
printf "You must specify a distro, namely:\n" 1>&2
printf "Look at files under config/dependencies/\n" 1>&2
printf "Example: ./build dependencies debian\n" 1>&2
fail "install_packages: target not specified"
fi
[ -f "config/dependencies/${2}" ] || fail "Unsupported target"
. "config/dependencies/${2}"
xx_ ${pkg_add} ${pkglist}
[ -z "${aur_notice}" ] && return 0
printf "You must install AUR packages: %s\n" "${aur_notice}" 1>&2
}
# release archives contain .gitignore, but not .git.
# lbmk can be run from lbmk.git, or an archive.
git_init()
{
[ -L ".git" ] && fail "Reference .git is a symlink"
[ -e ".git" ] && return 0
eval "$(setvars "$(date -Rd @${versiondate})" cdate _nogit)"
git init || fail "${PWD}: cannot initialise Git repository"
git add -A . || fail "${PWD}: cannot add files to Git repository"
git commit -m "${projectname} ${version}" --date "${cdate}" \
--author="lbmk <lbmk@libreboot.org>" || \
fail "${PWD}: can't commit ${projectname}/${version}, date ${cdate}"
git tag -a "${version}" -m "${projectname} ${version}" || \
fail "${PWD}: cannot git-tag ${projectname}/${version}"
}
execute_command()
{
lbmkcmd="${buildpath}/${option}"
[ -f "${lbmkcmd}" ] || fail "Invalid command. Run: ${linkpath} help"
"${lbmkcmd}" $@ || fail "execute_command: ${lbmkcmd} ${@}"
}
usage()
{
progname=${0}
cat <<- EOF
$(mkversion)
USAGE: ${progname} <OPTION>
possible values for 'OPTION':
$(items "${buildpath}")
To know what ${projectname} version you're on, type:
${progname} version
Refer to ${projectname} documentation for more info.
EOF
}
mkversion()
{
printf "revision: %s %s\n" "${projectname}" "${version}"
printf "revision date: %s\n" "$(date -Rud @${versiondate})"
}
lbmk_exit()
{
tmp_cleanup || err "lbmk_exit: can't rm tmpdir upon exit $1: ${tmpdir}"
exit $1
}
fail()
{
tmp_cleanup || printf "WARNING: can't rm tmpdir: %s\n" "${tmpdir}" 1>&2
err "${1}"
}
tmp_cleanup()
{
[ "${tmpdir_was_set}" = "n" ] || return 0
rm -Rf "${tmpdir}" || return 1
}
main $@
+589
View File
@@ -0,0 +1,589 @@
#
# Automatically generated file; DO NOT EDIT.
# coreboot configuration
#
#
# General setup
#
CONFIG_COREBOOT_BUILD=y
CONFIG_LOCALVERSION=""
CONFIG_CBFS_PREFIX="fallback"
CONFIG_COMPILER_GCC=y
# CONFIG_COMPILER_LLVM_CLANG is not set
CONFIG_ARCH_SUPPORTS_CLANG=y
# CONFIG_ANY_TOOLCHAIN is not set
# CONFIG_CCACHE is not set
# CONFIG_IWYU is not set
# CONFIG_FMD_GENPARSER is not set
# CONFIG_UTIL_GENPARSER is not set
CONFIG_OPTION_BACKEND_NONE=y
# CONFIG_USE_OPTION_TABLE is not set
CONFIG_COMPRESS_RAMSTAGE=y
CONFIG_INCLUDE_CONFIG_FILE=y
CONFIG_COLLECT_TIMESTAMPS=y
# CONFIG_TIMESTAMPS_ON_CONSOLE is not set
CONFIG_USE_BLOBS=y
# CONFIG_USE_AMD_BLOBS is not set
# CONFIG_USE_QC_BLOBS is not set
# CONFIG_COVERAGE is not set
# CONFIG_UBSAN is not set
CONFIG_HAVE_ASAN_IN_RAMSTAGE=y
# CONFIG_ASAN is not set
CONFIG_NO_STAGE_CACHE=y
# CONFIG_CBMEM_STAGE_CACHE is not set
# CONFIG_UPDATE_IMAGE is not set
# CONFIG_BOOTSPLASH_IMAGE is not set
# CONFIG_FW_CONFIG is not set
#
# Software Bill Of Materials (SBOM)
#
# CONFIG_SBOM is not set
# end of Software Bill Of Materials (SBOM)
# end of General setup
#
# Mainboard
#
#
# Important: Run 'make distclean' before switching boards
#
# CONFIG_VENDOR_51NB is not set
# CONFIG_VENDOR_ACER is not set
# CONFIG_VENDOR_ADLINK is not set
# CONFIG_VENDOR_AMD is not set
# CONFIG_VENDOR_AOPEN is not set
# CONFIG_VENDOR_APPLE is not set
# CONFIG_VENDOR_ASROCK is not set
CONFIG_VENDOR_ASUS=y
# CONFIG_VENDOR_BAP is not set
# CONFIG_VENDOR_BIOSTAR is not set
# CONFIG_VENDOR_BOSTENTECH is not set
# CONFIG_VENDOR_CAVIUM is not set
# CONFIG_VENDOR_CLEVO is not set
# CONFIG_VENDOR_COMPULAB is not set
# CONFIG_VENDOR_DELL is not set
# CONFIG_VENDOR_ELMEX is not set
# CONFIG_VENDOR_EMULATION is not set
# CONFIG_VENDOR_EXAMPLE is not set
# CONFIG_VENDOR_FACEBOOK is not set
# CONFIG_VENDOR_FOXCONN is not set
# CONFIG_VENDOR_GETAC is not set
# CONFIG_VENDOR_GIGABYTE is not set
# CONFIG_VENDOR_GIZMOSPHERE is not set
# CONFIG_VENDOR_GOOGLE is not set
# CONFIG_VENDOR_HP is not set
# CONFIG_VENDOR_IBASE is not set
# CONFIG_VENDOR_INTEL is not set
# CONFIG_VENDOR_JETWAY is not set
# CONFIG_VENDOR_KONTRON is not set
# CONFIG_VENDOR_LENOVO is not set
# CONFIG_VENDOR_LIBRETREND is not set
# CONFIG_VENDOR_LIPPERT is not set
# CONFIG_VENDOR_MSI is not set
# CONFIG_VENDOR_OCP is not set
# CONFIG_VENDOR_OPENCELLULAR is not set
# CONFIG_VENDOR_PACKARDBELL is not set
# CONFIG_VENDOR_PCENGINES is not set
# CONFIG_VENDOR_PINE64 is not set
# CONFIG_VENDOR_PORTWELL is not set
# CONFIG_VENDOR_PRODRIVE is not set
# CONFIG_VENDOR_PROTECTLI is not set
# CONFIG_VENDOR_PURISM is not set
# CONFIG_VENDOR_RAZER is not set
# CONFIG_VENDOR_RODA is not set
# CONFIG_VENDOR_SAMSUNG is not set
# CONFIG_VENDOR_SAPPHIRE is not set
# CONFIG_VENDOR_SCALEWAY is not set
# CONFIG_VENDOR_SIEMENS is not set
# CONFIG_VENDOR_SIFIVE is not set
# CONFIG_VENDOR_STARLABS is not set
# CONFIG_VENDOR_SUPERMICRO is not set
# CONFIG_VENDOR_SYSTEM76 is not set
# CONFIG_VENDOR_TI is not set
# CONFIG_VENDOR_UP is not set
CONFIG_BOARD_SPECIFIC_OPTIONS=y
CONFIG_MAINBOARD_PART_NUMBER="A88XM-E"
CONFIG_MAINBOARD_VERSION="1.0"
CONFIG_MAINBOARD_DIR="asus/a88xm-e"
CONFIG_VGA_BIOS_ID="1002,9996"
CONFIG_DIMM_MAX=4
CONFIG_DIMM_SPD_SIZE=256
CONFIG_FMDFILE=""
# CONFIG_NO_POST is not set
CONFIG_MAINBOARD_VENDOR="ASUS"
CONFIG_CBFS_SIZE=0x00800000
CONFIG_CONSOLE_SERIAL=y
CONFIG_MAX_CPUS=4
CONFIG_ONBOARD_VGA_IS_PRIMARY=y
CONFIG_POST_DEVICE=y
CONFIG_POST_IO=y
CONFIG_UART_FOR_CONSOLE=0
CONFIG_EFS_SPI_READ_MODE=2
CONFIG_EFS_SPI_SPEED=1
CONFIG_EFS_SPI_MICRON_FLAG=0
CONFIG_NORMAL_READ_SPI_SPEED=1
CONFIG_ALT_SPI_SPEED=1
CONFIG_TPM_SPI_SPEED=1
# CONFIG_VBOOT is not set
CONFIG_IRQ_SLOT_COUNT=11
CONFIG_HW_MEM_HOLE_SIZEK=0x200000
CONFIG_DEVICETREE="devicetree.cb"
# CONFIG_HUDSON_LEGACY_FREE is not set
CONFIG_OVERRIDE_DEVICETREE=""
CONFIG_VGA_BIOS=y
CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="ASUS"
CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00
CONFIG_BOARD_ASUS_A88XM_E=y
# CONFIG_BOARD_ASUS_AM1I_A is not set
# CONFIG_BOARD_ASUS_F2A85_M is not set
# CONFIG_BOARD_ASUS_F2A85_M_PRO is not set
# CONFIG_BOARD_ASUS_F2A85_M_LE is not set
# CONFIG_BOARD_ASUS_H61M_CS is not set
# CONFIG_BOARD_ASUS_P8H61_M_LX is not set
# CONFIG_BOARD_ASUS_P8H61_M_LX3_R2_0 is not set
# CONFIG_BOARD_ASUS_P8H61_M_PRO is not set
# CONFIG_BOARD_ASUS_P8H61_M_PRO_CM6630 is not set
# CONFIG_BOARD_ASUS_MAXIMUS_IV_GENE_Z is not set
# CONFIG_BOARD_ASUS_P2B is not set
# CONFIG_BOARD_ASUS_P2B_D is not set
# CONFIG_BOARD_ASUS_P2B_DS is not set
# CONFIG_BOARD_ASUS_P2B_F is not set
# CONFIG_BOARD_ASUS_P2B_LS is not set
# CONFIG_BOARD_ASUS_P3B_F is not set
# CONFIG_BOARD_ASUS_P5GC_MX is not set
# CONFIG_BOARD_ASUS_P5QC is not set
# CONFIG_BOARD_ASUS_P5Q_PRO is not set
# CONFIG_BOARD_ASUS_P5QL_PRO is not set
# CONFIG_BOARD_ASUS_P5Q_SE is not set
# CONFIG_BOARD_ASUS_P5Q is not set
# CONFIG_BOARD_ASUS_P5QL_EM is not set
# CONFIG_BOARD_ASUS_P5QPL_AM is not set
# CONFIG_BOARD_ASUS_P5G41T_M_LX is not set
# CONFIG_BOARD_ASUS_P8C_WS is not set
# CONFIG_BOARD_ASUS_P8H77_V is not set
# CONFIG_BOARD_ASUS_P8Z77_M_PRO is not set
# CONFIG_BOARD_ASUS_P8Z77_V_LX2 is not set
# CONFIG_BOARD_ASUS_P8Z77_V is not set
# CONFIG_BOARD_ASUS_P8Z77_M is not set
# CONFIG_HUDSON_XHCI_FWM is not set
# CONFIG_HUDSON_XHCI_ENABLE is not set
CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout"
CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0
# CONFIG_CONSOLE_POST is not set
CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld"
CONFIG_DCACHE_RAM_BASE=0x30000
CONFIG_DCACHE_RAM_SIZE=0x10000
CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000
CONFIG_DCACHE_BSP_STACK_SIZE=0x4000
CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xF8000000
CONFIG_ECAM_MMCONF_BUS_NUMBER=64
CONFIG_MAX_ACPI_TABLE_SIZE_KB=144
CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000
CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y
CONFIG_SPI_FLASH_WINBOND=y
CONFIG_DRIVERS_INTEL_WIFI=y
CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000
CONFIG_VGA_BIOS_FILE="../../../pciroms/pci1002,9996.rom"
CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="A88XM-E"
CONFIG_PS2K_EISAID="PNP0303"
CONFIG_PS2M_EISAID="PNP0F13"
# CONFIG_PCIEXP_L1_SUB_STATE is not set
# CONFIG_PCIEXP_CLK_PM is not set
CONFIG_DRIVERS_UART_8250IO=y
CONFIG_HEAP_SIZE=0xc0000
CONFIG_EC_GPE_SCI=0x50
CONFIG_BOARD_ROMSIZE_KB_8192=y
# CONFIG_COREBOOT_ROMSIZE_KB_256 is not set
# CONFIG_COREBOOT_ROMSIZE_KB_512 is not set
# CONFIG_COREBOOT_ROMSIZE_KB_1024 is not set
# CONFIG_COREBOOT_ROMSIZE_KB_2048 is not set
# CONFIG_COREBOOT_ROMSIZE_KB_4096 is not set
# CONFIG_COREBOOT_ROMSIZE_KB_5120 is not set
# CONFIG_COREBOOT_ROMSIZE_KB_6144 is not set
CONFIG_COREBOOT_ROMSIZE_KB_8192=y
# CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set
# CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set
# CONFIG_COREBOOT_ROMSIZE_KB_16384 is not set
# CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set
# CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set
CONFIG_COREBOOT_ROMSIZE_KB=8192
CONFIG_ROM_SIZE=0x00800000
# end of Mainboard
#
# Chipset
#
#
# SoC
#
CONFIG_ARCH_ALL_STAGES_X86=y
CONFIG_CHIPSET_DEVICETREE=""
CONFIG_CBFS_MCACHE_SIZE=0x4000
CONFIG_ROMSTAGE_ADDR=0x2000000
CONFIG_VERSTAGE_ADDR=0x2000000
# CONFIG_VGA_BIOS_SECOND is not set
CONFIG_ACPI_CPU_STRING="\\_SB.CP%02d"
CONFIG_BOTTOMIO_POSITION=0x80000000
CONFIG_EHCI_BAR=0xfef00000
CONFIG_AHCI_ROM_ID="1022,7801"
CONFIG_STACK_SIZE=0x2000
CONFIG_VBT_DATA_SIZE_KB=8
CONFIG_INTEL_GMA_BCLV_OFFSET=0xc8254
CONFIG_INTEL_GMA_BCLV_WIDTH=16
CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256
CONFIG_INTEL_GMA_BCLM_WIDTH=16
CONFIG_BOOTBLOCK_IN_CBFS=y
# CONFIG_PCIEXP_ASPM is not set
# CONFIG_PCIEXP_COMMON_CLOCK is not set
CONFIG_TTYS0_BASE=0x3f8
CONFIG_TTYS0_LCS=3
CONFIG_UART_PCI_ADDR=0x0
CONFIG_SOC_AMD_COMMON=y
CONFIG_SOC_AMD_COMMON_BLOCK_ACPIMMIO=y
CONFIG_SOC_AMD_COMMON_BLOCK_ACPIMMIO_BIOSRAM=y
CONFIG_CBFS_CACHE_ALIGN=8
CONFIG_SOC_AMD_COMMON_BLOCK_PCI_MMCONF=y
# CONFIG_SOC_AMD_COMMON_BLOCK_SPI_DEBUG is not set
#
# CPU
#
CONFIG_CPU_AMD_AGESA=y
CONFIG_UDELAY_LAPIC_FIXED_FSB=200
# CONFIG_ENABLE_MRC_CACHE is not set
CONFIG_CPU_AMD_AGESA_FAMILY15_TN=y
CONFIG_SSE2=y
CONFIG_LEGACY_SMP_INIT=y
CONFIG_XAPIC_ONLY=y
CONFIG_UDELAY_LAPIC=y
CONFIG_LAPIC_MONOTONIC_TIMER=y
CONFIG_UNKNOWN_TSC_RATE=y
CONFIG_TSC_SYNC_LFENCE=y
CONFIG_LOGICAL_CPUS=y
CONFIG_SMM_ASEG=y
CONFIG_X86_AMD_FIXED_MTRRS=y
CONFIG_SMP=y
CONFIG_SSE=y
#
# Northbridge
#
CONFIG_NORTHBRIDGE_AMD_AGESA=y
CONFIG_NORTHBRIDGE_AMD_AGESA_FAMILY15_TN=y
#
# Southbridge
#
CONFIG_SOUTHBRIDGE_AMD_AGESA_HUDSON=y
CONFIG_SOUTHBRIDGE_SPECIFIC_OPTIONS=y
CONFIG_HUDSON_SATA_MODE=2
#
# AHCI
#
# CONFIG_HUDSON_AHCI_ROM is not set
CONFIG_ACPI_ENABLE_THERMAL_ZONE=y
# CONFIG_PCIEXP_HOTPLUG is not set
CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000
CONFIG_RCBA_LENGTH=0x4000
#
# Super I/O
#
CONFIG_SUPERIO_ITE_COMMON_PRE_RAM=y
CONFIG_SUPERIO_ITE_ENV_CTRL=y
CONFIG_SUPERIO_ITE_ENV_CTRL_FAN16_CONFIG=y
CONFIG_SUPERIO_ITE_ENV_CTRL_8BIT_PWM=y
CONFIG_SUPERIO_ITE_ENV_CTRL_PWM_FREQ2=y
CONFIG_SUPERIO_ITE_ENV_CTRL_5FANS=y
CONFIG_SUPERIO_ITE_ENV_CTRL_7BIT_SLOPE_REG=y
CONFIG_SUPERIO_ITE_ENV_CTRL_EXT_ANY_TMPIN=y
CONFIG_SUPERIO_ITE_IT8728F=y
#
# Embedded Controllers
#
#
# AMD Platform Initialization
#
# CONFIG_CPU_AMD_AGESA_BINARY_PI is not set
CONFIG_CPU_AMD_AGESA_OPENSOURCE=y
CONFIG_IDS_OPTIONS_HOOKED_UP=y
CONFIG_IDS_ENABLED=y
#
# Warning: IDS options may not work. Enable at your own risk!
#
# CONFIG_IDS_CONTROL_ENABLED is not set
# CONFIG_IDS_PERF_ANALYSIS is not set
# CONFIG_IDS_TRACING_ENABLED is not set
CONFIG_CPU_AMD_AGESA_OPENSOURCE_MEM_JEDEC=y
# CONFIG_CPU_AMD_AGESA_OPENSOURCE_MEM_XMP_1 is not set
# CONFIG_CPU_AMD_AGESA_OPENSOURCE_MEM_XMP_2 is not set
# CONFIG_CPU_AMD_AGESA_OPENSOURCE_MEM_CUSTOM is not set
# CONFIG_AGESA_EXTRA_TIMESTAMPS is not set
# end of AMD Platform Initialization
CONFIG_ARCH_X86=y
CONFIG_ARCH_BOOTBLOCK_X86_32=y
CONFIG_ARCH_VERSTAGE_X86_32=y
CONFIG_ARCH_ROMSTAGE_X86_32=y
CONFIG_ARCH_POSTCAR_X86_32=y
CONFIG_ARCH_RAMSTAGE_X86_32=y
CONFIG_ARCH_ALL_STAGES_X86_32=y
CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y
CONFIG_NUM_IPI_STARTS=2
CONFIG_PC80_SYSTEM=y
CONFIG_POSTCAR_STAGE=y
CONFIG_BOOTBLOCK_SIMPLE=y
# CONFIG_BOOTBLOCK_NORMAL is not set
CONFIG_COLLECT_TIMESTAMPS_TSC=y
CONFIG_HAVE_CF9_RESET=y
CONFIG_HAVE_CF9_RESET_PREPARE=y
CONFIG_DEBUG_HW_BREAKPOINTS=y
CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y
# end of Chipset
#
# Devices
#
CONFIG_VGA_ROM_RUN_DEFAULT=y
# CONFIG_VGA_ROM_RUN is not set
CONFIG_NO_GFX_INIT=y
CONFIG_PCI=y
CONFIG_ECAM_MMCONF_SUPPORT=y
CONFIG_PCIX_PLUGIN_SUPPORT=y
CONFIG_CARDBUS_PLUGIN_SUPPORT=y
CONFIG_PCIEXP_PLUGIN_SUPPORT=y
CONFIG_ECAM_MMCONF_LENGTH=0x04000000
CONFIG_PCI_ALLOW_BUS_MASTER=y
CONFIG_PCI_SET_BUS_MASTER_PCI_BRIDGES=y
CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y
# CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS is not set
# CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR is not set
# CONFIG_EARLY_PCI_BRIDGE is not set
CONFIG_SUBSYSTEM_VENDOR_ID=0x0000
CONFIG_SUBSYSTEM_DEVICE_ID=0x0000
# CONFIG_VGA_BIOS_DGPU is not set
# CONFIG_SOFTWARE_I2C is not set
CONFIG_I2C_TRANSFER_TIMEOUT_US=500000
CONFIG_RESOURCE_ALLOCATOR_V3=y
# end of Devices
#
# Generic Drivers
#
CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000
# CONFIG_ELOG is not set
CONFIG_CACHE_MRC_SETTINGS=y
# CONFIG_MRC_SETTINGS_PROTECT is not set
CONFIG_SPI_FLASH=y
CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y
CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y
# CONFIG_SPI_FLASH_NO_FAST_READ is not set
CONFIG_SPI_FLASH_ADESTO=y
CONFIG_SPI_FLASH_AMIC=y
CONFIG_SPI_FLASH_ATMEL=y
CONFIG_SPI_FLASH_EON=y
CONFIG_SPI_FLASH_GIGADEVICE=y
CONFIG_SPI_FLASH_MACRONIX=y
CONFIG_SPI_FLASH_SPANSION=y
CONFIG_SPI_FLASH_SST=y
CONFIG_SPI_FLASH_STMICRO=y
CONFIG_DRIVERS_UART=y
# CONFIG_DRIVERS_UART_OXPCIE is not set
CONFIG_HAVE_USBDEBUG=y
CONFIG_HAVE_USBDEBUG_OPTIONS=y
# CONFIG_USBDEBUG is not set
# CONFIG_VPD is not set
CONFIG_DRIVERS_AMD_PI=y
# CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set
# CONFIG_DRIVERS_GENERIC_CBFS_UUID is not set
# CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set
# CONFIG_DRIVERS_GENESYSLOGIC_GL9755 is not set
# CONFIG_DRIVERS_GENESYSLOGIC_GL9763E is not set
# CONFIG_DRIVERS_I2C_MAX98396 is not set
CONFIG_INTEL_GMA_OPREGION_2_0=y
# CONFIG_DRIVERS_NXP_UWB_SR1XX is not set
# CONFIG_DRIVERS_PS2_KEYBOARD is not set
CONFIG_DRIVERS_MC146818=y
CONFIG_USE_PC_CMOS_ALTCENTURY=y
# CONFIG_DRIVERS_SIL_3114 is not set
CONFIG_DRIVERS_WIFI_GENERIC=y
# end of Generic Drivers
#
# Security
#
#
# CBFS verification
#
# CONFIG_CBFS_VERIFICATION is not set
# end of CBFS verification
#
# Verified Boot (vboot)
#
# end of Verified Boot (vboot)
#
# Trusted Platform Module
#
CONFIG_NO_TPM=y
# end of Trusted Platform Module
#
# Memory initialization
#
CONFIG_PLATFORM_HAS_DRAM_CLEAR=y
CONFIG_SECURITY_CLEAR_DRAM_ON_REGULAR_BOOT=y
# end of Memory initialization
CONFIG_BOOTMEDIA_LOCK_NONE=y
# CONFIG_BOOTMEDIA_LOCK_CONTROLLER is not set
# CONFIG_BOOTMEDIA_LOCK_CHIP is not set
# end of Security
CONFIG_ACPI_HAVE_PCAT_8259=y
CONFIG_HAVE_ACPI_TABLES=y
CONFIG_BOOT_DEVICE_SPI_FLASH=y
CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y
CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y
#
# Console
#
CONFIG_BOOTBLOCK_CONSOLE=y
CONFIG_POSTCAR_CONSOLE=y
CONFIG_SQUELCH_EARLY_SMP=y
#
# I/O mapped, 8250-compatible
#
#
# Serial port base address = 0x3f8
#
# CONFIG_CONSOLE_SERIAL_921600 is not set
# CONFIG_CONSOLE_SERIAL_460800 is not set
# CONFIG_CONSOLE_SERIAL_230400 is not set
CONFIG_CONSOLE_SERIAL_115200=y
# CONFIG_CONSOLE_SERIAL_57600 is not set
# CONFIG_CONSOLE_SERIAL_38400 is not set
# CONFIG_CONSOLE_SERIAL_19200 is not set
# CONFIG_CONSOLE_SERIAL_9600 is not set
CONFIG_TTYS0_BAUD=115200
# CONFIG_SPKMODEM is not set
# CONFIG_CONSOLE_NE2K is not set
CONFIG_CONSOLE_CBMEM=y
# CONFIG_CONSOLE_SPI_FLASH is not set
# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set
CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y
# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set
# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set
# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set
# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_3 is not set
# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_2 is not set
# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_1 is not set
# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_0 is not set
CONFIG_DEFAULT_CONSOLE_LOGLEVEL=7
CONFIG_CONSOLE_USE_LOGLEVEL_PREFIX=y
CONFIG_CONSOLE_USE_ANSI_ESCAPES=y
# CONFIG_CMOS_POST is not set
CONFIG_POST_DEVICE_NONE=y
# CONFIG_POST_DEVICE_LPC is not set
# CONFIG_POST_DEVICE_PCI_PCIE is not set
CONFIG_POST_IO_PORT=0x80
CONFIG_HWBASE_DEBUG_CB=y
# end of Console
CONFIG_HAVE_ACPI_RESUME=y
CONFIG_RESUME_PATH_SAME_AS_BOOT=y
CONFIG_HAVE_MONOTONIC_TIMER=y
CONFIG_HAVE_OPTION_TABLE=y
CONFIG_IOAPIC=y
CONFIG_GFXUMA=y
CONFIG_HAVE_MP_TABLE=y
CONFIG_HAVE_PIRQ_TABLE=y
#
# System tables
#
CONFIG_GENERATE_MP_TABLE=y
CONFIG_GENERATE_PIRQ_TABLE=y
CONFIG_GENERATE_SMBIOS_TABLES=y
CONFIG_MAINBOARD_SERIAL_NUMBER="123456789"
# end of System tables
#
# Payload
#
CONFIG_PAYLOAD_NONE=y
# CONFIG_PAYLOAD_ELF is not set
# CONFIG_PAYLOAD_BOOTBOOT is not set
# CONFIG_PAYLOAD_FILO is not set
# CONFIG_PAYLOAD_GRUB2 is not set
# CONFIG_PAYLOAD_SEAGRUB is not set
# CONFIG_PAYLOAD_LINUXBOOT is not set
# CONFIG_PAYLOAD_SEABIOS is not set
# CONFIG_PAYLOAD_UBOOT is not set
# CONFIG_PAYLOAD_YABITS is not set
# CONFIG_PAYLOAD_EDK2 is not set
# CONFIG_PAYLOAD_LINUX is not set
CONFIG_PAYLOAD_OPTIONS=""
# CONFIG_PXE is not set
# CONFIG_COMPRESS_SECONDARY_PAYLOAD is not set
#
# Secondary Payloads
#
# CONFIG_COREINFO_SECONDARY_PAYLOAD is not set
# CONFIG_GRUB2_SECONDARY_PAYLOAD is not set
# CONFIG_MEMTEST_SECONDARY_PAYLOAD is not set
# CONFIG_NVRAMCUI_SECONDARY_PAYLOAD is not set
# CONFIG_SEABIOS_SECONDARY_PAYLOAD is not set
# CONFIG_TINT_SECONDARY_PAYLOAD is not set
# CONFIG_COREDOOM_SECONDARY_PAYLOAD is not set
# end of Secondary Payloads
# end of Payload
#
# Debugging
#
#
# CPU Debug Settings
#
# CONFIG_DISPLAY_MTRRS is not set
#
# BLOB Debug Settings
#
#
# General Debug Settings
#
# CONFIG_GDB_STUB is not set
# CONFIG_FATAL_ASSERTS is not set
# CONFIG_DEBUG_CBFS is not set
# CONFIG_DEBUG_PIRQ is not set
# CONFIG_DEBUG_MALLOC is not set
# CONFIG_DEBUG_CONSOLE_INIT is not set
# CONFIG_DEBUG_SPI_FLASH is not set
# CONFIG_DEBUG_BOOT_STATE is not set
# CONFIG_DEBUG_ADA_CODE is not set
# end of Debugging
CONFIG_DECOMPRESS_OFAST=y
CONFIG_WARNINGS_ARE_ERRORS=y
CONFIG_MAX_REBOOT_CNT=3
CONFIG_RELOCATABLE_MODULES=y
CONFIG_HAVE_BOOTBLOCK=y
CONFIG_HAVE_ROMSTAGE=y
CONFIG_HAVE_RAMSTAGE=y
+8
View File
@@ -0,0 +1,8 @@
tree="default"
romtype="normal"
arch="x86_64"
payload_seabios="y"
payload_seabios_withgrub="y"
payload_seabios_grubonly="y"
payload_memtest="y"
grub_scan_disk="ahci"
+1
View File
@@ -0,0 +1 @@
build/coreboot.rom
+4
View File
@@ -0,0 +1,4 @@
tree="default"
romtype="normal"
rev="54d0cc9a3cf31963ebf0ca85a87a7e464ef678a7" # 4.18_branch
arch="x86_64"
-3
View File
@@ -1,3 +0,0 @@
bsdtar
bsdunzip
bsdcpio
-3
View File
@@ -1,3 +0,0 @@
# SPDX-License-Identifier: GPL-3.0-or-later
premake="autoreconf -fiv src/libarchive"
+11
View File
@@ -0,0 +1,11 @@
pkg_add="pacman -S --needed --noconfirm"
pkglist=" \
acpica arm-none-eabi-binutils arm-none-eabi-gcc arm-none-eabi-newlib \
autogen base-devel bison cmake curl device-mapper doxygen \
dtc e2fsprogs flex freetype2 fuse2 gawk gcc-ada gdb gettext git \
help2man innoextract libftdi libpciaccess libusb nasm ncurses openssl p7zip \
parted pciutils perl perl-libwww python python-setuptools rsync sharutils \
subversion swig texinfo ttf-dejavu unarchiver unzip wget xz zlib \
"
aur_notice="bdf-unifont unifont"
Regular → Executable
+13 -5
View File
@@ -1,7 +1,15 @@
# SPDX-License-Identifier: GPL-3.0-or-later
pkg_add="apt-get install --no-install-recommends $reinstall"
pkg_add="apt-get -y install"
pkglist=" \
mercurial python3 python3-dev python3-pip curl wget dpkg-sig libssl-dev zstd \
libxml2-dev
acpica-tools autoconf autogen automake autopoint autotools-dev bc \
binutils-arm-none-eabi bison build-essential cmake curl device-tree-compiler \
doxygen e2fsprogs efitools flex fonts-unifont gawk gcc-arm-linux-gnueabi \
gcc-arm-none-eabi gdb gettext git gnat help2man innoextract libdevmapper-dev \
libfdt-dev libfont-freetype-perl libfreetype6-dev libftdi-dev libfuse-dev \
libgnutls28-dev liblz4-tool liblzma-dev libncurses5-dev libncurses-dev \
libnewlib-arm-none-eabi libopts25 libopts25-dev libpci-dev libpython3-dev \
libsdl2-dev libselinux1-dev libssl-dev libtool libusb-1.0 libusb-1.0-0-dev \
libusb-dev lz4 lzma lzma-alone m4 nasm openssl p7zip p7zip-full parted pciutils \
perl pkg-config python3 python3-distutils python3-pkg-resources python3-pycryptodome \
python3-pyelftools python3-setuptools python-is-python3 sharutils swig unar \
unifont unzip uuid-dev wget zlib1g-dev \
"
-7
View File
@@ -1,7 +0,0 @@
# SPDX-License-Identifier: GPL-3.0-or-later
pkg_add="dnf ${reinstall}install"
pkglist=" \
python3 curl wget zstd python3-devel python3-pip mercurial openssl-devel \
libxml2-devel
"
+12
View File
@@ -0,0 +1,12 @@
pkg_add="dnf -y install"
pkglist=" \
acpica-tools arm-none-eabi-binutils arm-none-eabi-gcc \
arm-none-eabi-gcc arm-none-eabi-newlib autogen bison bzip2 cmake curl \
dejavu-fonts-all device-mapper doxygen e2fsprogs flex freetype-devel fuse \
gawk gcc gcc-gnat gdb gettext gettext-devel git gprbuild help2man \
innoextract intltool libftdi-devel libselinux-devel libusb1 libusb1-devel \
nasm ncurses-devel openssl-devel p7zip p7zip-plugins pandoc parted \
pciutils-devel perl perl-libwww-perl python-unversioned-command python3 \
python3-setuptools rsync sharutils subversion texinfo unar unifont \
unifont-fonts unifont-ttf-fonts unzip wget xz zlib-devel \
"
+1
View File
@@ -0,0 +1 @@
debian
+10
View File
@@ -0,0 +1,10 @@
pkg_add="pacman -S --needed --noconfirm"
pkglist=" \
acpica arm-none-eabi-binutils arm-none-eabi-gcc arm-none-eabi-newlib \
autogen base-devel bdf-unifont bison cmake curl device-mapper doxygen \
dtc e2fsprogs flex freetype2 fuse2 gawk gcc-ada gdb gettext git \
help2man innoextract libftdi libpciaccess libusb nasm ncurses openssl p7zip \
parted pciutils perl perl-libwww python python-setuptools rsync sharutils \
subversion swig texinfo ttf-dejavu unarchiver unifont-utils unzip wget xz \
zlib \
"
+1
View File
@@ -0,0 +1 @@
debian
+1
View File
@@ -0,0 +1 @@
ubuntu2004
+1
View File
@@ -0,0 +1 @@
debian
+14
View File
@@ -0,0 +1,14 @@
pkg_add="apt-get -y install"
pkglist=" \
autoconf autogen automake autopoint autotools-dev bc binutils-arm-none-eabi \
bison build-essential cmake curl device-tree-compiler doxygen e2fsprogs efitools \
flex gawk gcc-arm-linux-gnueabi gcc-arm-none-eabi gdb gettext git gnat help2man \
innoextract libdevmapper-dev libfdt-dev libfont-freetype-perl libfreetype6-dev \
libftdi-dev libfuse-dev libgnutls28-dev liblz4-tool liblzma-dev libncurses5-dev \
libncurses-dev libnewlib-arm-none-eabi libopts25 libopts25-dev libpci-dev \
libpython3-dev libsdl2-dev libselinux1-dev libssl-dev libtool libusb-1.0-0 \
libusb-1.0-0-dev lz4 lzma lzma-alone m4 nasm openssl p7zip p7zip-full parted \
pciutils perl pkg-config python3 python3-distutils python3-pkg-resources \
python3-pycryptodome python3-pyelftools python3-setuptools python-is-python3 \
sharutils swig ttf-unifont unar unifont unzip uuid-dev wget zlib1g-dev \
"
+11
View File
@@ -0,0 +1,11 @@
pkg_add="xbps-install -y"
pkglist=" \
acpica-utils autogen base-devel bison cmake \
cross-arm-none-eabi-binutils cross-arm-none-eabi-gcc \
cross-arm-none-eabi-libstdc++ cross-arm-none-eabi-newlib curl \
dejavu-fonts-ttf device-mapper doxygen e2fsprogs flexflex font-unifont-bdf \
freetype fuse gawk gcc-ada gdb gettext gettext-devel git help2man \
innoextract libftdi1 libpciaccess libusb nasm ncurses ncurses-devel openssl
p7zip parted pciutils perl perl-LWP python python3 python3-setuptools rsync \
sharutils subversion texinfo unar unzip wget xz zlib \
"
@@ -1,25 +0,0 @@
From 2a476bafca96f7a44e5ca07adcf637cc3b340a45 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:09:05 +0100
Subject: [PATCH 01/52] add-mojeek.patch
---
services/settings/dumps/main/moz.build | 2 ++
1 file changed, 2 insertions(+)
diff --git a/services/settings/dumps/main/moz.build b/services/settings/dumps/main/moz.build
index ee5e57c5b4e3..34e72bb608a1 100644
--- a/services/settings/dumps/main/moz.build
+++ b/services/settings/dumps/main/moz.build
@@ -62,6 +62,8 @@ if CONFIG["MOZ_BUILD_APP"] == "browser":
"search-config-icons/25de0352-aabb-d31f-15f7-bf9299fb004c.meta.json",
"search-config-icons/2bbe48f4-d3b8-c9e0-86e3-a54c37ec3335",
"search-config-icons/2bbe48f4-d3b8-c9e0-86e3-a54c37ec3335.meta.json",
+ "search-config-icons/2c4b8834-030c-4097-a887-c7506689095c",
+ "search-config-icons/2c4b8834-030c-4097-a887-c7506689095c.meta.json",
"search-config-icons/2e835b0e-9709-d1bb-9725-87f59f3445ca",
"search-config-icons/2e835b0e-9709-d1bb-9725-87f59f3445ca.meta.json",
"search-config-icons/32d26d19-aeb0-5c01-32e8-f8970be9246f",
--
2.47.3
@@ -1,24 +0,0 @@
From 285c02a31e60bbe6e5eb98d1b449439126768f41 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:09:09 +0100
Subject: [PATCH 02/52] always-fetch-latest-toolchain-artifact.patch
---
python/mozbuild/mozbuild/artifact_commands.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/python/mozbuild/mozbuild/artifact_commands.py b/python/mozbuild/mozbuild/artifact_commands.py
index 928227d2cb5f..af3d58c6505b 100644
--- a/python/mozbuild/mozbuild/artifact_commands.py
+++ b/python/mozbuild/mozbuild/artifact_commands.py
@@ -10,6 +10,7 @@ import logging
import os
import pathlib
import shutil
+import requests
from collections import OrderedDict
import mozversioncontrol
--
2.47.3
@@ -1,34 +0,0 @@
From 62e68c8db9275d65df47179a770126c667e00399 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:09:13 +0100
Subject: [PATCH 03/52] autoconfig-setEnv.patch
---
extensions/pref/autoconfig/src/prefcalls.js | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/extensions/pref/autoconfig/src/prefcalls.js b/extensions/pref/autoconfig/src/prefcalls.js
index 47eb92982c97..78dd0ee5473a 100644
--- a/extensions/pref/autoconfig/src/prefcalls.js
+++ b/extensions/pref/autoconfig/src/prefcalls.js
@@ -205,7 +205,17 @@ function getenv(name) {
return undefined;
}
+function setEnv(name, value) {
+ try {
+ return Services.env.set(name, value);
+ } catch (e) {
+ displayError("getEnvironment", e);
+ }
+ return undefined;
+}
+
var APIs = {
+ setEnv,
pref,
defaultPref,
lockPref,
--
2.47.3
@@ -1,25 +0,0 @@
From 50902dac61f2447168c46115d6ae8023908eb00e Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:09:16 +0100
Subject: [PATCH 04/52] bootstrap.patch
---
python/mozversioncontrol/mozversioncontrol/repo/source.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/python/mozversioncontrol/mozversioncontrol/repo/source.py b/python/mozversioncontrol/mozversioncontrol/repo/source.py
index 85048fafce91..71904adc1657 100644
--- a/python/mozversioncontrol/mozversioncontrol/repo/source.py
+++ b/python/mozversioncontrol/mozversioncontrol/repo/source.py
@@ -111,7 +111,7 @@ class SrcRepository(Repository):
for root, dirs, files in os.walk(self.path):
base = os.path.relpath(root, self.path)
for name in files:
- res.append(os.path.join(base, name))
+ res.append(os.path.join(base, name).replace("\\", "/"))
return res
def get_tracked_files_finder(self, path):
--
2.47.3
@@ -1,164 +0,0 @@
From e0a864992baea169d5f20b366ecdbe918ce1bcba Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:09:20 +0100
Subject: [PATCH 05/52] canvas-permission.patch
---
browser/modules/SitePermissions.sys.mjs | 98 ++++++++++++++++++-
.../resistfingerprinting/RFPHelper.sys.mjs | 10 +-
2 files changed, 105 insertions(+), 3 deletions(-)
diff --git a/browser/modules/SitePermissions.sys.mjs b/browser/modules/SitePermissions.sys.mjs
index 3cf23c809c23..b112014e0d49 100644
--- a/browser/modules/SitePermissions.sys.mjs
+++ b/browser/modules/SitePermissions.sys.mjs
@@ -3,6 +3,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs";
+import { RFPHelper } from "resource://gre/modules/RFPHelper.sys.mjs";
var gStringBundle = Services.strings.createBundle(
"chrome://browser/locale/sitePermissions.properties"
@@ -807,6 +808,67 @@ export var SitePermissions = {
return null;
}
},
+
+ /**
+ * Computes whether the canvas image extraction prompt is enabled
+ * based on Baseline/FPP settings and their respective overrides.
+ *
+ * @returns {boolean} true if CanvasImageExtractionPrompt/AllTargets is active
+ */
+ _computeCanvasImageExtractionEnabled() {
+ const fppEnabled = this.fingerprintingProtectionEnabled;
+ const baselineEnabled = this.baselineFingerprintingProtectionEnabled;
+
+ if (fppEnabled) {
+ const defaults = RFPHelper.getTargetDefaults();
+ const active = new Set(defaults);
+ const overrides = this.fingerprintingProtectionOverrides;
+ this._applyOverrides(active, overrides);
+ if (active.has("CanvasImageExtractionPrompt")) {
+ return true;
+ }
+ }
+
+ if (baselineEnabled) {
+ const defaults = RFPHelper.getTargetDefaultsBaseline();
+ const active = new Set(defaults);
+ const overrides = this.baselineFingerprintingProtectionOverrides;
+ this._applyOverrides(active, overrides);
+ if (active.has("CanvasImageExtractionPrompt")) {
+ return true;
+ }
+ }
+
+ return false;
+ },
+
+ /**
+ * Applies override flags to an active set of targets.
+ *
+ * @param {Set} active - The active targets set
+ * @param {string} overridesString - The override string (e.g., "+CanvasImageExtractionPrompt,+AllTargets")
+ */
+ _applyOverrides(active, overridesString) {
+ for (const flag of overridesString.split(",").filter(Boolean)) {
+ if (flag.startsWith("+")) {
+ const target = flag.slice(1);
+ if (
+ target === "AllTargets" ||
+ target === "CanvasImageExtractionPrompt"
+ ) {
+ active.add("CanvasImageExtractionPrompt");
+ }
+ } else if (flag.startsWith("-")) {
+ const target = flag.slice(1);
+ if (
+ target === "AllTargets" ||
+ target === "CanvasImageExtractionPrompt"
+ ) {
+ active.delete("CanvasImageExtractionPrompt");
+ }
+ }
+ }
+ },
};
let gPermissions = {
@@ -1069,7 +1131,10 @@ let gPermissions = {
canvas: {
get disabled() {
- return !SitePermissions.resistFingerprinting;
+ return (
+ !SitePermissions.resistFingerprinting &&
+ !SitePermissions._computeCanvasImageExtractionEnabled()
+ );
},
},
@@ -1133,6 +1198,37 @@ XPCOMUtils.defineLazyPreferenceGetter(
false,
SitePermissions.invalidatePermissionList.bind(SitePermissions)
);
+XPCOMUtils.defineLazyPreferenceGetter(
+ SitePermissions,
+ "fingerprintingProtectionEnabled",
+ "privacy.fingerprintingProtection",
+ false,
+ SitePermissions.invalidatePermissionList.bind(SitePermissions)
+);
+
+XPCOMUtils.defineLazyPreferenceGetter(
+ SitePermissions,
+ "fingerprintingProtectionOverrides",
+ "privacy.fingerprintingProtection.overrides",
+ "",
+ SitePermissions.invalidatePermissionList.bind(SitePermissions)
+);
+
+XPCOMUtils.defineLazyPreferenceGetter(
+ SitePermissions,
+ "baselineFingerprintingProtectionEnabled",
+ "privacy.baselineFingerprintingProtection",
+ false,
+ SitePermissions.invalidatePermissionList.bind(SitePermissions)
+);
+
+XPCOMUtils.defineLazyPreferenceGetter(
+ SitePermissions,
+ "baselineFingerprintingProtectionOverrides",
+ "privacy.baselineFingerprintingProtection.overrides",
+ "",
+ SitePermissions.invalidatePermissionList.bind(SitePermissions)
+);
XPCOMUtils.defineLazyPreferenceGetter(
SitePermissions,
diff --git a/toolkit/components/resistfingerprinting/RFPHelper.sys.mjs b/toolkit/components/resistfingerprinting/RFPHelper.sys.mjs
index f82d7309e129..d11f8a011fac 100644
--- a/toolkit/components/resistfingerprinting/RFPHelper.sys.mjs
+++ b/toolkit/components/resistfingerprinting/RFPHelper.sys.mjs
@@ -208,8 +208,14 @@ class _RFPHelper {
return;
}
- let loadContext = notificationCallbacks.getInterface(Ci.nsILoadContext);
- if (!loadContext || !loadContext.isContent) {
+ let loadContext;
+ try {
+ loadContext = notificationCallbacks.getInterface(Ci.nsILoadContext);
+ } catch (e) {
+ return;
+ }
+
+ if (!loadContext.isContent) {
return;
}
--
2.47.3
@@ -1,40 +0,0 @@
From 9d67e4bd2a45975b777a1f798a2b05cd0e7a9d6e Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:09:24 +0100
Subject: [PATCH 06/52] custom-ubo-assets-bootstrap-location.patch
---
.../components/extensions/parent/ext-storage.js | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/toolkit/components/extensions/parent/ext-storage.js b/toolkit/components/extensions/parent/ext-storage.js
index 0d6109c25019..3dce60b6d5ec 100644
--- a/toolkit/components/extensions/parent/ext-storage.js
+++ b/toolkit/components/extensions/parent/ext-storage.js
@@ -411,6 +411,23 @@ this.storage = class extends ExtensionAPIPersistent {
managed: {
async get(keys) {
enforceNoTemporaryAddon(extension.id);
+ const assetsBootstrapLocation = Services.prefs.getStringPref(
+ "librewolf.uBO.assetsBootstrapLocation",
+ undefined
+ );
+ if (extension.id == "uBlock0@raymondhill.net" && assetsBootstrapLocation) {
+ let data = {};
+ try {
+ let manifestData = await getManagedStorageManifestData(extension, context);
+ data = await ExtensionStorage._filterProperties(extension.id, manifestData, keys);
+ } catch (e) {
+ // no managed manifest
+ }
+ return {
+ ...data,
+ adminSettings: { ...(data.adminSettings || {}), assetsBootstrapLocation },
+ };
+ }
let data = await getManagedStorageManifestData(extension, context);
return ExtensionStorage._filterProperties(extension.id, data, keys);
},
--
2.47.3
@@ -1,83 +0,0 @@
From 4dcc900e125ca963cd141185588de161e444e836 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:09:28 +0100
Subject: [PATCH 07/52] dbus_name.patch
---
toolkit/components/remote/nsDBusRemoteClient.cpp | 6 +++---
toolkit/components/remote/nsDBusRemoteServer.cpp | 8 ++++----
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/toolkit/components/remote/nsDBusRemoteClient.cpp b/toolkit/components/remote/nsDBusRemoteClient.cpp
index bd1fe5f9cffd..bb68321ba95a 100644
--- a/toolkit/components/remote/nsDBusRemoteClient.cpp
+++ b/toolkit/components/remote/nsDBusRemoteClient.cpp
@@ -73,14 +73,14 @@ bool nsDBusRemoteClient::GetRemoteDestinationName(const char* aProgram,
mozilla::XREAppData::SanitizeNameForDBus(profileName);
aDestinationName =
- nsPrintfCString("org.mozilla.%s.%s", aProgram, profileName.get());
+ nsPrintfCString("io.gitlab.%s.%s", aProgram, profileName.get());
if (aDestinationName.Length() > DBUS_MAXIMUM_NAME_LENGTH)
aDestinationName.Truncate(DBUS_MAXIMUM_NAME_LENGTH);
if (!g_dbus_is_name(aDestinationName.get())) {
// We don't have a valid busName yet - try to create a default one.
aDestinationName =
- nsPrintfCString("org.mozilla.%s.%s", aProgram, "default");
+ nsPrintfCString("io.gitlab.%s.%s", aProgram, "default");
if (!g_dbus_is_name(aDestinationName.get())) {
// We failed completely to get a valid bus name - just quit.
LOG(" failed to validate profile DBus name");
@@ -118,7 +118,7 @@ nsresult nsDBusRemoteClient::DoSendDBusCommandLine(const char* aProfile,
}
nsAutoCString remoteInterfaceName;
- remoteInterfaceName = nsPrintfCString("org.mozilla.%s", appName.get());
+ remoteInterfaceName = nsPrintfCString("io.gitlab.%s", appName.get());
LOG(" DBus destination: %s\n", destinationName.get());
LOG(" DBus path: %s\n", pathName.get());
diff --git a/toolkit/components/remote/nsDBusRemoteServer.cpp b/toolkit/components/remote/nsDBusRemoteServer.cpp
index 226b2dc52874..f2477798aeca 100644
--- a/toolkit/components/remote/nsDBusRemoteServer.cpp
+++ b/toolkit/components/remote/nsDBusRemoteServer.cpp
@@ -25,7 +25,7 @@ static const char* introspect_template =
"1.0//EN\"\n"
"\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">\n"
"<node>\n"
- " <interface name=\"org.mozilla.%s\">\n"
+ " <interface name=\"io.gitlab.%s\">\n"
" <method name=\"OpenURL\">\n"
" <arg name=\"url\" direction=\"in\" type=\"ay\"/>\n"
" </method>\n"
@@ -35,7 +35,7 @@ static const char* introspect_template =
bool nsDBusRemoteServer::HandleOpenURL(const gchar* aInterfaceName,
const gchar* aMethodName,
Span<const gchar> aParam) {
- nsPrintfCString ourInterfaceName("org.mozilla.%s", mAppName.get());
+ nsPrintfCString ourInterfaceName("io.gitlab.%s", mAppName.get());
if ((strcmp("OpenURL", aMethodName) != 0) ||
(strcmp(ourInterfaceName.get(), aInterfaceName) != 0)) {
@@ -199,7 +199,7 @@ nsresult nsDBusRemoteServer::Startup(const char* aAppName,
mozilla::XREAppData::SanitizeNameForDBus(profileName);
- nsPrintfCString busName("org.mozilla.%s.%s", mAppName.get(),
+ nsPrintfCString busName("io.gitlab.%s.%s", mAppName.get(),
profileName.get());
if (busName.Length() > DBUS_MAXIMUM_NAME_LENGTH) {
busName.Truncate(DBUS_MAXIMUM_NAME_LENGTH);
@@ -207,7 +207,7 @@ nsresult nsDBusRemoteServer::Startup(const char* aAppName,
// We don't have a valid busName yet - try to create a default one.
if (!g_dbus_is_name(busName.get())) {
- busName = nsPrintfCString("org.mozilla.%s.%s", mAppName.get(), "default");
+ busName = nsPrintfCString("io.gitlab.%s.%s", mAppName.get(), "default");
if (!g_dbus_is_name(busName.get())) {
// We failed completely to get a valid bus name - just quit.
g_warning("nsDBusRemoteServer: couldn't get a valid bus name!");
--
2.47.3
@@ -1,42 +0,0 @@
From c34c0143ee4dd38902c9a8a3defaae42f74020c6 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:09:31 +0100
Subject: [PATCH 08/52] delete-cookie-permission.patch
---
browser/components/ProfileDataUpgrader.sys.mjs | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/browser/components/ProfileDataUpgrader.sys.mjs b/browser/components/ProfileDataUpgrader.sys.mjs
index 6b0e2251f0eb..c859bf8db8e0 100644
--- a/browser/components/ProfileDataUpgrader.sys.mjs
+++ b/browser/components/ProfileDataUpgrader.sys.mjs
@@ -1030,6 +1030,9 @@ export let ProfileDataUpgrader = {
// Only migrate durable, user-set permissions. Anything that expires
// (session/time) or is re-applied from an enterprise policy on every
// startup (EXPIRE_POLICY) must not be persisted as a regular permission.
+
+ const toDelete = [];
+
Services.perms.getAllByTypes(["cookie"]).forEach(p => {
if (p.expireType != Services.perms.EXPIRE_NEVER) {
return;
@@ -1040,8 +1043,15 @@ export let ProfileDataUpgrader = {
"persist-data-on-shutdown",
Ci.nsICookiePermission.ACCESS_ALLOW
);
+ toDelete.push(p);
}
});
+
+ toDelete.forEach(p => {
+ Services.perms.removePermission(p);
+ });
+
+ Services.perms.removeOrphanedInteractionRecords();
}
if (
--
2.47.3
@@ -1,61 +0,0 @@
From 4890972bf672fd70b7d114eef185f5ab9efbf82d Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:09:36 +0100
Subject: [PATCH 09/52] devtools-bypass.patch
---
devtools/server/actors/thread.js | 5 ++++-
devtools/server/actors/webconsole/listeners/console-api.js | 3 ++-
devtools/shared/flags.js | 2 ++
3 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/devtools/server/actors/thread.js b/devtools/server/actors/thread.js
index e0ceee32c625..b7b90d476ead 100644
--- a/devtools/server/actors/thread.js
+++ b/devtools/server/actors/thread.js
@@ -8,6 +8,7 @@
// error packets.
/* eslint-disable no-throw-literal */
+var flags = require("resource://devtools/shared/flags.js");
const { Actor } = require("resource://devtools/shared/protocol/Actor.js");
const { Pool } = require("resource://devtools/shared/protocol/Pool.js");
const { threadSpec } = require("resource://devtools/shared/specs/thread.js");
@@ -390,7 +391,9 @@ class ThreadActor extends Actor {
attach(options) {
// Note that the client avoids trying to call attach if already attached.
// But just in case, avoid any possible duplicate call to attach.
- if (this.alreadyAttached) {
+ let forceDetach = flags.lwDetach;
+
+ if (this.alreadyAttached || forceDetach) {
return;
}
diff --git a/devtools/server/actors/webconsole/listeners/console-api.js b/devtools/server/actors/webconsole/listeners/console-api.js
index cdf6a841a8de..ccdd19e95a0d 100644
--- a/devtools/server/actors/webconsole/listeners/console-api.js
+++ b/devtools/server/actors/webconsole/listeners/console-api.js
@@ -98,7 +98,8 @@ class ConsoleAPIListener {
* The message object receives from the ConsoleAPIStorage service.
*/
onConsoleAPILogEvent(message) {
- if (!this.handler) {
+ let disableConsole = Services.prefs.getBoolPref("librewolf.console.logging_disabled", false);
+ if (!this.handler || disableConsole) {
return;
}
diff --git a/devtools/shared/flags.js b/devtools/shared/flags.js
index 95b1be41d20b..562b5591037d 100644
--- a/devtools/shared/flags.js
+++ b/devtools/shared/flags.js
@@ -60,3 +60,5 @@ makePrefTrackedFlag(exports, "wantLogging", "devtools.debugger.log");
* behaviors typically enable easier testing or enhanced debugging features.
*/
makePrefTrackedFlag(exports, "testing", "devtools.testing");
+
+makePrefTrackedFlag(exports, "lwDetach", "librewolf.debugger.force_detach");
--
2.47.3
@@ -1,169 +0,0 @@
From 86537762694f63b6e4ce3c06c11444a726b08958 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:09:43 +0100
Subject: [PATCH 10/52] disable-data-reporting-at-compile-time.patch
---
browser/components/tabbrowser/content/tabbrowser.js | 6 ------
browser/moz.configure | 4 ++--
python/mach/mach/telemetry.py | 5 +----
python/sites/mach.txt | 2 +-
third_party/rust/glean-core/src/core/mod.rs | 3 ++-
third_party/rust/glean-core/src/lib.rs | 3 +++
toolkit/components/telemetry/core/Telemetry.cpp | 6 +++---
toolkit/library/rust/gkrust-features.mozbuild | 2 +-
8 files changed, 13 insertions(+), 18 deletions(-)
diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js
index 43180487a2fa..b60919e238be 100644
--- a/browser/components/tabbrowser/content/tabbrowser.js
+++ b/browser/components/tabbrowser/content/tabbrowser.js
@@ -3390,10 +3390,6 @@
);
}
- if (!UserInteraction.running("browser.tabs.opening", window)) {
- UserInteraction.start("browser.tabs.opening", "initting", window);
- }
-
// If we're opening a foreground tab, set the owner by default.
ownerTab ??= inBackground ? null : this.selectedTab;
@@ -4239,8 +4235,6 @@
0,
this.tabContainer
);
- } else {
- UserInteraction.update("browser.tabs.opening", "animated", window);
}
return t;
diff --git a/browser/moz.configure b/browser/moz.configure
index 3ea3d88b9360..c55951b8debf 100644
--- a/browser/moz.configure
+++ b/browser/moz.configure
@@ -3,11 +3,11 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
imply_option("MOZ_PLACES", True)
-imply_option("MOZ_SERVICES_HEALTHREPORT", True)
+imply_option("MOZ_SERVICES_HEALTHREPORT", False)
imply_option("MOZ_SERVICES_SYNC", True)
imply_option("MOZ_DEDICATED_PROFILES", True)
imply_option("MOZ_BLOCK_PROFILE_DOWNGRADE", True)
-imply_option("MOZ_NORMANDY", True)
+imply_option("MOZ_NORMANDY", False)
imply_option("MOZ_PROFILE_MIGRATOR", True)
diff --git a/python/mach/mach/telemetry.py b/python/mach/mach/telemetry.py
index 2b70b3f75a2d..b111dacc764e 100644
--- a/python/mach/mach/telemetry.py
+++ b/python/mach/mach/telemetry.py
@@ -82,10 +82,7 @@ def is_applicable_telemetry_environment():
def is_telemetry_enabled(settings):
- if os.environ.get("DISABLE_TELEMETRY") == "1":
- return False
-
- return settings.mach_telemetry.is_enabled
+ return False
def arcrc_path():
diff --git a/python/sites/mach.txt b/python/sites/mach.txt
index d5cdce88869a..f4f38c1f9b78 100644
--- a/python/sites/mach.txt
+++ b/python/sites/mach.txt
@@ -58,7 +58,7 @@ pth:xpcom/geckoprocesstypes_generator
pth:xpcom/idl-parser
# glean-sdk may not be installable if a wheel isn't available
# and it has to be built from source.
-pypi-optional:glean-sdk==68.0.1:telemetry will not be collected
+# pypi-optional:glean-sdk==68.0.1:telemetry will not be collected
pypi-optional:orjson>=3.10:json operations will be slower in various tools
# Mach gracefully handles the case where `psutil` is unavailable.
# We aren't (yet) able to pin packages in automation, so we have to
diff --git a/third_party/rust/glean-core/src/core/mod.rs b/third_party/rust/glean-core/src/core/mod.rs
index 013064660410..1f68b9ef3d4c 100644
--- a/third_party/rust/glean-core/src/core/mod.rs
+++ b/third_party/rust/glean-core/src/core/mod.rs
@@ -813,7 +813,8 @@ impl Glean {
///
/// When upload is disabled, no data will be recorded.
pub fn is_upload_enabled(&self) -> bool {
- self.upload_enabled
+ _ = self.upload_enabled;
+ false
}
/// Check if a ping is enabled.
diff --git a/third_party/rust/glean-core/src/lib.rs b/third_party/rust/glean-core/src/lib.rs
index c401c3dafef9..2a52db7d9f83 100644
--- a/third_party/rust/glean-core/src/lib.rs
+++ b/third_party/rust/glean-core/src/lib.rs
@@ -916,6 +916,7 @@ pub extern "C" fn glean_enable_logging() {
/// **DEPRECATION NOTICE**:
/// This API is deprecated. Use `set_collection_enabled` instead.
pub fn glean_set_upload_enabled(enabled: bool) {
+ let enabled = false;
if !was_initialize_called() {
return;
}
@@ -951,6 +952,8 @@ pub fn glean_set_upload_enabled(enabled: bool) {
///
/// This replaces `set_upload_enabled`.
pub fn glean_set_collection_enabled(enabled: bool) {
+ // Redundant currently
+ let enabled = false;
glean_set_upload_enabled(enabled)
}
diff --git a/toolkit/components/telemetry/core/Telemetry.cpp b/toolkit/components/telemetry/core/Telemetry.cpp
index 1e83d34cd007..474bc5c50bf3 100644
--- a/toolkit/components/telemetry/core/Telemetry.cpp
+++ b/toolkit/components/telemetry/core/Telemetry.cpp
@@ -693,7 +693,7 @@ TelemetryImpl::GetCanRecordBase(bool* ret) {
NS_IMETHODIMP
TelemetryImpl::SetCanRecordBase(bool canRecord) {
-#ifndef FUZZING
+#if false
if (canRecord != mCanRecordBase) {
TelemetryHistogram::SetCanRecordBase(canRecord);
TelemetryScalar::SetCanRecordBase(canRecord);
@@ -719,7 +719,7 @@ TelemetryImpl::GetCanRecordExtended(bool* ret) {
NS_IMETHODIMP
TelemetryImpl::SetCanRecordExtended(bool canRecord) {
-#ifndef FUZZING
+#if false
if (canRecord != mCanRecordExtended) {
TelemetryHistogram::SetCanRecordExtended(canRecord);
TelemetryScalar::SetCanRecordExtended(canRecord);
@@ -762,7 +762,7 @@ already_AddRefed<nsITelemetry> TelemetryImpl::CreateTelemetryInstance() {
}
bool useTelemetry = false;
-#ifndef FUZZING
+#if false
if (XRE_IsParentProcess() || XRE_IsContentProcess() || XRE_IsGPUProcess() ||
XRE_IsRDDProcess() || XRE_IsSocketProcess() || XRE_IsUtilityProcess()) {
useTelemetry = true;
diff --git a/toolkit/library/rust/gkrust-features.mozbuild b/toolkit/library/rust/gkrust-features.mozbuild
index 59535dd585aa..4d32a3062134 100644
--- a/toolkit/library/rust/gkrust-features.mozbuild
+++ b/toolkit/library/rust/gkrust-features.mozbuild
@@ -57,7 +57,7 @@ if CONFIG["MOZ_WEBRTC"]:
# We need to tell Glean it is being built with Gecko.
gkrust_features += ["glean_with_gecko"]
-if not CONFIG["MOZILLA_OFFICIAL"]:
+if CONFIG["MOZILLA_OFFICIAL"]:
gkrust_features += ["glean_disable_upload"]
if CONFIG["MOZ_ENABLE_DBUS"]:
--
2.47.3
@@ -1,207 +0,0 @@
From 82f46ce61c0eeaa4a41bdb3441003a307767e017 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:09:47 +0100
Subject: [PATCH 11/52] eme-permission.patch
---
.../ContentPermissionPrompt.sys.mjs | 4 +
browser/modules/EMEPermissionPrompt.sys.mjs | 111 ++++++++++++++++++
dom/media/eme/MediaKeySystemAccessManager.cpp | 23 +++-
3 files changed, 132 insertions(+), 6 deletions(-)
create mode 100644 browser/modules/EMEPermissionPrompt.sys.mjs
diff --git a/browser/components/permissions/ContentPermissionPrompt.sys.mjs b/browser/components/permissions/ContentPermissionPrompt.sys.mjs
index fc3c64110c37..032010493054 100644
--- a/browser/components/permissions/ContentPermissionPrompt.sys.mjs
+++ b/browser/components/permissions/ContentPermissionPrompt.sys.mjs
@@ -7,6 +7,7 @@ const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
Integration: "resource://gre/modules/Integration.sys.mjs",
PermissionUI: "resource:///modules/PermissionUI.sys.mjs",
+ EMEPermissionPrompt: "moz-src:///browser/modules/EMEPermissionPrompt.sys.mjs",
});
/**
* ContentPermissionIntegration is responsible for showing the user
@@ -40,6 +41,9 @@ const ContentPermissionIntegration = {
*/
createPermissionPrompt(type, request) {
switch (type) {
+ case "media-key-system-access": {
+ return new lazy.EMEPermissionPrompt(request);
+ }
case "geolocation": {
return new lazy.PermissionUI.GeolocationPermissionPrompt(request);
}
diff --git a/browser/modules/EMEPermissionPrompt.sys.mjs b/browser/modules/EMEPermissionPrompt.sys.mjs
new file mode 100644
index 000000000000..4e0d8eeec3f3
--- /dev/null
+++ b/browser/modules/EMEPermissionPrompt.sys.mjs
@@ -0,0 +1,111 @@
+/* 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 https://mozilla.org/MPL/2.0/. */
+
+const lazy = {};
+
+ChromeUtils.defineESModuleGetters(lazy, {
+ PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs",
+ SitePermissions: "resource:///modules/SitePermissions.sys.mjs",
+});
+
+ChromeUtils.defineLazyGetter(lazy, "gBrowserBundle", function () {
+ return Services.strings.createBundle(
+ "chrome://browser/locale/browser.properties"
+ );
+});
+
+const { PermissionUI } = ChromeUtils.importESModule(
+ "resource:///modules/PermissionUI.sys.mjs"
+);
+
+/**
+ * Creates a PermissionPrompt for a nsIContentPermissionRequest for
+ * EME (Encrypted Media Extensions).
+ *
+ * @param request (nsIContentPermissionRequest)
+ * The request for a permission from content.
+ */
+export class EMEPermissionPrompt extends PermissionUI.PermissionPromptForRequest {
+ constructor(request) {
+ super();
+ this.request = request;
+ }
+
+ get type() {
+ return "media-key-system-access";
+ }
+
+ get permissionKey() {
+ return "media-key-system-access";
+ }
+
+ get popupOptions() {
+ let options = {
+ learnMoreURL: Services.urlFormatter.formatURLPref("librewolf.eme.warning.infoURL"),
+ displayURI: false,
+ name: this.getPrincipalName(),
+ };
+
+ // Don't offer "always remember" action in PB mode
+ options.checkbox = {
+ show: !lazy.PrivateBrowsingUtils.isWindowPrivate(
+ this.browser.documentGlobal
+ ),
+ };
+
+ if (options.checkbox.show) {
+ options.checkbox.label =
+ lazy.gBrowserBundle.GetStringFromName("eme.remember2");
+ }
+
+ return options;
+ }
+
+ get notificationID() {
+ return "media-key-system-access";
+ }
+
+ get anchorID() {
+ return "eme-notification-icon";
+ }
+
+ get message() {
+ return lazy.gBrowserBundle.formatStringFromName("eme.siteprompt2", [
+ "<>",
+ ]);
+ }
+
+ get promptActions() {
+ return [
+ {
+ label: lazy.gBrowserBundle.GetStringFromName("eme.allow2"),
+ accessKey: lazy.gBrowserBundle.GetStringFromName("eme.allow2.accesskey"),
+ action: lazy.SitePermissions.ALLOW,
+ },
+ {
+ label: lazy.gBrowserBundle.GetStringFromName("eme.block"),
+ accessKey: lazy.gBrowserBundle.GetStringFromName("eme.block.accesskey"),
+ action: lazy.SitePermissions.BLOCK,
+ },
+ ];
+ }
+
+ get principal() {
+ // The standard/superclass method of getDelegatePrincipal (1) appears to return a null principal here
+ // So we're overriding it to use topLevelPrincipal instead, as that's what GeckoView uses (2)
+ // 1: https://searchfox.org/firefox-main/rev/e28b34ab/browser/modules/PermissionUI.sys.mjs#762
+ // 2: https://searchfox.org/firefox-main/rev/e28b34ab/mobile/shared/components/geckoview/GeckoViewPermission.sys.mjs#124
+ return this.request.topLevelPrincipal;
+ }
+
+ prompt() {
+ // If the EME UI is disabled, we can't/shouldn't prompt users - so just cancel the request
+ if (!Services.prefs.getBoolPref("browser.eme.ui.enabled")) {
+ this.cancel();
+ } else {
+ super.prompt();
+ }
+ return;
+ }
+}
diff --git a/dom/media/eme/MediaKeySystemAccessManager.cpp b/dom/media/eme/MediaKeySystemAccessManager.cpp
index aaa3ff25b64f..56724a03ac24 100644
--- a/dom/media/eme/MediaKeySystemAccessManager.cpp
+++ b/dom/media/eme/MediaKeySystemAccessManager.cpp
@@ -364,9 +364,11 @@ void MediaKeySystemAccessManager::OnDoesAppAllowProtectedMedia(
aIsAllowed ? "true" : "false",
NS_ConvertUTF16toUTF8(aRequest->mKeySystem).get());
if (!aIsAllowed) {
- aRequest->RejectPromiseWithNotSupportedError(
- nsLiteralCString("The application embedding this user agent has "
- "blocked MediaKeySystemAccess"));
+ if (IsClearkeyKeySystem(aRequest->mKeySystem)) {
+ aRequest->RejectPromiseWithNotSupportedError("CDM is not installed"_ns);
+ } else {
+ aRequest->RejectPromiseWithNotSupportedError("EME has been preffed off"_ns);
+ }
return;
}
@@ -421,8 +423,8 @@ void MediaKeySystemAccessManager::RequestMediaKeySystemAccess(
return;
}
- if (!StaticPrefs::media_eme_enabled() &&
- !IsClearkeyKeySystem(aRequest->mKeySystem)) {
+ if (!StaticPrefs::media_eme_enabled()) {
+// !IsClearkeyKeySystem(aRequest->mKeySystem)) {
// EME disabled by user, send notification to chrome so UI can inform user.
// Clearkey is allowed even when EME is disabled because we want the pref
// "media.eme.enabled" only taking effect on proprietary DRMs.
@@ -431,12 +433,21 @@ void MediaKeySystemAccessManager::RequestMediaKeySystemAccess(
MediaKeySystemAccess::NotifyObservers(mWindow, aRequest->mKeySystem,
MediaKeySystemStatus::Api_disabled);
}
- aRequest->RejectPromiseWithNotSupportedError("EME has been preffed off"_ns);
+ if (IsClearkeyKeySystem(aRequest->mKeySystem)) {
+ aRequest->RejectPromiseWithNotSupportedError("CDM is not installed"_ns);
+ } else {
+ aRequest->RejectPromiseWithNotSupportedError("EME has been preffed off"_ns);
+ }
aRequest->mDiagnostics.StoreMediaKeySystemAccess(
mWindow->GetExtantDoc(), aRequest->mKeySystem, false, __func__);
return;
}
+ if (IsClearkeyKeySystem(aRequest->mKeySystem) && !Preferences::GetBool("librewolf.eme.gmp-clearkey.enabled", false)) {
+ aRequest->RejectPromiseWithNotSupportedError("CDM is not installed"_ns);
+ return;
+ }
+
nsAutoCString message;
MediaKeySystemStatus status =
MediaKeySystemAccess::GetKeySystemStatus(*aRequest, message);
--
2.47.3
@@ -1,25 +0,0 @@
From 8533ae5958adc2514498427967a2bcd97fa1506a Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:09:51 +0100
Subject: [PATCH 12/52] extensions-setUninstallURL.patch
---
toolkit/components/extensions/parent/ext-runtime.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/toolkit/components/extensions/parent/ext-runtime.js b/toolkit/components/extensions/parent/ext-runtime.js
index abc30a2e1319..22f03e99a871 100644
--- a/toolkit/components/extensions/parent/ext-runtime.js
+++ b/toolkit/components/extensions/parent/ext-runtime.js
@@ -354,7 +354,7 @@ this.runtime = class extends ExtensionAPIPersistent {
},
setUninstallURL: function (url) {
- if (url === null || url.length === 0) {
+ if (true) {
extension.uninstallURL = null;
return Promise.resolve();
}
--
2.47.3
@@ -1,25 +0,0 @@
From 1279461064c89e354b68951077e4a893d9cb3ebf Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:09:54 +0100
Subject: [PATCH 13/52] firefox-in-ua.patch
---
toolkit/moz.configure | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/toolkit/moz.configure b/toolkit/moz.configure
index e313d971ec33..a20a82fa6d06 100644
--- a/toolkit/moz.configure
+++ b/toolkit/moz.configure
@@ -26,7 +26,7 @@ project_flag(
project_flag(
env="MOZ_APP_UA_NAME",
- default="",
+ default="Firefox",
nargs=1,
help="Application name in the User Agent string",
)
--
2.47.3
@@ -1,105 +0,0 @@
From 09f40f3935428b5046ea866e09dfbf739684ce6f Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:09:59 +0100
Subject: [PATCH 14/52] fpp-canvas-fix.patch
---
dom/canvas/CanvasRenderingContext2D.cpp | 11 ++++++++---
dom/canvas/ClientWebGLContext.cpp | 10 +++++++---
.../components/resistfingerprinting/nsRFPService.cpp | 2 ++
3 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/dom/canvas/CanvasRenderingContext2D.cpp b/dom/canvas/CanvasRenderingContext2D.cpp
index 596eb44f3992..2018528600f7 100644
--- a/dom/canvas/CanvasRenderingContext2D.cpp
+++ b/dom/canvas/CanvasRenderingContext2D.cpp
@@ -2288,7 +2288,9 @@ UniquePtr<uint8_t[]> CanvasRenderingContext2D::GetImageBuffer(
PrincipalOrNull(), ret.get(), out_imageSize->width,
out_imageSize->height,
out_imageSize->width * out_imageSize->height * 4);
- if (aExtractionBehavior == CanvasUtils::ImageExtraction::Randomize) {
+ if (aExtractionBehavior == CanvasUtils::ImageExtraction::Randomize ||
+ aExtractionBehavior ==
+ CanvasUtils::ImageExtraction::EfficientRandomize) {
nsRFPService::RandomizePixels(
GetCookieJarSettings(), PrincipalOrNull(), ret.get(),
out_imageSize->width, out_imageSize->height,
@@ -6682,7 +6684,8 @@ nsresult CanvasRenderingContext2D::GetImageDataArray(
//
// Note that we don't need to clone if we will use the place holder because
// the place holder doesn't use actual image data.
- if (extractionBehavior == CanvasUtils::ImageExtraction::Randomize) {
+ if (extractionBehavior == CanvasUtils::ImageExtraction::Randomize ||
+ extractionBehavior == CanvasUtils::ImageExtraction::EfficientRandomize) {
if (readback) {
readback = CreateDataSourceSurfaceByCloning(readback);
}
@@ -6704,7 +6707,9 @@ nsresult CanvasRenderingContext2D::GetImageDataArray(
// service) after we call JS_GetUint8ClampedArrayData, we will
// pre-generate the randomness required for GeneratePlaceholderCanvasData.
randomData = TryToGenerateRandomDataForPlaceholderCanvasData();
- } else if (extractionBehavior == CanvasUtils::ImageExtraction::Randomize) {
+ } else if (extractionBehavior == CanvasUtils::ImageExtraction::Randomize ||
+ extractionBehavior ==
+ CanvasUtils::ImageExtraction::EfficientRandomize) {
// Apply the random noises if canvan randomization is enabled. We don't
// need to calculate random noises if we are going to use the place
// holder.
diff --git a/dom/canvas/ClientWebGLContext.cpp b/dom/canvas/ClientWebGLContext.cpp
index f56f1107070e..afed0c39f23a 100644
--- a/dom/canvas/ClientWebGLContext.cpp
+++ b/dom/canvas/ClientWebGLContext.cpp
@@ -1367,7 +1367,8 @@ UniquePtr<uint8_t[]> ClientWebGLContext::GetImageBuffer(
*out_imageSize = dataSurface->GetSize();
nsRFPService::PotentiallyDumpImage(PrincipalOrNull(), dataSurface);
- if (aExtractionBehavior == CanvasUtils::ImageExtraction::Randomize) {
+ if (aExtractionBehavior == CanvasUtils::ImageExtraction::Randomize ||
+ aExtractionBehavior == CanvasUtils::ImageExtraction::EfficientRandomize) {
return gfxUtils::GetImageBufferWithRandomNoise(
dataSurface, premultAlpha, GetCookieJarSettings(), PrincipalOrNull(),
out_format);
@@ -3680,7 +3681,9 @@ void ClientWebGLContext::GetBufferSubData(GLenum target, GLintptr srcByteOffset,
if (extraction == CanvasUtils::ImageExtraction::Placeholder) {
dom::GeneratePlaceholderCanvasData(destView->size_bytes(),
destView->Elements());
- } else if (extraction == CanvasUtils::ImageExtraction::Randomize) {
+ } else if (extraction == CanvasUtils::ImageExtraction::Randomize ||
+ extraction ==
+ CanvasUtils::ImageExtraction::EfficientRandomize) {
// We have no idea what's in the buffer. So, we randomize it as if each
// elemSize bytes is a single element.
uint8_t elementsPerGroup = 1,
@@ -5455,7 +5458,8 @@ void ClientWebGLContext::ReadPixels(GLint x, GLint y, GLsizei width,
} else {
RecordCanvasUsage(CanvasExtractionAPI::ReadPixels,
CSSIntSize(width, height));
- if (extraction == CanvasUtils::ImageExtraction::Randomize) {
+ if (extraction == CanvasUtils::ImageExtraction::Randomize ||
+ extraction == CanvasUtils::ImageExtraction::EfficientRandomize) {
const auto pii = webgl::PackingInfoInfo::For(desc.pi);
// DoReadPixels() requres pii to be Some().
MOZ_ASSERT(pii.isSome());
diff --git a/toolkit/components/resistfingerprinting/nsRFPService.cpp b/toolkit/components/resistfingerprinting/nsRFPService.cpp
index ea47718beff8..ccc9f21c9bf2 100644
--- a/toolkit/components/resistfingerprinting/nsRFPService.cpp
+++ b/toolkit/components/resistfingerprinting/nsRFPService.cpp
@@ -1890,6 +1890,7 @@ nsresult nsRFPService::RandomizeElements(
return NS_OK;
}
+ /*
// Don't randomize if all groups are uniform.
const bool allGroupsMatch = [&]() {
auto itr = RangedPtr<const uint8_t>(aData, aSizeInBytes);
@@ -1904,6 +1905,7 @@ nsresult nsRFPService::RandomizeElements(
if (allGroupsMatch) {
return NS_OK;
}
+ */
auto timerId =
glean::fingerprinting_protection::canvas_noise_calculate_time_2.Start();
--
2.47.3
@@ -1,179 +0,0 @@
From 61b38ed69d7f2660775f702da1df6a1b9dd84a2a Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:10:05 +0100
Subject: [PATCH 15/52] fullpage-translations-customization.patch
---
browser/base/content/main-popupset.inc.xhtml | 2 +
browser/base/content/main-popupset.js | 3 ++
.../preferences/config/languages.mjs | 1 +
browser/components/preferences/main.inc.xhtml | 11 ++++-
browser/components/preferences/main.js | 43 ++++++++++---------
.../content/fullPageTranslationsPanel.js | 9 ++++
6 files changed, 47 insertions(+), 22 deletions(-)
diff --git a/browser/base/content/main-popupset.inc.xhtml b/browser/base/content/main-popupset.inc.xhtml
index 47603929dbad..459b7b426c4b 100644
--- a/browser/base/content/main-popupset.inc.xhtml
+++ b/browser/base/content/main-popupset.inc.xhtml
@@ -1005,6 +1005,8 @@
type="checkbox"
autocheck="false"
id="translations-panel-settings-never-translate-site"/>
+ <menuitem data-l10n-id="translations-panel-disable-translations"
+ id="translations-panel-disable-translations"/>
<menuseparator/>
<menuitem class="manage-languages-menuitem"
data-l10n-id="translations-panel-settings-manage-languages"
diff --git a/browser/base/content/main-popupset.js b/browser/base/content/main-popupset.js
index 1286fba14b0c..47cfc8b16858 100644
--- a/browser/base/content/main-popupset.js
+++ b/browser/base/content/main-popupset.js
@@ -438,6 +438,9 @@ document.addEventListener(
case "translations-panel-settings-never-translate-site":
FullPageTranslationsPanel.onNeverTranslateSite();
break;
+ case "translations-panel-disable-translations":
+ FullPageTranslationsPanel.openDisableTranslations();
+ break;
case "translations-panel-manage-languages":
FullPageTranslationsPanel.openManageLanguages();
break;
diff --git a/browser/components/preferences/config/languages.mjs b/browser/components/preferences/config/languages.mjs
index 7dd8ff65d59e..7123cb0f4639 100644
--- a/browser/components/preferences/config/languages.mjs
+++ b/browser/components/preferences/config/languages.mjs
@@ -20,6 +20,7 @@ Preferences.addAll([
{ id: "privacy.spoof_english", type: "int" },
{ id: "layout.spellcheckDefault", type: "int" },
{ id: "browser.translations.automaticallyPopup", type: "bool" },
+ { id: "browser.translations.enable", type: "bool" },
]);
/**
diff --git a/browser/components/preferences/main.inc.xhtml b/browser/components/preferences/main.inc.xhtml
index f6badc31b612..9ea6086f8b88 100644
--- a/browser/components/preferences/main.inc.xhtml
+++ b/browser/components/preferences/main.inc.xhtml
@@ -106,8 +106,16 @@
<!-- This Translations UI is the pre-settings-redesign UI and should be removed
when getting ready for the settings redesign to fully ship. -->
- <vbox id="translationsGroup" data-srd-groupid="translations" hidden="true" data-subcategory="translations">
+ <vbox id="translationsGroup" data-srd-groupid="translations" data-subcategory="translations">
<label><html:h2 data-l10n-id="translations-manage-header"/></label>
+ <checkbox id="translations-manage-enable"
+ data-l10n-id="translations-manage-enable"
+ preference="browser.translations.enable"
+ data-subcategory="translations-enable" />
+ <vbox id="innerTranslationsGroup" hidden="true">
+ <checkbox id="translations-manage-autopopup"
+ data-l10n-id="translations-manage-autopopup"
+ preference="browser.translations.automaticallyPopup" />
<hbox id="translations-manage-description" align="center">
<description flex="1" data-l10n-id="translations-manage-intro-2"/>
<button id="translations-manage-settings-button"
@@ -128,6 +136,7 @@
</html:div>
<description id="translations-manage-error" hidden="true"></description>
</vbox>
+ </vbox>
</vbox>
</groupbox>
diff --git a/browser/components/preferences/main.js b/browser/components/preferences/main.js
index 5a56d348146c..d75d3c81cfa5 100644
--- a/browser/components/preferences/main.js
+++ b/browser/components/preferences/main.js
@@ -713,6 +713,10 @@ var gMainPane = {
window.addEventListener("unload", this);
// Notify observers that the UI is now ready
+ Preferences.addSyncFromPrefListener(
+ document.getElementById("translations-manage-enable"),
+ () => this.readEnableTranslations()
+ );
Services.obs.notifyObservers(window, "main-pane-loaded");
this.setInitialized();
},
@@ -813,39 +817,36 @@ var gMainPane = {
button.disabled = !preference.value;
return undefined;
},
+
+ readEnableTranslations(skipInit = false) {
+ const translationsEnabled = Preferences.get("browser.translations.enable").value;
+ document.getElementById("innerTranslationsGroup").hidden = !translationsEnabled;
+ if (!this._translationsInitialized && !skipInit)
+ this.initTranslations();
+ },
+
+ _translationsInitialized: false,
+
/**
* Initialize the translations view.
*/
async initTranslations() {
- let legacyTranslationsVisible = Preferences.getSetting(
- "legacyTranslationsVisible"
- );
+ this.readEnableTranslations(true);
+
+ if (!Services.prefs.getBoolPref("browser.translations.enable")) {
+ return;
+ }
+
+ this._translationsInitialized = true;
+
/**
* Which phase a language download is in.
*
* @typedef {"downloaded" | "loading" | "uninstalled"} DownloadPhase
*/
- let translationsGroup = document.getElementById("translationsGroup");
- let setTranslationsGroupVisbility = () => {
- // Immediately show the group so that the async load of the component does
- // not cause the layout to jump. The group will be empty initially.
- translationsGroup.hidden = !legacyTranslationsVisible.visible;
- translationsGroup.classList.toggle(
- "setting-hidden",
- translationsGroup.hidden
- );
- };
- setTranslationsGroupVisbility();
- legacyTranslationsVisible.on("change", setTranslationsGroupVisbility);
- window.addEventListener(
- "unload",
- () =>
- legacyTranslationsVisible.off("change", setTranslationsGroupVisbility),
- { once: true }
- );
class TranslationsState {
/**
diff --git a/browser/components/translations/content/fullPageTranslationsPanel.js b/browser/components/translations/content/fullPageTranslationsPanel.js
index 91666d6e513c..f65017583ef1 100644
--- a/browser/components/translations/content/fullPageTranslationsPanel.js
+++ b/browser/components/translations/content/fullPageTranslationsPanel.js
@@ -1342,6 +1342,15 @@ var FullPageTranslationsPanel = new (class {
);
}
+ openDisableTranslations() {
+ const window =
+ gBrowser.selectedBrowser.browsingContext.top.embedderElement.ownerGlobal;
+ window.openTrustedLinkIn(
+ "about:preferences#general-translations-enable",
+ "tab"
+ );
+ }
+
/**
* Redirect the user to about:preferences
*/
--
2.47.3
@@ -1,24 +0,0 @@
From 28d1d9f1d35be687c7caf9cf59d72fb2870a7639 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:10:09 +0100
Subject: [PATCH 16/52] languages.patch
---
browser/locales/shipped-locales | 1 +
1 file changed, 1 insertion(+)
diff --git a/browser/locales/shipped-locales b/browser/locales/shipped-locales
index 41ee3f73d91c..7f501f4c7391 100644
--- a/browser/locales/shipped-locales
+++ b/browser/locales/shipped-locales
@@ -57,6 +57,7 @@ kk
km
kn
ko
+ku
lij
lt
lv
--
2.47.3
@@ -1,65 +0,0 @@
From 26cad7aba0e8913d91fb1ea94d063295635e26d1 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:10:12 +0100
Subject: [PATCH 17/52] limit-access.patch
---
caps/nsScriptSecurityManager.cpp | 42 ++++++++++++++++++++++++++++++++
1 file changed, 42 insertions(+)
diff --git a/caps/nsScriptSecurityManager.cpp b/caps/nsScriptSecurityManager.cpp
index aaca13e98a07..5a320f3279af 100644
--- a/caps/nsScriptSecurityManager.cpp
+++ b/caps/nsScriptSecurityManager.cpp
@@ -1031,6 +1031,48 @@ nsresult nsScriptSecurityManager::CheckLoadURIFlags(
}
}
+ // Only allow some "about:" pages to have access to contentaccessible
+ // "chrome://branding/" assets. Otherwise web pages could easily and
+ // consistently detect the differences between channels when their
+ // branding differs. See tor-browser#43308 and tor-browser#42319.
+ // NOTE: The same assets under the alternative URI
+ // "resource:///chrome/browser/content/branding/" should already be
+ // inaccessible to web content, so we only add a condition for the chrome
+ // path.
+ if (targetScheme.EqualsLiteral("chrome")) {
+ nsAutoCString targetHost;
+ rv = aTargetBaseURI->GetHost(targetHost);
+ NS_ENSURE_SUCCESS(rv, rv);
+ if (targetHost.EqualsLiteral("branding")) {
+ // Disallow any Principal whose scheme is not "about", or is a
+ // contentaccessible "about" URI ("about:blank" or "about:srcdoc").
+ // NOTE: "about:blank" and "about:srcdoc" would be unexpected here
+ // since such a document spawned by a web document should inherit the
+ // same Principal URI. I.e. they would be "http:" or "https:" schemes.
+ // But we add this condition for extra assurances.
+ // NOTE: Documents with null Principals, like "about:blank" typed by
+ // the user, would also be excluded since the Principal URI would be
+ // "moz-nullprincipal:".
+ if (!aSourceBaseURI->SchemeIs("about") ||
+ NS_IsContentAccessibleAboutURI(aSourceBaseURI)) {
+ return NS_ERROR_DOM_BAD_URI;
+ }
+ // Also exclude "about:reader" from accessing branding assets. I.e. if
+ // a web page includes `<img src="chrome://branding/..." />` we do not
+ // want it to render within "about:reader" either.
+ // Though it is unknown whether the information within "about:reader"
+ // would be exploitable by a web page, we also want to exclude
+ // "about:reader" for consistency: if it does not display in the
+ // original web page, it should not display in "about:reader" either.
+ nsAutoCString sourcePath;
+ rv = aSourceBaseURI->GetFilePath(sourcePath);
+ NS_ENSURE_SUCCESS(rv, rv);
+ if (sourcePath.EqualsLiteral("reader")) {
+ return NS_ERROR_DOM_BAD_URI;
+ }
+ }
+ }
+
if (targetScheme.EqualsLiteral("resource")) {
if (StaticPrefs::security_all_resource_uri_content_accessible()) {
return NS_OK;
--
2.47.3
@@ -1,45 +0,0 @@
From 9410b040ecde531f6c10992f1f64af126b510ed5 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:10:16 +0100
Subject: [PATCH 18/52] link-preview.patch
---
.../preferences/config/tabs-browsing.mjs | 14 ++++++--------
1 file changed, 6 insertions(+), 8 deletions(-)
diff --git a/browser/components/preferences/config/tabs-browsing.mjs b/browser/components/preferences/config/tabs-browsing.mjs
index 50fb55329067..7d4b5bec8b53 100644
--- a/browser/components/preferences/config/tabs-browsing.mjs
+++ b/browser/components/preferences/config/tabs-browsing.mjs
@@ -440,22 +440,20 @@ Preferences.addSetting({
Preferences.addSetting({
id: "linkPreviewEnabled",
pref: "browser.ml.linkPreview.enabled",
+});
+Preferences.addSetting({
+ id: "linkPreviewKeyPoints",
+ pref: "browser.ml.linkPreview.optin",
deps: ["aiControlDefault", "aiControlLinkPreviews"],
visible: ({ aiControlDefault, aiControlLinkPreviews }) => {
return (
window.canShowAiFeature(aiControlLinkPreviews, aiControlDefault) &&
+ // LinkPreview.canShowKeyPoints depends on the global genai pref.
// @ts-ignore bug 1996860
- lazy.LinkPreview.canShowPreferences
+ lazy.LinkPreview.canShowKeyPoints
);
},
});
-Preferences.addSetting({
- id: "linkPreviewKeyPoints",
- pref: "browser.ml.linkPreview.optin",
- // LinkPreview.canShowKeyPoints depends on the global genai pref.
- // @ts-ignore bug 1996860
- visible: () => lazy.LinkPreview.canShowKeyPoints,
-});
Preferences.addSetting({
id: "linkPreviewLongPress",
pref: "browser.ml.linkPreview.longPress",
--
2.47.3
@@ -1,277 +0,0 @@
From 62fca4b579e3ad49fa5b8ad09b04d9bec7640261 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:10:22 +0100
Subject: [PATCH 19/52] lw-permissions.patch
---
.../base/content/navigator-toolbox.inc.xhtml | 6 ++
.../preferences/config/permissions-data.mjs | 82 +++++++++++++++++++
.../preferences/dialogs/sitePermissions.js | 14 ++++
browser/modules/SitePermissions.sys.mjs | 51 ++++++++++++
browser/modules/moz.build | 2 +
browser/themes/shared/preferences/privacy.css | 8 ++
6 files changed, 163 insertions(+)
diff --git a/browser/base/content/navigator-toolbox.inc.xhtml b/browser/base/content/navigator-toolbox.inc.xhtml
index da5ce8e0cfc5..f23d366e0b56 100644
--- a/browser/base/content/navigator-toolbox.inc.xhtml
+++ b/browser/base/content/navigator-toolbox.inc.xhtml
@@ -283,6 +283,10 @@
data-l10n-id="urlbar-autoplay-media-blocked"/>
<image data-permission-id="canvas" class="blocked-permission-icon canvas-icon" role="button"
data-l10n-id="urlbar-canvas-blocked"/>
+ <image data-permission-id="media-key-system-access" class="blocked-permission-icon drm-icon" role="button"
+ data-l10n-id="urlbar-eme-blocked"/>
+ <image data-permission-id="webgl" class="blocked-permission-icon webgl-icon" role="button"
+ data-l10n-id="urlbar-webgl-blocked"/>
<image data-permission-id="midi" class="blocked-permission-icon midi-icon" role="button"
data-l10n-id="urlbar-midi-blocked"/>
<image data-permission-id="serial" class="blocked-permission-icon serial-icon" role="button"
@@ -314,6 +318,8 @@
data-l10n-id="urlbar-addons-notification-anchor"/>
<image id="canvas-notification-icon" class="notification-anchor-icon" role="button"
data-l10n-id="urlbar-canvas-notification-anchor"/>
+ <image id="webgl-notification-icon" class="notification-anchor-icon" role="button"
+ data-l10n-id="urlbar-webgl-notification-anchor"/>
<image id="indexedDB-notification-icon" class="notification-anchor-icon indexedDB-icon" role="button"
data-l10n-id="urlbar-indexed-db-notification-anchor"/>
<image id="password-notification-icon" class="notification-anchor-icon" role="button"
diff --git a/browser/components/preferences/config/permissions-data.mjs b/browser/components/preferences/config/permissions-data.mjs
index 021036868962..e9f9ae828c2c 100644
--- a/browser/components/preferences/config/permissions-data.mjs
+++ b/browser/components/preferences/config/permissions-data.mjs
@@ -63,6 +63,11 @@ Preferences.addAll([
{ id: PREF_ADDON_RECOMMENDATIONS_ENABLED, type: "bool" },
{ id: PREF_UPLOAD_ENABLED, type: "bool" },
{ id: "datareporting.usage.uploadEnabled", type: "bool" },
+
+ { id: "browser.eme.ui.enabled", type: "bool" },
+ { id: "librewolf.webgl.prompt", type: "bool" },
+ { id: "media.eme.require-app-approval", type: "bool" },
+ { id: "webgl.disabled", type: "bool" },
]);
/**
@@ -498,6 +503,53 @@ Preferences.addSetting(
})
);
+Preferences.addSetting({
+ id: "emeEnabled",
+ pref: "media.eme.enabled",
+});
+Preferences.addSetting({
+ id: "emePermissionPromptEnabled",
+ pref: "media.eme.require-app-approval",
+});
+Preferences.addSetting({
+ id: "emeUIEnabled",
+ pref: "browser.eme.ui.enabled",
+});
+Preferences.addSetting({
+ id: "emeSettingsButton",
+ onUserClick: () => showPermissionExceptions({ permissionType: "media-key-system-access" }),
+ deps: ["emeEnabled", "emePermissionPromptEnabled", "emeUIEnabled"],
+ visible: deps => {
+ return deps.emeEnabled.value && deps.emePermissionPromptEnabled.value && deps.emeUIEnabled.value;
+ },
+});
+
+Preferences.addSetting({
+ id: "webglPermissionPromptEnabled",
+ pref: "librewolf.webgl.prompt",
+});
+Preferences.addSetting({
+ id: "webglDisabled",
+ pref: "webgl.disabled",
+});
+Preferences.addSetting({
+ id: "webglSettingsButton",
+ onUserClick: () => showPermissionExceptions({ permissionType: "webgl" }),
+ deps: ["webglPermissionPromptEnabled", "webglDisabled"],
+ visible: deps => {
+ return deps.webglPermissionPromptEnabled.value && !deps.webglDisabled.value;
+ },
+});
+
+Preferences.addSetting({
+ id: "canvasSettingsButton",
+ onUserClick: () => showPermissionExceptions({ permissionType: "canvas" }),
+ deps: ["resistFingerprinting"],
+ visible: deps => {
+ return deps.resistFingerprinting.value;
+ },
+});
+
SettingGroupManager.registerGroups({
permissions: {
id: "permissions",
@@ -607,6 +659,36 @@ SettingGroupManager.registerGroups({
"permissions-remove.label,permissions-remove-all.label,permissions-site-xr-window2.title,permissions-site-xr-desc,permissions-site-xr-disable-label,permissions-site-xr-disable-desc,",
},
},
+ {
+ id: "webglSettingsButton",
+ control: "moz-box-button",
+ l10nId: "permissions-webgl2",
+ controlAttrs: {
+ ".iconSrc": "chrome://browser/skin/notification-icons/webgl.svg",
+ "search-l10n-ids":
+ "permissions-remove.label,permissions-remove-all.label,permissions-site-webgl-window2.title,permissions-site-webgl-desc",
+ },
+ },
+ {
+ id: "canvasSettingsButton",
+ control: "moz-box-button",
+ l10nId: "permissions-canvas2",
+ controlAttrs: {
+ ".iconSrc": "chrome://browser/skin/canvas.svg",
+ "search-l10n-ids":
+ "permissions-remove.label,permissions-remove-all.label,permissions-site-canvas-window2.title,permissions-site-canvas-desc",
+ },
+ },
+ {
+ id: "emeSettingsButton",
+ control: "moz-box-button",
+ l10nId: "permissions-eme2",
+ controlAttrs: {
+ ".iconSrc": "chrome://browser/skin/drm-icon.svg",
+ "search-l10n-ids":
+ "permissions-remove.label,permissions-remove-all.label,permissions-site-eme-window2.title,permissions-site-eme-desc,permissions-site-eme-disable-label,permissions-site-eme-disable-desc",
+ },
+ },
],
},
{
diff --git a/browser/components/preferences/dialogs/sitePermissions.js b/browser/components/preferences/dialogs/sitePermissions.js
index 013c0df347bb..633b9f3e4512 100644
--- a/browser/components/preferences/dialogs/sitePermissions.js
+++ b/browser/components/preferences/dialogs/sitePermissions.js
@@ -40,6 +40,20 @@ const sitePermissionsL10n = {
disableLabel: "permissions-site-xr-disable-label",
disableDescription: "permissions-site-xr-disable-desc",
},
+ "media-key-system-access": {
+ window: "permissions-site-eme-window2",
+ description: "permissions-site-eme-desc",
+ disableLabel: "permissions-site-eme-disable-label",
+ disableDescription: "permissions-site-eme-disable-desc",
+ },
+ webgl: {
+ window: "permissions-site-webgl-window2",
+ description: "permissions-site-webgl-desc",
+ },
+ canvas: {
+ window: "permissions-site-canvas-window2",
+ description: "permissions-site-canvas-desc",
+ },
camera: {
window: "permissions-site-camera-window2",
description: "permissions-site-camera-desc",
diff --git a/browser/modules/SitePermissions.sys.mjs b/browser/modules/SitePermissions.sys.mjs
index b112014e0d49..9e2a36111674 100644
--- a/browser/modules/SitePermissions.sys.mjs
+++ b/browser/modules/SitePermissions.sys.mjs
@@ -1138,6 +1138,21 @@ let gPermissions = {
},
},
+ "media-key-system-access": {
+ labelID: "eme",
+ exactHostMatch: true,
+ get disabled() {
+ return !SitePermissions.emeEnabled || !SitePermissions.emePermissionPromptEnabled || !SitePermissions.emeUIEnabled;
+ },
+ },
+
+ webgl: {
+// exactHostMatch: true,
+ get disabled() {
+ return !SitePermissions.webglPermissionPromptEnabled || SitePermissions.webglDisabled;
+ },
+ },
+
midi: {
exactHostMatch: true,
get disabled() {
@@ -1171,6 +1186,42 @@ let gPermissions = {
},
};
+XPCOMUtils.defineLazyPreferenceGetter(
+ SitePermissions,
+ "emeEnabled",
+ "media.eme.enabled",
+ false,
+ SitePermissions.invalidatePermissionList.bind(SitePermissions)
+);
+XPCOMUtils.defineLazyPreferenceGetter(
+ SitePermissions,
+ "emePermissionPromptEnabled",
+ "media.eme.require-app-approval",
+ true,
+ SitePermissions.invalidatePermissionList.bind(SitePermissions)
+);
+XPCOMUtils.defineLazyPreferenceGetter(
+ SitePermissions,
+ "emeUIEnabled",
+ "browser.eme.ui.enabled",
+ true,
+ SitePermissions.invalidatePermissionList.bind(SitePermissions)
+);
+XPCOMUtils.defineLazyPreferenceGetter(
+ SitePermissions,
+ "webglPermissionPromptEnabled",
+ "librewolf.webgl.prompt",
+ true,
+ SitePermissions.invalidatePermissionList.bind(SitePermissions)
+);
+XPCOMUtils.defineLazyPreferenceGetter(
+ SitePermissions,
+ "webglDisabled",
+ "webgl.disabled",
+ false,
+ SitePermissions.invalidatePermissionList.bind(SitePermissions)
+);
+
SitePermissions.midiPermissionEnabled = Services.prefs.getBoolPref(
"dom.webmidi.enabled"
);
diff --git a/browser/modules/moz.build b/browser/modules/moz.build
index eebf824044aa..d8dfd195fc73 100644
--- a/browser/modules/moz.build
+++ b/browser/modules/moz.build
@@ -150,9 +150,11 @@ EXTRA_JS_MODULES += [
MOZ_SRC_FILES += [
"CanvasPermissionPromptHelper.sys.mjs",
"ContextId.sys.mjs",
+ "EMEPermissionPrompt.sys.mjs",
"ObserverForwarder.sys.mjs",
"PrivateBrowsingUI.sys.mjs",
"SerialDeviceSharingHelper.sys.mjs",
+ "WebGLPermissionPromptHelper.sys.mjs",
]
if CONFIG["MOZ_WIDGET_TOOLKIT"] == "windows":
diff --git a/browser/themes/shared/preferences/privacy.css b/browser/themes/shared/preferences/privacy.css
index 896619be9a33..cbe70bc6455d 100644
--- a/browser/themes/shared/preferences/privacy.css
+++ b/browser/themes/shared/preferences/privacy.css
@@ -37,6 +37,14 @@
list-style-image: url(chrome://browser/skin/notification-icons/xr.svg);
}
+.drm-icon {
+ list-style-image: url(chrome://browser/skin/drm-icon.svg);
+}
+
+.webgl-icon {
+ list-style-image: url(chrome://browser/skin/notification-icons/webgl.svg);
+}
+
.camera-icon {
list-style-image: url(chrome://browser/skin/notification-icons/camera.svg);
}
--
2.47.3
@@ -1,32 +0,0 @@
From 1fa7b395367dfa3c3b42b35461fb9c0bba2930e0 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:10:25 +0100
Subject: [PATCH 20/52] moz-configure.patch
---
toolkit/moz.configure | 2 ++
1 file changed, 2 insertions(+)
diff --git a/toolkit/moz.configure b/toolkit/moz.configure
index a20a82fa6d06..0290e89ec973 100644
--- a/toolkit/moz.configure
+++ b/toolkit/moz.configure
@@ -20,6 +20,7 @@ def check_moz_app_id(moz_app_id, build_project):
project_flag(
env="MOZ_APP_VENDOR",
+ default="LibreWolf",
nargs=1,
help='Used for application.ini\'s "Vendor" field, which also impacts profile location and user-visible fields',
)
@@ -33,6 +34,7 @@ project_flag(
project_flag(
"MOZ_APP_PROFILE",
+ default="librewolf",
nargs=1,
help='Used for application.ini\'s "Profile" field, which controls profile location',
)
--
2.47.3
@@ -1,171 +0,0 @@
From a7c5a02b1e5515e04e88068d9125b4078b5137a0 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:10:30 +0100
Subject: [PATCH 21/52] mozilla_dirs.patch
---
.../extensions/NativeManifests.sys.mjs | 2 +
toolkit/xre/nsXREDirProvider.cpp | 54 ++++++++-----------
xpcom/build/nsXULAppAPI.h | 2 +
3 files changed, 27 insertions(+), 31 deletions(-)
diff --git a/toolkit/components/extensions/NativeManifests.sys.mjs b/toolkit/components/extensions/NativeManifests.sys.mjs
index 48d7d50cdec3..fbf39fba0d3a 100644
--- a/toolkit/components/extensions/NativeManifests.sys.mjs
+++ b/toolkit/components/extensions/NativeManifests.sys.mjs
@@ -37,6 +37,8 @@ export var NativeManifests = {
let dirs = [
Services.dirsvc.get("XREUserNativeManifests", Ci.nsIFile).path,
Services.dirsvc.get("XRESysNativeManifests", Ci.nsIFile).path,
+ Services.dirsvc.get("XREMozUserNativeManifests", Ci.nsIFile).path,
+ Services.dirsvc.get("XREMozSysNativeManifests", Ci.nsIFile).path,
];
this._lookup = (type, name, context) =>
this._tryPaths(type, name, dirs, context);
diff --git a/toolkit/xre/nsXREDirProvider.cpp b/toolkit/xre/nsXREDirProvider.cpp
index dcce3335e14f..004c767956f2 100644
--- a/toolkit/xre/nsXREDirProvider.cpp
+++ b/toolkit/xre/nsXREDirProvider.cpp
@@ -332,23 +332,25 @@ nsresult nsXREDirProvider::GetBackgroundTasksProfilesRootDir(
* On Linux this is /usr/{lib,lib64}/mozilla
* (for 32- and 64-bit systems respsectively)
*/
-static nsresult GetSystemParentDirectory(nsIFile** aFile) {
+static nsresult GetSystemParentDirectory(nsIFile** aFile,
+ nsCString aName = "LibreWolf"_ns) {
nsresult rv;
nsCOMPtr<nsIFile> localDir;
# if defined(XP_MACOSX)
rv = GetOSXFolderType(kOnSystemDisk, kApplicationSupportFolderType,
getter_AddRefs(localDir));
if (NS_SUCCEEDED(rv)) {
- rv = localDir->AppendNative("Mozilla"_ns);
+ rv = localDir->AppendNative(aName);
}
# else
- constexpr auto dirname =
+ ToLowerCase(aName);
+ nsCString dirname =
# ifdef HAVE_USR_LIB64_DIR
- "/usr/lib64/mozilla"_ns
+ "/usr/lib64/"_ns + aName
# elif defined(__OpenBSD__) || defined(__FreeBSD__)
- "/usr/local/lib/mozilla"_ns
+ "/usr/local/lib/"_ns + aName
# else
- "/usr/lib/mozilla"_ns
+ "/usr/lib/"_ns + aName
# endif
;
rv = NS_NewNativeLocalFile(dirname, getter_AddRefs(localDir));
@@ -416,11 +418,21 @@ nsXREDirProvider::GetFile(const char* aProperty, bool* aPersistent,
#if defined(XP_UNIX) || defined(XP_MACOSX)
else if (!strcmp(aProperty, XRE_SYS_NATIVE_MANIFESTS)) {
rv = ::GetSystemParentDirectory(getter_AddRefs(file));
+ } else if (!strcmp(aProperty, XRE_MOZ_SYS_NATIVE_MANIFESTS)) {
+ rv = ::GetSystemParentDirectory(getter_AddRefs(file), "Mozilla"_ns);
} else if (!strcmp(aProperty, XRE_USER_NATIVE_MANIFESTS)) {
// Keep forcing the legacy path for compatibility
rv = GetUserDataDirectoryHome(getter_AddRefs(file), /* aLocal */ false,
/* aForceLegacy */ true);
NS_ENSURE_SUCCESS(rv, rv);
+# if defined(XP_MACOSX)
+ rv = file->AppendNative("LibreWolf"_ns);
+# else // defined(XP_MACOSX)
+ rv = file->AppendNative(".librewolf"_ns);
+# endif // defined(XP_MACOSX)
+ } else if (!strcmp(aProperty, XRE_MOZ_USER_NATIVE_MANIFESTS)) {
+ rv = GetUserDataDirectoryHome(getter_AddRefs(file), false, true);
+ NS_ENSURE_SUCCESS(rv, rv);
# if defined(XP_MACOSX)
rv = file->AppendNative("Mozilla"_ns);
# else // defined(XP_MACOSX)
@@ -454,9 +466,9 @@ nsXREDirProvider::GetFile(const char* aProperty, bool* aPersistent,
else if (!strcmp(aProperty, XRE_SYS_SHARE_EXTENSION_PARENT_DIR)) {
# ifdef ENABLE_SYSTEM_EXTENSION_DIRS
# if defined(__OpenBSD__) || defined(__FreeBSD__)
- static const char* const sysLExtDir = "/usr/local/share/mozilla/extensions";
+ static const char* const sysLExtDir = "/usr/local/share/librewolf/extensions";
# else
- static const char* const sysLExtDir = "/usr/share/mozilla/extensions";
+ static const char* const sysLExtDir = "/usr/share/librewolf/extensions";
# endif
rv = NS_NewNativeLocalFile(nsDependentCString(sysLExtDir),
getter_AddRefs(file));
@@ -980,13 +992,7 @@ nsresult nsXREDirProvider::GetUpdateRootDir(nsIFile** aResult,
}
appDirPath = Substring(appDirPath, 1, dotIndex - 1);
- bool hasVendor = GetAppVendor() && strlen(GetAppVendor()) != 0;
- if (hasVendor || GetAppName()) {
- if (NS_FAILED(localDir->AppendNative(
- nsDependentCString(hasVendor ? GetAppVendor() : GetAppName())))) {
- return NS_ERROR_FAILURE;
- }
- } else if (NS_FAILED(localDir->AppendNative("Mozilla"_ns))) {
+ if (NS_FAILED(localDir->AppendNative("LibreWolf"_ns))) {
return NS_ERROR_FAILURE;
}
@@ -1284,7 +1290,7 @@ nsresult nsXREDirProvider::AppendSysUserExtensionPath(nsIFile* aFile) {
#if defined(XP_MACOSX) || defined(XP_WIN)
- static const char* const sXR = "Mozilla";
+ static const char* const sXR = "LibreWolf";
rv = aFile->AppendNative(nsDependentCString(sXR));
NS_ENSURE_SUCCESS(rv, rv);
@@ -1294,7 +1300,7 @@ nsresult nsXREDirProvider::AppendSysUserExtensionPath(nsIFile* aFile) {
#elif defined(XP_UNIX)
- static const char* const sXR = ".mozilla";
+ static const char* const sXR = ".librewolf";
rv = aFile->AppendNative(nsDependentCString(sXR));
NS_ENSURE_SUCCESS(rv, rv);
@@ -1599,10 +1605,6 @@ nsresult nsXREDirProvider::AppendProfilePath(nsIFile* aFile, bool aLocal) {
if (!profile.IsEmpty()) {
rv = AppendProfileString(aFile, profile.get());
} else {
- if (!vendor.IsEmpty()) {
- rv = aFile->AppendNative(vendor);
- NS_ENSURE_SUCCESS(rv, rv);
- }
rv = aFile->AppendNative(appName);
}
NS_ENSURE_SUCCESS(rv, rv);
@@ -1640,16 +1642,6 @@ nsresult nsXREDirProvider::AppendProfilePath(nsIFile* aFile, bool aLocal) {
rv = AppendProfileString(aFile, folder.get());
} else {
- if (!vendor.IsEmpty()) {
- folder.Append(vendor);
- ToLowerCase(folder);
-
- rv = aFile->AppendNative(folder);
- NS_ENSURE_SUCCESS(rv, rv);
-
- folder.Truncate();
- }
-
// This can be the case in tests.
if (!appName.IsEmpty()) {
folder.Append(appName);
diff --git a/xpcom/build/nsXULAppAPI.h b/xpcom/build/nsXULAppAPI.h
index 8a09115312f2..f8c623b611d4 100644
--- a/xpcom/build/nsXULAppAPI.h
+++ b/xpcom/build/nsXULAppAPI.h
@@ -113,6 +113,8 @@ struct BootstrapConfig;
*/
# define XRE_SYS_NATIVE_MANIFESTS "XRESysNativeManifests"
# define XRE_USER_NATIVE_MANIFESTS "XREUserNativeManifests"
+# define XRE_MOZ_SYS_NATIVE_MANIFESTS "XREMozSysNativeManifests"
+# define XRE_MOZ_USER_NATIVE_MANIFESTS "XREMozUserNativeManifests"
#endif
/**
--
2.47.3
@@ -1,112 +0,0 @@
From 301f96eacf384fb2c83b29e75370f198f12dc21c Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:10:36 +0100
Subject: [PATCH 22/52] moz-official.patch
---
browser/base/content/browser-development-helpers.js | 6 ++++--
browser/base/content/browser-main.js | 4 +---
browser/base/jar.mn | 2 --
browser/components/BrowserComponents.manifest | 2 --
dom/media/gmp/ChromiumCDMAdapter.cpp | 4 ++--
media/gmp-clearkey/0.1/gmp-clearkey.cpp | 2 +-
6 files changed, 8 insertions(+), 12 deletions(-)
diff --git a/browser/base/content/browser-development-helpers.js b/browser/base/content/browser-development-helpers.js
index 5155b280b8ff..8dea266fbde5 100644
--- a/browser/base/content/browser-development-helpers.js
+++ b/browser/base/content/browser-development-helpers.js
@@ -9,8 +9,10 @@
var DevelopmentHelpers = {
init() {
- this.quickRestart = this.quickRestart.bind(this);
- this.addRestartShortcut();
+ if (Services.prefs.getBoolPref("librewolf.devHelpers", false)) {
+ this.quickRestart = this.quickRestart.bind(this);
+ this.addRestartShortcut();
+ }
},
quickRestart() {
diff --git a/browser/base/content/browser-main.js b/browser/base/content/browser-main.js
index 1ff101aecefc..6b02e5acb177 100644
--- a/browser/base/content/browser-main.js
+++ b/browser/base/content/browser-main.js
@@ -11,9 +11,7 @@
if (AppConstants.MOZ_DATA_REPORTING) {
Services.scriptloader.loadSubScript("chrome://browser/content/browser-data-submission-info-bar.js", this);
}
- if (!AppConstants.MOZILLA_OFFICIAL) {
- Services.scriptloader.loadSubScript("chrome://browser/content/browser-development-helpers.js", this);
- }
+ Services.scriptloader.loadSubScript("chrome://browser/content/browser-development-helpers.js", this);
Services.scriptloader.loadSubScript("chrome://browser/content/browser-pageActions.js", this);
Services.scriptloader.loadSubScript("chrome://browser/content/sidebar/browser-sidebar.js", this);
Services.scriptloader.loadSubScript("chrome://browser/content/browser-customtitlebar.js", this);
diff --git a/browser/base/jar.mn b/browser/base/jar.mn
index 783c67d397a5..b280fc60f01b 100644
--- a/browser/base/jar.mn
+++ b/browser/base/jar.mn
@@ -41,9 +41,7 @@ browser.jar:
content/browser/browser-context.js (content/browser-context.js)
content/browser/browser-customization.js (content/browser-customization.js)
content/browser/browser-data-submission-info-bar.js (content/browser-data-submission-info-bar.js)
-#ifndef MOZILLA_OFFICIAL
content/browser/browser-development-helpers.js (content/browser-development-helpers.js)
-#endif
content/browser/browser-fullScreenAndPointerLock.js (content/browser-fullScreenAndPointerLock.js)
content/browser/browser-gestureSupport.js (content/browser-gestureSupport.js)
content/browser/browser-init.js (content/browser-init.js)
diff --git a/browser/components/BrowserComponents.manifest b/browser/components/BrowserComponents.manifest
index 5fc75066310e..a184e735ce4b 100644
--- a/browser/components/BrowserComponents.manifest
+++ b/browser/components/BrowserComponents.manifest
@@ -86,9 +86,7 @@ category browser-window-delayed-startup chrome://browser/content/browser-fullScr
#ifdef MOZ_DATA_REPORTING
category browser-window-delayed-startup chrome://browser/content/browser-data-submission-info-bar.js gDataNotificationInfoBar.init
#endif
-#ifndef MOZILLA_OFFICIAL
category browser-window-delayed-startup chrome://browser/content/browser-development-helpers.js DevelopmentHelpers.init
-#endif
category browser-window-delayed-startup chrome://browser/content/browser-addons.js gExtensionsNotifications.init
category browser-window-delayed-startup chrome://browser/content/browser-captivePortal.js CaptivePortalWatcher.delayedStartup
diff --git a/dom/media/gmp/ChromiumCDMAdapter.cpp b/dom/media/gmp/ChromiumCDMAdapter.cpp
index 3afba39c6a92..0956a87b124f 100644
--- a/dom/media/gmp/ChromiumCDMAdapter.cpp
+++ b/dom/media/gmp/ChromiumCDMAdapter.cpp
@@ -68,7 +68,7 @@ void* ChromiumCdmHostCompat(int aHostInterfaceVersion, void* aUserData) {
return aUserData;
}
-#ifdef MOZILLA_OFFICIAL
+#if 0
static cdm::HostFile TakeToCDMHostFile(HostFileData& aHostFileData) {
return cdm::HostFile(aHostFileData.mBinary.Path().get(),
aHostFileData.mBinary.TakePlatformFile(),
@@ -84,7 +84,7 @@ GMPErr ChromiumCDMAdapter::GMPInit(const GMPPlatformAPI* aPlatformAPI) {
return GMPGenericErr;
}
-#ifdef MOZILLA_OFFICIAL
+#if 0
// Note: we must call the VerifyCdmHost_0 function if it's present before
// we call the initialize function.
auto verify = reinterpret_cast<decltype(::VerifyCdmHost_0)*>(
diff --git a/media/gmp-clearkey/0.1/gmp-clearkey.cpp b/media/gmp-clearkey/0.1/gmp-clearkey.cpp
index 95f8b1ff3f41..d30b13721fdc 100644
--- a/media/gmp-clearkey/0.1/gmp-clearkey.cpp
+++ b/media/gmp-clearkey/0.1/gmp-clearkey.cpp
@@ -72,7 +72,7 @@ void* CreateCdmInstance(int cdm_interface_version, const char* key_system,
return nullptr;
}
-#ifdef MOZILLA_OFFICIAL
+#if 0
// Test that we're able to read the host files.
if (!sCanReadHostVerificationFiles) {
return nullptr;
--
2.47.3
@@ -1,201 +0,0 @@
From 088c12ddd95935ad1f55c91723dcd34442b4d240 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:10:41 +0100
Subject: [PATCH 23/52] msix.patch
---
.../windows/msix/AppxManifest.xml.in | 19 +---
python/mozbuild/mozbuild/mach_commands.py | 4 +-
python/mozbuild/mozbuild/repackaging/msix.py | 97 +++----------------
3 files changed, 16 insertions(+), 104 deletions(-)
diff --git a/browser/installer/windows/msix/AppxManifest.xml.in b/browser/installer/windows/msix/AppxManifest.xml.in
index 246f15595dad..9a953b3d16d2 100644
--- a/browser/installer/windows/msix/AppxManifest.xml.in
+++ b/browser/installer/windows/msix/AppxManifest.xml.in
@@ -30,13 +30,14 @@
</Resources>
<Dependencies>
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.22621.1555" />
+ <PackageDependency Name="Microsoft.VCLibs.140.00.UWPDesktop" MinVersion="14.0.0.0" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" />
</Dependencies>
<Capabilities>
<rescap:Capability Name="runFullTrust" />
</Capabilities>
<Applications>
<Application Id="App" Executable="VFS\ProgramFiles\@APPX_INSTDIR@\@MOZ_APP_NAME@.exe" EntryPoint="Windows.FullTrustApplication">
- <uap:VisualElements BackgroundColor="#20123A" DisplayName="@MOZ_APP_DISPLAYNAME@" Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png" Description="@MOZ_APP_DISPLAYNAME@">
+ <uap:VisualElements BackgroundColor="#FFFFFF" DisplayName="@MOZ_APP_DISPLAYNAME@" Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png" Description="@MOZ_APP_DISPLAYNAME@">
<uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png" Square310x310Logo="Assets\LargeTile.png" Square71x71Logo="Assets\SmallTile.png">
<uap:ShowNameOnTiles>
<uap:ShowOn Tile="square150x150Logo"/>
@@ -119,20 +120,4 @@
</Extensions>
</Application>
</Applications>
- <Extensions>
- <!-- These COM registrations allow Windows/MSAA to access Firefox accessibility features. -->
- <com:Extension Category="windows.comInterface">
- <com:ComInterface>
- <com:ProxyStub DisplayName="AccessibleMarshal"
- Id="1814ceeb-49e2-407f-af99-fa755a7d2607"
- Path="VFS\ProgramFiles\@APPX_INSTDIR@\AccessibleMarshal.dll" />
- <com:Interface Id="4e747be5-2052-4265-8af0-8ecad7aad1c0"
- ProxyStubClsid="1814ceeb-49e2-407f-af99-fa755a7d2607" />
- <com:Interface Id="1814ceeb-49e2-407f-af99-fa755a7d2607"
- ProxyStubClsid="1814ceeb-49e2-407f-af99-fa755a7d2607" />
- <com:Interface Id="0d68d6d0-d93d-4d08-a30d-f00dd1f45b24"
- ProxyStubClsid="1814ceeb-49e2-407f-af99-fa755a7d2607" />
- </com:ComInterface>
- </com:Extension>
- </Extensions>
</Package>
diff --git a/python/mozbuild/mozbuild/mach_commands.py b/python/mozbuild/mozbuild/mach_commands.py
index c7b0d3d0f9bc..b4a9a14b342c 100644
--- a/python/mozbuild/mozbuild/mach_commands.py
+++ b/python/mozbuild/mozbuild/mach_commands.py
@@ -3257,7 +3257,7 @@ def repackage_msi(
@CommandArgument(
"--vendor",
type=str,
- default="Mozilla",
+ default=None,
required=False,
help="The vendor to use in the Package/Identity/Name string to use in the App Manifest."
+ " Defaults to 'Mozilla'.",
@@ -3415,7 +3415,7 @@ def repackage_msix(
command_context.topsrcdir,
channel=channel,
arch=arch,
- displayname=identity_name,
+ identity=identity_name,
vendor=vendor,
publisher=publisher,
publisher_display_name=publisher_display_name,
diff --git a/python/mozbuild/mozbuild/repackaging/msix.py b/python/mozbuild/mozbuild/repackaging/msix.py
index 693b080c7ca5..77bf7153effb 100644
--- a/python/mozbuild/mozbuild/repackaging/msix.py
+++ b/python/mozbuild/mozbuild/repackaging/msix.py
@@ -106,68 +106,19 @@ def get_embedded_version(version, buildid):
the dotted quad to be identically 0, so we enforce that here.
"""
- # It's irritating to roll our own version parsing, but the tree doesn't seem
- # to contain exactly what we need at this time.
- version = version.rsplit("esr", 1)[0]
- alpha = "a" in version
-
- tail = None
- if "a" in version:
- head, tail = version.rsplit("a", 1)
- if tail != "1":
- # Disallow anything beyond `X.Ya1`.
- raise ValueError(
- f"Alpha version not of the form X.0a1 is not supported: {version}"
- )
- tail = buildid
- elif "b" in version:
- head, tail = version.rsplit("b", 1)
- if len(head.split(".")) > 2:
- raise ValueError(
- f"Beta version not of the form X.YbZ is not supported: {version}"
- )
- elif "rc" in version:
- head, tail = version.rsplit("rc", 1)
- if len(head.split(".")) > 2:
- raise ValueError(
- f"Release candidate version not of the form X.YrcZ is not supported: {version}"
- )
- else:
- head = version
-
- components = (head.split(".") + ["0", "0", "0"])[:3]
- if tail:
- components[2] = tail
-
- if alpha:
- # Nightly builds are all `X.0a1`, which isn't helpful. Include build ID
- # to disambiguate. But each part of the dotted quad is 16 bits, so we
- # have to squash.
- if components[1] != "0":
- # Disallow anything beyond `X.0a1`.
- raise ValueError(
- f"Alpha version not of the form X.0a1 is not supported: {version}"
- )
-
- # Last two digits only to save space. Nightly builds in 2066 and 2099
- # will be impacted, but future us can deal with that.
- year = buildid[2:4]
- if year[0] == "0":
- # Avoid leading zero, like `.0YMm`.
- year = year[1:]
- month = buildid[4:6]
- day = buildid[6:8]
- if day[0] == "0":
- # Avoid leading zero, like `.0DHh`.
- day = day[1:]
- hour = buildid[8:10]
-
- components[1] = "".join((year, month))
- components[2] = "".join((day, hour))
+ [ver, rel] = version.split("-")
- version = "{}.{}.{}.0".format(*components)
+ ver_parts = ver.split(".")
+ ver_parts += ["0"] * (3 - len(ver_parts))
- return version
+ return ".".join(
+ [
+ ver_parts[0],
+ str(100 * int(ver_parts[1]) + int(ver_parts[2])),
+ str(int(rel) * 100),
+ "0",
+ ]
+ )
def remove_single_line_comments(text):
@@ -410,21 +361,7 @@ def repackage_msix(
)
first = next(values)
- if not displayname:
- displayname = first
-
- # Release (official) and Beta share branding. Differentiate Beta a little bit.
- if channel == "beta":
- suffix = " Beta"
- if not displayname.endswith(suffix):
- displayname += suffix
-
- elif channel == "esr":
- # Release (official) and ESR share branding. Differentiate ESR a little bit.
- suffix = " ESR"
- if not displayname.endswith(suffix):
- displayname += suffix
-
+ displayname = displayname or first
second = next(values)
vendor = vendor or second
@@ -553,16 +490,6 @@ def repackage_msix(
# In local builds and unpacked MSIX directories, `p` is like "firefox.exe" already.
pp = p
- if pp.startswith("distribution"):
- # Treat any existing distribution as a distribution directory,
- # potentially with language packs. This makes it easy to repack
- # unpacked MSIXes.
- distribution_dir = mozpath.join(dir_or_package, "distribution")
- if distribution_dir not in distribution_dirs:
- distribution_dirs.append(distribution_dir)
-
- continue
-
copier.add(mozpath.normsep(mozpath.join("VFS", "ProgramFiles", instdir, pp)), f)
# Locales to declare as supported in `AppxManifest.xml`.
--
2.47.3
@@ -1,24 +0,0 @@
From 07c72fc57ef85abed9a80ad95e6572715016b946 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:10:44 +0100
Subject: [PATCH 24/52] newtab-fix.patch
---
browser/modules/AboutNewTab.sys.mjs | 1 -
1 file changed, 1 deletion(-)
diff --git a/browser/modules/AboutNewTab.sys.mjs b/browser/modules/AboutNewTab.sys.mjs
index 4d6b04e72b22..438a31c78f35 100644
--- a/browser/modules/AboutNewTab.sys.mjs
+++ b/browser/modules/AboutNewTab.sys.mjs
@@ -216,7 +216,6 @@ export const AboutNewTab = {
const [createdTimestamp] = await Promise.all([
profileCreatedAccessorReady,
- trainhopFeatureReady,
addonInitted,
]);
const createdInstant = createdTimestamp
--
2.47.3
@@ -1,55 +0,0 @@
From 00e1f2fb40434c9e7fcdb746ce72cd03cb07e3f2 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:10:48 +0100
Subject: [PATCH 25/52] pip-hide.patch
---
.../pictureinpicture/PictureInPicture.sys.mjs | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs b/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs
index 6aca1f73281c..5225e05e7a38 100644
--- a/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs
+++ b/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs
@@ -121,6 +121,15 @@ export class PictureInPictureToggleParent extends JSWindowActorParent {
if (!lazy.PIP_ENABLED || !lazy.PIP_WHEN_SWITCHING_TABS) {
break;
}
+
+ // Suppress auto-toggle if the user deliberately closed this PiP window
+ if (
+ PictureInPicture.weakAutoPipBrowserClosedDeliberately.has(browser)
+ ) {
+ PictureInPicture.weakAutoPipBrowserClosedDeliberately.delete(browser);
+ break;
+ }
+
// If the tab is still selected, then we can ignore this event
if (browser.documentGlobal.gBrowser.selectedBrowser == browser) {
break;
@@ -263,6 +272,8 @@ export var PictureInPicture = {
// Maps auto pip browser to PictureInPictureParent actor
weakAutoPipBrowserToParent: new WeakMap(),
+ weakAutoPipBrowserClosedDeliberately: new WeakSet(),
+
/**
* Returns the player window if one exists and if it hasn't yet been closed.
*
@@ -901,6 +912,13 @@ export var PictureInPicture = {
if (!win) {
return;
}
+
+ const browser = this.weakWinToBrowser.get(win);
+
+ if (reason === "CloseButton") {
+ PictureInPicture.weakAutoPipBrowserClosedDeliberately.add(browser);
+ }
+
this.removePiPBrowserFromWeakMap(this.weakWinToBrowser.get(win));
this.weakAutoPipBrowserToParent.delete(this.weakWinToBrowser.get(win));
--
2.47.3
@@ -1,120 +0,0 @@
From 3ec728b749444dc8960c6c521f472ea6be16997a Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:10:52 +0100
Subject: [PATCH 26/52] pip-hide-ui.patch
---
.../pictureinpicture/content/player.js | 6 ++++++
.../pictureinpicture/content/player.xhtml | 11 ++++++++++-
.../themes/shared/pictureinpicture/player.css | 17 +++++++++++++++++
3 files changed, 33 insertions(+), 1 deletion(-)
diff --git a/toolkit/components/pictureinpicture/content/player.js b/toolkit/components/pictureinpicture/content/player.js
index 978c6be7dbd2..a26ba023d20a 100644
--- a/toolkit/components/pictureinpicture/content/player.js
+++ b/toolkit/components/pictureinpicture/content/player.js
@@ -257,6 +257,7 @@ let Player = {
let strId = this.isFullscreen
? `pictureinpicture-exit-fullscreen-btn2`
: `pictureinpicture-fullscreen-btn2`;
+ this.setupTooltip("piphide", "pictureinpicture-piphide-btn");
this.setupTooltip("fullscreen", strId, "fullscreenToggleShortcut");
// Set the specific remoteType and browsingContextGroupID to use for the
@@ -898,6 +899,11 @@ let Player = {
break;
}
+ case "piphide": {
+ this.onClose(true);
+ break;
+ }
+
case "playpause": {
if (!this.isPlaying) {
this.actor.sendAsyncMessage("PictureInPicture:Play");
diff --git a/toolkit/components/pictureinpicture/content/player.xhtml b/toolkit/components/pictureinpicture/content/player.xhtml
index a723bc582857..96a2c946a14e 100644
--- a/toolkit/components/pictureinpicture/content/player.xhtml
+++ b/toolkit/components/pictureinpicture/content/player.xhtml
@@ -51,13 +51,22 @@
tabindex="9"
#else
tabindex="10"
+#endif
+ />
+ <button id="piphide"
+ class="control-item control-button tooltip-under-controls" data-l10n-id="pictureinpicture-piphide-btn" data-l10n-attrs="tooltip"
+#ifdef XP_MACOSX
+ mac="true"
+ tabindex="10"
+#else
+ tabindex="11"
#endif
/>
<button id="unpip"
class="control-item control-button tooltip-under-controls" data-l10n-id="pictureinpicture-unpip-btn" data-l10n-attrs="tooltip"
#ifdef XP_MACOSX
mac="true"
- tabindex="10"
+ tabindex="11"
#else
tabindex="9"
#endif
diff --git a/toolkit/themes/shared/pictureinpicture/player.css b/toolkit/themes/shared/pictureinpicture/player.css
index 72b016f96263..7a5fd66d43c4 100644
--- a/toolkit/themes/shared/pictureinpicture/player.css
+++ b/toolkit/themes/shared/pictureinpicture/player.css
@@ -222,6 +222,8 @@ body:not(:fullscreen) #controls:hover .control-button:disabled {
bottom: -3em;
}
+#piphide:focus-visible::after,
+#piphide:hover::after,
#close:focus-visible::after,
#close:hover::after,
#unpip[mac="true"]:focus-visible::after,
@@ -230,6 +232,8 @@ body:not(:fullscreen) #controls:hover .control-button:disabled {
transform: translateX(1em);
}
+#piphide[mac="true"]:focus-visible::after,
+#piphide[mac="true"]:hover::after,
#unpip:focus-visible::after,
#unpip:hover::after,
#close[mac="true"]:focus-visible::after,
@@ -305,6 +309,7 @@ body:not(:fullscreen) #controls:hover #timestamp {
opacity: 1;
}
+#piphide,
#close,
#unpip {
background-color: rgba(255, 255, 255, 0.8);
@@ -312,11 +317,23 @@ body:not(:fullscreen) #controls:hover #timestamp {
fill: var(--close-btn-fill-color);
}
+#piphide:is(:hover, :focus-visible),
#close:is(:hover, :focus-visible),
#unpip:is(:hover, :focus-visible) {
background-color: rgba(255, 255, 255, 0.9);
}
+#piphide {
+ background-image: url("chrome://global/skin/icons/eye-slash.svg");
+ right: 50px;
+ top: 10px;
+}
+
+#piphide[mac="true"] {
+ right: auto;
+ left: 50px;
+}
+
#close {
background-image: url("chrome://global/skin/icons/close.svg");
right: 10px;
--
2.47.3
@@ -1,71 +0,0 @@
From 2d9a9c339498838aa373ea09383861eb7a84851a Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:10:56 +0100
Subject: [PATCH 27/52] profile-directory.patch
---
extensions/pref/autoconfig/src/prefcalls.js | 48 +++++++++++++++++++++
1 file changed, 48 insertions(+)
diff --git a/extensions/pref/autoconfig/src/prefcalls.js b/extensions/pref/autoconfig/src/prefcalls.js
index 78dd0ee5473a..4231262f29b8 100644
--- a/extensions/pref/autoconfig/src/prefcalls.js
+++ b/extensions/pref/autoconfig/src/prefcalls.js
@@ -9,6 +9,54 @@ const LDAPSyncQueryContractID = "@mozilla.org/ldapsyncquery;1";
var gIsUTF8;
+{
+ let profile_directory = null;
+ let defaults = Services.prefs.getDefaultBranch(null);
+
+ let supportsXDG = Services.prefs.getBoolPref("widget.support-xdg-config", false);
+
+ if (supportsXDG) {
+ let isLegacy = false;
+ {
+ let dirSvc = Cc["@mozilla.org/file/directory_service;1"]
+ .getService(Ci.nsIProperties || Ci.nsIDirectoryService);
+ let profDir = dirSvc.get("ProfD", Ci.nsIFile);
+ let path = profDir.path || "";
+ isLegacy = path.includes(".librewolf");
+ }
+
+ if (!isLegacy) {
+ let xdg = Services.env.get("XDG_CONFIG_HOME");
+ if (xdg) {
+ profile_directory = xdg;
+ } else {
+ let home = Services.env.get("HOME");
+ profile_directory = home ? (home + "/.config") : null;
+ }
+ if (profile_directory) {
+ defaults.setCharPref(
+ "autoadmin.global_config_url",
+ `file://${profile_directory}/librewolf/librewolf/librewolf.overrides.cfg`
+ );
+ }
+ } else {
+ if (profile_directory = Services.env.get("HOME")) {
+ defaults.setCharPref(
+ "autoadmin.global_config_url",
+ `file://${profile_directory}/.librewolf/librewolf.overrides.cfg`
+ );
+ }
+ }
+ } else {
+ if ((profile_directory = Services.env.get("USERPROFILE") || Services.env.get("HOME"))) {
+ defaults.setCharPref(
+ "autoadmin.global_config_url",
+ `file://${profile_directory}/.librewolf/librewolf.overrides.cfg`
+ );
+ }
+ }
+}
+
function getPrefBranch() {
return Services.prefs.getBranch(null);
}
--
2.47.3
@@ -1,33 +0,0 @@
From 045dddc201c0d52abccbbd47d7b69273a72abf4c Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:10:59 +0100
Subject: [PATCH 28/52] remove-language-packs.patch
---
browser/components/BrowserGlue.sys.mjs | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/browser/components/BrowserGlue.sys.mjs b/browser/components/BrowserGlue.sys.mjs
index 6339f3df60ab..202d238d56b9 100644
--- a/browser/components/BrowserGlue.sys.mjs
+++ b/browser/components/BrowserGlue.sys.mjs
@@ -403,6 +403,16 @@ BrowserGlue.prototype = {
// handle any UI migration
this._migrateUI();
+
+ const removeLangpacks = async () => {
+ for (const addon of await lazy.AddonManager.getAddonsByTypes(["locale"])) {
+ await addon.uninstall();
+ }
+ };
+
+ removeLangpacks().catch(err => {
+ console.error("Could not remove langpacks", err);
+ });
if (!Services.prefs.prefHasUserValue(PREF_PDFJS_ISDEFAULT_CACHE_STATE)) {
lazy.PdfJs.checkIsDefault(this._isNewProfile);
--
2.47.3
@@ -1,108 +0,0 @@
From f99c183cf16dd19665458d3713af1660aa08a6ee Mon Sep 17 00:00:00 2001
From: celenity <celenity@celenity.dev>
Date: Wed, 4 Feb 2026 04:27:07 +0000
Subject: [PATCH 29/52] fix: Remove OpenAI backend
Removes the OpenAI backend from Mozilla's ML (machine learning) component.
Signed-off-by: celenity <celenity@celenity.dev>
---
toolkit/components/aboutinference/content/aboutInference.js | 4 ++--
toolkit/components/ml/content/EngineProcess.sys.mjs | 2 +-
toolkit/components/ml/content/backends/Pipeline.mjs | 6 +++---
toolkit/components/ml/jar.mn | 4 ++--
toolkit/content/license.html | 2 +-
5 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/toolkit/components/aboutinference/content/aboutInference.js b/toolkit/components/aboutinference/content/aboutInference.js
index 6672be945f5b..585540f54cd8 100644
--- a/toolkit/components/aboutinference/content/aboutInference.js
+++ b/toolkit/components/aboutinference/content/aboutInference.js
@@ -379,7 +379,7 @@ const INFERENCE_PAD_PRESETS = {
device: "cpu",
backend: "onnx",
},
- openai: {
+/* openai: {
inputArgs: [
{
role: "system",
@@ -398,7 +398,7 @@ const INFERENCE_PAD_PRESETS = {
apiKey: "ollama",
baseURL: "http://localhost:11434/v1",
backend: "openai",
- },
+ }, */
};
const PREDEFINED = Object.keys(INFERENCE_PAD_PRESETS);
diff --git a/toolkit/components/ml/content/EngineProcess.sys.mjs b/toolkit/components/ml/content/EngineProcess.sys.mjs
index 03721443f7e0..d0ad4478acd4 100644
--- a/toolkit/components/ml/content/EngineProcess.sys.mjs
+++ b/toolkit/components/ml/content/EngineProcess.sys.mjs
@@ -34,7 +34,7 @@ export const BACKENDS = Object.freeze({
onnxNative: "onnx-native",
llamaCpp: "llama.cpp",
bestOnnx: "best-onnx",
- openai: "openai",
+// openai: "openai",
staticEmbeddings: "static-embeddings",
});
diff --git a/toolkit/components/ml/content/backends/Pipeline.mjs b/toolkit/components/ml/content/backends/Pipeline.mjs
index 1b913af2a39a..30a04a070442 100644
--- a/toolkit/components/ml/content/backends/Pipeline.mjs
+++ b/toolkit/components/ml/content/backends/Pipeline.mjs
@@ -13,7 +13,7 @@ ChromeUtils.defineESModuleGetters(
LlamaCppPipeline:
"chrome://global/content/ml/backends/LlamaCppPipeline.mjs",
PipelineOptions: "chrome://global/content/ml/EngineProcess.sys.mjs",
- OpenAIPipeline: "chrome://global/content/ml/backends/OpenAIPipeline.mjs",
+// OpenAIPipeline: "chrome://global/content/ml/backends/OpenAIPipeline.mjs",
StaticEmbeddingsPipeline:
"chrome://global/content/ml/backends/StaticEmbeddingsPipeline.mjs",
},
@@ -46,9 +46,9 @@ export async function getBackend(consumer, wasm, options) {
case "llama.cpp":
factory = lazy.LlamaCppPipeline.initialize;
break;
- case "openai":
+/* case "openai":
factory = lazy.OpenAIPipeline.initialize;
- break;
+ break; */
case "static-embeddings":
factory = lazy.StaticEmbeddingsPipeline.initialize;
break;
diff --git a/toolkit/components/ml/jar.mn b/toolkit/components/ml/jar.mn
index 143e4a0f0bb0..47ba236e18b1 100644
--- a/toolkit/components/ml/jar.mn
+++ b/toolkit/components/ml/jar.mn
@@ -23,9 +23,9 @@ toolkit.jar:
content/global/ml/transformers.js (vendor/transformers.js)
content/global/ml/ThomSample.mjs (content/ThomSample.mjs)
content/global/ml/backends/LlamaCppPipeline.mjs (content/backends/LlamaCppPipeline.mjs)
- content/global/ml/backends/OpenAIPipeline.mjs (content/backends/OpenAIPipeline.mjs)
+# content/global/ml/backends/OpenAIPipeline.mjs (content/backends/OpenAIPipeline.mjs)
content/global/ml/backends/StaticEmbeddingsPipeline.mjs (content/backends/StaticEmbeddingsPipeline.mjs)
- content/global/ml/openai.mjs (vendor/openai/dist/openai.mjs)
+# content/global/ml/openai.mjs (vendor/openai/dist/openai.mjs)
content/global/ml/MLTelemetry.sys.mjs (MLTelemetry.sys.mjs)
content/global/ml/security/ConditionEvaluator.sys.mjs (security/ConditionEvaluator.sys.mjs)
content/global/ml/security/DecisionTypes.sys.mjs (security/DecisionTypes.sys.mjs)
diff --git a/toolkit/content/license.html b/toolkit/content/license.html
index 75cc6317750f..a5a42a43479f 100644
--- a/toolkit/content/license.html
+++ b/toolkit/content/license.html
@@ -1533,7 +1533,7 @@ product.
<li><code>third_party/perfetto/</code></li>
#endif
<li><code>third_party/rust/calendrical_calculations</code></li>
- <li><code>toolkit/components/ml/vendor/openai/dist/openai.mjs</code></li>
+ <!-- <li><code>toolkit/components/ml/vendor/openai/dist/openai.mjs</code></li> -->
<li><code>toolkit/components/ml/vendor/transformers.js</code></li>
#ifdef NIGHTLY_BUILD
<li><code>toolkit/components/ml/vendor/transformers-dev.js</code></li>
--
2.47.3
@@ -1,105 +0,0 @@
From d776f452b45b6f61622fa57fae899ba51054e6b8 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:11:10 +0100
Subject: [PATCH 30/52] remove-pingsender.patch
---
browser/app/macbuild/Contents/MacOS-files.in | 1 -
browser/installer/package-manifest.in | 4 ----
browser/installer/windows/nsis/shared.nsh | 1 -
python/mozbuild/mozbuild/artifacts.py | 2 --
toolkit/components/telemetry/app/TelemetrySend.sys.mjs | 3 +++
toolkit/components/telemetry/moz.build | 4 ----
6 files changed, 3 insertions(+), 12 deletions(-)
diff --git a/browser/app/macbuild/Contents/MacOS-files.in b/browser/app/macbuild/Contents/MacOS-files.in
index 2f420f773610..3551c6613d18 100644
--- a/browser/app/macbuild/Contents/MacOS-files.in
+++ b/browser/app/macbuild/Contents/MacOS-files.in
@@ -17,7 +17,6 @@
/crashhelper
#endif
/nmhproxy
-/pingsender
/pk12util
/ssltunnel
/xpcshell
diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in
index 9944fbec4022..605af7a29185 100644
--- a/browser/installer/package-manifest.in
+++ b/browser/installer/package-manifest.in
@@ -408,10 +408,6 @@ bin/libfreebl_64int_3.so
@BINPATH@/crashhelper@BIN_SUFFIX@
#endif
-; [ Ping Sender ]
-;
-@BINPATH@/pingsender@BIN_SUFFIX@
-
; [ Native Messaging Host Proxy ]
;
#if defined(XP_WIN) || defined(XP_MACOSX)
diff --git a/browser/installer/windows/nsis/shared.nsh b/browser/installer/windows/nsis/shared.nsh
index b81c7ef59be0..4155c5264318 100755
--- a/browser/installer/windows/nsis/shared.nsh
+++ b/browser/installer/windows/nsis/shared.nsh
@@ -1411,7 +1411,6 @@ FunctionEnd
Push "crashreporter.exe"
Push "default-browser-agent.exe"
Push "nmhproxy.exe"
- Push "pingsender.exe"
Push "updater.exe"
Push "mozwer.dll"
Push "${FileMainEXE}"
diff --git a/python/mozbuild/mozbuild/artifacts.py b/python/mozbuild/mozbuild/artifacts.py
index 548b7786ee85..6b055486e029 100644
--- a/python/mozbuild/mozbuild/artifacts.py
+++ b/python/mozbuild/mozbuild/artifacts.py
@@ -677,7 +677,6 @@ class LinuxArtifactJob(ArtifactJob):
"{product}/dependentlibs.list",
"{product}/{product}",
"{product}/{product}-bin",
- "{product}/pingsender",
"{product}/plugin-container",
"{product}/updater",
"{product}/gfxtest",
@@ -773,7 +772,6 @@ class MacArtifactJob(ArtifactJob):
"{product}-bin",
"*.dylib",
"nmhproxy",
- "pingsender",
"plugin-container.app/Contents/MacOS/plugin-container",
"updater.app/Contents/MacOS/org.mozilla.updater",
# 'xpcshell',
diff --git a/toolkit/components/telemetry/app/TelemetrySend.sys.mjs b/toolkit/components/telemetry/app/TelemetrySend.sys.mjs
index 2ebae13763c5..496880e402f2 100644
--- a/toolkit/components/telemetry/app/TelemetrySend.sys.mjs
+++ b/toolkit/components/telemetry/app/TelemetrySend.sys.mjs
@@ -1677,6 +1677,9 @@ export var TelemetrySendImpl = {
},
runPingSender(pings, observer) {
+ throw Components.Exception("", Cr.NS_ERROR_NOT_IMPLEMENTED);
+
+ /* eslint-disable-next-line no-unreachable */
if (AppConstants.platform === "android") {
throw Components.Exception("", Cr.NS_ERROR_NOT_IMPLEMENTED);
}
diff --git a/toolkit/components/telemetry/moz.build b/toolkit/components/telemetry/moz.build
index 91ae53839b69..de9f21c2b2b0 100644
--- a/toolkit/components/telemetry/moz.build
+++ b/toolkit/components/telemetry/moz.build
@@ -6,10 +6,6 @@ include("/ipc/chromium/chromium-config.mozbuild")
FINAL_LIBRARY = "xul"
-DIRS = [
- "pingsender",
-]
-
DEFINES["MOZ_APP_VERSION"] = '"%s"' % CONFIG["MOZ_APP_VERSION"]
LOCAL_INCLUDES += [
--
2.47.3
@@ -1,312 +0,0 @@
From 38c03c5e125329cc45f3b290ae16f50fe533a5c3 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:11:17 +0100
Subject: [PATCH 31/52] rs-blocker.patch
---
services/settings/RemoteSettings.worker.mjs | 8 +-
.../settings/RemoteSettingsClient.sys.mjs | 21 ++++-
.../settings/RemoteSettingsWorker.sys.mjs | 4 +-
services/settings/SharedUtils.sys.mjs | 78 ++++++++++++++++++-
services/settings/Utils.sys.mjs | 28 ++++++-
services/settings/remote-settings.sys.mjs | 5 ++
.../search/SearchEngineSelector.sys.mjs | 8 +-
7 files changed, 136 insertions(+), 16 deletions(-)
diff --git a/services/settings/RemoteSettings.worker.mjs b/services/settings/RemoteSettings.worker.mjs
index 3e4e915c13ed..a92768553a29 100644
--- a/services/settings/RemoteSettings.worker.mjs
+++ b/services/settings/RemoteSettings.worker.mjs
@@ -62,12 +62,16 @@ const Agent = {
*
* @param {string} bucket
* @param {string} collection
+ * @param {string} allowedCollections
+ * @param {string} allowedCollectionsFromDump
* @returns {int} Number of records loaded from dump or -1 if no dump found.
*/
- async importJSONDump(bucket, collection) {
+ async importJSONDump(bucket, collection, allowedCollections, allowedCollectionsFromDump) {
const { data: records, timestamp } = await SharedUtils.loadJSONDump(
bucket,
- collection
+ collection,
+ allowedCollections,
+ allowedCollectionsFromDump
);
if (records === null) {
// Return -1 if file is missing.
diff --git a/services/settings/RemoteSettingsClient.sys.mjs b/services/settings/RemoteSettingsClient.sys.mjs
index f4f9b1c0bce9..fc3c6bb2b1ba 100644
--- a/services/settings/RemoteSettingsClient.sys.mjs
+++ b/services/settings/RemoteSettingsClient.sys.mjs
@@ -209,12 +209,21 @@ class AttachmentDownloader extends Downloader {
return cacheImpl;
}
+ get identifier() {
+ return this._client.identifier;
+ }
+
/**
* Download attachment and report Telemetry on failure.
*
* @see Downloader.download
*/
async download(record, options) {
+ if (!lazy.SharedUtils.isCollectionAllowed(this.bucketName, this.collectionName, lazy.Utils.allowedCollections)) {
+ throw Error(
+ `Download attempt to RS collection "${this.identifier}" was blocked.`
+ );
+ }
await lazy.UptakeTelemetry.report(
lazy.UptakeTelemetry.STATUS.DOWNLOAD_START,
{
@@ -586,7 +595,9 @@ export class RemoteSettingsClient extends EventEmitter {
}
({ data } = await lazy.SharedUtils.loadJSONDump(
this.bucketName,
- this.collectionName
+ this.collectionName,
+ lazy.Utils.allowedCollections,
+ lazy.Utils.allowedCollectionsFromDump
));
if (data !== null) {
lazy.console.info(`${this.identifier} falling back to JSON dump`);
@@ -656,6 +667,10 @@ export class RemoteSettingsClient extends EventEmitter {
return;
}
+ if (!lazy.SharedUtils.isCollectionAllowed(this.bucketName, this.collectionName, lazy.Utils.allowedCollections)) {
+ return;
+ }
+
// We want to know which timestamp we are expected to obtain in order to leverage
// cache busting. We don't provide ETag because we don't want a 304.
const { changes } = await lazy.Utils.fetchLatestChanges(
@@ -1040,7 +1055,9 @@ export class RemoteSettingsClient extends EventEmitter {
lazy.console.info(`${this.identifier} try to restore dump`);
const result = await lazy.RemoteSettingsWorker.importJSONDump(
this.bucketName,
- this.collectionName
+ this.collectionName,
+ lazy.Utils.allowedCollections,
+ lazy.Utils.allowedCollectionsFromDump
);
if (result < 0) {
lazy.console.debug(`${this.identifier} no dump available`);
diff --git a/services/settings/RemoteSettingsWorker.sys.mjs b/services/settings/RemoteSettingsWorker.sys.mjs
index 57bfb3f3d544..874b35abff18 100644
--- a/services/settings/RemoteSettingsWorker.sys.mjs
+++ b/services/settings/RemoteSettingsWorker.sys.mjs
@@ -162,8 +162,8 @@ class Worker {
]);
}
- async importJSONDump(bucket, collection) {
- return this._execute("importJSONDump", [bucket, collection], {
+ async importJSONDump(bucket, collection, allowedCollections, allowedCollectionsFromDump) {
+ return this._execute("importJSONDump", [bucket, collection, allowedCollections, allowedCollectionsFromDump], {
mustComplete: true,
});
}
diff --git a/services/settings/SharedUtils.sys.mjs b/services/settings/SharedUtils.sys.mjs
index e5b20d9b9dd6..9a71c99668f0 100644
--- a/services/settings/SharedUtils.sys.mjs
+++ b/services/settings/SharedUtils.sys.mjs
@@ -34,8 +34,13 @@ export var SharedUtils = {
*
* @param {string} bucket
* @param {string} collection
+ * @param {string} allowedCollections
+ * @param {string} allowedCollectionsFromDump
*/
- async loadJSONDump(bucket, collection) {
+ async loadJSONDump(bucket, collection, allowedCollections, allowedCollectionsFromDump) {
+ if (!this.isCollectionAllowedFromDump(bucket, collection, allowedCollections, allowedCollectionsFromDump)) {
+ return { data: null, timestamp: null };
+ }
// When using the preview bucket, we still want to load the main dump.
// But we store it locally in the preview bucket.
const jsonBucket = bucket.replace("-preview", "");
@@ -50,4 +55,75 @@ export var SharedUtils = {
// Will throw if JSON is invalid.
return response.json();
},
+
+ /**
+ * Internal code to determine whether the bucket and collection are allowed to
+ * be loaded by the remote settings client for a given list of allowed
+ * bucket/collection combinations.
+ * @param {string} bucket
+ * @param {string} collection
+ * @param {Array<string>} allowedCollections
+ * @returns {boolean} whether the bucket and collection are allowed to load
+ */
+ _isCollectionAllowedInternal(bucket, collection, allowedCollections) {
+ return (
+ allowedCollections.includes(`${bucket}/${collection}`) ||
+ allowedCollections.includes(`${bucket}/*`) ||
+ allowedCollections.includes("*")
+ );
+ },
+
+ /**
+ * Determines whether the bucket and collection are allowed to be loaded by the
+ * remote settings client.
+ * @param {string} bucket
+ * @param {string} collection
+ * @param {string} allowedCollections
+ * @returns {boolean} whether the bucket and collection are allowed to load
+ */
+ isCollectionAllowed(bucket, collection, allowedCollections) {
+ if (
+ this._isCollectionAllowedInternal(
+ bucket,
+ collection,
+ allowedCollections
+ )
+ ) {
+ return true;
+ }
+ console.warn(
+ `Connection attempt to RS collection "${bucket}/${collection}" was blocked/filtered.`
+ );
+ return false;
+ },
+
+ /**
+ * Determines whether the bucket and collection are allowed to be loaded from
+ * an in-tree remote settings dump.
+ * @param {string} bucket
+ * @param {string} collection
+ * @param {string} allowedCollections
+ * @param {string} allowedCollectionsFromDump
+ * @returns {boolean} whether the bucket and collection are allowed to load
+ */
+ isCollectionAllowedFromDump(bucket, collection, allowedCollections, allowedCollectionsFromDump) {
+ if (
+ this._isCollectionAllowedInternal(
+ bucket,
+ collection,
+ allowedCollectionsFromDump
+ ) ||
+ this._isCollectionAllowedInternal(
+ bucket,
+ collection,
+ allowedCollections
+ )
+ ) {
+ return true;
+ }
+ console.warn(
+ `Access attempt to RS collection "${bucket}/${collection}" from local dump was blocked/filtered.`
+ );
+ return false;
+ },
};
diff --git a/services/settings/Utils.sys.mjs b/services/settings/Utils.sys.mjs
index 40e919a997a5..ccc7694bcc28 100644
--- a/services/settings/Utils.sys.mjs
+++ b/services/settings/Utils.sys.mjs
@@ -99,6 +99,18 @@ XPCOMUtils.defineLazyPreferenceGetter(
""
);
+ChromeUtils.defineLazyGetter(lazy, "allowedCollections", () =>
+ Services.prefs
+ .getStringPref("librewolf.services.settings.allowedCollections", "")
+ .split(",")
+);
+
+ChromeUtils.defineLazyGetter(lazy, "allowedCollectionsFromDump", () =>
+ Services.prefs
+ .getStringPref("librewolf.services.settings.allowedCollectionsFromDump", "")
+ .split(",")
+);
+
function _isUndefined(value) {
return typeof value === "undefined";
}
@@ -111,6 +123,14 @@ export var Utils = {
: AppConstants.REMOTE_SETTINGS_SERVER_URLS[0];
},
+ get allowedCollections() {
+ return lazy.allowedCollections;
+ },
+
+ get allowedCollectionsFromDump() {
+ return lazy.allowedCollectionsFromDump;
+ },
+
CHANGES_PATH: "/buckets/monitor/collections/changes/changeset",
/**
@@ -451,7 +471,9 @@ export var Utils = {
if (lastModified === undefined) {
const { timestamp: dumpTimestamp } = await lazy.SharedUtils.loadJSONDump(
bucket,
- collection
+ collection,
+ this.allowedCollections,
+ this.allowedCollectionsFromDump
);
// Client recognize -1 as missing dump.
lastModified = dumpTimestamp ?? -1;
@@ -561,7 +583,9 @@ export var Utils = {
}
return {
- changes,
+ changes: changes.filter(change =>
+ lazy.SharedUtils.isCollectionAllowed(change.bucket, change.collection, this.allowedCollections)
+ ),
timestamp,
serverTimeMillis,
backoffSeconds,
diff --git a/services/settings/remote-settings.sys.mjs b/services/settings/remote-settings.sys.mjs
index b180cfc850ee..c8db18344c1f 100644
--- a/services/settings/remote-settings.sys.mjs
+++ b/services/settings/remote-settings.sys.mjs
@@ -16,6 +16,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
pushBroadcastService: "resource://gre/modules/PushBroadcastService.sys.mjs",
RemoteSettingsClient:
"resource://services-settings/RemoteSettingsClient.sys.mjs",
+ SharedUtils: "resource://services-settings/SharedUtils.sys.mjs",
SyncHistory: "resource://services-settings/SyncHistory.sys.mjs",
UptakeTelemetry: "resource://services-settings/UptakeTelemetry.sys.mjs",
Utils: "resource://services-settings/Utils.sys.mjs",
@@ -286,6 +287,10 @@ function remoteSettingsFunction() {
const collection = changeset.metadata.id;
const identifier = `${bucket}/${collection}`;
+ if (!lazy.SharedUtils.isCollectionAllowed(bucket, collection, lazy.Utils.allowedCollections)) {
+ continue;
+ }
+
if (pulled.includes(identifier)) {
// The startup bundles contain both main and preview changesets.
// Importing both increases complexity down the line, and brings no value.
diff --git a/toolkit/components/search/SearchEngineSelector.sys.mjs b/toolkit/components/search/SearchEngineSelector.sys.mjs
index 3a42b383af19..3befe8d89988 100644
--- a/toolkit/components/search/SearchEngineSelector.sys.mjs
+++ b/toolkit/components/search/SearchEngineSelector.sys.mjs
@@ -409,13 +409,7 @@ export class SearchEngineSelector {
* could be obtained.
*/
async #getConfigurationOverrides() {
- let result = [];
- try {
- result = await this.#remoteConfigOverrides.get();
- } catch (ex) {
- // This data is remote only, so we just return an empty array if it fails.
- }
- return result;
+ return [];
}
/**
--
2.47.3
@@ -1,39 +0,0 @@
From 97f59260bde3e817cb6b1ea9cab173de834391f4 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:11:20 +0100
Subject: [PATCH 32/52] rust-gentoo-musl.patch
---
build/moz.configure/rust.configure | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/build/moz.configure/rust.configure b/build/moz.configure/rust.configure
index ea19412890bd..662f0d621628 100644
--- a/build/moz.configure/rust.configure
+++ b/build/moz.configure/rust.configure
@@ -424,11 +424,21 @@ def detect_rustc_target(host_or_target, arm_target, rust_supported_targets):
if len(narrowed) == 1:
return narrowed[0].rust_target
- # Finally, see if the vendor can be used to disambiguate.
+ # See if the vendor can be used to disambiguate.
narrowed = [c for c in candidates if c.target.vendor == host_or_target.vendor]
if len(narrowed) == 1:
return narrowed[0].rust_target
+ # Finally, check for vendor gentoo in the target triple.
+ vendor_aliases = {"unknown": ("gentoo")}
+ narrowed = [
+ c
+ for c in candidates
+ if host_or_target.vendor in vendor_aliases.get(c.target.vendor, ())
+ ]
+ if len(narrowed) == 1:
+ return narrowed[0].rust_target
+
return None
rustc_target = find_candidate(candidates)
--
2.47.3
@@ -1,98 +0,0 @@
From 0181d9a235bb94ae627e516cf6b941434a4e831f Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:11:24 +0100
Subject: [PATCH 33/52] strip-dash-from-compare.patch
---
xpcom/base/nsVersionComparator.cpp | 40 ++++++++++++++++++++++++++++++
1 file changed, 40 insertions(+)
diff --git a/xpcom/base/nsVersionComparator.cpp b/xpcom/base/nsVersionComparator.cpp
index 21dd6499f796..e7e3f505db85 100644
--- a/xpcom/base/nsVersionComparator.cpp
+++ b/xpcom/base/nsVersionComparator.cpp
@@ -4,6 +4,7 @@
#include "nsVersionComparator.h"
+#include <ctype.h>
#include <errno.h>
#include <stdint.h>
#include <stdlib.h>
@@ -16,6 +17,7 @@
# include "nsString.h"
# endif
+# include <wctype.h>
# include "mozilla/Char16.h"
# include "nsAlgorithm.h"
#endif
@@ -331,6 +333,22 @@ static int32_t CompareVP(VersionPartW& aVer1, VersionPartW& aVer2) {
namespace mozilla {
#ifdef XP_WIN
+static void StripVersionSuffix(wchar_t* aVersion) {
+ if (!aVersion) return;
+
+ size_t len = wcslen(aVersion);
+ if (len < 2) return;
+
+ int pos = (int)len - 1;
+ while (pos >= 0 && iswdigit(aVersion[pos])) {
+ pos--;
+ }
+
+ if (pos >= 0 && aVersion[pos] == L'-') {
+ aVersion[pos] = L'\0';
+ }
+}
+
int32_t CompareVersions(const char16_t* aStrA, const char16_t* aStrB) {
wchar_t* A2 = wcsdup(char16ptr_t(aStrA));
if (!A2) {
@@ -343,6 +361,9 @@ int32_t CompareVersions(const char16_t* aStrA, const char16_t* aStrB) {
return 1;
}
+ StripVersionSuffix(A2);
+ StripVersionSuffix(B2);
+
int32_t result;
wchar_t* a = A2;
wchar_t* b = B2;
@@ -367,6 +388,22 @@ int32_t CompareVersions(const char16_t* aStrA, const char16_t* aStrB) {
}
#endif
+static void StripVersionSuffix(char* aVersion) {
+ if (!aVersion) return;
+
+ size_t len = strlen(aVersion);
+ if (len < 2) return;
+
+ int pos = (int)len - 1;
+ while (pos >= 0 && isdigit(aVersion[pos])) {
+ pos--;
+ }
+
+ if (pos >= 0 && aVersion[pos] == '-') {
+ aVersion[pos] = '\0';
+ }
+}
+
int32_t CompareVersions(const char* aStrA, const char* aStrB) {
char* A2 = strdup(aStrA);
if (!A2) {
@@ -379,6 +416,9 @@ int32_t CompareVersions(const char* aStrA, const char* aStrB) {
return 1;
}
+ StripVersionSuffix(A2);
+ StripVersionSuffix(B2);
+
int32_t result;
char* a = A2;
char* b = B2;
--
2.47.3
@@ -1,51 +0,0 @@
From 39bc6d8ff9776feeb8b4682957956d31b5680925 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:11:28 +0100
Subject: [PATCH 34/52] temp-macos-fix.patch
---
browser/app/macbuild/Contents/Info.plist.in | 2 --
browser/app/moz.build | 1 -
browser/installer/package-manifest.in | 1 -
3 files changed, 4 deletions(-)
diff --git a/browser/app/macbuild/Contents/Info.plist.in b/browser/app/macbuild/Contents/Info.plist.in
index cd59b5dfcbf8..0757ac1d98b7 100644
--- a/browser/app/macbuild/Contents/Info.plist.in
+++ b/browser/app/macbuild/Contents/Info.plist.in
@@ -190,8 +190,6 @@
<string>@MAC_APP_NAME@ @APP_VERSION@</string>
<key>CFBundleIconFile</key>
<string>firefox.icns</string>
- <key>CFBundleIconName</key>
- <string>AppIcon</string>
<key>CFBundleIdentifier</key>
<string>@MOZ_MACBUNDLE_ID@</string>
<key>CFBundleInfoDictionaryVersion</key>
diff --git a/browser/app/moz.build b/browser/app/moz.build
index db09aba7e9ec..2d8a4d867a04 100644
--- a/browser/app/moz.build
+++ b/browser/app/moz.build
@@ -74,7 +74,6 @@ if CONFIG["MOZ_WIDGET_TOOLKIT"] == "cocoa":
extra_files = [
(f"{branding}/firefox.icns", "Resources/firefox.icns"),
(f"{branding}/document.icns", "Resources/document.icns"),
- (f"{branding}/Assets.car", "Resources/Assets.car"),
]
if CONFIG["MOZ_UPDATER"]:
extra_files.append((
diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in
index 605af7a29185..70c1b894be93 100644
--- a/browser/installer/package-manifest.in
+++ b/browser/installer/package-manifest.in
@@ -42,7 +42,6 @@
@APPNAME@/Contents/PkgInfo
@RESPATH@/firefox.icns
@RESPATH@/document.icns
-@RESPATH@/Assets.car
@RESPATH@/@LPROJ_ROOT@.lproj/*
#endif
--
2.47.3
@@ -1,31 +0,0 @@
From 6c60f71343ada19cf657593af1dcc1d3d3da3d80 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:11:32 +0100
Subject: [PATCH 35/52] macos-relaunch-without-updater.patch
---
toolkit/xre/nsCommandLineServiceMac.mm | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/toolkit/xre/nsCommandLineServiceMac.mm b/toolkit/xre/nsCommandLineServiceMac.mm
index 3fc9808a5524..a20e7114bd69 100644
--- a/toolkit/xre/nsCommandLineServiceMac.mm
+++ b/toolkit/xre/nsCommandLineServiceMac.mm
@@ -61,8 +61,12 @@ void SetupMacCommandLine(int& argc, char**& argv, bool forRestart) {
NSString* updaterPath = [[path stringByDeletingLastPathComponent]
stringByAppendingPathComponent:
@"updater.app/Contents/MacOS/org.mozilla.updater"];
- AddToCommandLine(updaterPath.UTF8String);
- AddToCommandLine("--openAppBundle");
+ // Only use the updater as a relauncher when it exists. When the updater is
+ // disabled, fall back to relaunching the .app bundle directly via NSWorkspace.
+ if ([[NSFileManager defaultManager] fileExistsAtPath:updaterPath]) {
+ AddToCommandLine(updaterPath.UTF8String);
+ AddToCommandLine("--openAppBundle");
+ }
}
// We adjust the path to point to the .app bundle, rather than the executable
--
2.47.3
@@ -1,96 +0,0 @@
From 484614c225f0e13d9713ee5f85d579938b4dfe96 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:11:36 +0100
Subject: [PATCH 36/52] ui-patches/add-translate-page-context-menu.patch
---
.../base/content/browser-context.inc.xhtml | 2 +
browser/base/content/browser-context.js | 3 ++
browser/base/content/nsContextMenu.sys.mjs | 37 +++++++++++++++++++
3 files changed, 42 insertions(+)
diff --git a/browser/base/content/browser-context.inc.xhtml b/browser/base/content/browser-context.inc.xhtml
index 621be24e4e0c..b5ec280b761f 100644
--- a/browser/base/content/browser-context.inc.xhtml
+++ b/browser/base/content/browser-context.inc.xhtml
@@ -369,6 +369,8 @@
<menuitem id="context-searchselect-private"/>
<menuitem id="context-translate-selection"
data-l10n-id="main-context-menu-translate-selection"/>
+ <menuitem id="context-translate-page"
+ data-l10n-id="main-context-menu-translate-page"/>
<menu id="context-ask-chat"/>
<menuseparator id="frame-sep"/>
diff --git a/browser/base/content/browser-context.js b/browser/base/content/browser-context.js
index 042341cecb1a..a59e92ab302d 100644
--- a/browser/base/content/browser-context.js
+++ b/browser/base/content/browser-context.js
@@ -212,6 +212,9 @@ document.addEventListener(
case "context-translate-selection":
gContextMenu.openSelectTranslationsPanel(event);
break;
+ case "context-translate-page":
+ gContextMenu.openFullPageTranslationsPanel(event);
+ break;
case "context-showonlythisframe":
gContextMenu.showOnlyThisFrame();
break;
diff --git a/browser/base/content/nsContextMenu.sys.mjs b/browser/base/content/nsContextMenu.sys.mjs
index 305a6b1eb41d..d1a9aba3cc94 100644
--- a/browser/base/content/nsContextMenu.sys.mjs
+++ b/browser/base/content/nsContextMenu.sys.mjs
@@ -906,6 +906,7 @@ export class nsContextMenu {
this.showAndFormatSearchContextItem();
this.showTranslateSelectionItem();
+ this.showTranslatePageItem();
lazy.GenAI.buildAskChatMenu(document.getElementById("context-ask-chat"), {
browser: this.browser,
selectionInfo: this.selectionInfo,
@@ -2608,6 +2609,42 @@ export class nsContextMenu {
this.window.openTrustedLinkIn(drmInfoURL, dest);
}
+ /**
+ * Opens the FullPageTranslationsPanel singleton instance.
+ *
+ * @param {Event} event - The triggering event for opening the panel.
+ */
+ openFullPageTranslationsPanel(event) {
+ this.window.FullPageTranslationsPanel.open(event);
+ }
+
+ /**
+ * Displays or hides the translate-page item in the context menu.
+ */
+ showTranslatePageItem() {
+ const translatePageItem = this.document.getElementById(
+ "context-translate-page"
+ );
+ const translationsEnabled = lazy.TranslationsParent.AIFeature.isEnabled;
+ const isAboutPage = this.browser?.currentURI?.schemeIs?.("about");
+
+ translatePageItem.hidden =
+ // Only show the item if the feature is enabled.
+ !translationsEnabled ||
+ // Only show the item if Translations is supported on this hardware.
+ !lazy.TranslationsParent.getIsTranslationsEngineSupported() ||
+ // Do not show page translation on internal about: pages.
+ isAboutPage ||
+ // Do not show page translation for page contexts where it does not make sense.
+ this.onTextInput ||
+ this.isContentSelected ||
+ this.onLink ||
+ this.onImage ||
+ this.onCanvas ||
+ this.onVideo ||
+ this.onAudio;
+ }
+
/**
* Opens the SelectTranslationsPanel singleton instance.
*
--
2.47.3
@@ -1,173 +0,0 @@
From 0eaea882ee730683f16d3e9bde8cc52a4ce8f4cc Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:11:42 +0100
Subject: [PATCH 37/52] ui-patches/allow_cookies_for_site.patch
---
browser/base/content/browser-siteIdentity.js | 32 +++++++++++++++++
browser/base/content/browser-trustPanel.js | 35 +++++++++++++++++++
.../content/identityPanel.inc.xhtml | 5 +++
.../content/trustPanel.inc.xhtml | 7 ++++
4 files changed, 79 insertions(+)
diff --git a/browser/base/content/browser-siteIdentity.js b/browser/base/content/browser-siteIdentity.js
index 16b222280f85..2d0ba31d5ff8 100644
--- a/browser/base/content/browser-siteIdentity.js
+++ b/browser/base/content/browser-siteIdentity.js
@@ -231,6 +231,9 @@ var gIdentityHandler = {
"identity-popup-clear-sitedata-button": event => {
this.clearSiteData(event);
},
+ "identity-popup-allow-sitedata-button": () => {
+ this.toggleSiteData();
+ },
"identity-popup-remove-cert-exception": () => {
this.removeCertException();
},
@@ -483,6 +486,33 @@ var gIdentityHandler = {
event.stopPropagation();
},
+ async refreshSiteData() {
+ document.getElementById("identity-popup-allow-sitedata-toggle").toggleAttribute(
+ "pressed",
+ Services.perms.testExactPermissionFromPrincipal(
+ gBrowser.contentPrincipal,
+ "persist-data-on-shutdown"
+ ) === Services.perms.ALLOW_ACTION
+ );
+ },
+
+ async toggleSiteData() {
+ const pressed = document.getElementById("identity-popup-allow-sitedata-toggle").toggleAttribute(
+ "pressed"
+ );
+
+ if (pressed) {
+ Services.perms.addFromPrincipal(
+ gBrowser.contentPrincipal,
+ "persist-data-on-shutdown",
+ Services.perms.ALLOW_ACTION,
+ Services.perms.EXPIRE_NEVER
+ );
+ } else {
+ Services.perms.removeFromPrincipal(gBrowser.contentPrincipal, "persist-data-on-shutdown");
+ }
+ },
+
/**
* Handler for mouseclicks on the "More Information" button in the
* "identity-popup" panel.
@@ -1234,6 +1264,8 @@ var gIdentityHandler = {
this._identityPopupContentOwner.textContent = owner;
this._identityPopupContentSupp.textContent = supplemental;
this._identityPopupContentVerif.textContent = verifier;
+
+ this.refreshSiteData();
},
setURI(uri) {
diff --git a/browser/base/content/browser-trustPanel.js b/browser/base/content/browser-trustPanel.js
index a749cead9842..f607b960c9e5 100644
--- a/browser/base/content/browser-trustPanel.js
+++ b/browser/base/content/browser-trustPanel.js
@@ -341,6 +341,9 @@ class TrustPanel {
document
.getElementById("trustpanel-toggle")
.addEventListener("click", () => this.#toggleTrackingProtection());
+ document
+ .getElementById("identity-popup-allow-sitedata-button")
+ .addEventListener("click", () => this.#toggleCookiesAllowed());
document
.getElementById("identity-popup-remove-cert-exception")
.addEventListener("click", () => this.#removeCertException());
@@ -353,6 +356,30 @@ class TrustPanel {
}
}
+ #toggleCookiesAllowed() {
+ const pressed = document.getElementById("identity-popup-allow-sitedata-toggle").toggleAttribute(
+ "pressed"
+ );
+
+ if (pressed) {
+ Services.perms.addFromPrincipal(
+ gBrowser.contentPrincipal,
+ "persist-data-on-shutdown",
+ Services.perms.ALLOW_ACTION,
+ Services.perms.EXPIRE_NEVER
+ );
+ } else {
+ Services.perms.removeFromPrincipal(gBrowser.contentPrincipal, "persist-data-on-shutdown");
+ }
+ }
+
+ #areCookiesAllowed() {
+ return Services.perms.testExactPermissionFromPrincipal(
+ gBrowser.contentPrincipal,
+ "persist-data-on-shutdown"
+ ) === Services.perms.ALLOW_ACTION;
+ }
+
async showPopup(opts = {}) {
this.#initializePopup();
@@ -742,6 +769,9 @@ class TrustPanel {
{ host: this.#displayHost }
);
+ let toggleCookies = document.getElementById("identity-popup-allow-sitedata-toggle");
+ toggleCookies.toggleAttribute("pressed", this.#areCookiesAllowed());
+
let hostElement = document.getElementById("trustpanel-popup-host");
hostElement.setAttribute("value", this.#displayHost);
hostElement.setAttribute("tooltiptext", this.#displayHost);
@@ -781,6 +811,11 @@ class TrustPanel {
"hidden",
isPrivate
);
+ this.#updateAttribute(
+ document.getElementById("trustpanel-allow-cookies-footer"),
+ "hidden",
+ isPrivate
+ );
if (!isPrivate) {
try {
let baseDomain = SiteDataManager.getBaseDomainFromHost(this.#uri.host);
diff --git a/browser/components/controlcenter/content/identityPanel.inc.xhtml b/browser/components/controlcenter/content/identityPanel.inc.xhtml
index d7f214f471f7..088662a045a3 100644
--- a/browser/components/controlcenter/content/identityPanel.inc.xhtml
+++ b/browser/components/controlcenter/content/identityPanel.inc.xhtml
@@ -98,6 +98,11 @@
<toolbarbutton id="identity-popup-clear-sitedata-button"
data-l10n-id="identity-clear-site-data"
class="subviewbutton"/>
+ <toolbarbutton id="identity-popup-allow-sitedata-button"
+ class="subviewbutton">
+ <label data-l10n-id="identity-allow-site-data" flex="1"></label>
+ <html:moz-toggle id="identity-popup-allow-sitedata-toggle" style="pointer-events: none;"></html:moz-toggle>
+ </toolbarbutton>
</vbox>
</panelview>
diff --git a/browser/components/controlcenter/content/trustPanel.inc.xhtml b/browser/components/controlcenter/content/trustPanel.inc.xhtml
index 65f8089b0a5f..51794158610c 100644
--- a/browser/components/controlcenter/content/trustPanel.inc.xhtml
+++ b/browser/components/controlcenter/content/trustPanel.inc.xhtml
@@ -75,6 +75,13 @@
<toolbarbutton data-l10n-id="trustpanel-clear-cookies-button" id="trustpanel-clear-cookies-button" class="subviewbutton subviewbutton-nav"></toolbarbutton>
</vbox>
+ <vbox id="trustpanel-allow-cookies-footer">
+ <toolbarbutton id="identity-popup-allow-sitedata-button" class="subviewbutton">
+ <label data-l10n-id="identity-allow-site-data" flex="1"></label>
+ <html:moz-toggle id="identity-popup-allow-sitedata-toggle" style="pointer-events: none;"></html:moz-toggle>
+ </toolbarbutton>
+ </vbox>
+
<toolbarseparator></toolbarseparator>
<toolbarbutton id="trustpanel-privacy-link" data-l10n-id="trustpanel-privacy-link" class="subviewbutton"></toolbarbutton>
</vbox>
--
2.47.3
@@ -1,28 +0,0 @@
From d908628306c93f7cc9cc3bce321d156099efdf0a Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:11:45 +0100
Subject: [PATCH 38/52] ui-patches/home-preferences.patch
---
browser/themes/shared/preferences/preferences.css | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/browser/themes/shared/preferences/preferences.css b/browser/themes/shared/preferences/preferences.css
index 7116d47f1004..a7e7a4fd1dfd 100644
--- a/browser/themes/shared/preferences/preferences.css
+++ b/browser/themes/shared/preferences/preferences.css
@@ -1615,6 +1615,11 @@ setting-pane[onsearchpane] {
}
}
+#support-firefox,
+.mission-message {
+ display: none;
+}
+
#dohProviderSelect {
--select-max-width: 235px;
}
--
2.47.3
@@ -1,62 +0,0 @@
From 1af7edf004da29ad5291089cdac62f3d9a9411b0 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:11:51 +0100
Subject: [PATCH 39/52] ui-patches/lw-logo-devtools.patch
---
devtools/client/aboutdebugging/src/actions/runtimes.js | 4 +---
devtools/client/jar.mn | 1 +
.../themes/images/aboutdebugging-firefox-librewolf.svg | 1 +
.../client/themes/images/aboutdebugging-firefox-logo.svg | 7 +------
4 files changed, 4 insertions(+), 9 deletions(-)
create mode 100644 devtools/client/themes/images/aboutdebugging-firefox-librewolf.svg
diff --git a/devtools/client/aboutdebugging/src/actions/runtimes.js b/devtools/client/aboutdebugging/src/actions/runtimes.js
index 52148f80b280..74eac40db721 100644
--- a/devtools/client/aboutdebugging/src/actions/runtimes.js
+++ b/devtools/client/aboutdebugging/src/actions/runtimes.js
@@ -71,9 +71,7 @@ async function getRuntimeIcon(runtime, channel) {
}
}
- return channel === "release" || channel === "beta" || channel === "aurora"
- ? `chrome://devtools/skin/images/aboutdebugging-firefox-${channel}.svg`
- : "chrome://devtools/skin/images/aboutdebugging-firefox-nightly.svg";
+ return "chrome://devtools/skin/images/aboutdebugging-firefox-librewolf.svg";
}
function onRemoteDevToolsClientClosed() {
diff --git a/devtools/client/jar.mn b/devtools/client/jar.mn
index 4e0494c098b3..501d8b24cd8d 100644
--- a/devtools/client/jar.mn
+++ b/devtools/client/jar.mn
@@ -384,6 +384,7 @@ devtools.jar:
skin/images/aboutdebugging-firefox-logo.svg (themes/images/aboutdebugging-firefox-logo.svg)
skin/images/aboutdebugging-firefox-nightly.svg (themes/images/aboutdebugging-firefox-nightly.svg)
skin/images/aboutdebugging-firefox-release.svg (themes/images/aboutdebugging-firefox-release.svg)
+ skin/images/aboutdebugging-firefox-librewolf.svg (themes/images/aboutdebugging-firefox-librewolf.svg)
skin/images/aboutdebugging-globe-icon.svg (themes/images/aboutdebugging-globe-icon.svg)
skin/images/aboutdebugging-information.svg (themes/images/aboutdebugging-information.svg)
skin/images/aboutdebugging-process-icon.svg (themes/images/aboutdebugging-process-icon.svg)
diff --git a/devtools/client/themes/images/aboutdebugging-firefox-librewolf.svg b/devtools/client/themes/images/aboutdebugging-firefox-librewolf.svg
new file mode 100644
index 000000000000..386c02a5fd57
--- /dev/null
+++ b/devtools/client/themes/images/aboutdebugging-firefox-librewolf.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" viewBox="0 0 67.733 67.733"><g transform="translate(-42.107 -153.898)"><circle cx="75.973" cy="187.765" r="33.867" fill="#00acff"/><path d="M72.544 214.677c-4.744-.609-9.282-2.5-13.242-5.518-1.292-.985-3.715-3.424-4.773-4.804-2.963-3.865-4.805-8.25-5.412-12.887-.26-1.984-.26-5.633.003-7.447 1.308-9.068 7.014-16.846 15.209-20.73 3.811-1.806 7.3-2.57 11.73-2.57 7.166 0 13.527 2.567 18.681 7.54 2.483 2.396 4.148 4.668 5.574 7.607 1.929 3.975 2.71 7.433 2.71 11.995 0 6.006-1.735 11.244-5.337 16.117-1.07 1.448-3.162 3.647-4.55 4.785-3.806 3.12-8.658 5.232-13.473 5.863-1.663.218-5.593.245-7.12.05zm10.041-4.865c2.898-.914 5.26-2.142 7.54-3.92 1.213-.946 3.309-3.062 4.188-4.227 2.383-3.162 4.004-7.122 4.482-10.946.23-1.842.096-5.738-.255-7.43-.93-4.48-2.932-8.265-6.086-11.503-1.966-2.02-3.757-3.35-6.06-4.505-3.495-1.752-6.49-2.46-10.424-2.464-4.164-.004-7.815.95-11.429 2.987-3.29 1.855-6.69 5.26-8.553 8.563-1.372 2.433-2.376 5.32-2.767 7.96-.257 1.73-.262 5.164-.01 6.82.504 3.316 1.76 6.592 3.584 9.34.995 1.5.964 1.484 1.842.981 1.57-.898 1.98-1.333 2.836-3.01 1-1.96 2.07-3.673 3.037-4.863 1.116-1.373 1.27-1.618 1.83-2.915.28-.652.786-1.61 1.122-2.13l.611-.942-.79-.777c-1.05-1.032-1.923-2.201-2.087-2.796-.168-.608.03-.947.818-1.402.798-.461 1.368-.593 3.5-.812 1.037-.107 2.163-.302 2.518-.437.353-.134 1.408-.708 2.344-1.276 2.703-1.639 2.932-1.723 4.552-1.688 1.369.03 1.371.029 2.183-.462 1.7-1.028 4.143-2.883 7.357-5.587.616-.519 1.21-.926 1.32-.905.454.088 1.289 2.137 1.416 3.476.077.812-.08 1.615-.562 2.873-.132.343-.192.67-.135.727.138.137.61-.453.61-.763 0-.394.262-.439.617-.106.258.242.481.312 1 .312.567 0 .708.052.93.348.375.5.463 1.866.175 2.732-.28.842-1.125 1.813-1.892 2.173-.686.323-2.075 1.68-2.726 2.662a31.64 31.64 0 00-1.037 1.742c-.321.582-.86 1.461-1.198 1.954-.664.97-1.233 2.323-1.782 4.238-.323 1.126-.35 1.419-.363 3.928-.016 3.032-.173 3.776-.993 4.71-.931 1.06-1.862 3.391-1.94 4.86-.05.928-.192 1.832-.395 2.502-.09.295.077.291 1.072-.022z" fill="#fff"/><path d="M77.062 181.654l1.222-1.565 1.966-.275-1.222 1.564z" fill="#00acff"/></g></svg>
diff --git a/devtools/client/themes/images/aboutdebugging-firefox-logo.svg b/devtools/client/themes/images/aboutdebugging-firefox-logo.svg
index fe4d116b1660..fbbc08c9af6b 100644
--- a/devtools/client/themes/images/aboutdebugging-firefox-logo.svg
+++ b/devtools/client/themes/images/aboutdebugging-firefox-logo.svg
@@ -1,6 +1 @@
-<!-- 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" viewBox="0 0 512 512">
- <path fill="context-fill #20123a" d="M190.368 150.591c0.157 0.009 0.079 0.003 0 0zm-57.874-28.933c0.158 0.008 0.079 0.003 0 0zm346.228 44.674c-10.445-25.123-31.6-52.248-48.211-60.82 13.52 26.5 21.345 53.093 24.335 72.935 0 0.04 0.015 0.136 0.047 0.4-27.175-67.732-73.254-95.047-110.886-154.512-1.9-3.008-3.805-6.022-5.661-9.2a73.237 73.237 0 0 1-2.646-4.972 43.757 43.757 0 0 1-3.585-9.5 0.625 0.625 0 0 0-0.546-0.644 0.8 0.8 0 0 0-0.451 0c-0.033 0.011-0.084 0.051-0.119 0.065-0.053 0.02-0.12 0.069-0.176 0.095 0.026-0.036 0.083-0.117 0.1-0.135-53.437 31.3-75.587 86.093-81.282 120.97a128.057 128.057 0 0 0-47.624 12.153 6.144 6.144 0 0 0-3.041 7.63 6.034 6.034 0 0 0 8.192 3.525 116.175 116.175 0 0 1 41.481-10.826c0.468-0.033 0.937-0.062 1.405-0.1a117.624 117.624 0 0 1 5.932-0.211 120.831 120.831 0 0 1 34.491 4.777c0.654 0.192 1.295 0.414 1.946 0.616a120.15 120.15 0 0 1 5.539 1.842 121.852 121.852 0 0 1 3.992 1.564c1.074 0.434 2.148 0.868 3.206 1.331a118.453 118.453 0 0 1 4.9 2.307c0.743 0.368 1.485 0.735 2.217 1.117a120.535 120.535 0 0 1 4.675 2.587 107.785 107.785 0 0 1 2.952 1.776 123.018 123.018 0 0 1 42.028 43.477c-12.833-9.015-35.81-17.918-57.947-14.068 86.441 43.214 63.234 192.027-56.545 186.408a106.7 106.7 0 0 1-31.271-6.031 132.461 132.461 0 0 1-7.059-2.886c-1.356-0.618-2.711-1.243-4.051-1.935-29.349-15.168-53.583-43.833-56.611-78.643 0 0 11.093-41.335 79.433-41.335 7.388 0 28.508-20.614 28.9-26.593-0.09-1.953-41.917-18.59-58.223-34.656-8.714-8.585-12.851-12.723-16.514-15.829a71.7 71.7 0 0 0-6.225-4.7 111.335 111.335 0 0 1-0.675-58.733c-24.687 11.242-43.89 29.011-57.849 44.7h-0.111c-9.528-12.067-8.855-51.873-8.312-60.184-0.114-0.516-7.107 3.63-8.024 4.254a175.21 175.21 0 0 0-23.486 20.12 210.5 210.5 0 0 0-22.443 26.913c0 0.012-0.007 0.025-0.011 0.037 0-0.012 0.007-0.025 0.011-0.038a202.837 202.837 0 0 0-32.244 72.81c-0.058 0.265-2.29 10.054-3.92 22.147a265.794 265.794 0 0 0-0.769 5.651c-0.558 3.636-0.992 7.6-1.42 13.767-0.019 0.239-0.031 0.474-0.048 0.712a591.152 591.152 0 0 0-0.481 7.995c0 0.411-0.025 0.816-0.025 1.227 0 132.709 107.6 240.29 240.324 240.29 118.865 0 217.559-86.288 236.882-199.63 0.407-3.075 0.732-6.168 1.092-9.27 4.777-41.21-0.53-84.525-15.588-120.747zm-164.068 72.1z" />
-</svg>
+<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" viewBox="0 0 67.733 67.733"><path d="M33.867 0A33.867 33.867 0 000 33.867a33.867 33.867 0 0033.867 33.866 33.867 33.867 0 0033.866-33.866A33.867 33.867 0 0033.867 0zm.086 6.822c7.166 0 13.526 2.568 18.68 7.54 2.484 2.397 4.149 4.669 5.575 7.608 1.928 3.975 2.71 7.432 2.71 11.995 0 6.006-1.735 11.244-5.337 16.117-1.07 1.448-3.162 3.647-4.55 4.785-3.807 3.12-8.659 5.231-13.473 5.863-1.664.218-5.594.245-7.121.049-4.744-.609-9.282-2.5-13.242-5.519-1.291-.984-3.715-3.423-4.773-4.803C9.46 46.592 7.618 42.206 7.01 37.57c-.26-1.985-.259-5.633.003-7.447 1.308-9.068 7.014-16.845 15.209-20.73 3.811-1.806 7.3-2.57 11.731-2.57zm-.089 4.097c-4.164-.004-7.815.95-11.43 2.987-3.289 1.855-6.69 5.26-8.553 8.563-1.371 2.433-2.375 5.32-2.767 7.96-.257 1.729-.262 5.164-.01 6.82.504 3.315 1.761 6.591 3.584 9.34.995 1.5.964 1.484 1.842.981 1.571-.898 1.981-1.334 2.837-3.01 1-1.96 2.07-3.673 3.037-4.863 1.116-1.374 1.269-1.618 1.829-2.915a17.5 17.5 0 011.123-2.13l.61-.942-.79-.777c-1.05-1.032-1.923-2.202-2.087-2.797-.168-.607.03-.946.82-1.402.796-.46 1.367-.593 3.498-.812 1.037-.106 2.163-.302 2.518-.436.353-.134 1.408-.709 2.344-1.276 2.703-1.639 2.932-1.724 4.553-1.688 1.368.03 1.37.029 2.182-.462 1.701-1.028 4.144-2.883 7.358-5.587.616-.519 1.21-.926 1.319-.905.454.088 1.29 2.136 1.416 3.476.077.812-.08 1.615-.562 2.872-.131.343-.192.67-.134.728.137.137.61-.453.61-.763 0-.394.261-.44.616-.106.259.242.482.311 1 .311.568 0 .708.053.93.348.375.501.463 1.867.176 2.733-.28.842-1.125 1.812-1.892 2.173-.686.322-2.076 1.68-2.726 2.662-.249.376-.716 1.16-1.037 1.742-.322.582-.861 1.461-1.199 1.954-.664.97-1.233 2.322-1.782 4.238-.322 1.125-.35 1.418-.363 3.928-.016 3.032-.173 3.776-.992 4.71-.932 1.06-1.862 3.391-1.94 4.86-.05.928-.193 1.832-.396 2.502-.089.294.078.29 1.073-.023 2.898-.913 5.26-2.14 7.54-3.92 1.213-.945 3.308-3.06 4.187-4.226 2.383-3.162 4.005-7.122 4.482-10.947.23-1.841.097-5.738-.254-7.429-.93-4.48-2.932-8.265-6.087-11.503-1.966-2.02-3.756-3.35-6.06-4.505-3.495-1.752-6.49-2.46-10.423-2.464zm4.279 14.997l-1.966.275-1.222 1.565 1.966-.276 1.222-1.564z" fill="context-fill #00acff"/></svg>
--
2.47.3
@@ -1,97 +0,0 @@
From 8801c367f1dba73a857bcca0df5693e0d538819f Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:11:57 +0100
Subject: [PATCH 40/52] ui-patches/neterror.patch
---
toolkit/content/errors/net-error-illustrations.mjs | 7 ++-----
toolkit/content/net-error-card.mjs | 12 +++++++++---
toolkit/themes/shared/aboutNetError.css | 2 +-
toolkit/themes/shared/desktop-jar.inc.mn | 1 +
toolkit/themes/shared/illustrations/warning.svg | 8 ++++++++
5 files changed, 21 insertions(+), 9 deletions(-)
create mode 100644 toolkit/themes/shared/illustrations/warning.svg
diff --git a/toolkit/content/errors/net-error-illustrations.mjs b/toolkit/content/errors/net-error-illustrations.mjs
index d785e4381ad2..24e6026d94ae 100644
--- a/toolkit/content/errors/net-error-illustrations.mjs
+++ b/toolkit/content/errors/net-error-illustrations.mjs
@@ -3,11 +3,8 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
export const NET_ERROR_ILLUSTRATIONS = {
- noConnection: {
- src: "chrome://global/skin/illustrations/no-connection.svg",
- className: "no-connection",
- },
+ noConnection: {},
securityError: {
- src: "chrome://global/skin/illustrations/security-error.svg",
+ src: "chrome://global/skin/illustrations/warning.svg",
},
};
diff --git a/toolkit/content/net-error-card.mjs b/toolkit/content/net-error-card.mjs
index 8f51084ea10e..e964c4fd6862 100644
--- a/toolkit/content/net-error-card.mjs
+++ b/toolkit/content/net-error-card.mjs
@@ -1098,9 +1098,15 @@ export class NetErrorCard extends MozLitElement {
aria-labelledby="error-title"
aria-describedby="error-intro whatCanYouDo"
>
- <div class="img-container">
- <img src=${src} class=${ifDefined(className)} alt=${alt} />
- </div>
+ ${src &&
+ html`
+ <div class="img-container">
+ <img
+ src=${src}
+ ${alt && `data-l10n-id=${alt} data-l10n-attrs="alt"`}
+ />
+ </div>
+ `}
<div class="container">
${this.showCustomNetErrorCard
? html`${this.customNetErrorContainerTemplate()}`
diff --git a/toolkit/themes/shared/aboutNetError.css b/toolkit/themes/shared/aboutNetError.css
index eac2c03a57e1..e56fb33b1b0b 100644
--- a/toolkit/themes/shared/aboutNetError.css
+++ b/toolkit/themes/shared/aboutNetError.css
@@ -251,7 +251,7 @@ button:disabled {
}
.img-container > img {
- width: 8.75em;
+ width: 3.5em;
margin-block-start: 2em;
margin-inline-end: 2.5em;
diff --git a/toolkit/themes/shared/desktop-jar.inc.mn b/toolkit/themes/shared/desktop-jar.inc.mn
index a2b1b894f4e4..836d47d1b02b 100644
--- a/toolkit/themes/shared/desktop-jar.inc.mn
+++ b/toolkit/themes/shared/desktop-jar.inc.mn
@@ -153,6 +153,7 @@
skin/classic/global/illustrations/shield-check.svg (../../shared/illustrations/shield-check.svg)
skin/classic/global/illustrations/shield-alert.svg (../../shared/illustrations/shield-alert.svg)
skin/classic/global/illustrations/no-connection.svg (../../shared/illustrations/no-connection.svg)
+ skin/classic/global/illustrations/warning.svg (../../shared/illustrations/warning.svg)
skin/classic/global/illustrations/kit-concerned.svg (../../shared/illustrations/kit-concerned.svg)
skin/classic/global/illustrations/kit-confetti.svg (../../shared/illustrations/kit-confetti.svg)
skin/classic/global/illustrations/kit-happy.svg (../../shared/illustrations/kit-happy.svg)
diff --git a/toolkit/themes/shared/illustrations/warning.svg b/toolkit/themes/shared/illustrations/warning.svg
new file mode 100644
index 000000000000..e93301c81087
--- /dev/null
+++ b/toolkit/themes/shared/illustrations/warning.svg
@@ -0,0 +1,8 @@
+<!-- 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" viewBox="0 0 16 16" width="16" height="16"
+ fill="context-fill light-dark(#ffa436, #ffbd4f)" fill-opacity="context-fill-opacity">
+ <path
+ d="m14.875 12.037-5.497-10C8.997 1.346 8.311 1 7.625 1s-1.372.346-1.752 1.037l-5.497 10C-.358 13.37.607 15 2.128 15l10.995 0c1.52 0 2.485-1.63 1.752-2.963zM8.25 11.75 8 12l-.75 0-.25-.25L7 11l.25-.25.75 0 .25.25 0 .75zm0-2.688a.625.625 0 0 1-1.25 0l0-3.437a.625.625 0 0 1 1.25 0l0 3.437z" />
+</svg>
--
2.47.3
@@ -1,34 +0,0 @@
From 0585672972a84f7e454028b54a7001283f394699 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:12:00 +0100
Subject: [PATCH 41/52] ui-patches/pref-naming.patch
---
browser/locales/en-US/browser/preferences/preferences.ftl | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/browser/locales/en-US/browser/preferences/preferences.ftl b/browser/locales/en-US/browser/preferences/preferences.ftl
index 8227dc4b8437..d72fdb67fe31 100644
--- a/browser/locales/en-US/browser/preferences/preferences.ftl
+++ b/browser/locales/en-US/browser/preferences/preferences.ftl
@@ -744,7 +744,7 @@ play-drm-content =
.label = Play DRM-controlled content
.accesskey = P
-play-drm-content-learn-more = Learn more
+play-drm-content-learn-more = Why we disable it
## About Firefox
@@ -765,7 +765,7 @@ update-application-updates-managed-by-os =
# Variables:
# $version (string) - Firefox version
-update-application-version = Version { $version } <a data-l10n-name="learn-more">Whats new</a>
+update-application-version = Version { $version } <a data-l10n-name="learn-more">Visit the repositories</a>
update-history-2 =
.label = Show update history
--
2.47.3
@@ -1,318 +0,0 @@
From df1c4c1b1e969881f543f2609a3bdf9916cee46b Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:12:08 +0100
Subject: [PATCH 42/52] ui-patches/privacy-preferences.patch
---
.../preferences/config/permissions-data.mjs | 108 ------------------
.../components/preferences/config/privacy.mjs | 28 -----
browser/components/preferences/preferences.js | 2 +-
.../components/preferences/privacy.inc.xhtml | 34 +++---
browser/components/preferences/privacy.js | 2 -
.../en-US/browser/preferences/preferences.ftl | 2 -
browser/themes/shared/preferences/privacy.css | 7 +-
7 files changed, 21 insertions(+), 162 deletions(-)
diff --git a/browser/components/preferences/config/permissions-data.mjs b/browser/components/preferences/config/permissions-data.mjs
index e9f9ae828c2c..962160b64225 100644
--- a/browser/components/preferences/config/permissions-data.mjs
+++ b/browser/components/preferences/config/permissions-data.mjs
@@ -728,112 +728,4 @@ SettingGroupManager.registerGroups({
},
],
},
- dataCollection: {
- items: [
- {
- id: "dataCollectionCategory",
- l10nId: "data-collection",
- control: "moz-fieldset",
- iconSrc: "chrome://global/skin/icons/trending.svg",
- controlAttrs: {
- headinglevel: 2,
- "data-l10n-attrs": "searchkeywords",
- },
- items: [
- {
- id: "dataCollectionLink",
- control: "a",
- l10nId: "data-collection-link",
- slot: "support-link",
- controlAttrs: {
- id: "dataCollectionPrivacyNoticeLink",
- target: "_blank",
- },
- },
- {
- id: "preferencesPrivacyProfiles",
- control: "moz-message-bar",
- l10nId: "data-collection-preferences-across-profiles",
- controlAttrs: {
- role: "status",
- },
- items: [
- {
- id: "privacyProfilesLink",
- control: "a",
- l10nId: "data-collection-profiles-link",
- slot: "support-link",
- controlAttrs: {
- id: "dataCollectionViewProfiles",
- target: "_blank",
- href: "",
- },
- },
- ],
- },
- {
- id: "telemetryContainer",
- control: "moz-message-bar",
- l10nId: "data-collection-health-report-telemetry-disabled",
- supportPage: "telemetry-clientid",
- controlAttrs: {
- role: "status",
- },
- },
- {
- id: "backup-multi-profile-warning-message-bar",
- control: "moz-message-bar",
- l10nId: "backup-multi-profile-warning-message",
- controlAttrs: {
- dismissable: true,
- },
- },
- {
- id: "submitHealthReportBox",
- supportPage: "technical-and-interaction-data",
- subcategory: "reports",
- items: [
- {
- id: "addonRecommendationEnabled",
- l10nId: "addon-recommendations3",
- supportPage: "personalized-addons",
- },
- {
- id: "optOutStudiesEnabled",
- l10nId: "data-collection-run-studies",
- items: [
- {
- id: "viewShieldStudies",
- control: "moz-box-link",
- l10nId: "data-collection-studies-link",
- controlAttrs: {
- href: "about:studies",
- },
- },
- ],
- },
- ],
- },
-
- {
- id: "enableNimbusRollouts",
- l10nId: "nimbus-rollouts",
- supportPage: "remote-improvements",
- },
- {
- id: "submitUsagePingBox",
- l10nId: "data-collection-usage-ping",
- subcategory: "reports",
- supportPage: "usage-ping-settings",
- },
- {
- id: "automaticallySubmitCrashesBox",
- l10nId: "data-collection-backlogged-crash-reports",
- subcategory: "reports",
- supportPage: "crash-reports",
- },
- ],
- },
- ],
- },
});
diff --git a/browser/components/preferences/config/privacy.mjs b/browser/components/preferences/config/privacy.mjs
index dccc0f1b2819..9d34147f5423 100644
--- a/browser/components/preferences/config/privacy.mjs
+++ b/browser/components/preferences/config/privacy.mjs
@@ -890,34 +890,6 @@ SettingGroupManager.registerGroups({
l10nId: "history-group",
headingLevel: 2,
items: [
- {
- id: "historyMode",
- control: "moz-select",
- options: [
- {
- value: "remember",
- l10nId: "history-remember-option-all2",
- },
- { value: "dontremember", l10nId: "history-remember-option-never2" },
- { value: "custom", l10nId: "history-remember-option-custom2" },
- ],
- controlAttrs: {
- "search-l10n-ids": `
- history-remember-description4,
- history-dontremember-description4,
- history-custom-description4,
- history-private-browsing-permanent.label,
- history-remember-browser-option.label,
- history-remember-search-option.label,
- history-clear-on-close-option.label,
- history-clear-on-close-settings.label
- `,
- },
- },
- {
- id: "privateBrowsingAutoStart",
- l10nId: "history-private-browsing-permanent",
- },
{
id: "rememberHistory",
l10nId: "history-remember-browser-option",
diff --git a/browser/components/preferences/preferences.js b/browser/components/preferences/preferences.js
index 94612d8e28af..01f60127bbe9 100644
--- a/browser/components/preferences/preferences.js
+++ b/browser/components/preferences/preferences.js
@@ -395,7 +395,7 @@ const CONFIG_PANES = Object.freeze({
permissionsData: {
l10nId: "permissions-data-section",
iconSrc: "chrome://browser/skin/permissions.svg",
- groupIds: ["permissions", "dataCollection"],
+ groupIds: ["permissions"],
module: "chrome://browser/content/preferences/config/permissions-data.mjs",
visible: () => srdSectionEnabled("permissionsData"),
},
diff --git a/browser/components/preferences/privacy.inc.xhtml b/browser/components/preferences/privacy.inc.xhtml
index 78e2e934cf33..052afa00e06c 100644
--- a/browser/components/preferences/privacy.inc.xhtml
+++ b/browser/components/preferences/privacy.inc.xhtml
@@ -50,20 +50,6 @@
permissions-exceptions-manage-etp-desc,
"/>
</hbox>
- <hbox id="rfpIncompatibilityWarning" class="info-box-container" hidden="true">
- <vbox class="info-icon-container">
- <html:img class="info-icon"></html:img>
- </vbox>
- <vbox flex="1">
- <description>
- <html:span data-l10n-id="content-blocking-rfp-incompatibility-warning"/>
- <html:a is="moz-support-link"
- class="learnMore"
- support-page="resist-fingerprinting"
- />
- </description>
- </vbox>
- </hbox>
<hbox id="fpiIncompatibilityWarning" class="info-box-container" hidden="true">
<vbox class="info-icon-container">
<html:img class="info-icon"></html:img>
@@ -78,7 +64,7 @@
<radiogroup id="contentBlockingCategoryRadio"
preference="browser.contentblocking.category"
aria-labelledby="trackingProtectionMenuDesc">
- <vbox id="contentBlockingOptionStandard" class="privacy-detailedoption info-box-container">
+ <vbox id="contentBlockingOptionStandard" class="privacy-detailedoption info-box-container" hidden="true">
<hbox>
<radio id="standardRadio"
value="standard"
@@ -243,7 +229,7 @@
is="highlightable-button"
data-l10n-id="content-blocking-reload-tabs-button"/>
</html:div>
- <vbox class="content-blocking-warning info-box-container">
+ <vbox class="content-blocking-warning info-box-container" hidden="true">
<hbox>
<image class="content-blocking-warning-image"/>
<label class="content-blocking-warning-title" data-l10n-id="content-blocking-warning-title-2"/>
@@ -259,7 +245,7 @@
</vbox>
</vbox>
</vbox>
- <vbox id="contentBlockingOptionCustom" class="privacy-detailedoption info-box-container">
+ <vbox id="contentBlockingOptionCustom" class="privacy-detailedoption info-box-container" hidden="true">
<hbox>
<radio id="customRadio"
value="custom"
@@ -392,6 +378,20 @@
</vbox>
</radiogroup>
</vbox>
+ <hbox id="rfpIncompatibilityWarning" class="info-box-container" hidden="true">
+ <vbox class="info-icon-container">
+ <html:img class="info-icon"></html:img>
+ </vbox>
+ <vbox flex="1">
+ <description>
+ <html:span data-l10n-id="content-blocking-rfp-incompatibility-warning"/>
+ <html:a is="moz-support-link"
+ class="learnMore"
+ support-page="resist-fingerprinting"
+ />
+ </description>
+ </vbox>
+ </hbox>
</vbox>
</groupbox>
<html:setting-group id="nonTechnicalPrivacyGroup" groupid="nonTechnicalPrivacy" data-category="panePrivacy" hidden="true" data-srd-groupid="nonTechnicalPrivacy2"/>
diff --git a/browser/components/preferences/privacy.js b/browser/components/preferences/privacy.js
index a78085493646..5400217b0fc3 100644
--- a/browser/components/preferences/privacy.js
+++ b/browser/components/preferences/privacy.js
@@ -618,7 +618,6 @@ var gPrivacyPane = {
initSettingGroup("securityPrivacyStatus");
initSettingGroup("securityPrivacyWarnings");
initSettingGroup("httpsOnly");
- initSettingGroup("browsingProtection");
initSettingGroup("cookiesAndSiteData");
initSettingGroup("cookiesAndSiteData2");
initSettingGroup("certificates");
@@ -626,7 +625,6 @@ var gPrivacyPane = {
initSettingGroup("history");
initSettingGroup("history2");
initSettingGroup("permissions");
- initSettingGroup("dataCollection");
initSettingGroup("privacyPanel");
initSettingGroup("dnsOverHttps");
initSettingGroup("dnsOverHttpsAdvanced");
diff --git a/browser/locales/en-US/browser/preferences/preferences.ftl b/browser/locales/en-US/browser/preferences/preferences.ftl
index d72fdb67fe31..9590dd1d08c6 100644
--- a/browser/locales/en-US/browser/preferences/preferences.ftl
+++ b/browser/locales/en-US/browser/preferences/preferences.ftl
@@ -1934,8 +1934,6 @@ sitedata-cookies-exceptions3 =
content-blocking-enhanced-tracking-protection = Enhanced Tracking Protection
-content-blocking-section-top-level-description = Trackers follow you around online to collect information about your browsing habits and interests. { -brand-short-name } blocks many of these trackers and other malicious scripts.
-
content-blocking-learn-more = Learn more
content-blocking-fpi-incompatibility-warning = You are using First Party Isolation (FPI), which overrides some of { -brand-short-name }s cookie settings.
diff --git a/browser/themes/shared/preferences/privacy.css b/browser/themes/shared/preferences/privacy.css
index cbe70bc6455d..85f340cee183 100644
--- a/browser/themes/shared/preferences/privacy.css
+++ b/browser/themes/shared/preferences/privacy.css
@@ -233,7 +233,7 @@
}
.extra-information-label {
- margin-top: 18px;
+ margin-top: 5px;
}
/* Apply display: block to the containers of all the category information, as
@@ -269,9 +269,8 @@
}
.content-blocking-extra-blocking-desc {
- margin-inline-start: 0.5em;
- position: relative;
- top: 0.65em;
+ margin-top: 1em;
+ margin-bottom: 0.5em;
}
.content-blocking-label,
--
2.47.3
@@ -1,91 +0,0 @@
From 1fe59d97e86904f7bf983497a5a18127d3ed8ce1 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:12:12 +0100
Subject: [PATCH 43/52] ui-patches/remove-cfrprefs.patch
---
.../preferences/config/tabs-browsing.mjs | 41 -------------------
browser/components/preferences/preferences.js | 1 -
2 files changed, 42 deletions(-)
diff --git a/browser/components/preferences/config/tabs-browsing.mjs b/browser/components/preferences/config/tabs-browsing.mjs
index 7d4b5bec8b53..0cfde7bd0d09 100644
--- a/browser/components/preferences/config/tabs-browsing.mjs
+++ b/browser/components/preferences/config/tabs-browsing.mjs
@@ -541,16 +541,6 @@ Preferences.addSetting({
},
});
-// Recommendations settings
-Preferences.addSetting({
- id: "cfrRecommendations",
- pref: "browser.newtabpage.activity-stream.asrouter.userprefs.cfr.addons",
-});
-Preferences.addSetting({
- id: "cfrRecommendations-features",
- pref: "browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features",
-});
-
// Browser layout settings
Preferences.addSetting({
id: "browserLayoutRadioGroup",
@@ -783,25 +773,6 @@ SettingGroupManager.registerGroups({
},
],
},
- recommendations: {
- l10nId: "recommendations-group",
- headingLevel: 2,
- iconSrc: "chrome://browser/skin/lightning-bolt.svg",
- items: [
- {
- id: "cfrRecommendations",
- l10nId: "browsing-cfr-recommendations",
- supportPage: "extensionrecommendations",
- subcategory: "cfraddons",
- },
- {
- id: "cfrRecommendations-features",
- l10nId: "browsing-cfr-features",
- supportPage: "extensionrecommendations",
- subcategory: "cfrfeatures",
- },
- ],
- },
// Bug 2028609: the following sections are needed to ensure settings keep
// working in legacy views, and can be removed when the pref is flipped
drm: {
@@ -833,18 +804,6 @@ SettingGroupManager.registerGroups({
},
],
},
- {
- id: "cfrRecommendations",
- l10nId: "browsing-cfr-recommendations",
- supportPage: "extensionrecommendations",
- subcategory: "cfraddons",
- },
- {
- id: "cfrRecommendations-features",
- l10nId: "browsing-cfr-features",
- supportPage: "extensionrecommendations",
- subcategory: "cfrfeatures",
- },
{
id: "linkPreviewEnabled",
l10nId: "link-preview-settings-enable",
diff --git a/browser/components/preferences/preferences.js b/browser/components/preferences/preferences.js
index 01f60127bbe9..2798ad677d20 100644
--- a/browser/components/preferences/preferences.js
+++ b/browser/components/preferences/preferences.js
@@ -477,7 +477,6 @@ const CONFIG_PANES = Object.freeze({
"keyboardShortcuts",
"media",
"performance",
- "recommendations",
],
iconSrc: "chrome://global/skin/icons/cursor-arrow.svg",
module: "chrome://browser/content/preferences/config/tabs-browsing.mjs",
--
2.47.3
@@ -1,25 +0,0 @@
From a46bad5a4815206b904f707cfc36a0b01857ba75 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:12:15 +0100
Subject: [PATCH 44/52] ui-patches/remove-organization-policy-banner.patch
---
browser/components/preferences/preferences.js | 2 --
1 file changed, 2 deletions(-)
diff --git a/browser/components/preferences/preferences.js b/browser/components/preferences/preferences.js
index 2798ad677d20..89b032bedba7 100644
--- a/browser/components/preferences/preferences.js
+++ b/browser/components/preferences/preferences.js
@@ -639,8 +639,6 @@ function init_all() {
gotoPref(event.target.view);
});
- maybeDisplayPoliciesNotice();
-
window.addEventListener("hashchange", onHashChange);
window.addEventListener("beforeunload", onBeforeunload);
--
2.47.3
File diff suppressed because it is too large Load Diff
@@ -1,66 +0,0 @@
From b746f4cbe29321eeca3955c6ea04cb993f5960e2 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:12:32 +0100
Subject: [PATCH 46/52] ui-patches/trustpanel.patch
---
browser/themes/shared/controlcenter/panel.css | 43 +++++++++++++++++++
1 file changed, 43 insertions(+)
diff --git a/browser/themes/shared/controlcenter/panel.css b/browser/themes/shared/controlcenter/panel.css
index 7a5d6a777c54..db270a154bbd 100644
--- a/browser/themes/shared/controlcenter/panel.css
+++ b/browser/themes/shared/controlcenter/panel.css
@@ -828,6 +828,49 @@
padding-block-end: var(--space-small);
}
+/* Hide ETP description (reads like ad) */
+#trustpanel-etp-description {
+ display: none;
+}
+
+/* Hide most of graphic but show tracker count */
+#trustpanel-graphic-image,
+#trustpanel-graphic-section-text,
+#trustpanel-blocker-section > label:nth-child(2) {
+ display: none;
+}
+#trustpanel-graphic-section,
+#trustpanel-blocker-section,
+#trustpanel-toggle-section {
+ background: none !important;
+ border: none !important;
+ padding: 0 !important;
+}
+#trustpanel-toggle-section {
+ margin-bottom: 0 !important;
+}
+#trustpanel-graphic-section {
+ margin-top: 0 !important;
+}
+#trustpanel-blocker-section {
+ flex-direction: row;
+ justify-content: space-between;
+ align-items: start;
+}
+
+/* Make tracker count non-bold */
+#trustpanel-blocker-section > label:nth-child(1) {
+ font-weight: normal;
+}
+
+/* Place toggle before tracker count */
+#trustpanel-header-row {
+ order: -2;
+}
+#trustpanel-toggle-section {
+ order: -1;
+}
+
#trustpanel-header-row {
justify-content: space-between;
padding-block-start: var(--space-small);
--
2.47.3
@@ -1,37 +0,0 @@
From 2d86291ed691dab5f38ba637774a9ff577066319 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:12:36 +0100
Subject: [PATCH 47/52] ui-patches/wallpapers.patch
---
.../extensions/newtab/lib/Wallpapers/WallpaperFeed.sys.mjs | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/browser/extensions/newtab/lib/Wallpapers/WallpaperFeed.sys.mjs b/browser/extensions/newtab/lib/Wallpapers/WallpaperFeed.sys.mjs
index 467b01f0d102..4239d5e5a919 100644
--- a/browser/extensions/newtab/lib/Wallpapers/WallpaperFeed.sys.mjs
+++ b/browser/extensions/newtab/lib/Wallpapers/WallpaperFeed.sys.mjs
@@ -155,16 +155,17 @@ export class WallpaperFeed {
}
// retrieving all records in collection
- let records;
+ let records = [];
try {
- records = await this.wallpaperClient.get();
+ if (Services.prefs.getBoolPref("librewolf.externalWallpapers.enabled", false)) {
+ records = await this.wallpaperClient.get();
+ }
} catch (error) {
// Fall through so the custom-wallpaper upload entry is still surfaced.
console.error(
"Error fetching wallpaper records from remote settings",
error
);
- records = [];
}
const customWallpaperEnabled = Services.prefs.getBoolPref(
--
2.47.3
@@ -1,57 +0,0 @@
From 3d859b146eda48ed7143b3a44452493c31b1fa6b Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:12:39 +0100
Subject: [PATCH 48/52] ui-patches/website-appearance-ui-rfp.patch
---
.../preferences/config/appearance.mjs | 27 +++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/browser/components/preferences/config/appearance.mjs b/browser/components/preferences/config/appearance.mjs
index 45faa8c4c26f..1eba3052e344 100644
--- a/browser/components/preferences/config/appearance.mjs
+++ b/browser/components/preferences/config/appearance.mjs
@@ -270,6 +270,27 @@ if (Services.prefs.getBoolPref("browser.settings-redesign.enabled", false)) {
});
}
+Preferences.addSetting({
+ id: "librewolfRFPWarning",
+ deps: ["librewolfRFP"],
+ visible: ({librewolfRFP}) => {
+ const interval = setInterval(() => {
+ const chooser = document.getElementById("web-appearance-chooser");
+ if (chooser) {
+ clearInterval(interval);
+ if (librewolfRFP.value) {
+ chooser.style.opacity = "0.3";
+ chooser.style.pointerEvents = "none";
+ } else {
+ chooser.style.opacity = "1";
+ chooser.style.pointerEvents = "all";
+ }
+ }
+ }, 100);
+ return librewolfRFP.value;
+ },
+});
+
SettingGroupManager.registerGroups({
appearance: {
l10nId: "appearance-group2",
@@ -284,6 +305,12 @@ SettingGroupManager.registerGroups({
role: "status",
},
},
+ {
+ id: "librewolfRFPWarning",
+ l10nId: "librewolf-rfp-warning",
+ supportPage: "rfp-theme",
+ control: "moz-message-bar",
+ },
{
id: "web-appearance-chooser",
control: "moz-visual-picker",
--
2.47.3
@@ -1,58 +0,0 @@
From 828d539224f49b9fa5084b14b5aa0c7a6f7ce236 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:12:44 +0100
Subject: [PATCH 49/52] vendor-name.patch
---
toolkit/components/extensions/parent/ext-runtime.js | 10 +++++++++-
toolkit/xre/nsAppRunner.cpp | 6 ------
2 files changed, 9 insertions(+), 7 deletions(-)
diff --git a/toolkit/components/extensions/parent/ext-runtime.js b/toolkit/components/extensions/parent/ext-runtime.js
index 22f03e99a871..875fca7be972 100644
--- a/toolkit/components/extensions/parent/ext-runtime.js
+++ b/toolkit/components/extensions/parent/ext-runtime.js
@@ -334,7 +334,15 @@ this.runtime = class extends ExtensionAPIPersistent {
getBrowserInfo: function () {
const { name, vendor, version, appBuildID } = Services.appinfo;
- const info = { name, vendor, version, buildID: appBuildID };
+ const useFirefoxDefaults = Services.prefs.getBoolPref(
+ "librewolf.getBrowserInfo.setToFirefoxDefaults",
+ true
+ );
+
+ const info = useFirefoxDefaults
+ ? { name: "Firefox", vendor: "Mozilla", version, buildID: appBuildID }
+ : { name, vendor, version, buildID: appBuildID };
+
return Promise.resolve(info);
},
diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp
index cd9485c34497..140c31d08353 100644
--- a/toolkit/xre/nsAppRunner.cpp
+++ b/toolkit/xre/nsAppRunner.cpp
@@ -2257,9 +2257,6 @@ static void DumpHelp() {
}
static inline void DumpVersion() {
- if (gAppData->vendor && *gAppData->vendor) {
- printf("%s ", (const char*)gAppData->vendor);
- }
printf("%s ", (const char*)gAppData->name);
// Use the displayed version
@@ -2273,9 +2270,6 @@ static inline void DumpVersion() {
}
static inline void DumpFullVersion() {
- if (gAppData->vendor && *gAppData->vendor) {
- printf("%s ", (const char*)gAppData->vendor);
- }
printf("%s ", (const char*)gAppData->name);
// Use the displayed version
--
2.47.3
@@ -1,614 +0,0 @@
From 9c9f33a51b1676b1bcc3f85e10347115b40e2ff4 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:12:55 +0100
Subject: [PATCH 50/52] webgl-permission.patch
---
.../content/popup-notifications.inc.xhtml | 7 +
browser/modules/ObserverForwarder.sys.mjs | 5 +
.../WebGLPermissionPromptHelper.sys.mjs | 132 +++++++++++++++++
browser/themes/shared/icons/webgl-blocked.svg | 18 +++
browser/themes/shared/icons/webgl.svg | 17 +++
browser/themes/shared/jar.inc.mn | 3 +
browser/themes/shared/notification-icons.css | 9 ++
.../notification-icons/webgl-blocked.svg | 18 +++
.../shared/notification-icons/webgl.svg | 17 +++
dom/canvas/ClientWebGLContext.cpp | 140 ++++++++++++++++++
dom/ipc/BrowserParent.cpp | 23 +++
dom/ipc/BrowserParent.h | 2 +
dom/ipc/PBrowser.ipdl | 8 +
modules/libpref/init/StaticPrefList.yaml | 14 ++
modules/libpref/moz.build | 1 +
15 files changed, 414 insertions(+)
create mode 100644 browser/modules/WebGLPermissionPromptHelper.sys.mjs
create mode 100644 browser/themes/shared/icons/webgl-blocked.svg
create mode 100644 browser/themes/shared/icons/webgl.svg
create mode 100644 browser/themes/shared/notification-icons/webgl-blocked.svg
create mode 100644 browser/themes/shared/notification-icons/webgl.svg
diff --git a/browser/base/content/popup-notifications.inc.xhtml b/browser/base/content/popup-notifications.inc.xhtml
index 4e2f449c8199..256e4c94719a 100644
--- a/browser/base/content/popup-notifications.inc.xhtml
+++ b/browser/base/content/popup-notifications.inc.xhtml
@@ -175,6 +175,13 @@
</popupnotificationcontent>
</popupnotification>
+ <popupnotification id="webgl-permissions-prompt-notification" hidden="true">
+ <popupnotificationcontent orient="vertical">
+ <description class="popup-notification-description"/>
+ <label id="webgl-permissions-prompt-warning"/>
+ </popupnotificationcontent>
+ </popupnotification>
+
<popupnotification id="contextual-feature-recommendation-notification"
buttonhighlight="true"
hidden="true">
diff --git a/browser/modules/ObserverForwarder.sys.mjs b/browser/modules/ObserverForwarder.sys.mjs
index b62b572cdb11..222765c2754e 100644
--- a/browser/modules/ObserverForwarder.sys.mjs
+++ b/browser/modules/ObserverForwarder.sys.mjs
@@ -14,6 +14,8 @@ let lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
CanvasPermissionPromptHelper:
"moz-src:///browser/modules/CanvasPermissionPromptHelper.sys.mjs",
+ WebGLPermissionPromptHelper:
+ "moz-src:///browser/modules/WebGLPermissionPromptHelper.sys.mjs",
FilePickerCrashed: "resource:///modules/FilePickerCrashed.sys.mjs",
PluginManager: "resource:///actors/PluginParent.sys.mjs",
SerialDeviceSharingHelper:
@@ -29,6 +31,9 @@ let gObservers = {
"canvas-permissions-prompt": ["CanvasPermissionPromptHelper"],
"canvas-permissions-prompt-hide-doorhanger": ["CanvasPermissionPromptHelper"],
+ "webgl-permissions-prompt": ["WebGLPermissionPromptHelper"],
+ "webgl-permissions-prompt-hide-doorhanger": ["WebGLPermissionPromptHelper"],
+
"file-picker-crashed": ["FilePickerCrashed"],
"gmp-plugin-crash": ["PluginManager"],
"plugin-crashed": ["PluginManager"],
diff --git a/browser/modules/WebGLPermissionPromptHelper.sys.mjs b/browser/modules/WebGLPermissionPromptHelper.sys.mjs
new file mode 100644
index 000000000000..7c647a147894
--- /dev/null
+++ b/browser/modules/WebGLPermissionPromptHelper.sys.mjs
@@ -0,0 +1,132 @@
+/* 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 https://mozilla.org/MPL/2.0/. */
+
+import { PrivateBrowsingUtils } from "resource://gre/modules/PrivateBrowsingUtils.sys.mjs";
+
+export let WebGLPermissionPromptHelper = {
+ _permissionsPrompt: "webgl-permissions-prompt",
+ _permissionsPromptHideDoorHanger: "webgl-permissions-prompt-hide-doorhanger",
+ _notificationIcon: "webgl-notification-icon",
+
+ // aSubject is an nsIBrowser (e10s) or an nsIDOMWindow (non-e10s).
+ // aData is an Origin string.
+ observe(aSubject, aTopic, aData) {
+ if (
+ aTopic != this._permissionsPrompt &&
+ aTopic != this._permissionsPromptHideDoorHanger
+ ) {
+ return;
+ }
+
+ let browser;
+ if (aSubject instanceof Ci.nsIDOMWindow) {
+ browser = aSubject.docShell.chromeEventHandler;
+ } else {
+ browser = aSubject;
+ }
+
+ let window = browser?.documentGlobal;
+ if (!window) {
+ // Without knowing where this came from, we can't show the prompt.
+ return;
+ }
+
+ let principal =
+ Services.scriptSecurityManager.createContentPrincipalFromOrigin(aData);
+ let permission = Services.perms.testPermissionFromPrincipal(principal, "webgl");
+ if (permission === Ci.nsIPermissionManager.DENY_ACTION ||
+ permission === Ci.nsIPermissionManager.ALLOW_ACTION) {
+ return;
+ }
+
+ if (window.PopupNotifications.getNotification(
+ this._permissionsPrompt,
+ browser
+ )) {
+ return;
+ }
+
+ let { gNavigatorBundle, gBrowserBundle } = window;
+ let message = gNavigatorBundle.getFormattedString(
+ "webgl.siteprompt2",
+ ["<>"],
+ 1
+ );
+
+ function setWebGLPermission(aPerm, aPersistent) {
+ Services.perms.addFromPrincipal(
+ principal,
+ "webgl",
+ aPerm,
+ aPersistent
+ ? Ci.nsIPermissionManager.EXPIRE_NEVER
+ : Ci.nsIPermissionManager.EXPIRE_SESSION
+ );
+ }
+
+ let mainAction = {
+ label: gNavigatorBundle.getString("webgl.allow2"),
+ accessKey: gNavigatorBundle.getString("webgl.allow2.accesskey"),
+ callback(state) {
+ setWebGLPermission(
+ Ci.nsIPermissionManager.ALLOW_ACTION,
+ state && state.checkboxChecked
+ );
+ let tab = window?.gBrowser?.getTabForBrowser(browser);
+ if (tab) {
+ window.gBrowser.reloadTab(tab);
+ }
+ },
+ };
+
+ let secondaryActions = [
+ {
+ label: gNavigatorBundle.getString("webgl.block"),
+ accessKey: gNavigatorBundle.getString("webgl.block.accesskey"),
+ callback(state) {
+ setWebGLPermission(
+ Ci.nsIPermissionManager.DENY_ACTION,
+ state && state.checkboxChecked
+ );
+ },
+ },
+ ];
+
+ let checkbox = {
+ // In PB mode, we don't want the "always remember" checkbox
+ show: !PrivateBrowsingUtils.isWindowPrivate(window),
+ };
+ if (checkbox.show) {
+ checkbox.checked = true;
+ checkbox.label = gBrowserBundle.GetStringFromName("webgl.remember2");
+ }
+
+ let options = {
+ checkbox,
+ name: principal.host,
+ learnMoreURL:
+ Services.urlFormatter.formatURLPref("app.support.baseURL") +
+ "webgl-prompt",
+ dismissed: aTopic == this._permissionsPromptHideDoorHanger,
+ eventCallback(e) {
+ if (e == "showing" && this?.browser?.ownerDocument) {
+ this.browser.ownerDocument.getElementById(
+ "webgl-permissions-prompt-warning"
+ ).textContent = gBrowserBundle.GetStringFromName(
+ "webgl.siteprompt2.warning"
+ );
+ }
+ },
+ };
+ window.PopupNotifications.show(
+ browser,
+ this._permissionsPrompt,
+ message,
+ this._notificationIcon,
+ mainAction,
+ secondaryActions,
+ options
+ );
+ },
+};
diff --git a/browser/themes/shared/icons/webgl-blocked.svg b/browser/themes/shared/icons/webgl-blocked.svg
new file mode 100644
index 000000000000..6e18b7cf5401
--- /dev/null
+++ b/browser/themes/shared/icons/webgl-blocked.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ version="1.1"
+ id="svg1"
+ xml:space="preserve"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ fill="context-fill"
+ fill-opacity="context-fill-opacity"><defs
+ id="defs1" /><g
+ id="g30"
+ transform="translate(-95.002999,-238.87424)"><path
+ id="path30"
+ style="stroke-linecap:round;paint-order:stroke fill markers"
+ d="m 95.604562,238.87619 c -0.463094,0.0319 -0.839908,0.6221 -0.419922,1.06446 l 1,1 1.820312,1.82031 v 10.48437 a 0.625,0.625 0 0 0 0.625,0.625 0.625,0.625 0 0 0 0.625,-0.625 v -1.35547 h 7.878908 l 2.80078,2.80079 c 0.24466,0.24372 0.6401,0.24372 0.88477,0 0.24415,-0.24409 0.24415,-0.64068 0,-0.88477 l -2.0625,-2.06445 -1.10157,-1.10157 h -0.002 l -3.72656,-3.72656 v -0.002 l -0.96289,-0.96289 h -0.002 l -1.82031,-1.82031 -1.249999,-1.25 -0.636719,-0.63672 -2.367187,-2.36719 -0.462891,-0.46289 -0.355469,-0.35547 c -0.147451,-0.13999 -0.31048,-0.19033 -0.464843,-0.17969 z m 6.056638,4.00196 1.25,1.25 h 5.07422 c 0.42057,0 0.74894,0.32747 0.75,0.74804 l 0.0117,5.01953 c 5e-5,0.0215 -0.004,0.0416 -0.006,0.0625 l 0.96289,0.96289 c 0.18374,-0.30216 0.29391,-0.65288 0.29297,-1.02929 l -0.0117,-5.01953 c -0.003,-1.09501 -0.90499,-1.99414 -2,-1.99414 z m -2.406248,1.25 h 0.117188 l 2.13867,2.14062 a 1.4999924,1.4999924 0 0 0 -0.50976,1.10547 1.4999924,1.4999924 0 0 0 1.5,1.5 1.4999924,1.4999924 0 0 0 1.11718,-0.5 l 2.26563,2.26562 h -6.628908 z" /></g></svg>
diff --git a/browser/themes/shared/icons/webgl.svg b/browser/themes/shared/icons/webgl.svg
new file mode 100644
index 000000000000..ffbf97c74dc7
--- /dev/null
+++ b/browser/themes/shared/icons/webgl.svg
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ version="1.1"
+ id="svg1"
+ xml:space="preserve"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ fill="context-fill"
+ fill-opacity="context-fill-opacity"><defs
+ id="defs1" /><g
+ id="g27"
+ transform="translate(-95.002767,-238.87424)"><path
+ id="path26"
+ d="m 96.625679,239.87424 a 0.625,0.625 0 0 0 -0.625,0.625 0.625,0.625 0 0 0 0.625,0.625 h 0.626953 c 0.422091,-7e-5 0.751953,0.32791 0.751953,0.75 v 11.37109 a 0.625,0.625 0 0 0 0.625,0.625 0.625,0.625 0 0 0 0.624997,-0.625 v -1.35547 h 8.749998 c 1.095,0 1.99494,-0.90304 1.99219,-1.99804 l -0.0117,-5.01953 c -0.003,-1.09501 -0.90499,-1.99414 -2,-1.99414 h -8.730468 v -1.00391 c 0,-1.09772 -0.904231,-2.00019 -2.00195,-2 z m 2.628903,4.25391 h 8.730468 c 0.42057,0 0.74894,0.32747 0.75,0.74804 l 0.0117,5.01953 c 10e-4,0.41835 -0.32385,0.74415 -0.74219,0.74414 h -8.749998 z m 3.246088,1.74609 a 1.4999924,1.4999924 0 0 0 -1.5,1.5 1.4999924,1.4999924 0 0 0 1.5,1.5 1.4999924,1.4999924 0 0 0 1.5,-1.5 1.4999924,1.4999924 0 0 0 -1.5,-1.5 z" /></g></svg>
diff --git a/browser/themes/shared/jar.inc.mn b/browser/themes/shared/jar.inc.mn
index 450bff017b14..731979c9d588 100644
--- a/browser/themes/shared/jar.inc.mn
+++ b/browser/themes/shared/jar.inc.mn
@@ -212,6 +212,9 @@
skin/classic/browser/calendar-24.svg (../shared/icons/calendar-24.svg)
skin/classic/browser/canvas.svg (../shared/icons/canvas.svg)
skin/classic/browser/canvas-blocked.svg (../shared/icons/canvas-blocked.svg)
+ skin/classic/browser/webgl.svg (../shared/icons/webgl.svg)
+ skin/classic/browser/webgl-blocked.svg (../shared/icons/webgl-blocked.svg)
+ skin/classic/browser/notification-icons/webgl.svg (../shared/notification-icons/webgl.svg)
skin/classic/browser/characterEncoding.svg (../shared/icons/characterEncoding.svg)
skin/classic/browser/chevron-animation.svg (../shared/icons/chevron-animation.svg)
skin/classic/browser/circle-check-dotted.svg (../shared/icons/circle-check-dotted.svg)
diff --git a/browser/themes/shared/notification-icons.css b/browser/themes/shared/notification-icons.css
index 7d3f1207266e..fbc37db2709e 100644
--- a/browser/themes/shared/notification-icons.css
+++ b/browser/themes/shared/notification-icons.css
@@ -211,6 +211,15 @@
list-style-image: url(chrome://browser/skin/canvas-blocked.svg);
}
+#webgl-notification-icon,
+.webgl-icon {
+ list-style-image: url(chrome://browser/skin/webgl.svg);
+}
+
+.webgl-icon.blocked-permission-icon {
+ list-style-image: url(chrome://browser/skin/webgl-blocked.svg);
+}
+
#webauthn-notification-icon,
.popup-notification-icon[popupid^="webauthn-prompt-"] {
list-style-image: url(chrome://browser/skin/fingerprint.svg);
diff --git a/browser/themes/shared/notification-icons/webgl-blocked.svg b/browser/themes/shared/notification-icons/webgl-blocked.svg
new file mode 100644
index 000000000000..6e18b7cf5401
--- /dev/null
+++ b/browser/themes/shared/notification-icons/webgl-blocked.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ version="1.1"
+ id="svg1"
+ xml:space="preserve"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ fill="context-fill"
+ fill-opacity="context-fill-opacity"><defs
+ id="defs1" /><g
+ id="g30"
+ transform="translate(-95.002999,-238.87424)"><path
+ id="path30"
+ style="stroke-linecap:round;paint-order:stroke fill markers"
+ d="m 95.604562,238.87619 c -0.463094,0.0319 -0.839908,0.6221 -0.419922,1.06446 l 1,1 1.820312,1.82031 v 10.48437 a 0.625,0.625 0 0 0 0.625,0.625 0.625,0.625 0 0 0 0.625,-0.625 v -1.35547 h 7.878908 l 2.80078,2.80079 c 0.24466,0.24372 0.6401,0.24372 0.88477,0 0.24415,-0.24409 0.24415,-0.64068 0,-0.88477 l -2.0625,-2.06445 -1.10157,-1.10157 h -0.002 l -3.72656,-3.72656 v -0.002 l -0.96289,-0.96289 h -0.002 l -1.82031,-1.82031 -1.249999,-1.25 -0.636719,-0.63672 -2.367187,-2.36719 -0.462891,-0.46289 -0.355469,-0.35547 c -0.147451,-0.13999 -0.31048,-0.19033 -0.464843,-0.17969 z m 6.056638,4.00196 1.25,1.25 h 5.07422 c 0.42057,0 0.74894,0.32747 0.75,0.74804 l 0.0117,5.01953 c 5e-5,0.0215 -0.004,0.0416 -0.006,0.0625 l 0.96289,0.96289 c 0.18374,-0.30216 0.29391,-0.65288 0.29297,-1.02929 l -0.0117,-5.01953 c -0.003,-1.09501 -0.90499,-1.99414 -2,-1.99414 z m -2.406248,1.25 h 0.117188 l 2.13867,2.14062 a 1.4999924,1.4999924 0 0 0 -0.50976,1.10547 1.4999924,1.4999924 0 0 0 1.5,1.5 1.4999924,1.4999924 0 0 0 1.11718,-0.5 l 2.26563,2.26562 h -6.628908 z" /></g></svg>
diff --git a/browser/themes/shared/notification-icons/webgl.svg b/browser/themes/shared/notification-icons/webgl.svg
new file mode 100644
index 000000000000..ffbf97c74dc7
--- /dev/null
+++ b/browser/themes/shared/notification-icons/webgl.svg
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ version="1.1"
+ id="svg1"
+ xml:space="preserve"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ fill="context-fill"
+ fill-opacity="context-fill-opacity"><defs
+ id="defs1" /><g
+ id="g27"
+ transform="translate(-95.002767,-238.87424)"><path
+ id="path26"
+ d="m 96.625679,239.87424 a 0.625,0.625 0 0 0 -0.625,0.625 0.625,0.625 0 0 0 0.625,0.625 h 0.626953 c 0.422091,-7e-5 0.751953,0.32791 0.751953,0.75 v 11.37109 a 0.625,0.625 0 0 0 0.625,0.625 0.625,0.625 0 0 0 0.624997,-0.625 v -1.35547 h 8.749998 c 1.095,0 1.99494,-0.90304 1.99219,-1.99804 l -0.0117,-5.01953 c -0.003,-1.09501 -0.90499,-1.99414 -2,-1.99414 h -8.730468 v -1.00391 c 0,-1.09772 -0.904231,-2.00019 -2.00195,-2 z m 2.628903,4.25391 h 8.730468 c 0.42057,0 0.74894,0.32747 0.75,0.74804 l 0.0117,5.01953 c 10e-4,0.41835 -0.32385,0.74415 -0.74219,0.74414 h -8.749998 z m 3.246088,1.74609 a 1.4999924,1.4999924 0 0 0 -1.5,1.5 1.4999924,1.4999924 0 0 0 1.5,1.5 1.4999924,1.4999924 0 0 0 1.5,-1.5 1.4999924,1.4999924 0 0 0 -1.5,-1.5 z" /></g></svg>
diff --git a/dom/canvas/ClientWebGLContext.cpp b/dom/canvas/ClientWebGLContext.cpp
index afed0c39f23a..e9af0b03ffb8 100644
--- a/dom/canvas/ClientWebGLContext.cpp
+++ b/dom/canvas/ClientWebGLContext.cpp
@@ -24,7 +24,9 @@
#include "mozilla/RandomNum.h"
#include "mozilla/ResultVariant.h"
#include "mozilla/ScopeExit.h"
+#include "mozilla/StaticPrefs_librewolf.h"
#include "mozilla/StaticPrefs_webgl.h"
+#include "mozilla/dom/BrowserChild.h"
#include "mozilla/dom/BufferSourceBinding.h"
#include "mozilla/dom/Document.h"
#include "mozilla/dom/GeneratePlaceholderCanvasData.h"
@@ -45,6 +47,8 @@
#include "mozilla/layers/WebRenderUserData.h"
#include "nsContentUtils.h"
#include "nsDisplayList.h"
+#include "nsIPrincipal.h"
+#include "nsIPermissionManager.h"
namespace mozilla {
@@ -862,6 +866,131 @@ void ClientWebGLContext::ResetBitmap() {
Run<RPROC(Resize)>(size); // No-change resize still clears/resets everything.
}
+static uint32_t GetWebGLPermission(nsIPrincipal* aPrincipal) {
+ if (!aPrincipal) {
+ return nsIPermissionManager::UNKNOWN_ACTION;
+ }
+
+ if (IsUnrestrictedPrincipal(aPrincipal)) {
+ return true;
+ }
+
+ nsresult rv;
+ nsCOMPtr<nsIPermissionManager> permissionManager =
+ do_GetService(NS_PERMISSIONMANAGER_CONTRACTID, &rv);
+ NS_ENSURE_SUCCESS(rv, nsIPermissionManager::UNKNOWN_ACTION);
+
+ uint32_t permission;
+ rv = permissionManager->TestPermissionFromPrincipal(
+ aPrincipal, "webgl"_ns, &permission);
+ NS_ENSURE_SUCCESS(rv, nsIPermissionManager::UNKNOWN_ACTION);
+
+ return permission;
+}
+
+static bool IsWebGLAllowed_impl(
+ bool webGLDisabled, JSContext* aCx,
+ nsIPrincipal* aPrincipal,
+ const std::function<void(const nsAutoString&)>& aReportToConsole,
+ const std::function<void(bool)>& aTryPrompt) {
+
+ if(!webGLDisabled) {
+ return true;
+ }
+
+ if (!aCx) {
+ return false;
+ }
+
+ if (IsUnrestrictedPrincipal(aPrincipal)) {
+ return true;
+ }
+
+ Maybe<nsAutoCString> origin = Nothing();
+ auto getOrigin = [&]() {
+ if (origin.isSome()) {
+ return origin->IsEmpty();
+ }
+
+ nsAutoCString originResult;
+ nsresult rv = NS_ERROR_FAILURE;
+ if (aPrincipal) {
+ rv = aPrincipal->GetOrigin(originResult);
+ }
+ origin = NS_SUCCEEDED(rv) ? Some(originResult) : Some(""_ns);
+
+ return NS_SUCCEEDED(rv);
+ };
+
+ uint64_t permission = GetWebGLPermission(aPrincipal);
+ switch (permission) {
+ case nsIPermissionManager::ALLOW_ACTION:
+ return true;
+ case nsIPermissionManager::DENY_ACTION:
+ return false;
+ default:
+ break;
+ }
+
+ bool hidePermissionDoorhanger = StaticPrefs::librewolf_webgl_prompt_hide();
+
+ nsAutoString message;
+ message.AppendPrintf("Blocked %s from creating WebGL context but prompting the user.",
+ getOrigin() ? origin->get() : "unknown");
+ aReportToConsole(message);
+
+ aTryPrompt(hidePermissionDoorhanger);
+
+ return false;
+}
+
+static bool IsWebGLAllowed(dom::Document* aDocument, JSContext* aCx,
+ nsIPrincipal* aPrincipal) {
+ if(NS_WARN_IF(!aDocument)) {
+ return false;
+ }
+
+ bool webGLDisabled = StaticPrefs::librewolf_webgl_prompt();
+
+ if (!webGLDisabled) {
+ return true;
+ }
+
+ auto reportToConsole = [&](const nsAutoString& message) {
+ nsContentUtils::ReportToConsoleNonLocalized(
+ message, nsIScriptError::warningFlag, "Security"_ns, aDocument);
+ };
+
+ auto prompt = [&](bool hidePermissionDoorhanger) {
+ if (!aPrincipal) {
+ return;
+ }
+
+ nsAutoCString origin;
+ nsresult rv = aPrincipal->GetOrigin(origin);
+ if (NS_FAILED(rv)) {
+ return;
+ }
+
+ if (!XRE_IsContentProcess()) {
+ MOZ_ASSERT_UNREACHABLE(
+ "Who's calling this from the parent process without a chrome window "
+ "(it would have been exempt from the RFP targets)?");
+ return;
+ }
+
+ nsPIDOMWindowOuter* win = aDocument->GetWindow();
+ if (RefPtr<dom::BrowserChild> browserChild =
+ dom::BrowserChild::GetFrom(win)) {
+ browserChild->SendShowWebGLPermissionPrompt(origin, hidePermissionDoorhanger);
+ }
+ };
+
+ return IsWebGLAllowed_impl(
+ webGLDisabled, aCx, aPrincipal,
+ reportToConsole, prompt);
+}
+
bool ClientWebGLContext::CreateHostContext(const uvec2& requestedSize) {
const auto pNotLost = MakeRefPtr<webgl::NotLostData>(*this);
auto& notLost = *pNotLost;
@@ -900,6 +1029,17 @@ bool ClientWebGLContext::CreateHostContext(const uvec2& requestedSize) {
.options = options,
};
+ if (mCanvasElement && !StaticPrefs::webgl_disabled()) {
+ if(!IsWebGLAllowed(mCanvasElement->OwnerDoc(),
+ nsContentUtils::GetCurrentJSContext(),
+ mCanvasElement->NodePrincipal())) {
+
+ return Err("WebGL is currently disabled.");
+ }
+ }
+
+
+
// -
ScopedGfxFeatureReporter reporter("IpcWebGL");
diff --git a/dom/ipc/BrowserParent.cpp b/dom/ipc/BrowserParent.cpp
index 4fbe13919101..2473600d45c4 100644
--- a/dom/ipc/BrowserParent.cpp
+++ b/dom/ipc/BrowserParent.cpp
@@ -4229,6 +4229,29 @@ mozilla::ipc::IPCResult BrowserParent::RecvShowCanvasPermissionPrompt(
return IPC_OK();
}
+mozilla::ipc::IPCResult BrowserParent::RecvShowWebGLPermissionPrompt(const nsCString& aOrigin, const bool& aHideDoorHanger) {
+ nsCOMPtr<nsIBrowser> browser =
+ mFrameElement ? mFrameElement->AsBrowser() : nullptr;
+ if (!browser) {
+ // If the tab is being closed, the browser may not be available.
+ // In this case we can ignore the request.
+ return IPC_OK();
+ }
+ nsCOMPtr<nsIObserverService> os = services::GetObserverService();
+ if (!os) {
+ return IPC_FAIL_NO_REASON(this);
+ }
+ nsresult rv = os->NotifyObservers(
+ browser,
+ aHideDoorHanger ? "webgl-permissions-prompt-hide-doorhanger"
+ : "webgl-permissions-prompt",
+ NS_ConvertUTF8toUTF16(aOrigin).get());
+ if (NS_FAILED(rv)) {
+ return IPC_FAIL_NO_REASON(this);
+ }
+ return IPC_OK();
+}
+
mozilla::ipc::IPCResult BrowserParent::RecvVisitURI(
nsIURI* aURI, nsIURI* aLastVisitedURI, const uint32_t& aFlags,
const uint64_t& aBrowserId) {
diff --git a/dom/ipc/BrowserParent.h b/dom/ipc/BrowserParent.h
index f2537eccb928..c74a4e4c1251 100644
--- a/dom/ipc/BrowserParent.h
+++ b/dom/ipc/BrowserParent.h
@@ -757,6 +757,8 @@ class BrowserParent final : public PBrowserParent,
mozilla::ipc::IPCResult RecvShowCanvasPermissionPrompt(
const nsCString& aOrigin, const bool& aHideDoorHanger);
+ mozilla::ipc::IPCResult RecvShowWebGLPermissionPrompt(const nsCString& aOrigin, const bool& aHideDoorHanger);
+
mozilla::ipc::IPCResult RecvSetSystemFont(const nsCString& aFontName);
mozilla::ipc::IPCResult RecvGetSystemFont(nsCString* aFontName);
diff --git a/dom/ipc/PBrowser.ipdl b/dom/ipc/PBrowser.ipdl
index 2be0054f75be..ee483b2fa6ce 100644
--- a/dom/ipc/PBrowser.ipdl
+++ b/dom/ipc/PBrowser.ipdl
@@ -650,6 +650,14 @@ parent:
*/
async ShowCanvasPermissionPrompt(nsCString aOrigin,
bool aHideDoorHanger);
+ /**
+ * This function is used to notify the parent that it should display a
+ * WebGL permission prompt.
+ *
+ * @param aOrigin origin string of the document that is requesting access.
+ */
+ async ShowWebGLPermissionPrompt(nsCString aOrigin,
+ bool aHideDoorHanger);
sync SetSystemFont(nsCString aFontName);
sync GetSystemFont() returns (nsCString retval);
diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml
index d073433aa9b5..27fc0906de46 100644
--- a/modules/libpref/init/StaticPrefList.yaml
+++ b/modules/libpref/init/StaticPrefList.yaml
@@ -11976,6 +11976,20 @@
value: true
mirror: always
+#---------------------------------------------------------------------------
+# Prefs starting with "librewolf."
+#---------------------------------------------------------------------------
+
+- name: librewolf.webgl.prompt
+ type: RelaxedAtomicBool
+ value: true
+ mirror: always
+
+- name: librewolf.webgl.prompt.hide
+ type: RelaxedAtomicBool
+ value: true
+ mirror: always
+
#---------------------------------------------------------------------------
# Prefs starting with "logging."
#---------------------------------------------------------------------------
diff --git a/modules/libpref/moz.build b/modules/libpref/moz.build
index 2c8b218c618f..16805711b4e2 100644
--- a/modules/libpref/moz.build
+++ b/modules/libpref/moz.build
@@ -56,6 +56,7 @@ pref_groups = [
"javascript",
"layers",
"layout",
+ "librewolf",
"logging",
"mathml",
"media",
--
2.47.3
@@ -1,66 +0,0 @@
From f260cad296fb06a2be6b1816bb03f1015b9f8f14 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:12:58 +0100
Subject: [PATCH 51/52] windows-theming-bug.patch
---
browser/app/librewolf.exe.manifest | 47 ++++++++++++++++++++++++++++++
1 file changed, 47 insertions(+)
create mode 100644 browser/app/librewolf.exe.manifest
diff --git a/browser/app/librewolf.exe.manifest b/browser/app/librewolf.exe.manifest
new file mode 100644
index 000000000000..cad0ac6b6a87
--- /dev/null
+++ b/browser/app/librewolf.exe.manifest
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+<assemblyIdentity
+ version="1.0.0.0"
+ processorArchitecture="*"
+ name="LibreWolf"
+ type="win32"
+/>
+<description>LibreWolf</description>
+<dependency>
+ <dependentAssembly>
+ <assemblyIdentity
+ type="win32"
+ name="Microsoft.Windows.Common-Controls"
+ version="6.0.0.0"
+ processorArchitecture="*"
+ publicKeyToken="6595b64144ccf1df"
+ language="*"
+ />
+ </dependentAssembly>
+</dependency>
+<dependency>
+ <dependentAssembly>
+ <assemblyIdentity
+ type="win32"
+ name="mozglue"
+ version="1.0.0.0"
+ language="*"
+ />
+ </dependentAssembly>
+</dependency>
+<ms_asmv3:trustInfo xmlns:ms_asmv3="urn:schemas-microsoft-com:asm.v3">
+ <ms_asmv3:security>
+ <ms_asmv3:requestedPrivileges>
+ <ms_asmv3:requestedExecutionLevel level="asInvoker" uiAccess="false" />
+ </ms_asmv3:requestedPrivileges>
+ </ms_asmv3:security>
+</ms_asmv3:trustInfo>
+ <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+ <application>
+ <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
+ <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
+ <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
+ <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
+ </application>
+ </compatibility>
+</assembly>
--
2.47.3
@@ -1,107 +0,0 @@
From 8c23ea05790f53956fa4c0d8d13c5f1f1080ead6 Mon Sep 17 00:00:00 2001
From: LibreWolf Developers <noreply@librewolf.net>
Date: Sun, 6 Sep 2026 10:13:02 +0100
Subject: [PATCH 52/52] xdg-dir.patch
---
toolkit/xre/nsXREDirProvider.cpp | 47 ++++++++++++--------------------
1 file changed, 18 insertions(+), 29 deletions(-)
diff --git a/toolkit/xre/nsXREDirProvider.cpp b/toolkit/xre/nsXREDirProvider.cpp
index 004c767956f2..902b5c81092b 100644
--- a/toolkit/xre/nsXREDirProvider.cpp
+++ b/toolkit/xre/nsXREDirProvider.cpp
@@ -1341,7 +1341,8 @@ nsresult nsXREDirProvider::AppendFromAppData(nsIFile* aFile, bool aIsDotted) {
// Similar to nsXREDirProvider::AppendProfilePath.
// TODO: Bug 1990407 - Evaluate if refactoring might be required there in the
// future?
- if (gAppData->profile) {
+ // Use aIsDotted for a different purpose here, will probably break in the future
+ if (gAppData->profile && aIsDotted) {
nsAutoCString profile;
# if defined(MOZ_THUNDERBIRD)
if (gAppData->profile[0] != '.') {
@@ -1349,6 +1350,7 @@ nsresult nsXREDirProvider::AppendFromAppData(nsIFile* aFile, bool aIsDotted) {
}
# endif
profile.Append(gAppData->profile);
+ profile = "."_ns + nsDependentCString(gAppData->profile);
MOZ_TRY(aFile->AppendRelativeNativePath(profile));
} else {
nsAutoCString vendor;
@@ -1358,8 +1360,6 @@ nsresult nsXREDirProvider::AppendFromAppData(nsIFile* aFile, bool aIsDotted) {
ToLowerCase(vendor);
ToLowerCase(appName);
- MOZ_TRY(aFile->AppendRelativeNativePath(aIsDotted ? ("."_ns + vendor)
- : vendor));
MOZ_TRY(aFile->AppendRelativeNativePath(appName));
}
@@ -1396,6 +1396,14 @@ bool nsXREDirProvider::LegacyHomeExists(nsIFile** aFile) {
rv = localDir->Exists(&exists);
NS_ENSURE_SUCCESS(rv, false);
+ if (exists) {
+ rv = localDir->AppendNative("profiles.ini"_ns);
+ NS_ENSURE_SUCCESS(rv, false);
+
+ rv = localDir->Exists(&exists);
+ NS_ENSURE_SUCCESS(rv, false);
+ }
+
// Give a chance to (3)
if (!exists) {
nsCOMPtr<nsIFile> userDir;
@@ -1526,41 +1534,22 @@ nsresult nsXREDirProvider::GetLegacyOrXDGHomePath(const char* aHomeDir,
return NS_OK;
}
- // If the build was made against a specific profile name, MOZ_APP_PROFILE=
- // then make sure we respect this and dont move to XDG directory
- //
- // Only do this on Firefox.
- //
- // For Thunderbird, it always defines MOZ_APP_PROFILE=thunderbird. Hence,
- // check if the gAppData->profile value is set to something else, indicating
- // of a specific build where legacy needs to be forced, similar to the
- // Firefox handling. Both casing are verified to account for systems where
- // that matters.
- if (gAppData->profile
-# if defined(MOZ_THUNDERBIRD)
- && strcmp(gAppData->profile, "thunderbird") != 0 &&
- strcmp(gAppData->profile, "Thunderbird") != 0
-# endif
- ) {
- MOZ_TRY(NS_NewNativeLocalFile(nsDependentCString(aHomeDir),
- getter_AddRefs(localDir)));
- } else {
- MOZ_TRY(GetLegacyOrXDGConfigHome(aHomeDir, getter_AddRefs(localDir)));
- MOZ_TRY(localDir->Clone(getter_AddRefs(parentDir)));
- }
+ // Since we set gAppData->profile and don't want to force legacy behaviour
+ MOZ_TRY(GetLegacyOrXDGConfigHome(aHomeDir, getter_AddRefs(localDir)));
+ MOZ_TRY(localDir->Clone(getter_AddRefs(parentDir)));
MOZ_TRY(AppendFromAppData(localDir, false));
}
+ // The profile root directory needs to exists at that point.
+ MOZ_TRY(EnsureDirectoryExists(localDir));
+
// If required return the parent directory that matches the profile root
// directory.
if (aFile) {
- parentDir.forget(aFile);
+ localDir.forget(aFile);
}
- // The profile root directory needs to exists at that point.
- MOZ_TRY(EnsureDirectoryExists(localDir));
-
return NS_OK;
}
#endif // defined(MOZ_WIDGET_GTK)
--
2.47.3
-4
View File
@@ -1,4 +0,0 @@
# SPDX-License-Identifier: GPL-3.0-or-later
tree="default"
rev="fb95137a04eb8fe1196cb12f26b100c1e060295c" # FIREFOX_155_0_1_RELEASE
@@ -1,39 +0,0 @@
ac_add_options --enable-application=browser
ac_add_options --disable-crashreporter
ac_add_options --disable-debug
ac_add_options --disable-default-browser-agent
ac_add_options --disable-tests
ac_add_options --disable-updater
ac_add_options --disable-cargo-incremental
ac_add_options --enable-hardening
ac_add_options --enable-stl-hardening
ac_add_options --enable-optimize
ac_add_options --enable-release
ac_add_options --enable-rust-simd
# allow replacing malloc manually, will not affect regular systems
# not compatible with ac_add_options --disable-jemalloc, which only works when preloading custom malloc
ac_add_options --enable-replace-malloc
ac_add_options --enable-jemalloc
ac_add_options --with-app-name=librewolf
ac_add_options --with-branding=browser/branding/librewolf
ac_add_options --with-l10n-base=$PWD/lw/l10n
export MOZ_TELEMETRY_REPORTING=
export MOZ_REQUIRE_SIGNING=
export MOZILLA_OFFICIAL=1
export MOZ_APP_REMOTINGNAME=LibreWolf
mk_add_options MOZ_CRASHREPORTER=0
mk_add_options MOZ_DATA_REPORTING=0
mk_add_options MOZ_SERVICES_HEALTHREPORT=0
mk_add_options MOZ_TELEMETRY_REPORTING=0
export CFLAGS="-ftrivial-auto-var-init=zero -fwrapv -Wno-backend-plugin $CFLAGS"
export CXXFLAGS="-ftrivial-auto-var-init=zero -fwrapv -Wno-backend-plugin $CXXFLAGS"
#export LDFLAGS=
# Add your own stuff, libraries, architecture, etc..
# ex: `cat mozconfig.orig mozconfig.my > mozconfig`
@@ -1,3 +0,0 @@
# SPDX-License-Identifier: GPL-3.0-or-later
tree="default"
@@ -1,52 +0,0 @@
# Application and Branding
ac_add_options --enable-application=browser
ac_add_options --with-app-name=librewolf
ac_add_options --with-branding=browser/branding/librewolf
ac_add_options --with-l10n-base=$PWD/lw/l10n
# Performance Optimizations
ac_add_options --enable-release
ac_add_options --enable-optimize
ac_add_options --enable-lto=full
ac_add_options --enable-rust-simd
ac_add_options --enable-wasm-avx
ac_add_options --enable-jemalloc
ac_add_options --linker=lld
ac_add_options MOZ_PGO=1
# Build Hardening & Size
ac_add_options --enable-hardening
ac_add_options --enable-stl-hardening
ac_add_options --enable-sandbox
ac_add_options --enable-jxl
ac_add_options --enable-bootstrap
ac_add_options --enable-strip
ac_add_options --enable-install-strip
# Disable Debugging & Tests
ac_add_options --disable-debug
ac_add_options --disable-debug-symbols
ac_add_options --disable-debug-js-modules
ac_add_options --disable-tests
# Disable Unwanted Features
ac_add_options --disable-cargo-incremental
ac_add_options --disable-default-browser-agent
ac_add_options --disable-updater
ac_add_options --disable-crashreporter
ac_add_options --disable-parental-controls
# Environment Flags (CPU-specific optimization)
export CFLAGS="-O3 -march=native -mtune=native"
export CXXFLAGS="$CFLAGS"
export LDFLAGS="-Wl,--no-keep-memory"
# Disable Telemetry
export MOZ_TELEMETRY_REPORTING=
export MOZ_REQUIRE_SIGNING=
export MOZILLA_OFFICIAL=1
export MOZ_APP_REMOTINGNAME=LibreWolfHellFire
mk_add_options MOZ_CRASHREPORTER=0
mk_add_options MOZ_DATA_REPORTING=0
mk_add_options MOZ_SERVICES_HEALTHREPORT=0
mk_add_options MOZ_TELEMETRY_REPORTING=0
@@ -1,3 +0,0 @@
# SPDX-License-Identifier: GPL-3.0-or-later
tree="default"
+6
View File
@@ -0,0 +1,6 @@
{bios_extract}{
rev: 0a7bc1d71735ef97b00dfec0fd54a02fcc5d1bb0
loc: bios_extract
url: https://review.coreboot.org/bios_extract
bkup_url: https://github.com/coreboot/bios_extract/
}
+6
View File
@@ -0,0 +1,6 @@
{biosutilities}{
rev: 03ae0cf0706ede5a2a15da0986c19c776d0e6b26
loc: biosutilities
url: https://codeberg.org/libreboot/BIOSUtilities
bkup_url: https://github.com/platomav/BIOSUtilities
}
+6
View File
@@ -0,0 +1,6 @@
{coreboot}{
rev: HEAD
loc: coreboot/coreboot
url: https://review.coreboot.org/coreboot
bkup_url: https://github.com/coreboot/coreboot.git
}
+30
View File
@@ -0,0 +1,30 @@
{docs}{
rev: 06ac864b9a738b5daec3736ddb0fb2f94f127ee0
loc: docs
url: https://codeberg.org/vimuser/untitled
bkup_url: https://notabug.org/untitled/untitled
depend: mdfiles
depend: untitledwww
}
{mdfiles}{
rev: 6ebb88528e342cae48ee75a6f1bfa1b71002e1c3
loc: docs/www/html
url: https://codeberg.org/libreboot/lbwww
bkup_url: https://git.disroot.org/libreboot/lbwww
depend: imgfiles
}
{imgfiles}{
rev: 918c0ba07cf45f07836fa8c312fc51b48db32e0a
loc: docs/www/html/site/img
url: https://codeberg.org/libreboot/lbwww-img
bkup_url: https://git.disroot.org/libreboot/lbwww-img
}
{untitledwww}{
rev: 78cdadea40143a7e55b8eae48f4239d31ebb5c16
loc: docs/www/untitled
url: https://codeberg.org/vimuser/untitled-website
bkup_url: https://notabug.org/untitled/untitled-website
}
-5
View File
@@ -1,5 +0,0 @@
# SPDX-License-Identifier: GPL-3.0-or-later
rev="HEAD"
url="https://github.com/mozilla-firefox/firefox"
bkup_url="https://github.com/mozilla-firefox/firefox"
+6
View File
@@ -0,0 +1,6 @@
{flashrom}{
rev: fba29da188b4a3aa8a3cf6f5a3d13c37a5d9e1d7
loc: flashrom
url: https://review.coreboot.org/flashrom.git
bkup_url: https://github.com/flashrom/flashrom
}
+14
View File
@@ -0,0 +1,14 @@
{grub}{
rev: 64e3cee72ab8f5876abfebb263b5e6cf7c4a9a4e
loc: grub
url: git://git.savannah.gnu.org/grub.git
bkup_url: https://codeberg.org/libreboot/grub
depend: gnulib
}
{gnulib}{
rev: 9f48fb992a3d7e96610c4ce8be969cff2d61a01b
loc: grub/gnulib
url: git://git.sv.gnu.org/gnulib
bkup_url: https://codeberg.org/libreboot/gnulib
}
+6
View File
@@ -0,0 +1,6 @@
{memtest86plus}{
rev: 5dcd424ea7afb857c1171e747ef064d98d26afeb
loc: memtest86plus
url: https://codeberg.org/libreboot/memtest86plus
bkup_url: https://github.com/memtest86plus/memtest86plus.git
}
+6
View File
@@ -0,0 +1,6 @@
{pico-sdk}{
rev: 6a7db34ff63345a7badec79ebea3aaef1712f374
loc: pico-sdk
url: https://codeberg.org/libreboot/pico-sdk
bkup_url: https://github.com/raspberrypi/pico-sdk
}
+7
View File
@@ -0,0 +1,7 @@
{pico-serprog}{
rev: c8c16e9c11fe9e5b7230ff358f79de3f1951e1d9
loc: pico-serprog
url: https://codeberg.org/libreboot/pico-serprog
bkup_url: https://git.disroot.org/libreboot/pico-serprog
depend: pico-sdk
}
+6
View File
@@ -0,0 +1,6 @@
{seabios}{
rev: HEAD
loc: seabios/seabios
url: https://review.coreboot.org/seabios
bkup_url: https://github.com/coreboot/seabios
}
+6
View File
@@ -0,0 +1,6 @@
{stm32-vserprog}{
rev: 8fcf0a4d41800631b571fa7bbd1d8b251f0a2111
loc: stm32-vserprog
url: https://codeberg.org/libreboot/stm32-vserprog
bkup_url: https://git.disroot.org/libreboot/stm32-vserprog
}
+6
View File
@@ -0,0 +1,6 @@
{u-boot}{
rev: HEAD
loc: u-boot/u-boot
url: https://source.denx.de/u-boot/u-boot.git
bkup_url: https://github.com/u-boot/u-boot.git
}
+6
View File
@@ -0,0 +1,6 @@
{uefitool}{
rev: 4a41c33596e9bc3ae812e763965d91ac57553e02
loc: uefitool
url: https://codeberg.org/libreboot/UEFITool
bkup_url: https://github.com/LongSoft/UEFITool
}
+3
View File
@@ -0,0 +1,3 @@
The deer logo for Libreboot is copyright 2014 Marcus Moeller and released under
CC-0: https://creativecommons.org/publicdomain/zero/1.0/legalcode
The grey backgrounds with it were made by Leah Rowe in 2016, also CC-0
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

+2
View File
@@ -0,0 +1,2 @@
Copyright (C) 2014, 2015, 2016, 2020, 2021, 2023 Leah Rowe <leah@libreboot.org>
Copyright (C) 2015 Klemens Nanni <contact@autoboot.org>
+695
View File
@@ -0,0 +1,695 @@
# GRUB configuration files under resources/grub/config/
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# See AUTHORS for copyright holder information.
# Full terms of GPLv3 below, taken from https://www.gnu.org/licenses/licenses.html
________________________________________________________________________
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+215
View File
@@ -0,0 +1,215 @@
set prefix=(memdisk)/boot/grub
insmod at_keyboard
insmod usb_keyboard
insmod nativedisk
insmod ehci
insmod ohci
insmod uhci
insmod usb
insmod usbms
insmod regexp
terminal_input --append at_keyboard
terminal_input --append usb_keyboard
terminal_output --append cbmemc
gfxpayload=keep
terminal_output --append gfxterm
if [ -f (cbfsdisk)/background.png ]; then
insmod png
background_image (cbfsdisk)/background.png
elif [ -f (cbfsdisk)/background.jpg ]; then
insmod jpeg
background_image (cbfsdisk)/background.jpg
fi
set default="0"
if [ -f (cbfsdisk)/timeout.cfg ]; then
source (cbfsdisk)/timeout.cfg
else
set timeout=5
fi
set grub_scan_disk="both"
if [ -f (cbfsdisk)/scan.cfg ]; then
source (cbfsdisk)/scan.cfg
fi
if [ -f (cbfsdisk)/keymap.gkb ]; then
keymap (cbfsdisk)/keymap.gkb
elif [ -f (cbfsdisk)/keymap.cfg ]; then
source (cbfsdisk)/keymap.cfg
else
keymap usqwerty
fi
function try_user_config {
set root="${1}"
for dir in boot grub grub2 boot/grub boot/grub2; do
for name in '' osboot_ autoboot_ libreboot_ coreboot_; do
if [ -f /"${dir}"/"${name}"grub.cfg ]; then
unset superusers
configfile /"${dir}"/"${name}"grub.cfg
fi
done
done
}
function search_grub {
echo -n "Attempting to load grub.cfg from '${1}' devices"
for i in 0 1 2 3 4 5 6 7 8 9 10 11; do
for part in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do
try_user_config "(${1}${i},${part})"
done
# raw devices e.g. (ahci0) instead of (ahci0,1)
try_user_config "(${1}${i})"
done
echo # Insert newline
}
function try_isolinux_config {
set root="${1}"
for dir in '' /boot; do
if [ -f "${dir}"/isolinux/isolinux.cfg ]; then
syslinux_configfile -i "${dir}"/isolinux/isolinux.cfg
elif [ -f "${dir}"/syslinux/syslinux.cfg ]; then
syslinux_configfile -s "${dir}"/syslinux/syslinux.cfg
fi
done
}
function search_isolinux {
echo "\nAttempting to parse isolinux/syslinux config from '${1}' devices"
for i in 0 1 2 3 4 5 6 7 8 9 10 11; do
for part in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do
try_isolinux_config "(${1}${i},${part})"
done
# raw devices e.g. (usb0) instead of (usb0,1)
try_isolinux_config "(${1}${i})"
done
echo # Insert newline
}
menuentry 'Load Operating System (incl. fully encrypted disks) [o]' --hotkey='o' {
if [ "${grub_scan_disk}" != "ata" ]; then
search_grub ahci
fi
if [ "${grub_scan_disk}" != "ahci" ]; then
search_grub ata
fi
# grub device enumeration is very slow, so checks are hardcoded
# TODO: add more strings, based on what distros set up when
# the user select auto-partitioning on those installers
lvmvol="lvm/grubcrypt-bootvol lvm/grubcrypt-rootvol"
raidvol="md/0 md/1 md/2 md/3 md/4 md/5 md/6 md/7 md/8 md/9"
# in practise, doing multiple redundant checks is perfectly fast and
# TODO: optimize grub itself, and use */? here for everything
for vol in ${lvmvol} ${raidvol} ; do
try_user_config "${vol}"
done
unset ahcidev
unset atadev
for i in 11 10 9 8 7 6 5 4 3 2 1 0; do
for part in 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1; do
if [ "${grub_scan_disk}" != "ata" ]; then
ahcidev="(ahci${i},${part}) ${ahcidev}"
fi
if [ "${grub_scan_disk}" != "ahci" ]; then
atadev="(ata${i},${part}) ${atadev}"
fi
done
done
set pager=0
echo -n "Attempting to unlock encrypted volumes"
for dev in ${ahcidev} ${atadev} ${lvmvol} ${raidvol}; do
if cryptomount "${dev}" ; then break ; fi
done
set pager=1
echo
# after cryptomount, lvm volumes might be available
for vol in ${lvmvol}; do
try_user_config "${vol}"
done
search_grub crypto
if [ "${grub_scan_disk}" != "ata" ]; then
# Last resort, if all else fails
set root=ahci0,1
for p in / /boot/; do
if [ -f "${p}vmlinuz" ]; then
linux ${p}vmlinuz root=/dev/sda1 rw
if [ -f "${p}initrd.img" ]; then
initrd ${p}initrd.img
fi
fi
done
fi
if [ "${grub_scan_disk}" != "ahci" ]; then
# Last resort (for setups that use IDE instead of SATA)
set root=ata0,1
for p in / /boot/; do
if [ -f "${p}vmlinuz" ]; then
linux ${p}vmlinuz root=/dev/sda1 rw
if [ -f "${p}initrd.img" ]; then
initrd ${p}initrd.img
fi
fi
done
fi
true # Prevent pager requiring to accept each line instead of whole screen
}
menuentry 'Find and load GRUB config from USB drive [s]' --hotkey='s' {
search_grub usb
}
menuentry 'Find and load ISOLINUX/EXTLINUX from USB drive [u]' --hotkey='u' {
search_isolinux usb
}
menuentry 'Find and load ISOLINUX/EXTLINUX menu via AHCI [a]' --hotkey='a' {
search_isolinux ahci
}
menuentry 'Find and load ISOLINUX/EXTLINUX menu via ATA/IDE [d]' --hotkey='d' {
search_isolinux ata
}
if [ -f (cbfsdisk)/grubtest.cfg ]; then
menuentry 'Load test configuration (grubtest.cfg) inside of CBFS [t]' --hotkey='t' {
set root='(cbfsdisk)'
if [ -f /grubtest.cfg ]; then
configfile /grubtest.cfg
fi
}
fi
if [ -f (cbfsdisk)/seabios.elf ]; then
menuentry 'Load SeaBIOS (payload) [b]' --hotkey='b' {
set root='cbfsdisk'
chainloader /seabios.elf
}
fi
if [ -f (cbfsdisk)/img/grub2 ]; then
menuentry 'Return to SeaBIOS [b]' --hotkey='b' {
set root='cbfsdisk'
chainloader /fallback/payload
}
fi
menuentry 'Poweroff [p]' --hotkey='p' {
halt
}
menuentry 'Reboot [r]' --hotkey='r' {
reboot
}
if [ -f (cbfsdisk)/img/memtest ]; then
menuentry 'Load MemTest86+ [m]' --hotkey='m' {
set root='cbfsdisk'
chainloader /img/memtest
}
fi
+7
View File
@@ -0,0 +1,7 @@
set prefix=(memdisk)/boot/grub
if [ -f (cbfsdisk)/grub.cfg ]; then
source (cbfsdisk)/grub.cfg
else
source (memdisk)/boot/grub/grub_default.cfg
fi
Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More