header fix

This commit is contained in:
Alexander Frick 2023-06-21 08:28:10 -05:00
parent 7c81e8f30a
commit 047d3e7755
44 changed files with 6971 additions and 42 deletions

View file

@ -0,0 +1,2 @@
_build/
.flatpak-builder/

View file

@ -0,0 +1,3 @@
[submodule "shared-modules"]
path = shared-modules
url = https://github.com/flathub/shared-modules

View file

@ -0,0 +1,63 @@
## Chromium Flatpak
### Extension points
To avoid having to expose more of the host filesystem in the sandbox but still
allowing extending Chromium, the `org.chromium.Chromium.Extension` extension
point is defined.
This extension point is currently on version '1' and will expose any extension
manifests under the `extensions` subdirectory, policy files under
`policies/managed` and `policies/recommended`, and [native messaging host
manifests](https://developer.chrome.com/docs/apps/nativeMessaging/) under
`native-messaging-hosts`.
#### Legacy extension points
This application also supports two other extension points:
`org.chromium.Chromium.Policy` and `org.chromium.Chromium.NativeMessagingHost`.
These primarily exist for compatibility reasons and should not be used.
#### Using extension points
Extension points can be provided as regular flatpaks and an example is provided
under `examples/policies/google-safe-search`. Important to note that extension
points' name must follow the syntax of `Extension.<id>`, where `<id>` is a
generic id for this specific extension point.
Flatpak also supports “unmanaged extensions”, allowing loading extensions installed
into `/var/lib/flatpak/extension` and `$XDG_DATA_HOME/flatpak/extension`.
This can be useful for example to allow system administrators to expose system installed
policies, extensions, etc.
One example of such "unmanaged extension" could be an extension point that exposes
all system policies installed under `/etc/chromium-browser/policies/{managed,recommended}`.
This could be done for example by creating an extension point under
`/var/lib/flatpak/extension/org.chromium.Chromium.Extension.system-policies`, with
`/var/lib/flatpak/extension/org.chromium.Chromium.Extension.system-policies/<arch>/<version>`
being a symlink to `/etc/chromium-browser`. Note that `<version>` must match the
extension point version.
Also important to note that in the example above one would not be able to symlink the
actual policy file directly, as otherwise flatpak would not be able to resolve the
symlink when bind mounting the extension point.
### Building and updating
[CroFT](https://github.com/refi64/croft) is used to manage the patches in this
repository and work with a build environment.
### Build arguments to pass to gn
```
# Not required but makes builds faster.
use_lld = true
# NaCL hasn't been tested and is being removed from Linux builds.
enable_nacl = false
# Unrelated to Flatpak but helps speed up builds.
blink_symbol_level = 0
# Outdated
use_gnome_keyring = false
# Not supported
use_sysroot = false
```

View file

@ -0,0 +1,58 @@
#!/bin/bash -ex
# Needed to build GN itself.
. /usr/lib/sdk/llvm14/enable.sh
# GN will use these variables to configure its own build, but they introduce
# compat issues w/ Clang and aren't used by Chromium itself anyway, so just
# unset them here.
unset CFLAGS CXXFLAGS LDFLAGS
if [[ -d third_party/llvm-build/Release+Asserts/bin ]]; then
# The build scripts check that the stamp file is present, so write it out
# here.
PYTHONPATH=tools/clang/scripts/ \
python3 -c 'import update; print(update.PACKAGE_VERSION)' \
> third_party/llvm-build/Release+Asserts/cr_build_revision
else
python3 tools/clang/scripts/build.py --disable-asserts \
--skip-checkout --use-system-cmake --use-system-libxml \
--gcc-toolchain=/usr \
--host-cc=/usr/lib/sdk/llvm14/bin/clang \
--host-cxx=/usr/lib/sdk/llvm14/bin/clang++ \
--without-android --without-fuchsia \
--with-ml-inliner-model=
fi
# (TODO: enable use_qt in the future?)
# DO NOT REUSE THE BELOW API KEY; it is for Flathub only.
# http://lists.debian.org/debian-legal/2013/11/msg00006.html
tools/gn/bootstrap/bootstrap.py -v --no-clean --gn-gen-args='
use_sysroot=false
use_lld=true
enable_nacl=false
blink_symbol_level=0
use_gnome_keyring=false
use_pulseaudio=true
clang_use_chrome_plugins=false
is_official_build=true
google_api_key="AIzaSyAL6fqCZVFhA7K_qBvz9GO5Z-V1JBcPO0A"
treat_warnings_as_errors=false
proprietary_codecs=true
ffmpeg_branding="Chrome"
is_component_ffmpeg=true
use_vaapi=true
enable_widevine=true
rtc_use_pipewire=true
rtc_link_pipewire=true
enable_hangout_services_extension=true
disable_fieldtrial_testing_config=true
use_system_libwayland=false
use_system_libffi=true
use_qt=false
enable_remoting=false
'
mkdir -p out/ReleaseFree
cp out/Release{,Free}/args.gn
echo -e 'proprietary_codecs = false\nffmpeg_branding = "Chromium"' >> out/ReleaseFree/args.gn
out/Release/gn gen out/ReleaseFree

View file

@ -0,0 +1,15 @@
#!/bin/bash -ex
ln_overwrite_all() {
rm -rf "$2"
ln -s "$1" "$2"
}
# Link our verisons of Node and OpenJDK into Chromium so the build scripts will
# use them. For OpenJDK especially, this is a workaround for:
# https://bugs.chromium.org/p/chromium/issues/detail?id=1192875
ln_overwrite_all /usr/lib/sdk/node16 third_party/node/linux/node-linux-x64
ln_overwrite_all /usr/lib/sdk/openjdk11 third_party/jdk/current
ninja -C out/ReleaseFree -j$FLATPAK_BUILDER_N_JOBS libffmpeg.so
ninja -C out/Release -j$FLATPAK_BUILDER_N_JOBS chrome chrome_crashpad_handler

View file

@ -0,0 +1,24 @@
#!/bin/bash -ex
mkdir -p /app/chromium
pushd out/Release
for path in chrome chrome_crashpad_handler icudtl.dat *.so libvulkan.so.1 *.pak *.bin *.png locales MEIPreload vk_swiftshader_icd.json; do
# All the 'libVk*' names are just for debugging, stuff like "libVkICD_mock_icd" and "libVkLayer_khronos_validation".
[[ "$path" == libVk* ]] && continue
cp -rv $path /app/chromium
done
popd
# Place the proprietary libffmpeg in the extension path, then overwrite it with the free one.
install -Dm 755 out/ReleaseFree/libffmpeg.so /app/chromium/libffmpeg.so
install -Dm 755 out/Release/libffmpeg.so /app/chromium/nonfree-codecs/lib/libffmpeg.so
for size in 24 48 64 128 256; do
install -Dvm 644 chrome/app/theme/chromium/linux/product_logo_$size.png /app/share/icons/hicolor/${size}x${size}/apps/org.chromium.Chromium.png;
done
install -Dvm 644 cobalt.ini -t /app/etc
install -Dvm 644 org.chromium.Chromium.desktop -t /app/share/applications
install -Dvm 644 org.chromium.Chromium.metainfo.xml -t /app/share/metainfo
install -Dvm 755 chromium.sh /app/bin/chromium
install -Dvm 755 unlink_profiles.py -t /app/bin

View file

@ -0,0 +1,35 @@
#!/bin/bash
merge_extensions() {
(
shopt -s nullglob
dest=/app/chromium/extensions/$1
mkdir -p $dest
for ext in /app/chromium/${1%/*}/$1/*; do
ln -s $ext $dest
done
)
}
unlink_profiles() {
local stamp="$XDG_CONFIG_HOME/chromium-profiles-unlinked-stamp"
if [[ ! -d "$XDG_CONFIG_HOME/chromium" ]]; then
touch "$stamp"
elif [[ ! -f "$stamp" ]]; then
unlink_profiles.py && touch "$stamp"
fi
}
if [[ ! -f /app/chromium/extensions/no-mount-stamp ]]; then
# Merge all legacy extension points if the symlinks had a tmpfs mounted over
# them.
merge_extensions native-messaging-hosts
merge_extensions policies/managed
merge_extensions policies/recommended
fi
# Unlink any profiles from the sync keys to avoid any expected deletions.
unlink_profiles
export LIBGL_DRIVERS_PATH=/usr/lib/$(uname -m)-linux-gnu/GL/lib/dri
exec cobalt "$@"

View file

@ -0,0 +1,5 @@
[Application]
EntryPoint=/app/chromium/chrome
[DefaultFeatures]
Enabled=WebRTCPipeWireCapturer

View file

@ -0,0 +1,3 @@
{
"ForceGoogleSafeSearch": true
}

View file

@ -0,0 +1,18 @@
app-id: org.chromium.Chromium.Extension.google-safe-search-policy
# This should match the extension point version
branch: '1'
runtime: org.chromium.Chromium
runtime-version: stable
sdk: org.freedesktop.Sdk//20.08
build-extension: true
appstream-compose: false
modules:
- name: policy
buildsystem: simple
build-commands:
- mkdir -p ${FLATPAK_DEST}/policies/managed
- install -Dm 644 google-safe-search.json ${FLATPAK_DEST}/policies/managed
sources:
- type: file
path: google-safe-search.json

View file

@ -0,0 +1,2 @@
[Settings]
gtk-print-backends=file,cups

View file

@ -0,0 +1,12 @@
diff --git a/meson.build b/meson.build
index cbd820da44..0438f6cc7d 100644
--- a/meson.build
+++ b/meson.build
@@ -309,7 +309,6 @@ elif cc.get_id() == 'gcc' or cc.get_id() == 'clang'
'-Werror=sequence-point',
'-Werror=return-type',
'-Werror=trigraphs',
- '-Werror=array-bounds',
'-Werror=write-strings',
'-Werror=address',
'-Werror=int-to-pointer-cast',

View file

@ -0,0 +1,9 @@
[libdefaults]
dns_lookup_realm = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
rdns = false
pkinit_anchors = FILE:/etc/ssl/certs/ca-certificates.crt
spake_preauth_groups = edwards25519
default_ccache_name = KCM:

View file

@ -0,0 +1,23 @@
{
"name": "libsecret",
"buildsystem": "meson",
"config-opts": [
"-Dmanpage=false",
"-Dvapi=false",
"-Dgtk_doc=false"
],
"cleanup": [
"/bin",
"/include",
"/lib/pkgconfig",
"/share/gir-1.0",
"/share/man"
],
"sources": [
{
"type": "archive",
"url": "https://download.gnome.org/sources/libsecret/0.19/libsecret-0.19.1.tar.xz",
"sha256": "8583e10179456ae2c83075d95455f156dc08db6278b32bf4bd61819335a30e3a"
}
]
}

View file

@ -0,0 +1,225 @@
[Desktop Entry]
Version=1.0
Name=Chromium
# Only KDE 4 seems to use GenericName, so we reuse the KDE strings.
# From Ubuntu's language-pack-kde-XX-base packages, version 9.04-20090413.
GenericName=Web Browser
GenericName[ar]=متصفح الشبكة
GenericName[bg]=Уеб браузър
GenericName[ca]=Navegador web
GenericName[cs]=WWW prohlížeč
GenericName[da]=Browser
GenericName[de]=Web-Browser
GenericName[el]=Περιηγητής ιστού
GenericName[en_GB]=Web Browser
GenericName[es]=Navegador web
GenericName[et]=Veebibrauser
GenericName[fi]=WWW-selain
GenericName[fr]=Navigateur Web
GenericName[gu]=
GenericName[he]=דפדפן אינטרנט
GenericName[hi]=
GenericName[hu]=Webböngésző
GenericName[it]=Browser Web
GenericName[ja]=
GenericName[kn]=
GenericName[ko]=
GenericName[lt]=Žiniatinklio naršyklė
GenericName[lv]=Tīmekļa pārlūks
GenericName[ml]=
GenericName[mr]=
GenericName[nb]=Nettleser
GenericName[nl]=Webbrowser
GenericName[pl]=Przeglądarka WWW
GenericName[pt]=Navegador Web
GenericName[pt_BR]=Navegador da Internet
GenericName[ro]=Navigator de Internet
GenericName[ru]=Веб-браузер
GenericName[sl]=Spletni brskalnik
GenericName[sv]=Webbläsare
GenericName[ta]= ி
GenericName[th]=
GenericName[tr]=Web Tarayıcı
GenericName[uk]=Навігатор Тенет
GenericName[zh_CN]=
GenericName[zh_HK]=
GenericName[zh_TW]=
# Not translated in KDE, from Epiphany 2.26.1-0ubuntu1.
GenericName[bn]=
GenericName[fil]=Web Browser
GenericName[hr]=Web preglednik
GenericName[id]=Browser Web
GenericName[or]=
GenericName[sk]=WWW prehliadač
GenericName[sr]=Интернет прегледник
GenericName[te]= ి
GenericName[vi]=B duyt Web
# Gnome and KDE 3 uses Comment.
Comment=Access the Internet
Comment[ar]=الدخول إلى الإنترنت
Comment[bg]=Достъп до интернет
Comment[bn]=ি
Comment[ca]=Accedeix a Internet
Comment[cs]=Přístup k internetu
Comment[da]=Få adgang til internettet
Comment[de]=Internetzugriff
Comment[el]=Πρόσβαση στο Διαδίκτυο
Comment[en_GB]=Access the Internet
Comment[es]=Accede a Internet.
Comment[et]=Pääs Internetti
Comment[fi]=Käytä internetiä
Comment[fil]=I-access ang Internet
Comment[fr]=Accéder à Internet
Comment[gu]=
Comment[he]=גישה אל האינטרנט
Comment[hi]= ि
Comment[hr]=Pristup Internetu
Comment[hu]=Internetelérés
Comment[id]=Akses Internet
Comment[it]=Accesso a Internet
Comment[ja]=
Comment[kn]= ಿಿ
Comment[ko]=
Comment[lt]=Interneto prieiga
Comment[lv]=Piekļūt internetam
Comment[ml]=
Comment[mr]=
Comment[nb]=Gå til Internett
Comment[nl]=Verbinding maken met internet
Comment[or]=
Comment[pl]=Skorzystaj z internetu
Comment[pt]=Aceder à Internet
Comment[pt_BR]=Acessar a internet
Comment[ro]=Accesaţi Internetul
Comment[ru]=Доступ в Интернет
Comment[sk]=Prístup do siete Internet
Comment[sl]=Dostop do interneta
Comment[sr]=Приступите Интернету
Comment[sv]=Gå ut på Internet
Comment[ta]=
Comment[te]= ి
Comment[th]=
Comment[tr]=İnternet'e erişin
Comment[uk]=Доступ до Інтернету
Comment[vi]=Truy cp Internet
Comment[zh_CN]=访
Comment[zh_HK]=
Comment[zh_TW]=
Exec=/app/bin/chromium %U
StartupWMClass=chromium-browser
StartupNotify=true
Terminal=false
Icon=org.chromium.Chromium
Type=Application
Categories=Network;WebBrowser;
Keywords=chrome;internet;google;
MimeType=application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https;
Actions=new-window;new-private-window;
# Used by Endless
X-Flatpak-RenamedFrom=chromium-browser.desktop;
[Desktop Action new-window]
Name=New Window
Name[am]=
Name[ar]=نافذة جديدة
Name[bg]=Нов прозорец
Name[bn]=
Name[ca]=Finestra nova
Name[cs]=Nové okno
Name[da]=Nyt vindue
Name[de]=Neues Fenster
Name[el]=Νέο Παράθυρο
Name[en_GB]=New Window
Name[es]=Nueva ventana
Name[et]=Uus aken
Name[fa]=پنجره جدید
Name[fi]=Uusi ikkuna
Name[fil]=New Window
Name[fr]=Nouvelle fenêtre
Name[gu]= િ
Name[hi]= ि
Name[hr]=Novi prozor
Name[hu]=Új ablak
Name[id]=Jendela Baru
Name[it]=Nuova finestra
Name[iw]=חלון חדש
Name[ja]=
Name[kn]= ಿ
Name[ko]=
Name[lt]=Naujas langas
Name[lv]=Jauns logs
Name[ml]=ി ി
Name[mr]= ि
Name[nl]=Nieuw venster
Name[no]=Nytt vindu
Name[pl]=Nowe okno
Name[pt]=Nova janela
Name[pt_BR]=Nova janela
Name[ro]=Fereastră nouă
Name[ru]=Новое окно
Name[sk]=Nové okno
Name[sl]=Novo okno
Name[sr]=Нови прозор
Name[sv]=Nytt fönster
Name[sw]=Dirisha Jipya
Name[ta]=ி
Name[te]= ి
Name[th]=
Name[tr]=Yeni Pencere
Name[uk]=Нове вікно
Name[vi]=Ca s Mi
Name[zh_CN]=
Name[zh_TW]=
Exec=/app/bin/chromium
[Desktop Action new-private-window]
Name=New Incognito Window
Name[ar]=نافذة جديدة للتصفح المتخفي
Name[bg]=Нов прозорец инкогнито
Name[bn]=
Name[ca]=Finestra d'incògnit nova
Name[cs]=Nové anonymní okno
Name[da]=Nyt inkognitovindue
Name[de]=Neues Inkognito-Fenster
Name[el]=Νέο παράθυρο για ανώνυμη περιήγηση
Name[en_GB]=New Incognito window
Name[es]=Nueva ventana de incógnito
Name[et]=Uus inkognito aken
Name[fa]=پنجره جدید حالت ناشناس
Name[fi]=Uusi incognito-ikkuna
Name[fil]=Bagong Incognito window
Name[fr]=Nouvelle fenêtre de navigation privée
Name[gu]= િ
Name[hi]= ि
Name[hr]=Novi anoniman prozor
Name[hu]=Új Inkognitóablak
Name[id]=Jendela Penyamaran baru
Name[it]=Nuova finestra di navigazione in incognito
Name[iw]=חלון חדש לגלישה בסתר
Name[ja]=
Name[kn]= ಿ
Name[ko]= 릿
Name[lt]=Naujas inkognito langas
Name[lv]=Jauns inkognito režīma logs
Name[ml]=ി ി
Name[mr]= ि
Name[nl]=Nieuw incognitovenster
Name[no]=Nytt inkognitovindu
Name[pl]=Nowe okno incognito
Name[pt]=Nova janela de navegação anónima
Name[pt_BR]=Nova janela anônima
Name[ro]=Fereastră nouă incognito
Name[ru]=Новое окно в режиме инкогнито
Name[sk]=Nové okno inkognito
Name[sl]=Novo okno brez beleženja zgodovine
Name[sr]=Нови прозор за прегледање без архивирања
Name[sv]=Nytt inkognitofönster
Name[ta]=ி ி
Name[te]= ి
Name[th]=
Name[tr]=Yeni Gizli pencere
Name[uk]=Нове вікно в режимі анонімного перегляду
Name[vi]=Ca s n danh mi
Name[zh_CN]=
Name[zh_TW]=
Exec=/app/bin/chromium --incognito

View file

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright 2017 The Chromium Authors -->
<component type="desktop">
<id>org.chromium.Chromium</id>
<launchable type="desktop-id">org.chromium.Chromium.desktop</launchable>
<name>Chromium Web Browser</name>
<developer_name>The Chromium Authors</developer_name>
<summary>The web browser from Chromium project</summary>
<metadata_license>CC0-1.0</metadata_license>
<project_license>BSD-3-Clause and LGPL-2.1+ and Apache-2.0 and IJG and MIT and GPL-2.0+ and ISC and OpenSSL and (MPL-1.1 or GPL-2.0 or LGPL-2.0)</project_license>
<url type="homepage">https://www.chromium.org/Home</url>
<description>
<p>
Chromium is an open-source browser project that aims to build a safer, faster,
and more stable way to experience the web.
</p>
<p>
We invite you to join our effort to build a powerful platform for developing a
new generation of web applications.
</p>
</description>
<screenshots>
<screenshot type="default">
<image>https://www.gstatic.com/chrome/appstream/chrome-2.png</image>
<caption/>
</screenshot>
</screenshots>
<releases>
<release version="114.0.5735.133" date="2023-06-13"/>
<release version="114.0.5735.106" date="2023-06-05"/>
<release version="114.0.5735.90" date="2023-05-31"/>
<release version="113.0.5672.126" date="2023-05-16"/>
<release version="113.0.5672.92" date="2023-05-09"/>
<release version="113.0.5672.63" date="2023-04-26"/>
<release version="112.0.5615.165" date="2023-04-19"/>
<release version="112.0.5615.121" date="2023-04-14"/>
<release version="112.0.5615.49" date="2023-03-30"/>
<release version="111.0.5563.146" date="2023-03-27"/>
<release version="111.0.5563.110" date="2023-03-22"/>
<release version="111.0.5563.64" date="2023-03-07"/>
<release version="110.0.5481.177" date="2023-02-22"/>
<release version="110.0.5481.100" date="2023-02-16"/>
<release version="110.0.5481.77" date="2023-02-01"/>
<release version="109.0.5414.119" date="2023-01-24"/>
<release version="109.0.5414.74" date="2023-01-04"/>
<release version="108.0.5359.124" date="2022-12-14"/>
<release version="108.0.5359.98" date="2022-12-07"/>
<release version="108.0.5359.94" date="2022-12-02"/>
<release version="108.0.5359.71" date="2022-11-29"/>
<release version="107.0.5304.121" date="2022-11-24"/>
<release version="107.0.5304.110" date="2022-11-09"/>
<release version="107.0.5304.87" date="2022-10-27"/>
<release version="107.0.5304.68" date="2022-10-25"/>
<release version="106.0.5249.119" date="2022-10-12"/>
<release version="106.0.5249.91" date="2022-09-30"/>
<release version="106.0.5249.61" date="2022-09-26"/>
<release version="105.0.5195.125" date="2022-09-13"/>
<release version="105.0.5195.102" date="2022-09-02"/>
<release version="105.0.5195.52" date="2022-08-24"/>
<release version="104.0.5112.101" date="2022-08-16"/>
<release version="104.0.5112.79" date="2022-08-01"/>
<release version="103.0.5060.134" date="2022-07-19"/>
<release version="103.0.5060.114" date="2022-07-09"/>
<release version="103.0.5060.53" date="2022-06-16"/>
<release version="102.0.5005.115" date="2022-06-10"/>
<release version="102.0.5005.61" date="2022-05-19"/>
<release version="101.0.4951.64" date="2022-05-11"/>
<release version="101.0.4951.54" date="2022-05-03"/>
<release version="101.0.4951.41" date="2022-04-20"/>
<release version="100.0.4896.127" date="2022-04-15"/>
<release version="100.0.4896.88" date="2022-04-12"/>
<release version="100.0.4896.75" date="2022-04-05"/>
<release version="100.0.4896.60" date="2022-03-29"/>
<release version="99.0.4844.84" date="2022-03-26"/>
<release version="99.0.4844.82" date="2022-03-20"/>
<release version="99.0.4844.74" date="2022-03-16"/>
<release version="98.0.4758.102" date="2022-02-15"/>
<release version="98.0.4758.80" date="2022-02-01"/>
<release version="97.0.4692.99" date="2022-01-20"/>
<release version="97.0.4692.71" date="2021-12-31"/>
<release version="96.0.4664.110" date="2021-12-14"/>
<release version="96.0.4664.93" date="2021-12-07"/>
<release version="96.0.4664.45" date="2021-11-12"/>
<release version="95.0.4638.69" date="2021-10-29"/>
<release version="95.0.4638.54" date="2021-10-18"/>
<release version="94.0.4606.81" date="2021-10-08"/>
<release version="94.0.4606.71" date="2021-10-01"/>
<release version="94.0.4606.61" date="2021-09-24"/>
<release version="94.0.4606.54" date="2021-09-20"/>
<release version="93.0.4577.82" date="2021-09-14"/>
<release version="93.0.4577.63" date="2021-09-01"/>
<release version="92.0.4515.159" date="2021-08-17"/>
<release version="92.0.4515.131" date="2021-08-03"/>
<release version="92.0.4515.107" date="2021-07-19"/>
<release version="91.0.4472.164" date="2021-07-15"/>
<release version="91.0.4472.114" date="2021-06-18"/>
<release version="91.0.4472.106" date="2021-06-15"/>
<release version="91.0.4472.101" date="2021-06-09"/>
<release version="91.0.4472.77" date="2021-05-24"/>
<release version="90.0.4430.212" date="2021-05-10"/>
<release version="90.0.4430.93" date="2021-04-27"/>
<release version="90.0.4430.85" date="2021-04-20"/>
<release version="90.0.4430.72" date="2021-04-14"><url>https://chromereleases.googleblog.com/2021/04/stable-channel-update-for-desktop_14.html</url></release>
<release version="89.0.4389.128" date="2021-04-14"/>
<release version="89.0.4389.114" date="2021-03-30"/>
<release version="89.0.4389.90" date="2021-03-13"/>
<release version="89.0.4389.82" date="2021-03-05"/>
<release version="89.0.4389.72" date="2021-03-02"/>
<release version="88.0.4324.182" date="2021-02-16"/>
<release version="88.0.4324.150" date="2021-02-05"/>
<release version="88.0.4324.146" date="2021-02-02"/>
<release version="88.0.4324.96" date="2020-01-19"/>
<release version="87.0.4280.141" date="2021-01-07"/>
<release version="87.0.4280.88-1" date="2020-12-17"/>
<release version="87.0.4280.88" date="2020-12-04"/>
<release version="87.0.4280.66" date="2020-11-18"/>
<release version="86.0.4240.198" date="2020-11-12"/>
<release version="86.0.4240.183" date="2020-11-02"/>
<release version="86.0.4240.111" date="2020-11-01"/>
<release version="86.0.4240.75" date="2020-10-15"/>
<release version="85.0.4183.121" date="2020-09-29"/>
</releases>
<content_rating type="oars-1.1"/>
<translation/>
<update_contact>rymg19_at_gmail.com</update_contact>
</component>

View file

@ -0,0 +1,152 @@
app-id: org.chromium.Chromium
runtime: org.freedesktop.Platform
runtime-version: '22.08'
sdk: org.freedesktop.Sdk
base: org.chromium.Chromium.BaseApp
base-version: '22.08'
command: chromium
finish-args:
- --require-version=1.8.2
- --filesystem=home
- --filesystem=/run/.heim_org.h5l.kcm-socket
- --device=all
- --env=GTK_PATH=/app/lib/gtkmodules
- --env=LD_LIBRARY_PATH=/app/chromium/nonfree-codecs/lib
- --share=ipc
- --share=network
- --socket=cups
- --socket=pulseaudio
- --socket=x11
- --socket=wayland
- --system-talk-name=org.bluez
- --system-talk-name=org.freedesktop.Avahi
- --system-talk-name=org.freedesktop.UPower
- --talk-name=com.canonical.AppMenu.Registrar
- --talk-name=org.freedesktop.FileManager1
- --talk-name=org.freedesktop.Notifications
- --talk-name=org.freedesktop.ScreenSaver
- --talk-name=org.freedesktop.secrets
- --talk-name=org.kde.kwalletd5
- --talk-name=org.gnome.SessionManager
- --own-name=org.mpris.MediaPlayer2.chromium.*
add-extensions:
org.chromium.Chromium.Codecs:
directory: chromium/nonfree-codecs
add-ld-path: lib
bundle: true
autodelete: true
org.chromium.Chromium.NativeMessagingHost:
version: '1'
directory: chromium/native-messaging-hosts
merge-dirs: native-messaging-hosts
subdirectories: true
no-autodownload: true
autodelete: true
org.chromium.Chromium.Extension:
version: '1'
directory: chromium/extensions
merge-dirs: extensions;native-messaging-hosts;policies/managed;policies/recommended
subdirectories: true
no-autodownload: true
autodelete: true
org.chromium.Chromium.Policy:
version: '1'
directory: chromium/policies
merge-dirs: policies/managed;policies/recommended
subdirectories: true
no-autodownload: true
autodelete: true
sdk-extensions:
- org.freedesktop.Sdk.Extension.llvm14
- org.freedesktop.Sdk.Extension.node16
- org.freedesktop.Sdk.Extension.openjdk11
modules:
# Based on https://github.com/flathub/shared-modules/blob/master/python2.7/python-2.7.json
- name: python2
config-opts:
- --enable-shared
- --with-ensurepip=yes
- --with-system-expat
- --with-system-ffi
- --with-dbmliborder=gdbm
- --enable-unicode=ucs4
build-options:
no-debuginfo: true
post-install:
- chmod 644 $FLATPAK_DEST/lib/libpython2.7.so.1.0
cleanup:
- '*'
sources:
- type: archive
url: https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tar.xz
sha256: b62c0e7937551d0cc02b8fd5cb0f544f9405bafc9a54d3808ed4594812edef43
- name: readelf-symlink
only-arches: [aarch64]
buildsystem: simple
build-commands:
# Chromium expects to find readelf with its full toolprefix on arm64
- ln -s /usr/bin/readelf /app/bin/aarch64-linux-gnu-readelf
- name: extensions
buildsystem: simple
build-commands:
- mkdir -p /app/chromium/{extensions,native-messaging-hosts,policies}
- for dir in native-messaging-hosts policies; do ln -s /app/chromium/{$dir,extensions}/$dir;
done
- touch /app/chromium/extensions/no-mount-stamp
- name: chromium
buildsystem: simple
build-commands:
- ./bootstrap.sh
- ./build.sh
- ./install.sh
sources:
- type: archive
url: https://commondatastorage.googleapis.com/chromium-browser-official/chromium-114.0.5735.133.tar.xz
sha256: 8289ec1ec9e2540313af10bcf97721ec560789c931fc0583a2f5a545f223d262
x-checker-data:
type: chromium
component: chromium
is-main-source: true
- type: archive
url: https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/clang-llvmorg-17-init-8029-g27f27d15-3.tgz
sha256: 1ac590c011158940037ce9442d4bf12943dc14a7ddaab6094e75a8750b47b861
dest: third_party/llvm-build/Release+Asserts
strip-components: 0
only-arches: [x86_64]
x-checker-data:
type: chromium
component: llvm-prebuilt
- type: shell
commands:
- rm -rf third_party/llvm
only-arches: [aarch64]
- type: git
url: https://github.com/llvm/llvm-project
commit: llvmorg-17-init-8029-g27f27d15
dest: third_party/llvm
only-arches: [aarch64]
x-checker-data:
type: chromium
component: llvm-git
- patches/all.json
- type: file
path: org.chromium.Chromium.desktop
- type: file
path: org.chromium.Chromium.metainfo.xml
- type: file
path: chromium.sh
- type: file
path: unlink_profiles.py
- type: file
path: cobalt.ini
- type: dir
path: build-aux

View file

@ -0,0 +1,27 @@
[
{
"type": "patch",
"paths": [
"patches/chromium/flatpak-Add-initial-sandbox-support.patch",
"patches/chromium/flatpak-Expose-Widevine-into-the-sandbox.patch",
"patches/chromium/flatpak-Adjust-paths-for-the-sandbox.patch",
"patches/chromium/Import-chromium-71.0.3578.98-widevine-r3.patch.patch",
"patches/chromium/x11-Set-_NET_WM_BYPASS_COMPOSITOR-for-fullscreen.patch",
"patches/chromium/memory-Enable-the-tab-discards-feature.patch",
"patches/chromium/Enable-accelerated-mjpeg-decode-on-Linux.patch",
"patches/chromium/ffmpeg-Don-t-lie-about-AAC-and-H264-decoders-when-not-avai.patch",
"patches/chromium/Remove-the-ability-to-create-desktop-shortcuts.patch",
"patches/chromium/Use-CHROME_WRAPPER-as-the-executable-on-restart.patch",
"patches/chromium/Enable-new-dtags-on-non-component-builds.patch",
"patches/chromium/Add-support-for-respecting-system-proxy-settings-when-runn.patch",
"patches/chromium/Clang-build-script-Disable-hwasan.patch",
"patches/chromium/clang-build-script-Support-disabling-the-bundled-libxml2.patch",
"patches/chromium/Clang-build-script-Don-t-build-against-the-sysroot.patch",
"patches/chromium/Ignore-useless-warnings-from-the-Asahi-driver.patch",
"patches/chromium/Revert-Reland-Linux-Ozone-Wayland-Support-fractional-scale.patch",
"patches/ffmpeg/Enable-support-for-libfdk-aac-and-OpenH264.patch",
"patches/ffmpeg/ffmpeg-Handle-transient-decode-errors-arising-from-libfdk-.patch",
"patches/ffmpeg/Update-build-configuration.patch"
]
}
]

View file

@ -0,0 +1,388 @@
From c91ff0722be8317f940d11474bff671b01b4636a Mon Sep 17 00:00:00 2001
From: Andre Moreira Magalhaes <andre.magalhaes@endlessos.org>
Date: Thu, 17 Dec 2020 19:05:10 -0300
Subject: [PATCH] Add support for respecting system proxy settings when running
on Linux/Flatpak
Some general notes on implementation:
- The implementation uses the same codepath used when
`--winhttp-proxy-resolver` is passed as param, which uses the
`net::ProxyResolver` interface to determine the proxy given an url:
- This is due to limitations in the portal APIs which don't allow
access to the system proxy settings, and with that no reliable
way to implement a proper ProxyConfigService when on flatpak
- Despite the name of the param, this flag is not Windows(tm)
specific and also used on Mac builds
- This param may be removed at some point in the future, see
https://bugs.chromium.org/p/chromium/issues/detail?id=644030 but
it should be replaced with
https://bugs.chromium.org/p/chromium/issues/detail?id=1032820,
which from the looks of it would not require too many changes
to the impl here
- To avoid having to pass this param, this codepath is enabled
automatically when detecting we are running on flatpak
- This means that proxy resolution is done by invoking
`net::ProxyResolver::GetProxyForURL()` (instead of relying on the
internal chromium mechanism based on the proxy settings, set to
"mode=auto" in this case), which in turn invokes
`g_proxy_resolver_lookup` which uses the portal API via D-Bus
- To avoid having one D-Bus call per
`net::ProxyResolver::GetProxyForURL()`, this implements a (very)
simple cache that gets invalidated every 1min (same default
timeout used on chromium dns refresh)
- Another issue is that the impl will invoke the portal even if
proxy is disabled in the system, also because of a limitation
in the portal API where there is no way to know whether the
proxy is disabled
- We could skip using the portal on KDE, given the flatpak has
access to $HOME today (and the impl just reads .ini files),
but this impl uses the same codepath no matter the DE when running
on flatpak
Closes https://github.com/flathub/org.chromium.Chromium/issues/36
---
chrome/app/generated_resources.grd | 6 +
.../net/system_network_context_manager.cc | 9 +-
chrome/browser/ui/webui/about_ui.cc | 14 +-
net/BUILD.gn | 8 ++
.../configured_proxy_resolution_service.cc | 6 +-
.../proxy_config_service_linux.cc | 10 +-
net/proxy_resolution/proxy_resolver_linux.cc | 123 ++++++++++++++++++
net/proxy_resolution/proxy_resolver_linux.h | 29 +++++
8 files changed, 201 insertions(+), 4 deletions(-)
create mode 100644 net/proxy_resolution/proxy_resolver_linux.cc
create mode 100644 net/proxy_resolution/proxy_resolver_linux.h
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 1632fdfac5b94..e020244444348 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -12358,6 +12358,12 @@ Please help our engineers fix this problem. Tell us what happened right before y
&lt;p&gt;But you can still configure via the command line. Please see &lt;code&gt;man <ph name="PRODUCT_BINARY_NAME">$2<ex>google-chrome</ex></ph>&lt;/code&gt; for more information on flags and environment variables.&lt;/p&gt;
</message>
+ <message name="IDS_ABOUT_LINUX_PROXY_CONFIG_FLATPAK_BODY" desc="HTML body of page shown on systems running with flatpak where system proxy configuration is unsupported.">
+ &lt;p&gt;The flatpak version of <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> does not support changing the system proxy settings. However, it does respect those settings.&lt;/p&gt;
+ &lt;p&gt;If you need to adjust the proxy settings, please do so through the configuration system of your desktop environment.&lt;/p&gt;
+
+ &lt;p&gt;You can also override your system proxy settings via the command line. Please see &lt;code&gt;man <ph name="PRODUCT_BINARY_NAME">$2<ex>google-chrome</ex></ph>&lt;/code&gt; for more information on flags and environment variables.&lt;/p&gt;
+ </message>
</if>
<message name="IDS_IMAGE_FILES" desc="The description of the image file extensions in the select file dialog.">
diff --git a/chrome/browser/net/system_network_context_manager.cc b/chrome/browser/net/system_network_context_manager.cc
index 35847a946ce57..52fb3b7721ee3 100644
--- a/chrome/browser/net/system_network_context_manager.cc
+++ b/chrome/browser/net/system_network_context_manager.cc
@@ -96,6 +96,7 @@
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
#include "chrome/common/chrome_paths_internal.h"
#include "chrome/grit/chromium_strings.h"
+#include "sandbox/linux/services/flatpak_sandbox.h"
#include "ui/base/l10n/l10n_util.h"
#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
@@ -771,7 +772,13 @@ void SystemNetworkContextManager::ConfigureDefaultNetworkContextParams(
// or if it does work, now.
// Should be possible now that a private isolate is used.
// http://crbug.com/474654
- if (!command_line.HasSwitch(switches::kWinHttpProxyResolver)) {
+ bool use_system_proxy_resolver = command_line.HasSwitch(switches::kWinHttpProxyResolver);
+#if defined(OS_LINUX)
+ bool use_flatpak_sandbox = (sandbox::FlatpakSandbox::GetInstance()->GetSandboxLevel() >
+ sandbox::FlatpakSandbox::SandboxLevel::kNone);
+ use_system_proxy_resolver |= use_flatpak_sandbox;
+#endif
+ if (!use_system_proxy_resolver) {
if (command_line.HasSwitch(switches::kSingleProcess)) {
LOG(ERROR) << "Cannot use V8 Proxy resolver in single process mode.";
} else {
diff --git a/chrome/browser/ui/webui/about_ui.cc b/chrome/browser/ui/webui/about_ui.cc
index 56d077d10879c..330f87ad252d7 100644
--- a/chrome/browser/ui/webui/about_ui.cc
+++ b/chrome/browser/ui/webui/about_ui.cc
@@ -87,6 +87,10 @@
#include "chrome/common/webui_url_constants.h"
#endif // BUILDFLAG(IS_CHROMEOS)
+#if defined(OS_LINUX)
+#include "sandbox/linux/services/flatpak_sandbox.h"
+#endif
+
using content::BrowserThread;
namespace {
@@ -611,8 +615,16 @@ std::string AboutLinuxProxyConfig() {
data.append("<style>body { max-width: 70ex; padding: 2ex 5ex; }</style>");
AppendBody(&data);
base::FilePath binary = base::CommandLine::ForCurrentProcess()->GetProgram();
+
+ int id = IDS_ABOUT_LINUX_PROXY_CONFIG_BODY;
+#if defined(OS_LINUX)
+ bool use_flatpak_sandbox = (sandbox::FlatpakSandbox::GetInstance()->GetSandboxLevel() >
+ sandbox::FlatpakSandbox::SandboxLevel::kNone);
+ if (use_flatpak_sandbox)
+ id = IDS_ABOUT_LINUX_PROXY_CONFIG_FLATPAK_BODY;
+#endif
data.append(
- l10n_util::GetStringFUTF8(IDS_ABOUT_LINUX_PROXY_CONFIG_BODY,
+ l10n_util::GetStringFUTF8(id,
l10n_util::GetStringUTF16(IDS_PRODUCT_NAME),
base::ASCIIToUTF16(binary.BaseName().value())));
AppendFooter(&data);
diff --git a/net/BUILD.gn b/net/BUILD.gn
index 355767d5e548f..40eda4de3c758 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -1231,6 +1231,13 @@ component("net") {
deps += [ "//third_party/xdg_shared_mime_info" ]
}
+ if (is_linux) {
+ sources += [
+ "proxy_resolution/proxy_resolver_linux.cc",
+ "proxy_resolution/proxy_resolver_linux.h",
+ ]
+ }
+
if (is_mac) {
sources += [
"base/network_notification_thread_mac.cc",
@@ -1672,6 +1679,7 @@ source_set("net_deps") {
if (use_gio) {
public_configs += [ "//build/linux:gio_config" ]
+ public_deps += [ "//dbus" ]
}
if (is_android) {
diff --git a/net/proxy_resolution/configured_proxy_resolution_service.cc b/net/proxy_resolution/configured_proxy_resolution_service.cc
index 2463ee9c9c2bd..ff02aab556a81 100644
--- a/net/proxy_resolution/configured_proxy_resolution_service.cc
+++ b/net/proxy_resolution/configured_proxy_resolution_service.cc
@@ -49,6 +49,8 @@
#include "net/proxy_resolution/proxy_resolver_mac.h"
#elif BUILDFLAG(IS_MAC)
#include "net/proxy_resolution/proxy_resolver_mac.h"
+#elif BUILDFLAG(IS_LINUX)
+#include "net/proxy_resolution/proxy_resolver_linux.h"
#endif
using base::TimeTicks;
@@ -230,6 +232,8 @@ class ProxyResolverFactoryForSystem : public MultiThreadedProxyResolverFactory {
return std::make_unique<ProxyResolverFactoryWinHttp>();
#elif BUILDFLAG(IS_APPLE)
return std::make_unique<ProxyResolverFactoryMac>();
+#elif defined(OS_LINUX)
+ return std::make_unique<ProxyResolverFactoryLinux>();
#else
NOTREACHED();
return nullptr;
@@ -237,7 +241,7 @@ class ProxyResolverFactoryForSystem : public MultiThreadedProxyResolverFactory {
}
static bool IsSupported() {
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE)
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX)
return true;
#else
return false;
diff --git a/net/proxy_resolution/proxy_config_service_linux.cc b/net/proxy_resolution/proxy_config_service_linux.cc
index a74a05068239a..e0646499cacd1 100644
--- a/net/proxy_resolution/proxy_config_service_linux.cc
+++ b/net/proxy_resolution/proxy_config_service_linux.cc
@@ -35,6 +35,7 @@
#include "base/timer/timer.h"
#include "net/base/proxy_server.h"
#include "net/base/proxy_string_util.h"
+#include "sandbox/linux/services/flatpak_sandbox.h"
#if defined(USE_GIO)
#include <gio/gio.h>
@@ -1074,11 +1075,18 @@ ProxyConfigServiceLinux::Delegate::GetConfigFromSettings() {
config.set_from_system(true);
std::string mode;
- if (!setting_getter_->GetString(SettingGetter::PROXY_MODE, &mode)) {
+ bool use_flatpak_sandbox = (sandbox::FlatpakSandbox::GetInstance()->GetSandboxLevel() >
+ sandbox::FlatpakSandbox::SandboxLevel::kNone);
+
+ if (!use_flatpak_sandbox &&
+ !setting_getter_->GetString(SettingGetter::PROXY_MODE, &mode)) {
// We expect this to always be set, so if we don't see it then we probably
// have a gsettings problem, and so we don't have a valid proxy config.
return absl::nullopt;
+ } else if (use_flatpak_sandbox) {
+ mode = "auto";
}
+
if (mode == "none") {
// Specifically specifies no proxy.
return ProxyConfigWithAnnotation(
diff --git a/net/proxy_resolution/proxy_resolver_linux.cc b/net/proxy_resolution/proxy_resolver_linux.cc
new file mode 100644
index 0000000000000..3e3a252f0ef66
--- /dev/null
+++ b/net/proxy_resolution/proxy_resolver_linux.cc
@@ -0,0 +1,123 @@
+// Copyright (c) 2020 Endless OS Foundation LLC
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "net/proxy_resolution/proxy_resolver_linux.h"
+
+#include "base/time/time.h"
+#include "base/timer/timer.h"
+#include "net/base/net_errors.h"
+#include "net/proxy_resolution/proxy_info.h"
+#include "net/proxy_resolution/proxy_resolver.h"
+#include "sandbox/linux/services/flatpak_sandbox.h"
+
+#if defined(USE_GIO)
+#include <gio/gio.h>
+#endif // defined(USE_GIO)
+
+namespace net {
+
+namespace {
+
+#if defined(USE_GIO)
+// Same TTL used for DNS caches, see net/dns/host_resolver_manager.cc
+static const unsigned kCacheExpireSeconds = 60;
+
+class ProxyResolverLinuxImplPortal : public ProxyResolver {
+ public:
+ explicit ProxyResolverLinuxImplPortal();
+ ~ProxyResolverLinuxImplPortal() override;
+
+ // ProxyResolver methods:
+ int GetProxyForURL(const GURL& url,
+ const NetworkAnonymizationKey& network_anonymization_key,
+ ProxyInfo* results,
+ CompletionOnceCallback callback,
+ std::unique_ptr<Request>* request,
+ const NetLogWithSource& net_log) override;
+
+ private:
+ void InvalidateCache();
+
+ // Both InvalidateCache and GetProxyForURL run on the same thread,
+ // no need for explicit synchronization here
+ std::map<std::string, std::string> cache_;
+ base::RepeatingTimer cacheInvalidateTimer_;
+
+ GCancellable* cancellable_;
+};
+
+ProxyResolverLinuxImplPortal::ProxyResolverLinuxImplPortal() {
+ cancellable_ = g_cancellable_new();
+
+ cacheInvalidateTimer_.Start(FROM_HERE, base::Seconds(kCacheExpireSeconds),
+ this,
+ &ProxyResolverLinuxImplPortal::InvalidateCache);
+}
+
+ProxyResolverLinuxImplPortal::~ProxyResolverLinuxImplPortal() {
+ g_cancellable_cancel(cancellable_);
+ g_clear_object(&cancellable_);
+ cacheInvalidateTimer_.Stop();
+}
+
+// Runs on the worker thread
+int ProxyResolverLinuxImplPortal::GetProxyForURL(
+ const GURL& query_url,
+ const NetworkAnonymizationKey& /* network_anonymization_key_key */,
+ ProxyInfo* results,
+ CompletionOnceCallback /* callback */,
+ std::unique_ptr<Request>* /* request */,
+ const NetLogWithSource& /* net_log */) {
+ std::map<std::string, std::string>::const_iterator it =
+ cache_.find(query_url.spec());
+ if (it != cache_.end()) {
+ results->UseNamedProxy(it->second);
+ return OK;
+ }
+
+ GProxyResolver* resolver = g_proxy_resolver_get_default();
+ // TODO: support async resolution if 'request' is non-null - the current
+ // consumer is MultiThreadProxyResolver which always expects a sync
+ // resolver
+ // TODO: handle/warn on error
+ g_auto(GStrv) proxy_list = g_proxy_resolver_lookup(
+ resolver, query_url.spec().c_str(), cancellable_, NULL);
+ if (proxy_list) {
+ g_autofree gchar* proxy_list_str = g_strjoinv(";", proxy_list);
+ if (proxy_list_str && proxy_list_str[0] != '\0') {
+ cache_[query_url.spec()] = proxy_list_str;
+ results->UseNamedProxy(proxy_list_str);
+ }
+ }
+
+ return OK;
+}
+
+void ProxyResolverLinuxImplPortal::InvalidateCache() {
+ cache_.clear();
+}
+
+#endif // defined(USE_GIO)
+
+} // namespace
+
+ProxyResolverFactoryLinux::ProxyResolverFactoryLinux()
+ : ProxyResolverFactory(false /* expects_pac_bytes */) {}
+
+int ProxyResolverFactoryLinux::CreateProxyResolver(
+ const scoped_refptr<PacFileData>& pac_script,
+ std::unique_ptr<ProxyResolver>* resolver,
+ CompletionOnceCallback callback,
+ std::unique_ptr<Request>* request) {
+#if defined(USE_GIO)
+ if (sandbox::FlatpakSandbox::GetInstance()->GetSandboxLevel() >
+ sandbox::FlatpakSandbox::SandboxLevel::kNone) {
+ resolver->reset(new ProxyResolverLinuxImplPortal());
+ return OK;
+ }
+#endif
+ return ERR_NOT_IMPLEMENTED;
+}
+
+} // namespace net
diff --git a/net/proxy_resolution/proxy_resolver_linux.h b/net/proxy_resolution/proxy_resolver_linux.h
new file mode 100644
index 0000000000000..7ae45eeae1a43
--- /dev/null
+++ b/net/proxy_resolution/proxy_resolver_linux.h
@@ -0,0 +1,29 @@
+// Copyright (c) 2020 Endless OS Foundation LLC
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef NET_PROXY_RESOLUTION_PROXY_RESOLVER_LINUX_H_
+#define NET_PROXY_RESOLUTION_PROXY_RESOLVER_LINUX_H_
+
+#include "net/base/completion_once_callback.h"
+#include "net/base/net_export.h"
+#include "net/proxy_resolution/proxy_resolver_factory.h"
+#include "url/gurl.h"
+
+namespace net {
+
+class NET_EXPORT ProxyResolverFactoryLinux : public ProxyResolverFactory {
+ public:
+ ProxyResolverFactoryLinux();
+ ProxyResolverFactoryLinux(const ProxyResolverFactoryLinux&) = delete;
+ ProxyResolverFactoryLinux(ProxyResolverFactoryLinux&&) = delete;
+
+ int CreateProxyResolver(const scoped_refptr<PacFileData>& pac_script,
+ std::unique_ptr<ProxyResolver>* resolver,
+ CompletionOnceCallback callback,
+ std::unique_ptr<Request>* request) override;
+};
+
+} // namespace net
+
+#endif // NET_PROXY_RESOLUTION_PROXY_RESOLVER_LINUX_H_
--
2.39.2

View file

@ -0,0 +1,27 @@
From 075d164c1c7d1a405038ebed153e67a132c92548 Mon Sep 17 00:00:00 2001
From: Ryan Gonzalez <rymg19@gmail.com>
Date: Thu, 30 Sep 2021 11:27:43 -0500
Subject: [PATCH] Clang build script: Disable hwasan
hwasan doesn't seem to actually compile if not on a host x86-64 system,
and we don't really need this for the Flatpak anyway.
---
tools/clang/scripts/build.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/clang/scripts/build.py b/tools/clang/scripts/build.py
index 62cde9673ec68..8dafae1c08f2d 100755
--- a/tools/clang/scripts/build.py
+++ b/tools/clang/scripts/build.py
@@ -503,7 +503,7 @@ def compiler_rt_cmake_flags(*, sanitizers, profile):
'COMPILER_RT_BUILD_SANITIZERS=' + ('ON' if sanitizers else 'OFF'),
'COMPILER_RT_BUILD_XRAY=OFF',
# See crbug.com/1205046: don't build scudo (and others we don't need).
- 'COMPILER_RT_SANITIZERS_TO_BUILD=asan;dfsan;msan;hwasan;tsan;cfi',
+ 'COMPILER_RT_SANITIZERS_TO_BUILD=asan;dfsan;msan;tsan;cfi',
# We explicitly list all targets we want to build, do not autodetect
# targets.
'COMPILER_RT_DEFAULT_TARGET_ONLY=ON',
--
2.39.2

View file

@ -0,0 +1,78 @@
From 4bf3c18d7fceaf24e23a93b636789aed0ccc48b2 Mon Sep 17 00:00:00 2001
From: Ryan Gonzalez <rymg19@gmail.com>
Date: Wed, 31 Aug 2022 10:09:01 -0500
Subject: [PATCH] Clang build script: Don't build against the sysroot
---
tools/clang/scripts/build.py | 48 ++++++++++--------------------------
1 file changed, 13 insertions(+), 35 deletions(-)
diff --git a/tools/clang/scripts/build.py b/tools/clang/scripts/build.py
index 155ac4b52724b..5257433584144 100755
--- a/tools/clang/scripts/build.py
+++ b/tools/clang/scripts/build.py
@@ -762,7 +762,7 @@ def main():
MaybeDownloadHostGcc(args)
base_cmake_args += [ '-DLLVM_STATIC_LINK_CXX_STDLIB=ON' ]
- if sys.platform.startswith('linux'):
+ if sys.platform.startswith('linux') and False:
# Download sysroots. This uses basically Chromium's sysroots, but with
# minor changes:
# - glibc version bumped to 2.18 to make __cxa_thread_atexit_impl
@@ -1071,40 +1071,18 @@ def main():
runtimes_triples_args = []
if sys.platform.startswith('linux'):
- runtimes_triples_args.append((
- 'i386-unknown-linux-gnu',
- compiler_rt_cmake_flags(sanitizers=True, profile=True) + [
- 'CMAKE_SYSROOT=%s' % sysroot_i386,
- # TODO(https://crbug.com/1374690): pass proper flags to i386 tests so they compile correctly
- 'LLVM_INCLUDE_TESTS=OFF',
- ]))
- runtimes_triples_args.append(
- ('x86_64-unknown-linux-gnu',
- compiler_rt_cmake_flags(sanitizers=True, profile=True) + [
- 'CMAKE_SYSROOT=%s' % sysroot_amd64,
- ]))
- runtimes_triples_args.append(
- # Using "armv7a-unknown-linux-gnueabhihf" confuses the compiler-rt
- # builtins build, since compiler-rt/cmake/builtin-config-ix.cmake
- # doesn't include "armv7a" in its `ARM32` list.
- # TODO(thakis): It seems to work for everything else though, see try
- # results on
- # https://chromium-review.googlesource.com/c/chromium/src/+/3702739/4
- # Maybe it should work for builtins too?
- (
- 'armv7-unknown-linux-gnueabihf',
- compiler_rt_cmake_flags(sanitizers=True, profile=True) + [
- 'CMAKE_SYSROOT=%s' % sysroot_arm,
- # Can't run tests on x86 host.
- 'LLVM_INCLUDE_TESTS=OFF',
- ]))
- runtimes_triples_args.append((
- 'aarch64-unknown-linux-gnu',
- compiler_rt_cmake_flags(sanitizers=True, profile=True) + [
- 'CMAKE_SYSROOT=%s' % sysroot_arm64,
- # Can't run tests on x86 host.
- 'LLVM_INCLUDE_TESTS=OFF',
- ]))
+ if platform.machine() == 'x86_64':
+ runtimes_triples_args.append((
+ 'x86_64-unknown-linux-gnu',
+ compiler_rt_cmake_flags(sanitizers=True, profile=True) + [
+ 'LLVM_INCLUDE_TESTS=OFF',
+ ]))
+ else:
+ runtimes_triples_args.append((
+ 'aarch64-unknown-linux-gnu',
+ compiler_rt_cmake_flags(sanitizers=True, profile=True) + [
+ 'LLVM_INCLUDE_TESTS=OFF',
+ ]))
elif sys.platform == 'win32':
runtimes_triples_args.append(
('i386-pc-windows-msvc',
--
2.39.2

View file

@ -0,0 +1,98 @@
From 3c1106bf5334c3481f4d1a792c529669b30a20e6 Mon Sep 17 00:00:00 2001
From: Ryan Gonzalez <rymg19@gmail.com>
Date: Tue, 19 Jan 2021 15:41:16 -0600
Subject: [PATCH] Enable accelerated mjpeg decode on Linux
---
chrome/browser/about_flags.cc | 4 ++--
chrome/browser/flag_descriptions.cc | 10 +++++++---
chrome/browser/flag_descriptions.h | 10 +++++++---
media/base/media_switches.cc | 2 +-
4 files changed, 17 insertions(+), 9 deletions(-)
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index e2d74e803159c..eaf7108715f4b 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -4784,10 +4784,10 @@ const FeatureEntry kFeatureEntries[] = {
FEATURE_VALUE_TYPE(device::features::kWebXrSharedBuffers)},
#endif // BUILDFLAG(IS_ANDROID)
#endif // ENABLE_VR
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS_ASH) || (defined(OS_LINUX) && !defined(OS_ANDROID))
{"disable-accelerated-mjpeg-decode",
flag_descriptions::kAcceleratedMjpegDecodeName,
- flag_descriptions::kAcceleratedMjpegDecodeDescription, kOsCrOS,
+ flag_descriptions::kAcceleratedMjpegDecodeDescription, kOsCrOS | kOsLinux,
SINGLE_DISABLE_VALUE_TYPE(switches::kDisableAcceleratedMjpegDecode)},
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
{"system-keyboard-lock", flag_descriptions::kSystemKeyboardLockName,
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index cbf801b055f67..241596087ccc4 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -4976,9 +4976,7 @@ const char kBiometricAuthenticationForFillingDescription[] =
"Enables biometric authentication before filling form data";
#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
-// ChromeOS -------------------------------------------------------------------
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS_ASH) || (defined(OS_LINUX) && !defined(OS_ANDROID))
const char kAcceleratedMjpegDecodeName[] =
"Hardware-accelerated mjpeg decode for captured frame";
@@ -4986,6 +4984,12 @@ const char kAcceleratedMjpegDecodeDescription[] =
"Enable hardware-accelerated mjpeg decode for captured frame where "
"available.";
+#endif
+
+// ChromeOS -------------------------------------------------------------------
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+
const char kAdaptiveChargingForTestingName[] =
"Show adaptive charging notifications for testing";
const char kAdaptiveChargingForTestingDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 2ce6692612e1d..73afeb4c7c53e 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -2864,13 +2864,17 @@ extern const char kBiometricAuthenticationForFillingDescription[];
#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
-// ChromeOS -------------------------------------------------------------------
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS_ASH) || (defined(OS_LINUX) && !defined(OS_ANDROID))
extern const char kAcceleratedMjpegDecodeName[];
extern const char kAcceleratedMjpegDecodeDescription[];
+#endif
+
+// ChromeOS -------------------------------------------------------------------
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+
extern const char kAdaptiveChargingName[];
extern const char kAdaptiveChargingDescription[];
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc
index b8f748b183652..70ee6d2cce670 100644
--- a/media/base/media_switches.cc
+++ b/media/base/media_switches.cc
@@ -1497,7 +1497,7 @@ bool IsVideoCaptureAcceleratedJpegDecodingEnabled() {
switches::kUseFakeMjpegDecodeAccelerator)) {
return true;
}
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS_ASH) || (defined(OS_LINUX) && !defined(OS_ANDROID))
return true;
#else
return false;
--
2.39.2

View file

@ -0,0 +1,46 @@
From cc1c69b61de411b413e6cef70d5830df60947dc2 Mon Sep 17 00:00:00 2001
From: Ryan Gonzalez <rymg19@gmail.com>
Date: Thu, 19 Nov 2020 16:20:05 -0600
Subject: [PATCH] Enable new-dtags on non-component builds
---
build/config/gcc/BUILD.gn | 23 ++++++++++++++++-------
1 file changed, 16 insertions(+), 7 deletions(-)
diff --git a/build/config/gcc/BUILD.gn b/build/config/gcc/BUILD.gn
index 147ebfc53426c..d598bfa70b1b6 100644
--- a/build/config/gcc/BUILD.gn
+++ b/build/config/gcc/BUILD.gn
@@ -101,13 +101,22 @@ config("executable_config") {
}
if (!is_android && current_os != "aix") {
- ldflags += [
- # TODO(GYP): Do we need a check on the binutils version here?
- #
- # Newer binutils don't set DT_RPATH unless you disable "new" dtags
- # and the new DT_RUNPATH doesn't work without --no-as-needed flag.
- "-Wl,--disable-new-dtags",
- ]
+ if (is_component_build) {
+ ldflags += [
+ # TODO(GYP): Do we need a check on the binutils version here?
+ #
+ # Newer binutils don't set DT_RPATH unless you disable "new" dtags
+ # and the new DT_RUNPATH doesn't work without --no-as-needed flag.
+ "-Wl,--disable-new-dtags",
+ ]
+ } else {
+ # Using DT_RUNPATH breaks the component builds, because RUNPATH isn't used
+ # to look up transitive dependencies like RPATH is, but it's fine for
+ # primarily static builds.
+ ldflags += [
+ "-Wl,--enable-new-dtags"
+ ]
+ }
}
}
--
2.39.2

View file

@ -0,0 +1,29 @@
From 165d50d603fce1340986ce4a9330881a41043a1e Mon Sep 17 00:00:00 2001
From: Ryan Gonzalez <rymg19@gmail.com>
Date: Mon, 19 Dec 2022 19:58:16 -0600
Subject: [PATCH] Ignore useless warnings from the Asahi driver
---
ui/gl/gl_display.cc | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/ui/gl/gl_display.cc b/ui/gl/gl_display.cc
index ce97bb0b98f79..4a2db3615b2f5 100644
--- a/ui/gl/gl_display.cc
+++ b/ui/gl/gl_display.cc
@@ -501,6 +501,12 @@ void EGLAPIENTRY LogEGLDebugMessage(EGLenum error,
EGLLabelKHR thread_label,
EGLLabelKHR object_label,
const char* message) {
+ if (message == std::string("_eglClientWaitSyncCommon") ||
+ message == std::string("_eglDestroySync")) {
+ // Unimplemented on the Asahi driver, so just ignore.
+ return;
+ }
+
std::string formatted_message = std::string("EGL Driver message (") +
GetDebugMessageTypeString(message_type) +
") " + command + ": " + message;
--
2.39.2

View file

@ -0,0 +1,24 @@
From a1a5b43acabb7a39a0fa1256b68f6bcd5e534244 Mon Sep 17 00:00:00 2001
From: Ryan Gonzalez <rymg19@gmail.com>
Date: Tue, 17 Nov 2020 22:57:29 -0600
Subject: [PATCH] Import chromium-71.0.3578.98-widevine-r3.patch
Taken from the Fedora 33 repositories.
---
third_party/widevine/cdm/widevine_cdm_version.h | 2 ++
1 file changed, 2 insertions(+)
diff --git a/third_party/widevine/cdm/widevine_cdm_version.h b/third_party/widevine/cdm/widevine_cdm_version.h
index db80700b6c1b2..370bb3c9724ec 100644
--- a/third_party/widevine/cdm/widevine_cdm_version.h
+++ b/third_party/widevine/cdm/widevine_cdm_version.h
@@ -12,4 +12,6 @@
// - WIDEVINE_CDM_VERSION_STRING (with the version of the CDM that's available
// as a string, e.g., "1.0.123.456").
+#define WIDEVINE_CDM_VERSION_STRING "unknown"
+
#endif // WIDEVINE_CDM_VERSION_H_
--
2.39.2

View file

@ -0,0 +1,68 @@
From bc47457eef7940d49ae5ab9c1cd637bc852e1437 Mon Sep 17 00:00:00 2001
From: Ryan Gonzalez <rymg19@gmail.com>
Date: Wed, 11 Nov 2020 16:51:49 -0600
Subject: [PATCH] Remove the ability to create desktop shortcuts
---
.../ui/views/create_application_shortcut_view.cc | 11 ++---------
.../ui/views/create_application_shortcut_view.h | 1 -
2 files changed, 2 insertions(+), 10 deletions(-)
diff --git a/chrome/browser/ui/views/create_application_shortcut_view.cc b/chrome/browser/ui/views/create_application_shortcut_view.cc
index cc577c0f0b0ba..9d7b4239fe451 100644
--- a/chrome/browser/ui/views/create_application_shortcut_view.cc
+++ b/chrome/browser/ui/views/create_application_shortcut_view.cc
@@ -114,10 +114,6 @@ void CreateChromeApplicationShortcutView::InitControls() {
create_shortcuts_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
create_shortcuts_label->SetMultiLine(true);
- std::unique_ptr<views::Checkbox> desktop_check_box = AddCheckbox(
- l10n_util::GetStringUTF16(IDS_CREATE_SHORTCUTS_DESKTOP_CHKBOX),
- prefs::kWebAppCreateOnDesktop);
-
std::unique_ptr<views::Checkbox> menu_check_box;
std::unique_ptr<views::Checkbox> pin_to_taskbar_checkbox;
@@ -145,7 +141,6 @@ void CreateChromeApplicationShortcutView::InitControls() {
views::BoxLayout::Orientation::kVertical, gfx::Insets(),
provider->GetDistanceMetric(views::DISTANCE_RELATED_CONTROL_VERTICAL)));
AddChildView(std::move(create_shortcuts_label));
- desktop_check_box_ = AddChildView(std::move(desktop_check_box));
if (menu_check_box)
menu_check_box_ = AddChildView(std::move(menu_check_box));
if (pin_to_taskbar_checkbox)
@@ -167,9 +162,8 @@ bool CreateChromeApplicationShortcutView::IsDialogButtonEnabled(
if (!shortcut_info_)
return false; // Dialog's not ready because app info hasn't been loaded.
- // One of the three location checkboxes must be checked:
- return desktop_check_box_->GetChecked() ||
- (menu_check_box_ && menu_check_box_->GetChecked()) ||
+ // One of the two location checkboxes must be checked:
+ return (menu_check_box_ && menu_check_box_->GetChecked()) ||
(quick_launch_check_box_ && quick_launch_check_box_->GetChecked());
}
@@ -188,7 +182,6 @@ void CreateChromeApplicationShortcutView::OnDialogAccepted() {
return;
web_app::ShortcutLocations creation_locations;
- creation_locations.on_desktop = desktop_check_box_->GetChecked();
if (menu_check_box_ && menu_check_box_->GetChecked()) {
creation_locations.applications_menu_location =
web_app::APP_MENU_LOCATION_SUBDIR_CHROMEAPPS;
diff --git a/chrome/browser/ui/views/create_application_shortcut_view.h b/chrome/browser/ui/views/create_application_shortcut_view.h
index df40729a1c1d2..39d5800687d49 100644
--- a/chrome/browser/ui/views/create_application_shortcut_view.h
+++ b/chrome/browser/ui/views/create_application_shortcut_view.h
@@ -76,7 +76,6 @@ class CreateChromeApplicationShortcutView : public views::DialogDelegateView {
base::OnceCallback<void(bool)> close_callback_;
// May be null if the platform doesn't support a particular location.
- raw_ptr<views::Checkbox> desktop_check_box_ = nullptr;
raw_ptr<views::Checkbox> menu_check_box_ = nullptr;
raw_ptr<views::Checkbox> quick_launch_check_box_ = nullptr;
--
2.39.2

View file

@ -0,0 +1,40 @@
From 65b71b0ee6ae746a75e9ecc76fbc36d43d9fe761 Mon Sep 17 00:00:00 2001
From: Ryan Gonzalez <rymg19@gmail.com>
Date: Wed, 11 Nov 2020 17:13:38 -0600
Subject: [PATCH] Use CHROME_WRAPPER as the executable on restart
---
chrome/browser/first_run/upgrade_util_linux.cc | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/chrome/browser/first_run/upgrade_util_linux.cc b/chrome/browser/first_run/upgrade_util_linux.cc
index 229da211ae987..22fbcd9d890f2 100644
--- a/chrome/browser/first_run/upgrade_util_linux.cc
+++ b/chrome/browser/first_run/upgrade_util_linux.cc
@@ -12,6 +12,7 @@
#include "base/path_service.h"
#include "base/process/launch.h"
#include "chrome/browser/first_run/upgrade_util_linux.h"
+#include "chrome/browser/shell_integration_linux.h"
namespace {
@@ -22,10 +23,14 @@ double saved_last_modified_time_of_exe = 0;
namespace upgrade_util {
bool RelaunchChromeBrowserImpl(const base::CommandLine& command_line) {
+ base::CommandLine new_cl(command_line);
+ // TODO: move the code outside the internal namespace.
+ new_cl.SetProgram(shell_integration_linux::internal::GetChromeExePath());
+
base::LaunchOptions options;
// Don't set NO_NEW_PRIVS on the relaunched browser process.
options.allow_new_privs = true;
- return base::LaunchProcess(command_line, options).IsValid();
+ return base::LaunchProcess(new_cl, options).IsValid();
}
bool IsUpdatePendingRestart() {
--
2.39.2

View file

@ -0,0 +1,24 @@
[
{
"type": "patch",
"paths": [
"patches/chromium/flatpak-Add-initial-sandbox-support.patch",
"patches/chromium/flatpak-Expose-Widevine-into-the-sandbox.patch",
"patches/chromium/flatpak-Adjust-paths-for-the-sandbox.patch",
"patches/chromium/Import-chromium-71.0.3578.98-widevine-r3.patch.patch",
"patches/chromium/x11-Set-_NET_WM_BYPASS_COMPOSITOR-for-fullscreen.patch",
"patches/chromium/memory-Enable-the-tab-discards-feature.patch",
"patches/chromium/Enable-accelerated-mjpeg-decode-on-Linux.patch",
"patches/chromium/ffmpeg-Don-t-lie-about-AAC-and-H264-decoders-when-not-avai.patch",
"patches/chromium/Remove-the-ability-to-create-desktop-shortcuts.patch",
"patches/chromium/Use-CHROME_WRAPPER-as-the-executable-on-restart.patch",
"patches/chromium/Enable-new-dtags-on-non-component-builds.patch",
"patches/chromium/Add-support-for-respecting-system-proxy-settings-when-runn.patch",
"patches/chromium/Clang-build-script-Disable-hwasan.patch",
"patches/chromium/clang-build-script-Support-disabling-the-bundled-libxml2.patch",
"patches/chromium/Clang-build-script-Don-t-build-against-the-sysroot.patch",
"patches/chromium/Ignore-useless-warnings-from-the-Asahi-driver.patch",
"patches/chromium/Revert-Reland-Linux-Ozone-Wayland-Support-fractional-scale.patch"
]
}
]

View file

@ -0,0 +1,64 @@
From 316519ae5254029edb019bf85cb28c70af768ad6 Mon Sep 17 00:00:00 2001
From: Ryan Gonzalez <rymg19@gmail.com>
Date: Tue, 1 Mar 2022 19:29:12 -0600
Subject: [PATCH] clang build script: Support disabling the bundled libxml2
In the case of toolchain builds that won't be using the cross
compilers, this isn't needed, and it can be a problem when
attempting to build a toolchain without network access.
---
tools/clang/scripts/build.py | 24 +++++++++++++++++-------
1 file changed, 17 insertions(+), 7 deletions(-)
diff --git a/tools/clang/scripts/build.py b/tools/clang/scripts/build.py
index 8dafae1c08f2d..155ac4b52724b 100755
--- a/tools/clang/scripts/build.py
+++ b/tools/clang/scripts/build.py
@@ -574,6 +574,8 @@ def main():
'\'default\', will download an official model which was '
'trained for Chrome on Android',
default='default' if sys.platform.startswith('linux') else '')
+ parser.add_argument('--use-system-libxml', action='store_true',
+ help='use the system libxml2 (unsupported on Windows)')
parser.add_argument('--with-android', type=gn_arg, nargs='?', const=True,
help='build the Android ASan runtime (linux only)',
default=sys.platform.startswith('linux'))
@@ -628,6 +630,10 @@ def main():
print('--with-ml-inliner-model only supports linux hosts')
return 1
+ if args.use_system_libxml and sys.platform == 'win32':
+ print('--use-system-xml is not valid on Windows')
+ return 1
+
# Don't buffer stdout, so that print statements are immediately flushed.
# LLVM tests print output without newlines, so with buffering they won't be
# immediately printed.
@@ -821,13 +827,17 @@ def main():
rpmalloc_dir = DownloadRPMalloc()
base_cmake_args.append('-DLLVM_INTEGRATED_CRT_ALLOC=' + rpmalloc_dir)
- # Statically link libxml2 to make lld-link not require mt.exe on Windows,
- # and to make sure lld-link output on other platforms is identical to
- # lld-link on Windows (for cross-builds).
- libxml_cmake_args, libxml_cflags = BuildLibXml2()
- base_cmake_args += libxml_cmake_args
- cflags += libxml_cflags
- cxxflags += libxml_cflags
+ if args.use_system_libxml:
+ # libxml2 is required by the Win manifest merging tool used in cross-builds.
+ base_cmake_args.append('-DLLVM_ENABLE_LIBXML2=FORCE_ON')
+ else:
+ # Statically link libxml2 to make lld-link not require mt.exe on Windows,
+ # and to make sure lld-link output on other platforms is identical to
+ # lld-link on Windows (for cross-builds).
+ libxml_cmake_args, libxml_cflags = BuildLibXml2()
+ base_cmake_args += libxml_cmake_args
+ cflags += libxml_cflags
+ cxxflags += libxml_cflags
if args.bootstrap:
print('Building bootstrap compiler')
--
2.39.2

View file

@ -0,0 +1,190 @@
From b6535b668e3517f153c6b5be8963b367bc4ac833 Mon Sep 17 00:00:00 2001
From: Mario Sanchez Prada <mario@endlessm.com>
Date: Tue, 25 Oct 2016 16:57:00 +0000
Subject: [PATCH] ffmpeg: Don't lie about AAC and H264 decoders when not
available
On Endless OS, we always build with USE_PROPRIETARY_CODECS defined
and then, depending on the version of libffmpeg.so that is loaded,
some non-free codecs can be available other than free ones.
The problem with this approach is that Chromium will internally
report that all the proprietary codecs are available regardless
of the version of libffmpeg.so that is being used so we need
to add some extra checks in this case at least for the codecs
that Endless OS would support in the non-free version of the OS),
so that users unable to reproduce certain media formats will then
be reported about it, so that they can decide whether to purchase
codecs activation key to unlock that particular type of content.
This patch double-checks whether the AAC and H264 decoders are really
available at run-time before adding the related MIME type to the list
of supported formats, so that we have a chance to let users know that
they might need to upgrade to a non-free version of Endless OS.
https://phabricator.endlessm.com/T15216
https://phabricator.endlessm.com/T30286
https://phabricator.endlessm.com/T30300
---
media/base/BUILD.gn | 4 ++
media/base/mime_util_internal.cc | 86 +++++++++++++++++++++++++++++---
2 files changed, 83 insertions(+), 7 deletions(-)
diff --git a/media/base/BUILD.gn b/media/base/BUILD.gn
index a180a6444c967..1c36adafc11e8 100644
--- a/media/base/BUILD.gn
+++ b/media/base/BUILD.gn
@@ -410,6 +410,10 @@ source_set("base") {
"//third_party/ffmpeg",
"//third_party/ffmpeg:ffmpeg_features",
]
+
+ if (is_linux) {
+ libs += ["openh264"]
+ }
}
if (is_chromeos_ash) {
diff --git a/media/base/mime_util_internal.cc b/media/base/mime_util_internal.cc
index f38d6a145e84b..c78c69cc6d276 100644
--- a/media/base/mime_util_internal.cc
+++ b/media/base/mime_util_internal.cc
@@ -4,6 +4,8 @@
#include "media/base/mime_util_internal.h"
+#include <wels/codec_api.h>
+
#include "base/command_line.h"
#include "base/feature_list.h"
#include "base/logging.h"
@@ -31,6 +33,8 @@
#include "media/base/android/media_codec_util.h" // nogncheck
#endif
+#include <dlfcn.h>
+
namespace media::internal {
// A map from codec string to MimeUtil::Codec.
@@ -293,6 +297,54 @@ void MimeUtil::InitializeMimeTypeMaps() {
AddSupportedMediaFormats();
}
+/* On Endless OS, we always build with USE_PROPRIETARY_CODECS defined
+ * and then, depending on the version of libffmpeg.so that is loaded,
+ * some non-free codecs can be available other than free ones.
+ *
+ * The problem with this approach is that Chromium will internally
+ * report that all the proprietary codecs are available regardless
+ * of the version of libffmpeg.so that is being used so we need
+ * to add some extra checks in this case at least for the codecs
+ * that Endless OS would support in the non-free version of the OS),
+ * so that users unable to reproduce certain media formats will then
+ * be reported about it, so that they can decide whether to purchase
+ * codecs activation key to unlock that particular type of content.
+ */
+
+static void CheckNonFreeMimeTypesOnFlatpak(bool& supports_h264,
+ bool& supports_aac) {
+ // Get a handle for the current process
+ std::unique_ptr<void, decltype(&dlclose)> handle(dlopen(nullptr, RTLD_NOW),
+ dlclose);
+ if (handle) {
+ // Let's check what ffmpeg-based decoders are available.
+ supports_h264 = dlsym(handle.get(), "ff_h264_decoder") != nullptr;
+ supports_aac = dlsym(handle.get(), "ff_libfdk_aac_decoder") != nullptr;
+
+ if (supports_h264) {
+ VLOG(1) << "Using FFmpeg's H.264 decoder";
+ }
+ if (supports_aac) {
+ VLOG(1) << "Using FFmpeg's AAC decoder";
+ }
+ } else {
+ LOG(WARNING) << ": Unable to obtain handle for main process: " << dlerror();
+ }
+
+ if (!supports_h264) {
+ SDecoderCapability decoder_caps;
+ // The real library will always return 0 (ERROR_NONE), while our
+ // own dummy library will return 3 (ERROR_API_FAILED) instead, and
+ // we only want to support H264 if it's the real one, of course.
+ supports_h264 = WelsGetDecoderCapability(&decoder_caps) == 0;
+ if (supports_h264) {
+ VLOG(1) << "Using Cisco OpenH264";
+ } else {
+ VLOG(1) << "No H.264 decoder available";
+ }
+ }
+}
+
// Each call to AddContainerWithCodecs() contains a media type
// (https://en.wikipedia.org/wiki/Media_type) and corresponding media codec(s)
// supported by these types/containers.
@@ -327,11 +379,22 @@ void MimeUtil::AddSupportedMediaFormats() {
mp4_video_codecs.emplace(VP9);
#if BUILDFLAG(USE_PROPRIETARY_CODECS)
- const CodecSet aac{MPEG2_AAC, MPEG4_AAC, MPEG4_XHE_AAC};
+ bool supports_h264 = false;
+ bool supports_aac = false;
+ CheckNonFreeMimeTypesOnFlatpak(supports_h264, supports_aac);
+
+ CodecSet aac;
+ if (supports_aac) {
+ aac.emplace(MPEG2_AAC);
+ aac.emplace(MPEG4_AAC);
+ aac.emplace(MPEG4_XHE_AAC);
+ }
+
mp4_audio_codecs.insert(aac.begin(), aac.end());
CodecSet avc_and_aac(aac);
- avc_and_aac.emplace(H264);
+ if (supports_aac && supports_h264)
+ avc_and_aac.emplace(H264);
#if BUILDFLAG(ENABLE_PLATFORM_AC3_EAC3_AUDIO)
mp4_audio_codecs.emplace(AC3);
@@ -342,7 +405,9 @@ void MimeUtil::AddSupportedMediaFormats() {
mp4_audio_codecs.emplace(MPEG_H_AUDIO);
#endif // BUILDFLAG(ENABLE_PLATFORM_MPEG_H_AUDIO)
- mp4_video_codecs.emplace(H264);
+ if (supports_h264)
+ mp4_video_codecs.emplace(H264);
+
#if BUILDFLAG(ENABLE_PLATFORM_HEVC)
mp4_video_codecs.emplace(HEVC);
#endif // BUILDFLAG(ENABLE_PLATFORM_HEVC)
@@ -382,15 +447,22 @@ void MimeUtil::AddSupportedMediaFormats() {
AddContainerWithCodecs("audio/mp3", implicit_codec);
AddContainerWithCodecs("audio/x-mp3", implicit_codec);
AddContainerWithCodecs("audio/mp4", mp4_audio_codecs);
- DCHECK(!mp4_video_codecs.empty());
- AddContainerWithCodecs("video/mp4", mp4_codecs);
#if BUILDFLAG(USE_PROPRIETARY_CODECS)
+ if (supports_h264) {
+ DCHECK(!mp4_video_codecs.empty());
+ AddContainerWithCodecs("video/mp4", mp4_codecs);
+ }
+
AddContainerWithCodecs("audio/aac", implicit_codec); // AAC / ADTS.
// These strings are supported for backwards compatibility only and thus only
// support the codecs needed for compatibility.
- AddContainerWithCodecs("audio/x-m4a", aac);
- AddContainerWithCodecs("video/x-m4v", avc_and_aac);
+ if (supports_aac) {
+ AddContainerWithCodecs("audio/x-m4a", aac);
+
+ if (supports_h264)
+ AddContainerWithCodecs("video/x-m4v", avc_and_aac);
+ }
CodecSet video_3gpp_codecs(aac);
video_3gpp_codecs.emplace(H264);
--
2.39.2

View file

@ -0,0 +1,124 @@
From f58cb69ed276841108b9769cf2ba8d0905e8a3f9 Mon Sep 17 00:00:00 2001
From: Ryan Gonzalez <rymg19@gmail.com>
Date: Tue, 25 Aug 2020 19:26:07 -0500
Subject: [PATCH] flatpak: Adjust paths for the sandbox
---
chrome/common/BUILD.gn | 4 ++++
chrome/common/chrome_paths.cc | 43 +++++++++++++++++++++++++++--------
2 files changed, 38 insertions(+), 9 deletions(-)
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn
index 21ba8f95b198d..13c51765c360d 100644
--- a/chrome/common/BUILD.gn
+++ b/chrome/common/BUILD.gn
@@ -662,6 +662,10 @@ static_library("constants") {
"//third_party/widevine/cdm:headers",
]
}
+
+ if (is_linux) {
+ deps += [ "//sandbox/linux:sandbox_services" ]
+ }
}
# Use a static library here because many test binaries depend on this but don't
diff --git a/chrome/common/chrome_paths.cc b/chrome/common/chrome_paths.cc
index b6a56e6406a20..378e637c16afb 100644
--- a/chrome/common/chrome_paths.cc
+++ b/chrome/common/chrome_paths.cc
@@ -4,6 +4,7 @@
#include "chrome/common/chrome_paths.h"
+#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/logging.h"
#include "base/native_library.h"
@@ -37,6 +38,10 @@
#include "base/win/registry.h"
#endif
+#if BUILDFLAG(IS_LINUX)
+#include "sandbox/linux/services/flatpak_sandbox.h"
+#endif
+
#if BUILDFLAG(ENABLE_WIDEVINE)
#include "third_party/widevine/cdm/widevine_cdm_common.h" // nogncheck
#endif
@@ -190,8 +195,8 @@ bool PathProvider(int key, base::FilePath* result) {
#else
if (!GetUserDownloadsDirectory(&cur))
return false;
- // Do not create the download directory here, we have done it twice now
- // and annoyed a lot of users.
+ // Do not create the download directory here, we have done it twice now
+ // and annoyed a lot of users.
#endif
break;
case chrome::DIR_CRASH_DUMPS:
@@ -420,6 +425,14 @@ bool PathProvider(int key, base::FilePath* result) {
break;
#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_OPENBSD)
case chrome::DIR_POLICY_FILES: {
+#if defined(OS_LINUX)
+ if (sandbox::FlatpakSandbox::GetInstance()->GetSandboxLevel() >
+ sandbox::FlatpakSandbox::SandboxLevel::kNone) {
+ cur = base::FilePath(
+ FILE_PATH_LITERAL("/app/chromium/extensions/policies"));
+ break;
+ }
+#endif
#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
cur = base::FilePath(FILE_PATH_LITERAL("/etc/opt/chrome/policies"));
#else
@@ -443,7 +456,13 @@ bool PathProvider(int key, base::FilePath* result) {
#endif
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
case chrome::DIR_STANDALONE_EXTERNAL_EXTENSIONS: {
- cur = base::FilePath(kFilepathSinglePrefExtensions);
+ if (sandbox::FlatpakSandbox::GetInstance()->GetSandboxLevel() >
+ sandbox::FlatpakSandbox::SandboxLevel::kNone) {
+ cur = base::FilePath(
+ FILE_PATH_LITERAL("/app/chromium/extensions/extensions"));
+ } else {
+ cur = base::FilePath(kFilepathSinglePrefExtensions);
+ }
break;
}
#endif
@@ -489,19 +508,25 @@ bool PathProvider(int key, base::FilePath* result) {
case chrome::DIR_NATIVE_MESSAGING:
#if BUILDFLAG(IS_MAC)
#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
- cur = base::FilePath(FILE_PATH_LITERAL(
- "/Library/Google/Chrome/NativeMessagingHosts"));
+ cur = base::FilePath(
+ FILE_PATH_LITERAL("/Library/Google/Chrome/NativeMessagingHosts"));
#else
cur = base::FilePath(FILE_PATH_LITERAL(
"/Library/Application Support/Chromium/NativeMessagingHosts"));
#endif
#else // BUILDFLAG(IS_MAC)
+ if (sandbox::FlatpakSandbox::GetInstance()->GetSandboxLevel() >
+ sandbox::FlatpakSandbox::SandboxLevel::kNone) {
+ cur = base::FilePath(FILE_PATH_LITERAL(
+ "/app/chromium/extensions/native-messaging-hosts"));
+ break;
+ }
#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
- cur = base::FilePath(FILE_PATH_LITERAL(
- "/etc/opt/chrome/native-messaging-hosts"));
+ cur = base::FilePath(
+ FILE_PATH_LITERAL("/etc/opt/chrome/native-messaging-hosts"));
#else
- cur = base::FilePath(FILE_PATH_LITERAL(
- "/etc/chromium/native-messaging-hosts"));
+ cur = base::FilePath(
+ FILE_PATH_LITERAL("/etc/chromium/native-messaging-hosts"));
#endif
#endif // !BUILDFLAG(IS_MAC)
break;
--
2.39.2

View file

@ -0,0 +1,326 @@
From 4c3e8472d56b6897f1e1c32e838a83dd42ae5a0d Mon Sep 17 00:00:00 2001
From: Ryan Gonzalez <rymg19@gmail.com>
Date: Tue, 17 Nov 2020 13:00:39 -0600
Subject: [PATCH] flatpak: Expose Widevine into the sandbox
---
.../zygote_host/zygote_host_impl_linux.cc | 54 +++++++++++++-
sandbox/linux/services/flatpak_sandbox.cc | 74 ++++++++++++++-----
sandbox/linux/services/flatpak_sandbox.h | 27 ++++++-
3 files changed, 131 insertions(+), 24 deletions(-)
diff --git a/content/browser/zygote_host/zygote_host_impl_linux.cc b/content/browser/zygote_host/zygote_host_impl_linux.cc
index b60dc232c4322..828c7729ffc9e 100644
--- a/content/browser/zygote_host/zygote_host_impl_linux.cc
+++ b/content/browser/zygote_host/zygote_host_impl_linux.cc
@@ -10,7 +10,10 @@
#include "base/allocator/allocator_extension.h"
#include "base/files/file_enumerator.h"
+#include "base/files/file_util.h"
#include "base/logging.h"
+#include "base/nix/xdg_util.h"
+#include "base/path_service.h"
#include "base/posix/unix_domain_socket.h"
#include "base/process/kill.h"
#include "base/process/launch.h"
@@ -18,9 +21,12 @@
#include "base/strings/string_number_conversions.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
+#include "chrome/common/chrome_paths.h" // nogncheck
#include "content/common/zygote/zygote_commands_linux.h"
#include "content/common/zygote/zygote_communication_linux.h"
#include "content/common/zygote/zygote_handle_impl_linux.h"
+#include "content/public/common/cdm_info.h"
+#include "content/public/common/content_client.h"
#include "content/public/common/zygote/zygote_handle.h"
#include "sandbox/linux/services/credentials.h"
#include "sandbox/linux/services/flatpak_sandbox.h"
@@ -29,6 +35,7 @@
#include "sandbox/linux/suid/common/sandbox.h"
#include "sandbox/policy/linux/sandbox_linux.h"
#include "sandbox/policy/switches.h"
+#include "third_party/widevine/cdm/buildflags.h" // nogncheck
#if BUILDFLAG(IS_CHROMEOS)
#include "content/common/zygote/zygote_communication_linux.h"
@@ -187,8 +194,51 @@ pid_t ZygoteHostImpl::LaunchZygote(
if (is_sandboxed_zygote && use_namespace_sandbox_) {
process = sandbox::NamespaceSandbox::LaunchProcess(*cmd_line, options);
} else if (is_sandboxed_zygote && use_flatpak_sandbox_) {
- process = sandbox::FlatpakSandbox::GetInstance()->LaunchProcess(*cmd_line,
- options);
+ sandbox::FlatpakSandbox::SpawnOptions spawn_options;
+
+#if BUILDFLAG(ENABLE_LIBRARY_CDMS)
+ // Expose the CDM paths into the sandbox. This is similar to PreSandboxInit
+ // in content_main_runner_impl.cc.
+ std::vector<CdmInfo> cdms;
+ GetContentClient()->AddContentDecryptionModules(&cdms, nullptr);
+ for (const auto& cdm : cdms) {
+ if (!spawn_options.ExposePathRo(cdm.path)) {
+ LOG(ERROR) << "Failed to expose CDM module";
+ }
+ }
+#endif
+
+#if BUILDFLAG(ENABLE_WIDEVINE_CDM_COMPONENT)
+ // Make sure we also expose the full Widevine CDM folder so it can be
+ // detected.
+ // TODO: Remove the explicit dependencies on chrome::.
+ base::FilePath widevine_cdm_path;
+ if (!base::PathService::Get(chrome::DIR_COMPONENT_UPDATED_WIDEVINE_CDM,
+ &widevine_cdm_path)) {
+ LOG(ERROR) << "Failed to get Widevine CDM folder for sandbox forwarding";
+ }
+
+ LOG(INFO) << "Widevine CDM path IS: " << widevine_cdm_path;
+
+ if (!widevine_cdm_path.empty() && base::PathExists(widevine_cdm_path)) {
+ if (!spawn_options.ExposePathRo(widevine_cdm_path)) {
+ LOG(ERROR) << "Failed to expose updated Widevine CDM path";
+ }
+ }
+
+ // The Widevine data is found relative to $XDG_CONFIG_HOME, which is not set
+ // by default when running a sandboxed process.
+ auto env = base::Environment::Create();
+ base::FilePath xdgConfigHome = base::nix::GetXDGDirectory(
+ env.get(), base::nix::kXdgConfigHomeEnvVar, nullptr);
+ if (!xdgConfigHome.empty()) {
+ options.environment[base::nix::kXdgConfigHomeEnvVar] =
+ xdgConfigHome.value();
+ }
+#endif
+
+ process = sandbox::FlatpakSandbox::GetInstance()->LaunchProcess(
+ *cmd_line, options, spawn_options);
} else {
process = base::LaunchProcess(*cmd_line, options);
}
diff --git a/sandbox/linux/services/flatpak_sandbox.cc b/sandbox/linux/services/flatpak_sandbox.cc
index cdc225a18b815..f848b3360b8e6 100644
--- a/sandbox/linux/services/flatpak_sandbox.cc
+++ b/sandbox/linux/services/flatpak_sandbox.cc
@@ -4,6 +4,7 @@
#include "sandbox/linux/services/flatpak_sandbox.h"
+#include <fcntl.h>
#include <signal.h>
#include <sstream>
#include <string>
@@ -92,6 +93,18 @@ enum FlatpakSpawnSandboxFlags {
kFlatpakSpawnSandbox_ShareA11yBus = 1 << 4,
};
+bool FlatpakSandbox::SpawnOptions::ExposePathRo(base::FilePath path) {
+ base::ScopedFD fd(
+ HANDLE_EINTR(open(path.value().c_str(), O_PATH | O_NOFOLLOW)));
+ if (!fd.is_valid()) {
+ PLOG(ERROR) << "Failed to expose path " << path;
+ return false;
+ }
+
+ sandbox_expose_ro.push_back(std::move(fd));
+ return true;
+}
+
FlatpakSandbox::FlatpakSandbox()
: bus_thread_("FlatpakPortalBus"), process_info_cv_(&process_info_lock_) {}
@@ -168,8 +181,9 @@ bool FlatpakSandbox::IsPidSandboxed(base::ProcessId relative_pid) {
base::Process FlatpakSandbox::LaunchProcess(
const base::CommandLine& cmdline,
- const base::LaunchOptions& launch_options) {
- base::ProcessId external_pid = Spawn(cmdline, launch_options);
+ const base::LaunchOptions& launch_options,
+ const SpawnOptions& spawn_options /*= {}*/) {
+ base::ProcessId external_pid = Spawn(cmdline, launch_options, spawn_options);
if (external_pid == base::kNullProcessId) {
return base::Process();
}
@@ -363,9 +377,9 @@ void FlatpakSandbox::OnSpawnExitedSignal(dbus::Signal* signal) {
process_info_cv_.Broadcast();
}
-base::ProcessId FlatpakSandbox::Spawn(
- const base::CommandLine& cmdline,
- const base::LaunchOptions& launch_options) {
+base::ProcessId FlatpakSandbox::Spawn(const base::CommandLine& cmdline,
+ const base::LaunchOptions& launch_options,
+ const SpawnOptions& spawn_options) {
base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
base::BlockingType::MAY_BLOCK);
base::ScopedAllowBaseSyncPrimitives allow_wait;
@@ -391,24 +405,26 @@ base::ProcessId FlatpakSandbox::Spawn(
FROM_HERE,
base::BindOnce(&FlatpakSandbox::SpawnOnBusThread, base::Unretained(this),
base::Unretained(&external_pid), base::Unretained(&event),
- cmdline, launch_options));
+ base::Unretained(&cmdline),
+ base::Unretained(&launch_options),
+ base::Unretained(&spawn_options)));
event.Wait();
return external_pid;
}
-void FlatpakSandbox::SpawnOnBusThread(
- base::ProcessId* out_external_pid,
- base::WaitableEvent* event,
- const base::CommandLine& cmdline,
- const base::LaunchOptions& launch_options) {
+void FlatpakSandbox::SpawnOnBusThread(base::ProcessId* out_external_pid,
+ base::WaitableEvent* event,
+ const base::CommandLine* cmdline,
+ const base::LaunchOptions* launch_options,
+ const SpawnOptions* spawn_options) {
dbus::ObjectProxy* object_proxy = GetPortalObjectProxy();
dbus::MethodCall method_call(kFlatpakPortalInterfaceName, "Spawn");
dbus::MessageWriter writer(&method_call);
const base::FilePath& current_directory =
- !launch_options.current_directory.empty()
- ? launch_options.current_directory
+ !launch_options->current_directory.empty()
+ ? launch_options->current_directory
// Change to /app since it's guaranteed to always be present in
// the sandbox.
: kFlatpakAppPath;
@@ -417,7 +433,7 @@ void FlatpakSandbox::SpawnOnBusThread(
dbus::MessageWriter argv_writer(nullptr);
writer.OpenArray("ay", &argv_writer);
- for (const std::string& arg : cmdline.argv()) {
+ for (const std::string& arg : cmdline->argv()) {
WriteStringAsByteArray(&argv_writer, arg);
}
@@ -439,7 +455,7 @@ void FlatpakSandbox::SpawnOnBusThread(
WriteFdPairMap(&fds_writer, STDOUT_FILENO, STDOUT_FILENO);
WriteFdPairMap(&fds_writer, STDERR_FILENO, STDERR_FILENO);
- for (const auto& pair : launch_options.fds_to_remap) {
+ for (const auto& pair : launch_options->fds_to_remap) {
WriteFdPairMap(&fds_writer, pair.first, pair.second);
}
@@ -448,7 +464,7 @@ void FlatpakSandbox::SpawnOnBusThread(
dbus::MessageWriter env_writer(nullptr);
writer.OpenArray("{ss}", &env_writer);
- for (const auto& pair : launch_options.environment) {
+ for (const auto& pair : launch_options->environment) {
dbus::MessageWriter entry_writer(nullptr);
env_writer.OpenDictEntry(&entry_writer);
@@ -472,11 +488,11 @@ void FlatpakSandbox::SpawnOnBusThread(
#else
#endif
- if (launch_options.clear_environment) {
+ if (launch_options->clear_environment) {
spawn_flags |= kFlatpakSpawn_ClearEnvironment;
}
- if (launch_options.kill_on_parent_death) {
+ if (launch_options->kill_on_parent_death) {
spawn_flags |= kFlatpakSpawn_WatchBus;
}
@@ -485,6 +501,28 @@ void FlatpakSandbox::SpawnOnBusThread(
dbus::MessageWriter options_writer(nullptr);
writer.OpenArray("{sv}", &options_writer);
+ if (!spawn_options->sandbox_expose_ro.empty()) {
+ dbus::MessageWriter entry_writer(nullptr);
+ options_writer.OpenDictEntry(&entry_writer);
+
+ entry_writer.AppendString("sandbox-expose-fd-ro");
+
+ dbus::MessageWriter variant_writer(nullptr);
+ entry_writer.OpenVariant("ah", &variant_writer);
+
+ dbus::MessageWriter fds_writer(nullptr);
+ variant_writer.OpenArray("h", &fds_writer);
+
+ for (const base::ScopedFD& fd : spawn_options->sandbox_expose_ro) {
+ CHECK(fd.is_valid()) << "Invalid spawn expose fd";
+ fds_writer.AppendFileDescriptor(fd.get());
+ }
+
+ variant_writer.CloseContainer(&fds_writer);
+ entry_writer.CloseContainer(&variant_writer);
+ options_writer.CloseContainer(&entry_writer);
+ }
+
if (sandbox_flags != 0) {
dbus::MessageWriter entry_writer(nullptr);
options_writer.OpenDictEntry(&entry_writer);
diff --git a/sandbox/linux/services/flatpak_sandbox.h b/sandbox/linux/services/flatpak_sandbox.h
index 167bbc85945ad..de8e7165b4573 100644
--- a/sandbox/linux/services/flatpak_sandbox.h
+++ b/sandbox/linux/services/flatpak_sandbox.h
@@ -9,6 +9,8 @@
#include "base/compiler_specific.h"
#include "base/containers/flat_map.h"
#include "base/containers/flat_set.h"
+#include "base/files/file_path.h"
+#include "base/files/scoped_file.h"
#include "base/no_destructor.h"
#include "base/process/kill.h"
#include "base/process/launch.h"
@@ -34,6 +36,20 @@ namespace sandbox {
// it is known inside the sandbox's PID namespace.
class SANDBOX_EXPORT FlatpakSandbox {
public:
+ class SpawnOptions {
+ public:
+ SpawnOptions() = default;
+ SpawnOptions(const SpawnOptions& other) = delete;
+ SpawnOptions(SpawnOptions&& other) = delete;
+
+ bool ExposePathRo(base::FilePath path);
+
+ private:
+ friend class FlatpakSandbox;
+
+ std::vector<base::ScopedFD> sandbox_expose_ro;
+ };
+
static FlatpakSandbox* GetInstance();
// Represents the level of sandboxing inside a Flatpak. kNone means this is
@@ -55,7 +71,8 @@ class SANDBOX_EXPORT FlatpakSandbox {
// GetRelativePid. This is the reason why a vanilla ProcessId is returned
// rather than a base::Process instance.
base::Process LaunchProcess(const base::CommandLine& cmdline,
- const base::LaunchOptions& launch_options);
+ const base::LaunchOptions& launch_options,
+ const SpawnOptions& spawn_options = {});
// Indefinitely waits for the given process and fills the exit code pointer
// if given and non-null. Returns false on wait failure.
@@ -84,11 +101,13 @@ class SANDBOX_EXPORT FlatpakSandbox {
void OnSpawnExitedSignal(dbus::Signal* signal);
base::ProcessId Spawn(const base::CommandLine& cmdline,
- const base::LaunchOptions& launch_options);
+ const base::LaunchOptions& launch_options,
+ const SpawnOptions& spawn_options);
void SpawnOnBusThread(base::ProcessId* out_external_pid,
base::WaitableEvent* event,
- const base::CommandLine& cmdline,
- const base::LaunchOptions& launch_options);
+ const base::CommandLine* cmdline,
+ const base::LaunchOptions* launch_options,
+ const SpawnOptions* spawn_options);
void OnSpawnResponse(base::ProcessId* out_external_pid,
base::WaitableEvent* event,
dbus::Response* response,
--
2.39.2

View file

@ -0,0 +1,114 @@
From 7869e89107f51f022de5884c6098cd4311823b26 Mon Sep 17 00:00:00 2001
From: Mario Sanchez Prada <mario@endlessm.com>
Date: Thu, 28 Jan 2016 13:53:08 +0000
Subject: [PATCH] memory: Enable the tab discards feature
This allows manually discarding tabs from chrome://discards as well
as automatic tab discards once a certain level of "memory pressure"
is reached.
---
chrome/browser/resource_coordinator/tab_manager.cc | 12 +++++++-----
chrome/browser/resource_coordinator/tab_manager.h | 6 +++---
2 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/chrome/browser/resource_coordinator/tab_manager.cc b/chrome/browser/resource_coordinator/tab_manager.cc
index 7bf4213423c75..1fe76674209f2 100644
--- a/chrome/browser/resource_coordinator/tab_manager.cc
+++ b/chrome/browser/resource_coordinator/tab_manager.cc
@@ -120,7 +120,9 @@ void TabManager::Start() {
// handled by Performance Manager.
#if BUILDFLAG(IS_CHROMEOS_ASH)
delegate_->StartPeriodicOOMScoreUpdate();
+#endif
+#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_LINUX)
// Create a |MemoryPressureListener| to listen for memory events when
// MemoryCoordinator is disabled. When MemoryCoordinator is enabled
// it asks TabManager to do tab discarding.
@@ -133,7 +135,7 @@ void TabManager::Start() {
OnMemoryPressure(level);
}
}
-#endif // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_LINUX)
// Create the graph observer. This is the source of page almost idle data and
// EQT measurements.
@@ -192,7 +194,6 @@ WebContents* TabManager::DiscardTabByExtension(content::WebContents* contents) {
return DiscardTabImpl(LifecycleUnitDiscardReason::EXTERNAL);
}
-#if BUILDFLAG(IS_CHROMEOS_ASH)
void TabManager::DiscardTabFromMemoryPressure() {
// Output a log with per-process memory usage and number of file descriptors,
// as well as GPU memory details. Discard happens without waiting for the log
@@ -203,6 +204,7 @@ void TabManager::DiscardTabFromMemoryPressure() {
// (https://crbug.com/1040522).
memory::OomMemoryDetails::Log("Tab Discards Memory details");
+#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_LINUX)
// Start handling memory pressure. Suppress further notifications before
// completion in case a slow handler queues up multiple dispatches of this
// method and inadvertently discards more than necessary tabs/apps in a burst.
@@ -211,8 +213,8 @@ void TabManager::DiscardTabFromMemoryPressure() {
TabDiscardDoneCB tab_discard_done(base::BindOnce(
&TabManager::OnTabDiscardDone, weak_ptr_factory_.GetWeakPtr()));
DiscardTab(LifecycleUnitDiscardReason::URGENT, std::move(tab_discard_done));
+#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_LINUX)
}
-#endif // BUILDFLAG(IS_CHROMEOS_ASH)
void TabManager::AddObserver(TabLifecycleObserver* observer) {
TabLifecycleUnitExternal::AddTabLifecycleObserver(observer);
@@ -242,7 +244,7 @@ bool TabManager::IsInternalPage(const GURL& url) {
return false;
}
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_LINUX)
void TabManager::OnMemoryPressure(
base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) {
// If Chrome is shutting down, do not do anything.
@@ -286,7 +288,7 @@ void TabManager::UnregisterMemoryPressureListener() {
// Destroying the memory pressure listener to unregister from the observer.
memory_pressure_listener_.reset();
}
-#endif // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_LINUX)
// TODO(jamescook): This should consider tabs with references to other tabs,
// such as tabs created with JavaScript window.open(). Potentially consider
diff --git a/chrome/browser/resource_coordinator/tab_manager.h b/chrome/browser/resource_coordinator/tab_manager.h
index 1465b0a6da1f1..72a54fa9ca4b2 100644
--- a/chrome/browser/resource_coordinator/tab_manager.h
+++ b/chrome/browser/resource_coordinator/tab_manager.h
@@ -90,7 +90,7 @@ class TabManager : public LifecycleUnitObserver,
// was discarded.
content::WebContents* DiscardTabByExtension(content::WebContents* contents);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_LINUX)
// Discards a tab in response to memory pressure.
void DiscardTabFromMemoryPressure();
#endif
@@ -136,7 +136,7 @@ class TabManager : public LifecycleUnitObserver,
// can be easily reloaded and hence makes a good choice to discard.
static bool IsInternalPage(const GURL& url);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_LINUX)
// Called by the memory pressure listener when the memory pressure rises.
void OnMemoryPressure(
base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level);
@@ -151,7 +151,7 @@ class TabManager : public LifecycleUnitObserver,
// Unregister to stop listening to memory pressure. Called on shutdown or
// beginning of tab discards.
void UnregisterMemoryPressureListener();
-#endif // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_LINUX)
// Discards the less important LifecycleUnit that supports discarding under
// |reason|.
--
2.39.2

View file

@ -0,0 +1,52 @@
From 2db736551b35cb89993ba3cc4367374bf5b9558b Mon Sep 17 00:00:00 2001
From: Daniel Drake <drake@endlessm.com>
Date: Fri, 3 Jul 2015 14:59:24 -0600
Subject: [PATCH] x11: Set _NET_WM_BYPASS_COMPOSITOR for fullscreen
This improves performance at full screen.
---
ui/ozone/platform/x11/x11_window.cc | 8 ++++++++
ui/ozone/platform/x11/x11_window.h | 1 +
2 files changed, 9 insertions(+)
diff --git a/ui/ozone/platform/x11/x11_window.cc b/ui/ozone/platform/x11/x11_window.cc
index 7ebbdf4700a63..a4e81f425ee95 100644
--- a/ui/ozone/platform/x11/x11_window.cc
+++ b/ui/ozone/platform/x11/x11_window.cc
@@ -639,6 +639,8 @@ void X11Window::SetFullscreen(bool fullscreen, int64_t target_display_id) {
state_ = new_state;
SetFullscreen(fullscreen);
+ SetBypassCompositor(fullscreen);
+
if (unmaximize_and_remaximize)
Maximize();
@@ -1881,6 +1883,12 @@ void X11Window::SetFullscreen(bool fullscreen) {
x11::Atom::None);
}
+void X11Window::SetBypassCompositor(bool bypass) {
+ x11::SetProperty<uint32_t>(xwindow_,
+ x11::GetAtom("_NET_WM_BYPASS_COMPOSITOR"),
+ x11::Atom::CARDINAL, bypass);
+}
+
bool X11Window::IsActive() const {
// Focus and stacking order are independent in X11. Since we cannot guarantee
// a window is topmost iff it has focus, just use the focus state to determine
diff --git a/ui/ozone/platform/x11/x11_window.h b/ui/ozone/platform/x11/x11_window.h
index 6cbd0d0a7146b..94adbd3741221 100644
--- a/ui/ozone/platform/x11/x11_window.h
+++ b/ui/ozone/platform/x11/x11_window.h
@@ -232,6 +232,7 @@ class X11Window : public PlatformWindow,
void CloseXWindow();
void Map(bool inactive = false);
void SetFullscreen(bool fullscreen);
+ void SetBypassCompositor(bool bypass);
bool IsActive() const;
bool IsTargetedBy(const x11::Event& xev) const;
void HandleEvent(const x11::Event& xev);
--
2.39.2

View file

@ -0,0 +1,77 @@
From 60447fb3f5a546d53a4a3aa8cb8f14903f616d17 Mon Sep 17 00:00:00 2001
From: Ryan Gonzalez <rymg19@gmail.com>
Date: Tue, 20 Jul 2021 14:18:31 -0500
Subject: [PATCH] Enable support for libfdk-aac and OpenH264
---
BUILD.gn | 5 +++++
chromium/scripts/build_ffmpeg.py | 22 +++++++++++++++++++---
chromium/scripts/generate_gn.py | 1 +
3 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/third_party/ffmpeg/BUILD.gn b/third_party/ffmpeg/BUILD.gn
index 91e2f508c3..6b67df2f6b 100644
--- a/third_party/ffmpeg/BUILD.gn
+++ b/third_party/ffmpeg/BUILD.gn
@@ -443,6 +443,11 @@ if (is_component_ffmpeg) {
"-L",
rebase_path(target_gen_dir, root_build_dir),
]
+
+ libs = [
+ "fdk-aac",
+ "openh264",
+ ]
} else if (is_win) {
# Windows component build needs the .def file to export ffmpeg symbols.
deps += [ ":ffmpeg_generate_def" ]
diff --git a/third_party/ffmpeg/chromium/scripts/build_ffmpeg.py b/third_party/ffmpeg/chromium/scripts/build_ffmpeg.py
index 19d0a0f7bc..13bec7605a 100755
--- a/third_party/ffmpeg/chromium/scripts/build_ffmpeg.py
+++ b/third_party/ffmpeg/chromium/scripts/build_ffmpeg.py
@@ -1001,11 +1001,27 @@ def ConfigureAndBuild(target_arch, target_os, host_os, host_arch, parallel_jobs,
'--ar=cygwin-wrapper lib',
])
+ if target_os == 'linux':
+ # Always use libfdk-aac
+ configure_flags['Common'].extend([
+ '--enable-demuxer=aac',
+ '--enable-parser=aac',
+ '--enable-libfdk-aac',
+ '--enable-decoder=libfdk_aac',
+ '--disable-decoder=aac',
+ ])
+
+ # Use OpenH264 when libx264 is not being used.
+ configure_flags['Chromium'].extend([
+ '--enable-libopenh264',
+ '--enable-decoder=libopenh264',
+ '--disable-decoder=h264',
+ ])
+
# Google Chrome & ChromeOS specific configuration.
configure_flags['Chrome'].extend([
- '--enable-decoder=aac,h264',
- '--enable-demuxer=aac',
- '--enable-parser=aac,h264',
+ '--enable-decoder=h264',
+ '--enable-parser=h264',
])
# Google ChromeOS specific configuration.
diff --git a/third_party/ffmpeg/chromium/scripts/generate_gn.py b/third_party/ffmpeg/chromium/scripts/generate_gn.py
index d36b0a22c3..16c5dcee5f 100755
--- a/third_party/ffmpeg/chromium/scripts/generate_gn.py
+++ b/third_party/ffmpeg/chromium/scripts/generate_gn.py
@@ -685,6 +685,7 @@ ALLOWED_LICENSES = [
'LGPL (v2.1 or later) GENERATED FILE',
'MIT/X11 (BSD like)',
'Public domain LGPL (v2.1 or later)',
+ 'ISC',
]
# Files permitted to report an UNKNOWN license. All files mentioned here should
--
2.39.2

View file

@ -0,0 +1,10 @@
[
{
"type": "patch",
"paths": [
"patches/ffmpeg/Enable-support-for-libfdk-aac-and-OpenH264.patch",
"patches/ffmpeg/ffmpeg-Handle-transient-decode-errors-arising-from-libfdk-.patch",
"patches/ffmpeg/Update-build-configuration.patch"
]
}
]

View file

@ -0,0 +1,48 @@
From aa591989d204a64f2cb9d5cb616a9481b695c0c9 Mon Sep 17 00:00:00 2001
From: Jan Schmidt <jan@centricular.com>
Date: Wed, 1 May 2019 17:49:42 +0200
Subject: [PATCH] ffmpeg: Handle transient decode errors arising from
libfdk-aac
GStreamer can successfully play an .m4a file that ffplay cannot, albeit
with some audible glitching.
For most errors, the input buffer should be discarded in this case, but
decoding not stopped, so we attempt to do this in order to make decoding more robust.
(see https://github.com/esrlabs/fdk-aac/blob/master/libAACdec/include/aacdecoder_lib.h#L362)
These errors happen much more often with the cut-down fdk-aac that
avoids patent encumbered portions of AAC
https://phabricator.endlessm.com/T23374
---
libavcodec/libfdk-aacdec.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/third_party/ffmpeg/libavcodec/libfdk-aacdec.c b/third_party/ffmpeg/libavcodec/libfdk-aacdec.c
index 8c1586e25e..d81289e97d 100644
--- a/third_party/ffmpeg/libavcodec/libfdk-aacdec.c
+++ b/third_party/ffmpeg/libavcodec/libfdk-aacdec.c
@@ -409,11 +409,15 @@ static int fdk_aac_decode_frame(AVCodecContext *avctx, AVFrame *frame,
err = aacDecoder_DecodeFrame(s->handle, (INT_PCM *) s->decoder_buffer,
s->decoder_buffer_size / sizeof(INT_PCM),
flags);
- if (err == AAC_DEC_NOT_ENOUGH_BITS) {
- ret = avpkt->size - valid;
- goto end;
- }
if (err != AAC_DEC_OK) {
+ /* Just ignore sync or non-fatal decode errors and keep feeding */
+ if ((err >= aac_dec_sync_error_start && err <= aac_dec_sync_error_end) ||
+ (err >= aac_dec_decode_error_start && err <= aac_dec_decode_error_end) ||
+ (err >= aac_dec_anc_data_error_start && err <= aac_dec_anc_data_error_end)) {
+ ret = avpkt->size - valid;
+ goto end;
+ }
+ /* All other errors, return them */
av_log(avctx, AV_LOG_ERROR,
"aacDecoder_DecodeFrame() failed: %x\n", err);
ret = AVERROR_UNKNOWN;
--
2.39.2

View file

@ -0,0 +1,29 @@
Your Flatpak version does not support a feature needed for this Chromium Flatpak
to run. This generally happens when your distribution has unprivileged user
namespaces disabled.
========== FOR DEBIAN FAMILY USERS ==========
If the distro you are currently using is Debian or a derivative, you can run the
following commands as root (you can enter a root shell via 'sudo -i'):
dpkg-statoverride --update --add root root 0755 /usr/bin/bwrap
echo kernel.unprivileged_userns_clone=1 > /etc/sysctl.d/50-bubblewrap.conf
sudo sysctl -w kernel.unprivileged_userns_clone=1
========== FOR OTHER DISTROS =========
If you installed a "hardened" security kernel, these also usually disable
unprivileged user namespaces. They can be re-enabled by running the following
as root (you can enter a root shell via 'sudo -i'):
echo kernel.unprivileged_userns_clone=1 > /etc/sysctl.d/50-bubblewrap.conf
sudo sysctl -w kernel.unprivileged_userns_clone=1
If 'ls -l /usr/bin/bwrap' contains 'rws', then bwrap is also setuid. This can be
removed, if present, via:
sudo chmod u-s /usr/bin/bwrap
However, note that the permissions may be overridden on the next update of your
distro's bubblewrap package.

View file

@ -0,0 +1,49 @@
#!/usr/bin/env python3
from pathlib import Path
import json
import os
import traceback
import sys
def migrate_profile(profile: Path):
prefs_file = profile / 'Preferences'
with prefs_file.open() as fp:
prefs = json.load(fp)
modified = False
KEYS_TO_REMOVE = ['account_info', 'google']
for key in KEYS_TO_REMOVE:
if key in prefs:
del prefs[key]
modified = True
if modified:
print('Update profile:', profile.name)
tmp = prefs_file.with_suffix('.tmp')
with open(tmp, 'w') as fp:
json.dump(prefs, fp)
tmp.rename(prefs_file)
def main():
data_dir = Path(os.environ['XDG_CONFIG_HOME']) / 'chromium'
profiles = [data_dir / 'Default']
profiles.extend(data_dir.glob('Profile *'))
succeeded = True
for profile in profiles:
try:
migrate_profile(profile)
except Exception:
traceback.print_exc()
succeeded = False
sys.exit(0 if succeeded else 1)
if __name__ == '__main__':
main()

View file

@ -352,10 +352,6 @@
<message name="IDS_TABLET_MULTITASK_MENU_NUDGE_TEXT" desc="Text that is shown when the tablet multitask menu nudge is displayed.">
Swipe down for more layout options
</message>
<message name="IDS_MULTITASK_MENU_FEEDBACK_BUTTON_NAME" desc="Button text of the dogfood feedback button on the multitask menu.">
Send feedback
</message>
<if expr="chromeos_ash">
<!-- The following strings are located here for accessibility from both //ash and //chrome -->
<message name="IDS_ENABLE_BLUETOOTH" desc="The message to display in the network list when Tether is enabled but Bluetooth is disabled.">
@ -2367,6 +2363,36 @@
<message name="IDS_PERSONALIZATION_APP_THEME_LABEL" desc="Label for theme element in personalization hub">
Theme
</message>
<message name="IDS_PERSONALIZATION_APP_THEME_DYNAMIC_COLOR_LABEL" desc="Label for dynamic color theme element in personalization hub">
Accent colors
</message>
<message name="IDS_PERSONALIZATION_APP_THEME_DYNAMIC_COLOR_DESCRIPTION" desc="Description for dynamic color theme element in personalization hub">
Use color sets that match your wallpaper
</message>
<message name="IDS_PERSONALIZATION_APP_THEME_COLOR_SCHEME_TONAL_SPOT" desc="Label for dynamic color tonal spot scheme in personalization hub">
Wallpaper tone
</message>
<message name="IDS_PERSONALIZATION_APP_THEME_COLOR_SCHEME_NEUTRAL" desc="Label for dynamic color neutral scheme in personalization hub">
Neutral
</message>
<message name="IDS_PERSONALIZATION_APP_THEME_COLOR_SCHEME_VIBRANT" desc="Label for dynamic color vibrant scheme in personalization hub">
Vibrant
</message>
<message name="IDS_PERSONALIZATION_APP_THEME_COLOR_SCHEME_EXPRESSIVE" desc="Label for dynamic color expressive scheme in personalization hub">
Expressive
</message>
<message name="IDS_PERSONALIZATION_APP_THEME_STATIC_COLOR_GOOGLE_BLUE" desc="Label for static color google blue in personalization hub">
Google blue
</message>
<message name="IDS_PERSONALIZATION_APP_THEME_STATIC_COLOR_LIGHT_PINK" desc="Label for static color light pink in personalization hub">
Light pink
</message>
<message name="IDS_PERSONALIZATION_APP_THEME_STATIC_COLOR_DARK_GREEN" desc="Label for static color dark green in personalization hub">
Dark green
</message>
<message name="IDS_PERSONALIZATION_APP_THEME_STATIC_COLOR_LIGHT_PURPLE" desc="Label for static color light purple in personalization hub">
Light purple
</message>
<message name="IDS_PERSONALIZATION_APP_THEME_DARK_COLOR_MODE" desc="Label for dark color mode setting">
Dark
</message>
@ -2449,6 +2475,12 @@
<message name="IDS_PERSONALIZATION_APP_AMBIENT_MODE_TOPIC_SOURCE_ART_GALLERY_DESCRIPTION" desc="Description for the radio button to choose the topic source from art gallery. The radio button allows the user to set Art gallery for ambient mode, which shows photos to the user when their device is idle.">
Select curated artwork and images
</message>
<message name="IDS_PERSONALIZATION_APP_AMBIENT_MODE_TOPIC_SOURCE_VIDEO" desc="Label for the radio button to choose the video topic source. The radio button allows the user to set which video ti play for ambient mode.">
Dawn to dark
</message>
<message name="IDS_PERSONALIZATION_APP_AMBIENT_MODE_TOPIC_SOURCE_VIDEO_DESCRIPTION" desc="Description for the radio button to choose the topic source from video animation. The radio button allows the user to set which video to play for ambient mode.">
Select Thoriumbook exclusive artwork
</message>
<message name="IDS_PERSONALIZATION_APP_AMBIENT_MODE_TOPIC_SOURCE_SELECTED_ROW" desc="A11y label for the selected topic source row in ambient mode.">
<ph name="TOPIC_SOURCE">$1<ex>Google Photos</ex></ph> <ph name="TOPIC_SOURCE_DESC">$2<ex>Select your memories</ex></ph> selected, press Enter to select <ph name="TOPIC_SOURCE">$1<ex>Google Photos</ex></ph> albums
</message>
@ -2506,6 +2538,9 @@
<message name="IDS_PERSONALIZATION_APP_AMBIENT_MODE_ANIMATION_FLOAT_ON_BY_LABEL" desc="Label for the ambient mode float on by animation.">
Float on by
</message>
<message name="IDS_PERSONALIZATION_APP_AMBIENT_MODE_ANIMATION_VIDEO_LABEL" desc="Label for the ambient mode float on by animation.">
Dawn to dark
</message>
<message name="IDS_PERSONALIZATION_APP_AMBIENT_MODE_ZERO_STATE_MESSAGE" desc="Message shown in the Ambient subpage in the personalization hub when ambient mode is disabled.">
Turn on the toggle to select the screen saver options
</message>
@ -2572,6 +2607,9 @@
<message name="IDS_PERSONALIZATION_APP_KEYBOARD_BACKLIGHT_TITLE" desc="Title for the keyboard backlight section of personalization hub.">
Keyboard backlight
</message>
<message name="IDS_PERSONALIZATION_APP_KEYBOARD_ZONES_TITLE" desc="Title for the keyboard zones in zone customization section of personalization hub.">
Keyboard zones
</message>
<message name="IDS_PERSONALIZATION_APP_KEYBOARD_BACKLIGHT_WALLPAPER_COLOR_LABEL" desc="Label for the wallpaper extracted color in the keyboard backlight section of personalization hub.">
Wallpaper color
</message>
@ -2634,6 +2672,21 @@
<message name="IDS_PERSONALIZATION_APP_TIME_OF_DAY_WALLPAPER_DIALOG_CONFIRM_BUTTON" desc="Label for the button to accept the dialog confirming user's selection of a Time of Day wallpaper.">
Confirm
</message>
<message name="IDS_PERSONALIZATION_APP_TIME_OF_DAY_VIDEO_CLOUDS_ALBUM_TITLE" desc="Title for the clouds video in the ambient section of the hub.">
Cloud Flow
</message>
<message name="IDS_PERSONALIZATION_APP_TIME_OF_DAY_VIDEO_NEW_MEXICO_ALBUM_TITLE" desc="Title for the new mexico video in the ambient section of the hub.">
Earth Flow
</message>
<message name="IDS_PERSONALIZATION_APP_TIME_OF_DAY_VIDEO_ALBUM_DESCRIPTION" desc="Common description all videos in the ambient section of the hub.">
Thoriumbook exclusive
</message>
<message name="IDS_PERSONALIZATION_APP_TIME_OF_DAY_BANNER_TITLE" desc="Title for the Time of Day promo banner.">
Exclusive Thoriumbook assets now available
</message>
<message name="IDS_PERSONALIZATION_APP_TIME_OF_DAY_BANNER_DESCRIPTION" desc="Description shown in the Time of Day promo banner.">
You now have access to new <ph name="BEGIN_LINK_WALLPAPER_SUBPAGE">&lt;a href="chrome://personalization/wallpaper"&gt;</ph>wallpapers<ph name="END_LINK_WALLPAPER_SUBPAGE">&lt;/a&gt;</ph> and <ph name="BEGIN_LINK_SCREENSAVER_SUBPAGE">&lt;a href="chrome://personalization/ambient"&gt;</ph>screen saver<ph name="END_LINK_SCREENSAVER_SUBPAGE">&lt;/a&gt;</ph>
</message>
<!-- Personalization App Search Results -->
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_TITLE" desc="Text for search result item which, when clicked, navigates the user to personalization app.">
@ -3175,6 +3228,10 @@
<message name="IDS_SHIMLESS_RMA_LID_CALIBRATION_INSTRUCTIONS" translateable="false" desc="Instructions for calibrating gyroscope and accelerometer located in the lid of the device.">
Before proceeding, place your whole device (base and lid) on a flat surface.
</message>
<!-- Nearby Presence -->
<message name="IDS_NEARBY_PRESENCE_DEVICE_NAME" is_accessibility_with_no_ui="true" desc="The device name used to advertise the user's device during a feature flow. Displayed to other devices.">
<ph name="GIVEN_NAME">$1<ex>Josh</ex></ph>'s <ph name="DEVICE_TYPE">$2<ex>Thoriumbook</ex></ph>
</message>
<!-- Finalize device page -->
<message name="IDS_SHIMLESS_RMA_FINALIZE_PAGE_TITLE" translateable="false" desc="Title for the page shown when finalizing the device. Finalizing is the process of confirming the device is ready to return to the owner.">
Finalizing repair
@ -3681,6 +3738,8 @@
</message>
<message name="IDS_FEEDBACK_TOOL_AUTOFILL_LOGS_CHECKBOX" translateable="false" desc="Checkbox for Google internal account to attach autofill logs from the current page.">
Send <ph name="BEGIN_LINK1">&lt;a href="#" id="autofillMetadataUrl"&gt;</ph>autofill metadata<ph name="END_LINK1">&lt;/a&gt;</ph>
<ph name="LINE_BREAK">&lt;br&gt;</ph>
(your autofill data won't be shared)
</message>
<message name="IDS_FEEDBACK_TOOL_ASSISTANT_LOGS_MESSAGE" translateable="false" desc="Message shown after user clicks on the assistant logs hyperlink">
Google Assistance captures recent history and information such as your identity and location to help us better understand your issue.&#10;&#10;The information is stored for up to 90 days and access is restricted to the team working on this issue.
@ -3803,6 +3862,21 @@
<message name="IDS_SHORTCUT_CUSTOMIZATION_SHORTCUT_WITH_CONFILICT_STATUS_MESSAGE" desc="The status message that displays when user clicks button to override an accelerator" translateable="false">
Shortcut is used by <ph name="CONFLICT_ACCEL_NAME">$1<ex>BRIGHTNESS_UP</ex></ph>. Press a new shortcut or press the same one again to use it for this action instead.
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_SEARCH_NO_RESULTS" desc="Text description of a search that has no results." translateable="false">
No search results found
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_SEARCH_CLEAR_QUERY_LABEL" desc="The label for the button that clears search input, displayed when the user hovers over the button or when a screen reader describes that button." translateable="false">
Clear search
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_SEARCH_PLACEHOLDER_LABEL" desc="Placeholder text shown in search input field before user has typed anything." translateable="false">
Search shortcuts
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_SEARCH_ACCELERATOR_TEXT_DIVIDER" desc="The text shown between multiple shortcut keys in search results." translateable="false">
or
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_SEARCH_RESULT_ROW_A11Y_RESULT_SELECTED" desc="ThoriumVox alert to indicate the position number of a selected result in a list of search results and the selected result text itself, and that the user can press enter to navigate to section described by the search result." translateable="false">
Search result <ph name="LIST_POSITION">$1<ex>1</ex></ph> of <ph name="LIST_SIZE">$2<ex>2</ex></ph>: <ph name="SEARCH_RESULT_TEXT">$3<ex>Open new tab, ctrl T</ex></ph>. Press Enter to navigate to shortcut.
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_CATEGORY_GENERAL" desc="Category named 'General' shown on the navigation sidebar">
General
</message>
@ -3873,7 +3947,7 @@
Desks
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_SUBCATEGORY_CHROMEVOX" desc="Subcategory named 'ThoriumVox' shown within main shortcuts section">
ChromeVox
ThoriumVox
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_SUBCATEGORY_VISIBILITY" desc="Subcategory named 'Visibility' shown within main shortcuts section">
Visibility
@ -3881,91 +3955,94 @@
<message name="IDS_SHORTCUT_CUSTOMIZATION_SUBCATEGORY_ACCESSIBILITY_NAVIGATION" desc="Subcategory named 'AccessibilityNavigation' shown within main shortcuts section">
Accessibility navigation
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_ARROW_DOWN" desc="The text read aloud by the screen reader describing the keyboard icon 'arrow down'." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_ARROW_DOWN" desc="The text read aloud by the screen reader describing the keyboard icon 'arrow down'.">
arrow down
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_ARROW_LEFT" desc="The text read aloud by the screen reader describing the keyboard icon 'arrow left'." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_ARROW_LEFT" desc="The text read aloud by the screen reader describing the keyboard icon 'arrow left'.">
arrow left
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_ARROW_RIGHT" desc="The text read aloud by the screen reader describing the keyboard icon 'arrow right'." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_ARROW_RIGHT" desc="The text read aloud by the screen reader describing the keyboard icon 'arrow right'.">
arrow right
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_ARROW_UP" desc="The text read aloud by the screen reader describing the keyboard icon 'arrow up'." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_ARROW_UP" desc="The text read aloud by the screen reader describing the keyboard icon 'arrow up'.">
arrow up
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_AUDIO_VOLUME_DOWN" desc="The text read aloud by the screen reader describing the keyboard icon 'volume down'." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_AUDIO_VOLUME_DOWN" desc="The text read aloud by the screen reader describing the keyboard icon 'volume down'.">
volume down
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_AUDIO_VOLUME_MUTE" desc="The text read aloud by the screen reader describing the keyboard icon 'volume mute'." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_AUDIO_VOLUME_MUTE" desc="The text read aloud by the screen reader describing the keyboard icon 'volume mute'.">
volume mute
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_AUDIO_VOLUME_UP" desc="The text read aloud by the screen reader describing the keyboard icon 'volume up'." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_AUDIO_VOLUME_UP" desc="The text read aloud by the screen reader describing the keyboard icon 'volume up'.">
volume up
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_BRIGHTNESS_DOWN" desc="The text read aloud by the screen reader describing the keyboard icon 'brightness down'." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_BRIGHTNESS_DOWN" desc="The text read aloud by the screen reader describing the keyboard icon 'brightness down'.">
brightness down
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_BRIGHTNESS_UP" desc="The text read aloud by the screen reader describing the keyboard icon 'brightness up'." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_BRIGHTNESS_UP" desc="The text read aloud by the screen reader describing the keyboard icon 'brightness up'.">
brightness up
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_BROWSER_BACK" desc="The text read aloud by the screen reader describing the keyboard icon 'back'." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_BROWSER_BACK" desc="The text read aloud by the screen reader describing the keyboard icon 'back'.">
back
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_BROWSER_FORWARD" desc="The text read aloud by the screen reader describing the keyboard icon 'forward'." translateable="false">
forward
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_BROWSER_REFRESH" desc="The text read aloud by the screen reader describing the keyboard icon 'refresh'." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_BROWSER_REFRESH" desc="The text read aloud by the screen reader describing the keyboard icon 'refresh'.">
refresh
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_BROWSER_SEARCH" desc="The text read aloud by the screen reader describing the keyboard icon 'search'." translateable="false">
search
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_TOGGLE_DICTATION" desc="The text read aloud by the screen reader describing the keyboard icon 'toggle dictation'." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_TOGGLE_DICTATION" desc="The text read aloud by the screen reader describing the keyboard icon 'toggle dictation'.">
toggle dictation
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_EMOJI_PICKER" desc="The text read aloud by the screen reader describing the keyboard icon 'emoji picker'." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_EMOJI_PICKER" desc="The text read aloud by the screen reader describing the keyboard icon 'emoji picker'.">
emoji picker
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_KEYBOARD_BACKLIGHT_TOGGLE" desc="The text read aloud by the screen reader describing the keyboard icon 'toggle keyboard backlight'." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_KEYBOARD_BACKLIGHT_TOGGLE" desc="The text read aloud by the screen reader describing the keyboard icon 'toggle keyboard backlight'.">
toggle keyboard backlight
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_KEYBOARD_BRIGHTNESS_UP" desc="The text read aloud by the screen reader describing the keyboard icon 'keyboard brightness up'." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_KEYBOARD_BRIGHTNESS_UP" desc="The text read aloud by the screen reader describing the keyboard icon 'keyboard brightness up'.">
keyboard brightness up
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_KEYBOARD_BRIGHTNESS_DOWN" desc="The text read aloud by the screen reader describing the keyboard icon 'keyboard brightness down'." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_KEYBOARD_BRIGHTNESS_DOWN" desc="The text read aloud by the screen reader describing the keyboard icon 'keyboard brightness down'.">
keyboard brightness down
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_LAUNCH_APPLICATION1" desc="The text read aloud by the screen reader describing the keyboard icon 'overview'." translateable="false">
overview
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_LAUNCH_APPLICATION1" desc="The text read aloud by the screen reader describing the keyboard icon 'show windows'.">
show windows
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_LAUNCH_APPLICATION2" desc="The text read aloud by the screen reader describing the keyboard icon 'open calculator'." translateable="false">
open calculator
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_LAUNCH_APPLICATION2" desc="The text read aloud by the screen reader describing the keyboard icon 'calculator app'.">
calculator app
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_LAUNCH_ASSISTANT" desc="The text read aloud by the screen reader describing the keyboard icon 'assistant'." translateable="false">
assistant
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_LAUNCH_ASSISTANT" desc="The text read aloud by the screen reader describing the keyboard icon 'Google Assistant'.">
Google Assistant
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_MEDIA_FAST_FORWARD" desc="The text read aloud by the screen reader describing the keyboard icon 'fast forward media'." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_MEDIA_FAST_FORWARD" desc="The text read aloud by the screen reader describing the keyboard icon 'fast forward media'.">
fast forward media
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_MEDIA_PAUSE" desc="The text read aloud by the screen reader describing the keyboard icon 'pause media'." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_MEDIA_PAUSE" desc="The text read aloud by the screen reader describing the keyboard icon 'pause media'.">
pause media
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_MEDIA_PLAY" desc="The text read aloud by the screen reader describing the keyboard icon 'play media'." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_MEDIA_PLAY" desc="The text read aloud by the screen reader describing the keyboard icon 'play media'.">
play media
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_MEDIA_PLAY_PAUSE" desc="The text read aloud by the screen reader describing the keyboard icon 'play pause'." translateable="false">
play pause
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_MEDIA_PLAY_PAUSE" desc="The text read aloud by the screen reader describing the keyboard icon 'play or pause media'.">
play or pause media
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_MEDIA_TRACK_NEXT" desc="The text read aloud by the screen reader describing the keyboard icon 'next track'." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_MEDIA_TRACK_NEXT" desc="The text read aloud by the screen reader describing the keyboard icon 'next track'.">
next track
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_MEDIA_TRACK_PREVIOUS" desc="The text read aloud by the screen reader describing the keyboard icon 'previous track'." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_MEDIA_TRACK_PREVIOUS" desc="The text read aloud by the screen reader describing the keyboard icon 'previous track'.">
previous track
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_MICROPHONE_MUTE_TOGGLE" desc="The text read aloud by the screen reader describing the keyboard icon 'toggle microphone mute'." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_MENU" desc="The text read aloud by the screen reader describing the keyboard icon 'menu." translateable="false">
menu
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_MICROPHONE_MUTE_TOGGLE" desc="The text read aloud by the screen reader describing the keyboard icon 'toggle microphone mute'.">
toggle microphone mute
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_MODE_CHANGE" desc="The text read aloud by the screen reader describing the keyboard icon 'mode change'." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_MODE_CHANGE" desc="The text read aloud by the screen reader describing the keyboard icon 'mode change'.">
mode change
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_OPEN_LAUNCHER" desc="The text read aloud by the screen reader describing the keyboard icon 'launcher'." translateable="false">
@ -3974,16 +4051,16 @@
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_POWER" desc="The text read aloud by the screen reader describing the keyboard icon 'power'." translateable="false">
power
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_PRINT_SCREEN" desc="The text read aloud by the screen reader describing the keyboard icon 'screenshot'." translateable="false">
screenshot
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_PRINT_SCREEN" desc="The text read aloud by the screen reader describing the keyboard icon 'take screenshot'.">
take screenshot
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_PRIVACY_SCREEN_TOGGLE" desc="The text read aloud by the screen reader describing the keyboard icon 'toggle privacy screen'." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_PRIVACY_SCREEN_TOGGLE" desc="The text read aloud by the screen reader describing the keyboard icon 'toggle privacy screen'.">
toggle privacy screen
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_SETTINGS" desc="The text read aloud by the screen reader describing the keyboard icon 'settings'." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_SETTINGS" desc="The text read aloud by the screen reader describing the keyboard icon 'settings'.">
settings
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_ZOOM_TOGGLE" desc="The text read aloud by the screen reader describing the keyboard icon 'full screen'." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_ZOOM_TOGGLE" desc="The text read aloud by the screen reader describing the keyboard icon 'full screen'.">
full screen
</message>
<!-- End of Shortcut Customization -->
@ -4004,6 +4081,12 @@
<message name="IDS_SETTINGS_APN_DESCRIPTION_WITH_LEARN_MORE_LINK" desc="Text describing APN settings menu with a link to more detailed information.">
Manage network APN settings. APNs establish a connection between a cellular network and the internet. <ph name="BEGIN_LINK">&lt;a href="#" &gt;</ph>Learn more<ph name="END_LINK">&lt;/a&gt;</ph>
</message>
<message name="IDS_SETTINGS_APN_ZERO_STATE_DESCRIPTION" desc="Text explaining there is no APN information to show because the network has not been attempted to be connected with, and that the user might need to add a custom APN.">
You are not connected yet. If your mobile carrier recommends a custom APN, enter the APN information by selecting "+ New APN"
</message>
<message name="IDS_SETTINGS_APN_CUSTOM_APNS_ERROR_MESSAGE" desc="Error message displayed when a cellular network fails to connect due to APN-related reasons, informing the user that none of the enabled custom APNs were successful in being used to connect.">
Can't connect to any enabled custom APNs. Contact your mobile carrier for more information.
</message>
<message name="IDS_SETTINGS_APN_MENU_DETAILS" desc="Details button in three dotted menu for APNs">
Details
</message>

@ -1 +1 @@
Subproject commit 9edbc885548c92a45e64df3a7002c9700061f638
Subproject commit d92ac48ba54ee93c801f331678a7994e39b117f3