Compare commits

..
Author SHA1 Message Date
uazoandGitHub 9c8125a264 Create ad-script.js 2021-11-16 13:48:26 +01:00
uazoandGitHub d95a22bd89 Create test_document_write.html 2021-11-16 13:47:19 +01:00
uazoandGitHub 4aa8a44ec6 Update autoplay.html 2020-11-09 17:43:37 +01:00
uazoandGitHub dc19294b5e Update autoplay.html 2020-11-09 17:42:37 +01:00
uazoandGitHub ac1ea62042 Update autoplay.html 2020-11-08 21:07:23 +01:00
uazoandGitHub fa3a3518a2 Create autoplay.html 2020-11-08 14:05:42 +01:00
uazoandGitHub 3ac7252ca5 Add files via upload 2020-10-30 09:14:11 +01:00
uazoandGitHub c499ee04f0 Update test.html 2020-08-26 17:39:21 +02:00
uazoandGitHub 12d3489b14 Create test.html 2020-08-25 19:16:56 +02:00
4347 changed files with 295022 additions and 469199 deletions
-14
View File
@@ -1,14 +0,0 @@
{{ range .Versions }}
<a name="{{ .Tag.Name }}"></a>
## {{ if .Tag.Previous }}[{{ .Tag.Name }}]({{ $.Info.RepositoryURL }}/compare/{{ .Tag.Previous.Name }}...{{ .Tag.Name }}){{ else }}{{ .Tag.Name }}{{ end }} ({{ datetime "2006-01-02" .Tag.Date }})
{{ range .Commits -}}
{{ if not (contains .Type "[") }}- {{.Hash.Short}} {{ .Subject }}
{{ if not (eq (len .Body) 0) }}{{ .Body }}{{ end }}
{{ range .Refs -}}
{{ " " }} - #{{ .Ref }}
{{ end }}
{{ end }}
{{ end }}
{{ end -}}
-20
View File
@@ -1,20 +0,0 @@
style: github
template: CHANGELOG.tpl.md
info:
title: CHANGELOG
repository_url: https://github.com/uazo/cromite
options:
commits:
filters:
Type:
- "[AUTO]"
commit_groups:
# title_maps: []
header:
pattern: "^(\\[.*\\])?(.*)$"
pattern_maps:
- Type
- Subject
notes:
keywords:
- BREAKING CHANGE
-5
View File
@@ -1,5 +0,0 @@
[*.{yaml,sh,gn_args}]
tab_width = 2
indent_size = 2
end_of_line = crlf
indent_style = space
-2
View File
@@ -1,2 +0,0 @@
*.zip binary
*.pdf binary
+4
View File
@@ -0,0 +1,4 @@
# These are supported funding model platforms
liberapay: csagan5
custom: https://www.bromite.org/#donate
+54
View File
@@ -0,0 +1,54 @@
---
name: Bug report
about: Create a Bromite bug report
---
### Bromite version
Version: `76.0...`
Arch: `arm` or `arm64` or `x86`
Android version: (example: `9.0`)
Device model: (example: `SM-G960UZKABST`)
### Is this bug about the SystemWebView?
Yes/No
<!-- No support for SystemWebView installations is provided. -->
### Is the bug reproducible with latest version?
<!-- Do not report bugs which are not reproducible with latest version. -->
### Can the bug be reproduced with corresponding Chromium version?
<!--
Please pick the same version of Chromium as Bromite from here: https://github.com/bromite/chromium/releases
If the bug is reproducible then it might be a configuration issue or an upstream bug. Upstream bugs can be reported on the [Chromium issue tracker](https://bugs.chromium.org/p/chromium/issues/list) and do not forget to read [Chromium project bug reporting guidelines](https://www.chromium.org/for-testers/bug-reporting-guidelines) first.
-->
### Is the bug a crash?
<!--
If yes then individuate and post the logcat dump (remove privacy sensitive information, if any), otherwise remove this section.
-->
### Describe the bug
<!-- Write here a clear and concise description of the bug. -->
### Steps to reproduce the bug
Steps to reproduce the bug:
1. Go to '...'
2. Click on '...'
3. Scroll down to '...'
4. See error
### Expected behavior
<!-- A clear and concise description of what you expected to happen. -->
### Screenshots
<!-- If applicable, add screenshots to help explain your problem. Otherwise remove this section. -->
-231
View File
@@ -1,231 +0,0 @@
name: Bug report
description: Create a Cromite bug report
body:
- type: markdown
attributes:
value: |
Welcome! Thanks for taking the time to submit a bug report.
If this is not a bug about the Cromite browser, or you are looking for a place to ask a question to the community,
then please use the [GitHub Discussions](https://github.com/uazo/cromite/discussions) instead.
Make sure you have acknowledged and completed this template before submitting your issue.
Please read it carefully: incorrect issues will be automatically closed and ignored.
- type: checkboxes
id: preliminary_checklist
attributes:
label: Preliminary checklist
options:
- label: "I have read the [README](https://github.com/uazo/cromite/blob/master/README.md)."
required: true
- label: "I have searched the existing issues for my problem. This is a new ticket, NOT a duplicate or related to another open issue."
required: true
- label: "I have read the [FAQs](https://github.com/uazo/cromite/blob/master/docs/FAQ.md)."
required: true
- label: "I have updated Cromite to the latest version. The bug is reproducible on this latest version."
required: true
- label: "This is a bug report about the Cromite browser; not the website nor F-Droid nor anything else."
required: true
- type: dropdown
id: is_chromium
attributes:
label: Can the bug be reproduced with corresponding Chromium version?
description: |
Please pick the same version of Chromium as Cromite
If the bug is reproducible then it might be a configuration issue or an upstream bug. Upstream bugs can be reported on the [Chromium issue tracker](https://bugs.chromium.org/p/chromium/issues/list) and
do not forget to read [Chromium project bug reporting guidelines](https://www.chromium.org/for-testers/bug-reporting-guidelines) first.
If the bug is related to functionality that does not exist in Chromium then answer "No".
multiple: false
options:
- "Yes"
- "No"
validations:
required: true
- type: dropdown
id: is_chromium2
attributes:
label: Are you sure?
description: |
Please check your answer above again, it is important information
If the bug is related to functionality that does not exist in Chromium then answer "No".
multiple: false
options:
- "Yes"
- "No"
validations:
required: true
- type: input
id: cromite_version
attributes:
label: Cromite version
description: What version of Cromite are you using? Please specify a single version e.g. `96.0.4664.1` not `latest`. If this is not the latest version then please update and retry before submitting this bug report.
validations:
required: true
- type: dropdown
id: device_architecture
attributes:
label: Device architecture
multiple: false
options:
- arm
- arm64
- arm64-v8a
- armeabi-v7a
- x86
- x64
- windows
- all
validations:
required: true
- type: dropdown
id: platform_version
attributes:
label: Platform version
multiple: false
description: What version of Android are you running?
options:
- Android 15
- Android 14
- Android 13
- Android 12.1
- Android 12
- Android 11
- Android 10
- Android 9
- Android 8.1
- Android 8.0
- Android 7.1
- Android 7.0
- Android Emulator
- Windows 10
- Windows 11
- I prefer not to write it/No matter
validations:
required: true
- type: input
id: device_model
attributes:
label: Android Device model
description: What is your device model? This can usually be found in your device's settings in the "About" section.
placeholder: (e.g. `OnePlus 8 (IN2010)`, or `SM-G960UZKABST`, etc.)
validations:
required: true
- type: dropdown
id: is_android_rooted
attributes:
label: Is the device rooted?
description: |
The information is important but not essential; it allows additional checks to be made.
multiple: false
options:
- "Yes"
- "No"
- "I prefer not to write it"
validations:
required: true
- type: textarea
id: changed_flags
attributes:
label: Changed flags
description: |
These are the flags changed under `chrome://flags`.
Report all the flags with non-default configuration (they will be blue-highlighted).
If no flags are changed then write 'no flags changed'.
placeholder: show-overdraw-feedback, enable-parallel-downloading
validations:
required: true
- type: dropdown
id: is_incognito
attributes:
label: Is this bug happening ONLY in an incognito tab?
multiple: false
options:
- "Yes"
- "No"
- "Always Incognito Mode"
validations:
required: true
- type: dropdown
id: adblock
attributes:
label: Is this bug caused by the adblocker?
description: You can test this by temporarily allowing ads for the site.
multiple: false
options:
- "Yes"
- "No"
validations:
required: true
- type: textarea
id: bug_crash
attributes:
label: Is this bug a crash?
description: |
1. No.
2. Yes, I have attached the crash report dump that I downloaded from `chrome://crashes`
3. Yes, I have copy/pasted the crash dump
placeholder: |
Drag the crash report dump here to attach it or paste the logcat dump individuated with `adb logcat | grep -E '( cr_|cromite|chromium)'`.
validations:
required: true
- type: textarea
id: bug_description
attributes:
label: Describe the bug
description: Write a clear and concise description of the bug.
validations:
required: true
- type: textarea
id: bug_steps
attributes:
label: Steps to reproduce the bug
description: |
Explain how to cause the bug as clearly as possible. Bugs that are not reproducible cannot be investigated.
Also, do not write "any website": please specify which URLs can be used to reproduce the issue.
placeholder: |
Steps to reproduce the bug (e.g.):
1. Go to '...'
2. Click on '...'
3. Scroll down to '...'
4. See error
validations:
required: true
- type: textarea
id: expected_behavior
attributes:
label: Expected behavior
description: A clear and concise description of what you expected to happen.
validations:
required: true
- type: textarea
id: screenshots
attributes:
label: Screenshots
description: |
If applicable, add screenshots to help explain your problem.
Otherwise, ignore this section.
placeholder: |
Drag the screenshot files here to attach them.
validations:
required: false
+23
View File
@@ -0,0 +1,23 @@
---
name: Feature request
about: Suggest a privacy-related idea for this project
---
### Is your feature request related to privacy?
<!-- Features that are not related to privacy are not considered. -->
### Is there a patch available for this feature somewhere?
<!-- If yes then provide URL and license information. -->
### Describe the solution you would like
<!-- A clear and concise description of what you want to happen.
Do not ask "I would like feature X which is available in browser Y"; such issues are closed immediately. -->
### Describe alternatives you have considered
<!-- A clear and concise description of any alternative solutions or features you have considered. -->
@@ -1,69 +0,0 @@
name: Feature request
description: Create a Cromite feature request
body:
- type: markdown
attributes:
value: |
Welcome! Thanks for taking time to submit a feature request.
If this is not a feature request about the Cromite browser, or you are looking for a place
to ask a question to the community then please use the [GitHub Discussions](https://github.com/uazo/cromite/discussions) instead.
Make sure you have acknowledged and completed this template before submitting your issue.
Please read it carefully: incorrect issues will be automatically closed and ignored.
Note:
- Features unrelated to privacy will not be considered.
- Do not ask "I would like feature X which is available in browser Y."
- type: checkboxes
id: preliminary_checklist
attributes:
label: Preliminary checklist
options:
- label: "I have read the [README](https://github.com/uazo/cromite/blob/master/README.md)"
required: true
- label: "I have searched [existing issues](https://github.com/uazo/cromite/issues) for my feature request. This is a new issue (NOT a duplicate) and is not related to another issue."
required: true
- label: "I have searched [wont fix issues](https://github.com/uazo/cromite/issues?q=label%3Awontfix) and this request is not among them"
required: true
- label: "This is a feature request for the Cromite browser; not the website nor F-Droid nor anything else."
required: true
- type: dropdown
id: is_privacy_related
attributes:
label: Is your feature request related to privacy?
description: Features that are not related to privacy are not considered.
multiple: false
options:
- "<please select>"
- "Yes"
- "No"
validations:
required: true
- type: textarea
id: is_patch_available
attributes:
label: Is there a patch available for this feature somewhere?
description: If yes please provide URL and related license information.
validations:
required: true
- type: textarea
id: solution_description
attributes:
label: Describe the solution you would like
description: A clear and concise description of what you want to happen.
validations:
required: true
- type: textarea
id: alternatives_considered
attributes:
label: Describe alternatives you have considered
description: A clear and concise description of any alternative solutions or features you have considered.
validations:
required: true
-15
View File
@@ -1,15 +0,0 @@
## Description
*Please explain here what feature or bugfix these changes are addressing and why they should be included*
## All submissions
* [ ] there are no other open [Pull Requests](../../../pulls) for the same update/change
* [ ] Bromite can be built with these changes
* [ ] I have tested that the new change works as intended (AVD or physical device will do)
### Format
* [ ] patch subject and filename match (e.g. `Subject: Alternative cache (NIK-based)` -> `Alternative-cache-NIK-based.patch`)
* [ ] patch description contains explanation of changes
* [ ] no unnecessary whitespace or unrelated changes
-229
View File
@@ -1,229 +0,0 @@
permissions:
actions: none
checks: none
contents: none
deployments: none
issues: write
packages: none
pull-requests: none
repository-projects: none
security-events: none
statuses: none
on:
workflow_dispatch:
inputs:
version:
description: 'chromium version'
required: false
default: ''
type:
description: 'runner?'
required: false
default: 'ubuntu-latest'
schedule:
- cron: '0 1 * * *'
env:
CHR_VERSION: ${{ github.event.inputs.version }}
NEW_VERSION: ${{ null }}
name: Builds and pushes tagged image to DockerHub
jobs:
generate_build_deps:
name: Generate Build Deps
runs-on: ${{ fromJSON( format('["ubuntu-latest", "{0}"]', github.event.inputs.type) )[github.event.inputs.type != ''] }}
steps:
- name: Reclaiming disk space on / by removing dotnet/android/ghc
#if: ${{ github.event.inputs.type == '' }}
run: |
df -h
DIR=/usr/share/dotnet && sudo rm -rf $DIR
DIR=/usr/local/lib/android && sudo rm -rf $DIR
DIR=/opt/ghc && sudo rm -rf $DIR
DIR=/opt/hostedtoolcache/CodeQL && sudo rm -rf $DIR
DIR=/usr/local/.ghcup && sudo rm -rf $DIR
DIR=/usr/lib/jvm && test -d $DIR && sudo rm -rf $DIR
DIR=/usr/local/julia1.10.5 && test -d $DIR && sudo rm -rf $DIR
DIR=/usr/local/x86_64-linux-gnu && test -d $DIR && sudo rm -rf $DIR
DIR=/usr/local/gcc && test -d $DIR && sudo rm -rf $DIR
DIR=/usr/local/llvm-15 && test -d $DIR && sudo rm -rf $DIR
DIR=/usr/local/llvm-14 && test -d $DIR && sudo rm -rf $DIR
DIR=/usr/local/llvm-13 && test -d $DIR && sudo rm -rf $DIR
DIR=/usr/local/heroku && test -d $DIR && sudo rm -rf $DIR
DIR=/usr/share/swift && test -d $DIR && sudo rm -rf $DIR
DIR=/usr/share/miniconda && test -d $DIR && sudo rm -rf $DIR
DIR=/usr/share/az_12.1.0 && test -d $DIR && sudo rm -rf $DIR
DIR=/usr/local/share/powershell && test -d $DIR && sudo rm -rf $DIR
DIR=/usr/local/share/chromium && test -d $DIR && sudo rm -rf $DIR
DIR=/usr/lib/gcc && test -d $DIR && sudo rm -rf $DIR
DIR=/usr/lib/llvm-15 && test -d $DIR && sudo rm -rf $DIR
DIR=/usr/lib/llvm-14 && test -d $DIR && sudo rm -rf $DIR
DIR=/usr/lib/llvm-13 && test -d $DIR && sudo rm -rf $DIR
sudo apt-get remove google-cloud-cli azure-cli google-chrome-stable \
firefox mysql-server-core-8.0 mono-devel podman \
powershell || true
sudo apt-get autoremove
df -h
- name: Enable proxy on container
shell: bash
if: ${{ github.event.inputs.type != '' && github.event.inputs.type != 'ubuntu-latest' }}
run: |
if ! [[ -z "${HTTP_PROXY}" ]]; then
PROXY_ADDR=http://$(hostname -I | cut -d' ' -f1 | xargs):8118
echo "PROXY_ADDR=$PROXY_ADDR" >> $GITHUB_ENV
sudo iptables -D INPUT -p tcp -s localhost --dport 8118 -j ACCEPT
sudo iptables -D INPUT -p tcp --dport 8118 -j DROP
fi
- name: Checkout repo
uses: actions/checkout@v2
with:
path: cromite
fetch-depth: 1
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Check versions
shell: bash
run: |
if [ -z $CHR_VERSION ]; then
LATEST_WIN=$(curl -s 'https://versionhistory.googleapis.com/v1/chrome/platforms/win64/channels/stable/versions/all/releases' | jq -rc '.releases[].version' | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n | tail -n 1)
LATEST_ANDROID=$(curl -s 'https://versionhistory.googleapis.com/v1/chrome/platforms/android/channels/stable/versions/all/releases' | jq -rc '.releases[].version' | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n | tail -n 1)
CHR_VERSION=$(echo -e "$LATEST_ANDROID\n$LATEST_WIN" | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n | tail -n 1)
echo "LATEST_WIN=$LATEST_WIN" >> $GITHUB_ENV
echo "LATEST_ANDROID=$LATEST_ANDROID" >> $GITHUB_ENV
echo "CHR_VERSION=$CHR_VERSION" >> $GITHUB_ENV
fi
- name: Download regctl
shell: bash
run: |
curl -L https://github.com/regclient/regclient/releases/latest/download/regctl-linux-amd64 >regctl
chmod 755 regctl
- name: Building build-deps container ${{ env.VERSION }}
shell: bash
run: |
IS_PRESENT=$(docker inspect --type=image uazo/build-deps:$CHR_VERSION > /dev/null ; echo $?)
if [ $IS_PRESENT -ne "0" ]; then
IS_PRESENT=$(./regctl image inspect uazo/build-deps:$CHR_VERSION > /dev/null ; echo $?)
if [ $IS_PRESENT -ne "0" ]; then
DOCKER_BUILDKIT=1 docker build -t uazo/build-deps:$CHR_VERSION \
--progress plain \
--build-arg VERSION=$CHR_VERSION \
--build-arg HTTP_PROXY="$PROXY_ADDR" \
--no-cache \
cromite/tools/images/build-deps/.
docker push uazo/build-deps:$CHR_VERSION
echo "NEW_VERSION=$CHR_VERSION" >> $GITHUB_ENV
fi
fi
- name: Building chromium container ${{ env.VERSION }}
shell: bash
run: |
IS_PRESENT=$(docker inspect --type=image uazo/chromium:$CHR_VERSION > /dev/null ; echo $?)
if [ $IS_PRESENT -ne "0" ]; then
IS_PRESENT=$(./regctl image inspect uazo/chromium:$CHR_VERSION > /dev/null ; echo $?)
if [ $IS_PRESENT -ne "0" ]; then
DOCKER_BUILDKIT=1 docker build -t uazo/chromium:$CHR_VERSION \
--progress plain \
--build-arg VERSION=$CHR_VERSION \
--build-arg HTTP_PROXY="$PROXY_ADDR" \
cromite/tools/images/chr-source/.
docker push uazo/chromium:$CHR_VERSION
echo "NEW_VERSION=$CHR_VERSION" >> $GITHUB_ENV
fi
fi
- name: Update files under control
shell: bash
run: |
cd cromite
RELEASE=$(cat build/RELEASE | xargs)
cd tools/under-control
DO_UPDATE=0
if [ -n "$NEW_VERSION" ]; then
if [ "$RELEASE" != "$NEW_VERSION" ]; then
DO_UPDATE=1
fi
elif [ "$RELEASE" != "$(cat src/RELEASE | xargs)" ]; then
DO_UPDATE=1
NEW_VERSION=$RELEASE
fi
if [[ DO_UPDATE -eq 1 ]]; then
echo "Found new version $NEW_VERSION"
echo "Under control: $(cat src/RELEASE | xargs)"
echo "Current: $RELEASE"
test -d src && rm -rf src
docker build --progress=plain --build-arg "TAG=$NEW_VERSION" -o . .
echo $NEW_VERSION >src/RELEASE
fi
CHANGES=0 && git diff --quiet || CHANGES=1
echo "CHANGES=$CHANGES" >> $GITHUB_ENV
if [[ CHANGES -eq 1 ]]; then
git add src
git diff --name-only --staged
fi
- name: Create Pull Request
uses: peter-evans/create-pull-request@c5a7806660adbe173f04e3e038b0ccdcd758773c #v6.1.0
if: env.CHANGES == '1'
with:
token: ${{ secrets.CROMITE_PULLS }}
path: cromite
add-paths: |
tools/under-control/*
commit-message: '[AUTO][FILECONTROL] - version ${{ env.NEW_VERSION }}'
title: '[AUTO][FILECONTROL] - version ${{ env.NEW_VERSION }}'
body: ${{ env.MESSAGE }}
delete-branch: true
branch-suffix: short-commit-hash
- name: Create issue ${{ env.VERSION }}
if: "${{ env.NEW_VERSION != '' }}"
shell: bash
run: |
GH=../../gh_2.18.1_linux_amd64/bin/gh
wget https://github.com/cli/cli/releases/download/v2.18.1/gh_2.18.1_linux_amd64.tar.gz
tar xfz gh_2.18.1_linux_amd64.tar.gz
cd cromite/tools
echo ${{ secrets.GITHUB_TOKEN }} | $GH auth login --with-token
echo Custom Release $CHR_VERSION >body.txt
if [[ "$LATEST_WIN" == "$CHR_VERSION" ]]; then
echo Using Windows Release >body.txt
echo "\`\`\`" >>body.txt
curl -s 'https://chromiumdash.appspot.com/fetch_releases?channel=Stable&platform=Windows&num=10&offset=0' | \
jq --arg LATEST "$LATEST_WIN" '.[] | select( .version == $LATEST )' >>body.txt
echo "\`\`\`" >>body.txt
fi
if [[ "$LATEST_ANDROID" == "$CHR_VERSION" ]]; then
echo Using Android Release >body.txt
echo "\`\`\`" >>body.txt
curl -s 'https://chromiumdash.appspot.com/fetch_releases?channel=Stable&platform=Android&num=10&offset=0' | \
jq --arg LATEST "$LATEST_ANDROID" '.[] | select( .version == $LATEST )' >>body.txt
echo "\`\`\`" >>body.txt
fi
$GH issue create -t "$CHR_VERSION: new chromium version" -F body.txt
-46
View File
@@ -1,46 +0,0 @@
name: Build Sysbox
permissions:
contents: write
on:
workflow_dispatch:
inputs:
sha:
description: 'Sysbox SHA'
required: true
default: ''
env:
SYSBOX_SHA: ${{ github.event.inputs.sha }}
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v2
with:
path: cromite
fetch-depth: 1
- name: Build patched sysbox
run: |
git clone --recursive https://github.com/nestybox/sysbox.git
cd sysbox
git checkout $SYSBOX_SHA
git submodule update --recursive
cd sysbox-runc/
git apply --ignore-whitespace ../../cromite/tools/images/sysbox/add-x86-x32-arch.patch
git status
cd ..
make sysbox-static TARGET_ARCH=x64
zip -r build.zip build
- name: Publish
uses: actions/upload-artifact@v2
with:
name: build.zip
path: sysbox/build.zip
@@ -1,244 +0,0 @@
name: Build Additional Targets
permissions:
actions: none
checks: none
contents: none
deployments: none
issues: none
packages: none
pull-requests: none
repository-projects: none
security-events: none
statuses: none
on:
workflow_dispatch:
inputs:
sha:
description: 'uazo/cromite SHA'
required: true
default: ''
type:
description: 'runner? [dev/ci]'
required: true
default: 'ci'
debug:
description: 'debug? [true/false]'
required: true
default: 'false'
env:
CROMITE_SHA: ${{ github.event.inputs.sha }}
REMOVEDOCKERSUPPORT: true
USELOCALIMAGE: true
jobs:
check_images:
runs-on: ${{ github.event.inputs.type }}
steps:
- name: Checkout repo
uses: actions/checkout@v2
with:
path: cromite
ref: ${{ github.event.inputs.sha }}
fetch-depth: 1
- name: Enable proxy on container
shell: bash
run: |
if ! [[ -z "${HTTP_PROXY}" ]]; then
PROXY_ADDR=http://$(hostname -I | cut -d' ' -f1 | xargs):8118
echo "PROXY_ADDR=$PROXY_ADDR" >> $GITHUB_ENV
sudo iptables -D INPUT -p tcp -s localhost --dport 8118 -j ACCEPT
sudo iptables -D INPUT -p tcp --dport 8118 -j DROP
fi
- name: Get current chromium version
shell: bash
run: |
export VERSION=$( cat ./cromite/build/RELEASE )
echo Current version is $VERSION
echo "VERSION=$VERSION" >> $GITHUB_ENV
cd cromite/tools
- name: Get uazo/cromite-build from docker hub if present
shell: bash
run: |
IS_PRESENT=$(docker manifest inspect uazo/cromite-build:$VERSION-$CROMITE_SHA > /dev/null ; echo $?)
if [ $IS_PRESENT -eq "0" ]; then
docker pull uazo/cromite-build:$VERSION-$CROMITE_SHA
fi
- name: Mark image to build
shell: bash
run: |
IS_PRESENT=$(docker inspect --type=image uazo/cromite-build:build > /dev/null ; echo $?)
if [ $IS_PRESENT -eq "0" ]; then
docker rmi uazo/cromite-build:build
fi
docker tag uazo/cromite-build:$VERSION-$CROMITE_SHA uazo/cromite-build:build
build:
runs-on: ${{ github.event.inputs.type }}
needs: check_images
if: success()
timeout-minutes: 1440
container:
image: uazo/cromite-build:build
env:
REMOVEDOCKERSUPPORT: true # CUSTOM RUNNER: remove sharing of docker socket
USELOCALIMAGE: true # CUSTOM RUNNER: permit use of local images
USEINTERNALNETWORK: true # CUSTOM RUNNER: create the docker network as internal
WORKSPACE: /home/lg/working_dir
# kythe
KYTHE_CORPUS: chromium.googlesource.com/chromium/src
KYTHE_ROOT_DIRECTORY: /home/lg/working_dir/chromium/src
KYTHE_OUTPUT_DIRECTORY: /home/lg/working_dir/chromium/src/out/arm64/kythe
# cross build
DEPOT_TOOLS_WIN_TOOLCHAIN_BASE_URL: /win_sdk/10.0.22621.0/
WINDOWSSDKDIR: "/win_sdk/10.0.22621.0/Windows Kits/10/"
GYP_MSVS_OVERRIDE_PATH: /win_sdk/10.0.22621.0/
# compile in debug mode
TARGET_ISDEBUG: ${{ github.event.inputs.debug }}
USE_KEYSTORE: true
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
CROMITE_PREF_HASH_SEED_BIN: ${{ secrets.CROMITE_PREF_HASH_SEED_BIN }}
volumes:
- /storage/images/${{ github.event.inputs.sha }}/android/${{ github.event.inputs.debug }}/chr_arm:/home/lg/working_dir/chromium/src/out/chr_arm
- /storage/images/${{ github.event.inputs.sha }}/android/${{ github.event.inputs.debug }}/chr_arm64:/home/lg/working_dir/chromium/src/out/chr_arm64
- /storage/images/${{ github.event.inputs.sha }}/android/${{ github.event.inputs.debug }}/chr_x64:/home/lg/working_dir/chromium/src/out/chr_x64
- /storage/images/${{ github.event.inputs.sha }}/android/${{ github.event.inputs.debug }}/x64_webview:/home/lg/working_dir/chromium/src/out/x64_webview
- /tmp/proxy:/tmp/proxy
- /win_sdk:/win_sdk
steps:
- name: Prepare Build Container
shell: bash
run: |
# set workspace paths
PATH=$WORKSPACE/chromium/src/third_party/llvm-build/Release+Asserts/bin:$WORKSPACE/depot_tools/:/usr/local/go/bin:$WORKSPACE/mtool/bin:$PATH
cd $WORKSPACE
# reset proxy env
HTTP_PROXY=
HTTPS_PROXY=
http_proxy=
https_proxy=
# set out folder permissions
test -d chromium/src/out/chr_arm || sudo mkdir -p chromium/src/out/chr_arm && \
sudo chown lg chromium/src/out &&
sudo chown lg chromium/src/out/chr_arm
test -d chromium/src/out/chr_arm64 || sudo mkdir -p chromium/src/out/chr_arm64 && \
sudo chown lg chromium/src/out &&
sudo chown lg chromium/src/out/chr_arm64
test -d chromium/src/out/chr_x64 || sudo mkdir -p chromium/src/out/chr_x64 && \
sudo chown lg chromium/src/out &&
sudo chown lg chromium/src/out/chr_x64
test -d chromium/src/out/x64_webview || sudo mkdir -p chromium/src/out/x64_webview && \
sudo chown lg chromium/src/out &&
sudo chown lg chromium/src/out/x64_webview
sudo mkdir -p /run/user/1000/
sudo chown lg /run/user/1000/
sudo chmod g-rxw /run/user/1000/
sudo chmod o-rxw /run/user/1000/
# prepare keystore
echo "::group::-------- prepare keystore"
cd $WORKSPACE
echo "${{ secrets.KEYSTORE }}" > cromite.keystore.asc
gpg --homedir ./ -d --passphrase "${{ secrets.KEYSTORE_PASSPHRASE }}" --batch cromite.keystore.asc > cromite.keystore
echo "::endgroup::"
- name: Build Cromite System WebView x64
shell: bash
run: |
PATH=$WORKSPACE/chromium/src/third_party/llvm-build/Release+Asserts/bin:$WORKSPACE/depot_tools/:/usr/local/go/bin:$WORKSPACE/mtool/bin:$PATH
cd $WORKSPACE/chromium/src
echo "::group::-------- gn gen"
gn gen --args="target_os = \"android\" target_cpu = \"x64\" $(cat /home/lg/working_dir/cromite/build/cromite.gn_args) system_webview_package_name=\"com.android.webview\" enable_trybot_verification=false " out/x64_webview
echo "::endgroup::"
echo "::group::-------- gn args"
gn args out/x64_webview/ --list --short
gn args out/x64_webview/ --list >out/x64_webview/gn_list
echo "::endgroup::"
vpython3 /home/lg/working_dir/depot_tools/siso.py ninja -C out/x64_webview system_webview_apk system_webview_shell --offline
cp ../../cromite/build/RELEASE out/x64_webview
- name: Prepare Build Container for vanilla chromium
shell: bash
run: |
# set workspace paths
PATH=$WORKSPACE/chromium/src/third_party/llvm-build/Release+Asserts/bin:$WORKSPACE/depot_tools/:/usr/local/go/bin:$WORKSPACE/mtool/bin:$PATH
cd $WORKSPACE/chromium/src
# checkout chromium commit
LAST_PATCH=$(git log --all --grep='Fix-chromium-vanilla.patch' --format="%H")
git checkout $LAST_PATCH
- name: Build Chromium Vanilla Android x64
shell: bash
run: |
PATH=$WORKSPACE/chromium/src/third_party/llvm-build/Release+Asserts/bin:$WORKSPACE/depot_tools/:/usr/local/go/bin:$WORKSPACE/mtool/bin:$PATH
cd $WORKSPACE/chromium/src
echo "::group::-------- gn gen"
gn gen --args="target_os = \"android\" $(cat /home/lg/working_dir/cromite/build/chromium.gn_args) target_cpu = \"x64\" " out/chr_x64
echo "::endgroup::"
echo "::group::-------- gn args"
gn args out/chr_x64/ --list --short
gn args out/chr_x64/ --list >out/chr_x64/gn_list
echo "::endgroup::"
vpython3 /home/lg/working_dir/depot_tools/siso.py ninja -C out/chr_x64 chrome_public_apk --offline
cp ../../cromite/build/RELEASE out/chr_x64
- name: Build Chromium Vanilla Android arm64
shell: bash
run: |
PATH=$WORKSPACE/chromium/src/third_party/llvm-build/Release+Asserts/bin:$WORKSPACE/depot_tools/:/usr/local/go/bin:$WORKSPACE/mtool/bin:$PATH
cd $WORKSPACE/chromium/src
echo "::group::-------- gn gen"
gn gen --args="target_os = \"android\" $(cat /home/lg/working_dir/cromite/build/chromium.gn_args) target_cpu = \"arm64\" " out/chr_arm64
echo "::endgroup::"
echo "::group::-------- gn args"
gn args out/chr_arm64/ --list --short
gn args out/chr_arm64/ --list >out/chr_arm64/gn_list
echo "::endgroup::"
vpython3 /home/lg/working_dir/depot_tools/siso.py ninja -C out/chr_arm64 chrome_public_apk --offline
cp ../../cromite/build/RELEASE out/chr_arm64
- name: Build Chromium Vanilla Android arm
shell: bash
run: |
PATH=$WORKSPACE/chromium/src/third_party/llvm-build/Release+Asserts/bin:$WORKSPACE/depot_tools/:/usr/local/go/bin:$WORKSPACE/mtool/bin:$PATH
cd $WORKSPACE/chromium/src
echo "::group::-------- gn gen"
gn gen --args="target_os = \"android\" $(cat /home/lg/working_dir/cromite/build/chromium.gn_args) target_cpu = \"arm\" " out/chr_arm
echo "::endgroup::"
echo "::group::-------- gn args"
gn args out/chr_arm/ --list --short
gn args out/chr_arm/ --list >out/chr_arm/gn_list
echo "::endgroup::"
vpython3 /home/lg/working_dir/depot_tools/siso.py ninja -C out/chr_arm chrome_public_apk --offline
cp ../../cromite/build/RELEASE out/chr_arm
-461
View File
@@ -1,461 +0,0 @@
name: Build Cromite
permissions:
actions: none
checks: none
contents: none
deployments: none
issues: none
packages: none
pull-requests: none
repository-projects: none
security-events: none
statuses: none
on:
workflow_dispatch:
inputs:
sha:
description: 'uazo/cromite SHA'
required: true
default: ''
target_os:
description: 'targetos [android/win/linux/all]'
required: true
default: 'all'
build:
description: 'android arch [arm/arm64/x64/all]'
required: true
default: 'all'
type:
description: 'runner? [dev/ci]'
required: true
default: 'ci'
debug:
description: 'debug? [true/false]'
required: true
default: 'false'
clangd:
description: 'clangd? [true/false]'
required: true
default: 'false'
env:
CROMITE_SHA: ${{ github.event.inputs.sha }}
REMOVEDOCKERSUPPORT: true
USELOCALIMAGE: true
jobs:
check_images:
runs-on: ${{ github.event.inputs.type }}
steps:
- name: Checkout repo
uses: actions/checkout@v2
with:
path: cromite
ref: ${{ github.event.inputs.sha }}
fetch-depth: 1
- name: Enable proxy on container
shell: bash
run: |
if ! [[ -z "${HTTP_PROXY}" ]]; then
PROXY_ADDR=http://$(hostname -I | cut -d' ' -f1 | xargs):8118
echo "PROXY_ADDR=$PROXY_ADDR" >> $GITHUB_ENV
sudo iptables -D INPUT -p tcp -s localhost --dport 8118 -j ACCEPT
sudo iptables -D INPUT -p tcp --dport 8118 -j DROP
fi
- name: Download regctl
shell: bash
run: |
curl -L https://github.com/regclient/regclient/releases/latest/download/regctl-linux-amd64 >regctl
chmod 755 regctl
- name: Get current chromium version
shell: bash
run: |
export VERSION=$( cat ./cromite/build/RELEASE )
echo Current version is $VERSION
echo "VERSION=$VERSION" >> $GITHUB_ENV
cd cromite/tools
- name: Building build-deps container ${{ env.VERSION }}
shell: bash
run: |
docker pull uazo/build-deps:$VERSION || true
IS_PRESENT=$(docker inspect --type=image uazo/build-deps:$VERSION > /dev/null ; echo $?)
if [ $IS_PRESENT -ne "0" ]; then
IS_PRESENT=$(./regctl image inspect uazo/build-deps:$VERSION > /dev/null ; echo $?)
if [ $IS_PRESENT -ne "0" ]; then
DOCKER_BUILDKIT=1 docker build -t uazo/build-deps:$VERSION \
--progress plain \
--build-arg VERSION=$VERSION \
--build-arg HTTP_PROXY="$PROXY_ADDR" \
--no-cache \
cromite/tools/images/build-deps/.
fi
fi
- name: Building chromium container ${{ env.VERSION }}
shell: bash
run: |
docker pull uazo/chromium:$VERSION || true
IS_PRESENT=$(docker inspect --type=image uazo/chromium:$VERSION > /dev/null ; echo $?)
if [ $IS_PRESENT -ne "0" ]; then
IS_PRESENT=$(./regctl image inspect uazo/chromium:$VERSION > /dev/null ; echo $?)
if [ $IS_PRESENT -ne "0" ]; then
DOCKER_BUILDKIT=1 docker build -t uazo/chromium:$VERSION \
--progress plain \
--build-arg VERSION=$VERSION \
--build-arg HTTP_PROXY="$PROXY_ADDR" \
cromite/tools/images/chr-source/.
fi
fi
- name: Building cromite container ${{ env.VERSION }}-${{ env.CROMITE_SHA }}
shell: bash
run: |
docker pull uazo/cromite:$VERSION-$CROMITE_SHA || true
IS_PRESENT=$(docker inspect --type=image uazo/cromite:$VERSION-$CROMITE_SHA > /dev/null ; echo $?)
if [ $IS_PRESENT -ne "0" ]; then
IS_PRESENT=$(./regctl image inspect uazo/cromite:$VERSION-$CROMITE_SHA > /dev/null ; echo $?)
if [ $IS_PRESENT -ne "0" ]; then
DOCKER_BUILDKIT=1 docker build -t uazo/cromite:$VERSION-$CROMITE_SHA --progress plain \
--build-arg CROMITE_SHA=$CROMITE_SHA \
--build-arg VERSION=$VERSION \
--build-arg HTTP_PROXY="$PROXY_ADDR" \
cromite/tools/images/cromite-source/.
fi
fi
- name: Building cromite-build container ${{ env.VERSION }}-${{ env.CROMITE_SHA }}
shell: bash
run: |
docker pull uazo/cromite-build:$VERSION-$CROMITE_SHA || true
IS_PRESENT=$(docker inspect --type=image uazo/cromite-build:$VERSION-$CROMITE_SHA > /dev/null ; echo $?)
if [ $IS_PRESENT -ne "0" ]; then
IS_PRESENT=$(./regctl image inspect uazo/cromite-build:$VERSION-$CROMITE_SHA > /dev/null ; echo $?)
if [ $IS_PRESENT -ne "0" ]; then
DOCKER_BUILDKIT=1 docker build -t uazo/cromite-build:$VERSION-$CROMITE_SHA --progress plain \
--build-arg CROMITE_SHA=$CROMITE_SHA \
--build-arg VERSION=$VERSION \
--build-arg HTTP_PROXY="$PROXY_ADDR" \
--no-cache \
cromite/tools/images/cromite-build/.
fi
fi
- name: Get uazo/cromite-build from docker hub if present
shell: bash
run: |
IS_PRESENT=$(./regctl image inspect uazo/cromite-build:$VERSION-$CROMITE_SHA > /dev/null ; echo $?)
if [ $IS_PRESENT -eq "0" ]; then
docker pull uazo/cromite-build:$VERSION-$CROMITE_SHA
fi
- name: Mark image to build
shell: bash
run: |
IS_PRESENT=$(docker inspect --type=image uazo/cromite-build:build > /dev/null ; echo $?)
if [ $IS_PRESENT -eq "0" ]; then
docker rmi uazo/cromite-build:build
fi
docker tag uazo/cromite-build:$VERSION-$CROMITE_SHA uazo/cromite-build:build
build:
runs-on: ${{ github.event.inputs.type }}
needs: check_images
if: success()
timeout-minutes: 1440
container:
image: uazo/cromite-build:build
env:
REMOVEDOCKERSUPPORT: true # CUSTOM RUNNER: remove sharing of docker socket
USELOCALIMAGE: true # CUSTOM RUNNER: permit use of local images
USEINTERNALNETWORK: true # CUSTOM RUNNER: create the docker network as internal
WORKSPACE: /home/lg/working_dir
# kythe
KYTHE_CORPUS: chromium.googlesource.com/chromium/src
KYTHE_ROOT_DIRECTORY: /home/lg/working_dir/chromium/src
KYTHE_OUTPUT_DIRECTORY: /home/lg/working_dir/chromium/src/out/arm64/kythe
# cross build (change also release.yaml)
DEPOT_TOOLS_WIN_TOOLCHAIN_BASE_URL: /win_sdk/sdks/Win11SDK_10.0.26100.0/
WINDOWSSDKDIR: "/win_sdk/sdks/Win11SDK_10.0.26100.0/Windows Kits/10/"
GYP_MSVS_OVERRIDE_PATH: /win_sdk/sdks/Win11SDK_10.0.26100.0/
# compile in debug mode
TARGET_ISDEBUG: ${{ github.event.inputs.debug }}
TARGET_OS: ${{ github.event.inputs.target_os }}
USE_KEYSTORE: true
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
CROMITE_PREF_HASH_SEED_BIN: ${{ secrets.CROMITE_PREF_HASH_SEED_BIN }}
volumes:
- /storage/images/${{ github.event.inputs.sha }}/android/${{ github.event.inputs.debug }}/arm:/home/lg/working_dir/chromium/src/out/arm
- /storage/images/${{ github.event.inputs.sha }}/android/${{ github.event.inputs.debug }}/arm64:/home/lg/working_dir/chromium/src/out/arm64
- /storage/images/${{ github.event.inputs.sha }}/android/${{ github.event.inputs.debug }}/x64:/home/lg/working_dir/chromium/src/out/x64
- /storage/images/${{ github.event.inputs.sha }}/linux/${{ github.event.inputs.debug }}/lin64:/home/lg/working_dir/chromium/src/out/lin64
- /storage/images/${{ github.event.inputs.sha }}/win/x64:/home/lg/working_dir/chromium/src/out/win64
- /storage/images/${{ github.event.inputs.sha }}/android/${{ github.event.inputs.debug }}/arm64_webview:/home/lg/working_dir/chromium/src/out/arm64_webview
- /tmp/proxy:/tmp/proxy
- /win_sdk:/win_sdk
steps:
- name: Prepare Build Container
shell: bash
run: |
# set workspace paths
PATH=$WORKSPACE/chromium/src/third_party/llvm-build/Release+Asserts/bin:$WORKSPACE/depot_tools/:/usr/local/go/bin:$WORKSPACE/mtool/bin:$PATH
cd $WORKSPACE
# reset proxy env
HTTP_PROXY=
HTTPS_PROXY=
http_proxy=
https_proxy=
# set out folder permissions
test -d chromium/src/out/arm || sudo mkdir -p chromium/src/out/arm && \
sudo chown lg chromium/src/out &&
sudo chown lg chromium/src/out/arm
test -d chromium/src/out/arm64 || sudo mkdir -p chromium/src/out/arm64 && \
sudo chown lg chromium/src/out &&
sudo chown lg chromium/src/out/arm64
test -d chromium/src/out/win64 || sudo mkdir -p chromium/src/out/win64 && \
sudo chown lg chromium/src/out &&
sudo chown lg chromium/src/out/win64
test -d chromium/src/out/x64 || sudo mkdir -p chromium/src/out/x64 && \
sudo chown lg chromium/src/out &&
sudo chown lg chromium/src/out/x64
test -d chromium/src/out/lin64 || sudo mkdir -p chromium/src/out/lin64 && \
sudo chown lg chromium/src/out &&
sudo chown lg chromium/src/out/lin64
test -d chromium/src/out/arm64_webview || sudo mkdir -p chromium/src/out/arm64_webview && \
sudo chown lg chromium/src/out &&
sudo chown lg chromium/src/out/arm64_webview
# make kythe output directory
test -d $KYTHE_OUTPUT_DIRECTORY || mkdir -p $KYTHE_OUTPUT_DIRECTORY
sudo mkdir -p /run/user/1000/
sudo chown lg /run/user/1000/
sudo chmod g-rxw /run/user/1000/
sudo chmod o-rxw /run/user/1000/
# prepare keystore
echo "::group::-------- prepare keystore"
cd $WORKSPACE
echo "${{ secrets.KEYSTORE }}" > cromite.keystore.asc
gpg --homedir ./ -d --passphrase "${{ secrets.KEYSTORE_PASSPHRASE }}" --batch cromite.keystore.asc > cromite.keystore
echo "::endgroup::"
# bootstrap python3 for gn
echo ../../../../../usr/bin >$WORKSPACE/depot_tools/python3_bin_reldir.txt
- name: Build Cromite Android x64
if: ${{ (github.event.inputs.target_os == 'android' || github.event.inputs.target_os == 'all') && (github.event.inputs.build == 'x64' || github.event.inputs.build == 'all') }}
shell: bash
run: |
PATH=$WORKSPACE/chromium/src/third_party/llvm-build/Release+Asserts/bin:$WORKSPACE/depot_tools/:/usr/local/go/bin:$WORKSPACE/mtool/bin:$PATH
cd $WORKSPACE/chromium/src
echo "::group::-------- gn gen"
gn gen --args="target_os = \"android\" $(cat /home/lg/working_dir/cromite/build/cromite.gn_args) target_cpu = \"x64\" " out/x64
echo "::endgroup::"
echo "::group::-------- gn args"
gn args out/x64/ --list --short
gn args out/x64/ --list >out/x64/gn_list
echo "::endgroup::"
vpython3 /home/lg/working_dir/depot_tools/siso.py ninja -C out/x64 chrome_public_bundle --offline
vpython3 /home/lg/working_dir/depot_tools/siso.py ninja -C out/x64 chrome_public_apk --offline
cp ../../cromite/build/RELEASE out/x64
- name: Get ninja logs Android x64
if: ${{ (github.event.inputs.target_os == 'android' || github.event.inputs.target_os == 'all') && (github.event.inputs.build == 'x64' || github.event.inputs.build == 'all') }}
shell: bash
run: |
cd $WORKSPACE
$WORKSPACE/ninjatracing/ninjatracing -a $WORKSPACE/chromium/src/out/x64/.ninja_log >$WORKSPACE/chromium/src/out/x64/ninja_log_trace.json
python3 $WORKSPACE/chromium/src/third_party/catapult/tracing/bin/trace2html $WORKSPACE/chromium/src/out/x64/ninja_log_trace.json
- name: Build Cromite Windows x64
if: ${{ github.event.inputs.target_os == 'win' || github.event.inputs.target_os == 'all' }}
shell: bash
run: |
PATH=$WORKSPACE/chromium/src/third_party/llvm-build/Release+Asserts/bin:$WORKSPACE/depot_tools/:/usr/local/go/bin:$WORKSPACE/mtool/bin:$PATH
cd $WORKSPACE/chromium/src
echo "::group::-------- gn gen"
gn gen --args="target_os = \"win\" $(cat /home/lg/working_dir/cromite/build/cromite.gn_args) target_cpu = \"x64\" " out/win64
echo "::endgroup::"
echo "::group::-------- gn args"
gn args out/win64/ --list --short
gn args out/win64/ --list >out/win64/gn_list
echo "::endgroup::"
vpython3 /home/lg/working_dir/depot_tools/siso.py ninja -C out/win64 chrome --offline
cp ../../cromite/build/RELEASE out/win64
- name: Get ninja logs Windows x64
if: ${{ github.event.inputs.target_os == 'win' || github.event.inputs.target_os == 'all' }}
shell: bash
run: |
cd $WORKSPACE
$WORKSPACE/ninjatracing/ninjatracing -a $WORKSPACE/chromium/src/out/win64/.ninja_log >$WORKSPACE/chromium/src/out/win64/ninja_log_trace.json
python3 $WORKSPACE/chromium/src/third_party/catapult/tracing/bin/trace2html $WORKSPACE/chromium/src/out/win64/ninja_log_trace.json
- name: Build Cromite Android arm64
if: ${{ (github.event.inputs.target_os == 'android' || github.event.inputs.target_os == 'all') && (github.event.inputs.build == 'arm64' || github.event.inputs.build == 'all') }}
shell: bash
run: |
PATH=$WORKSPACE/chromium/src/third_party/llvm-build/Release+Asserts/bin:$WORKSPACE/depot_tools/:/usr/local/go/bin:$WORKSPACE/mtool/bin:$PATH
cd $WORKSPACE/chromium/src
echo "::group::-------- gn gen"
gn gen --args="target_os = \"android\" $(cat /home/lg/working_dir/cromite/build/cromite.gn_args) target_cpu = \"arm64\" " out/arm64
echo "::endgroup::"
echo "::group::-------- gn args"
gn args out/arm64/ --list --short
gn args out/arm64/ --list >out/arm64/gn_list
echo "::endgroup::"
vpython3 /home/lg/working_dir/depot_tools/siso.py ninja -C out/arm64 chrome_public_bundle --offline
vpython3 /home/lg/working_dir/depot_tools/siso.py ninja -C out/arm64 chrome_public_apk --offline
cp ../../cromite/build/RELEASE out/arm64
- name: Get ninja logs Android arm64
if: ${{ (github.event.inputs.target_os == 'android' || github.event.inputs.target_os == 'all') && (github.event.inputs.build == 'arm64' || github.event.inputs.build == 'all') }}
shell: bash
run: |
cd $WORKSPACE
$WORKSPACE/ninjatracing/ninjatracing -a $WORKSPACE/chromium/src/out/arm64/.ninja_log >$WORKSPACE/chromium/src/out/arm64/ninja_log_trace.json
python3 $WORKSPACE/chromium/src/third_party/catapult/tracing/bin/trace2html $WORKSPACE/chromium/src/out/arm64/ninja_log_trace.json
- name: Generate breakpad symbols for Android arm64
if: ${{ (github.event.inputs.target_os == 'android' || github.event.inputs.target_os == 'all') && (github.event.inputs.build == 'arm64' || github.event.inputs.build == 'all') }}
shell: bash
run: |
PATH=$WORKSPACE/chromium/src/third_party/llvm-build/Release+Asserts/bin:$WORKSPACE/depot_tools/:/usr/local/go/bin:$WORKSPACE/mtool/bin:$PATH
cd $WORKSPACE/chromium/src
echo "::group::-------- generating breakpad symbols"
vpython3 /home/lg/working_dir/depot_tools/siso.py ninja -C out/arm64 minidump_stackwalk dump_syms --offline
components/crash/content/tools/generate_breakpad_symbols.py --build-dir=out/arm64 \
--symbols-dir=out/arm64/symbols/ --binary=out/arm64/lib.unstripped/libchrome.so \
--platform=android --clear --verbose
cp out/arm64/lib.unstripped/libchrome.so out/arm64/symbols/libchrome.lib.so
cp out/arm64/minidump_stackwalk out/arm64/symbols
cp out/arm64/dump_syms out/arm64/symbols
echo "::endgroup::"
- name: Generate Supersize data for Android arm64
if: ${{ github.event.inputs.debug == 'false' && (github.event.inputs.target_os == 'android' || github.event.inputs.target_os == 'all') && (github.event.inputs.build == 'arm64' || github.event.inputs.build == 'all') }}
shell: bash
run: |
PATH=$WORKSPACE/chromium/src/third_party/llvm-build/Release+Asserts/bin:$WORKSPACE/depot_tools/:/usr/local/go/bin:$WORKSPACE/mtool/bin:$PATH
cd $WORKSPACE/chromium/src
vpython3 tools/binary_size/libsupersize/main.py archive out/arm64/chrome.size --apk-file out/arm64/apks/ChromePublic.apk -v
- name: Build Cromite Android arm
if: ${{ (github.event.inputs.target_os == 'android' || github.event.inputs.target_os == 'all') && (github.event.inputs.build == 'arm' || github.event.inputs.build == 'all') }}
shell: bash
run: |
PATH=$WORKSPACE/chromium/src/third_party/llvm-build/Release+Asserts/bin:$WORKSPACE/depot_tools/:/usr/local/go/bin:$WORKSPACE/mtool/bin:$PATH
cd $WORKSPACE/chromium/src
echo "::group::-------- gn gen"
gn gen --args="target_os = \"android\" $(cat /home/lg/working_dir/cromite/build/cromite.gn_args) target_cpu = \"arm\" " out/arm
echo "::endgroup::"
echo "::group::-------- gn args"
gn args out/arm/ --list --short
gn args out/arm/ --list >out/arm/gn_list
echo "::endgroup::"
vpython3 /home/lg/working_dir/depot_tools/siso.py ninja -C out/arm chrome_public_bundle --offline
vpython3 /home/lg/working_dir/depot_tools/siso.py ninja -C out/arm chrome_public_apk --offline
cp ../../cromite/build/RELEASE out/arm
- name: Get ninja logs Android arm
if: ${{ (github.event.inputs.target_os == 'android' || github.event.inputs.target_os == 'all') && (github.event.inputs.build == 'arm' || github.event.inputs.build == 'all') }}
shell: bash
run: |
cd $WORKSPACE
$WORKSPACE/ninjatracing/ninjatracing -a $WORKSPACE/chromium/src/out/arm/.ninja_log >$WORKSPACE/chromium/src/out/arm/ninja_log_trace.json
python3 $WORKSPACE/chromium/src/third_party/catapult/tracing/bin/trace2html $WORKSPACE/chromium/src/out/arm/ninja_log_trace.json
- name: Build Cromite Linux 64
if: ${{ (github.event.inputs.target_os == 'linux' || github.event.inputs.target_os == 'all') }}
shell: bash
run: |
PATH=$WORKSPACE/chromium/src/third_party/llvm-build/Release+Asserts/bin:$WORKSPACE/depot_tools/:/usr/local/go/bin:$WORKSPACE/mtool/bin:$PATH
cd $WORKSPACE/chromium/src
echo "::group::-------- gn gen"
gn gen --args="target_os = \"linux\" $(cat /home/lg/working_dir/cromite/build/cromite.gn_args) target_cpu = \"x64\" " out/lin64
echo "::endgroup::"
echo "::group::-------- gn args"
gn args out/lin64/ --list --short
gn args out/lin64/ --list >out/lin64/gn_list
echo "::endgroup::"
vpython3 /home/lg/working_dir/depot_tools/siso.py ninja -C out/lin64 chrome chrome_sandbox --offline
cp ../../cromite/build/RELEASE out/lin64
- name: Get ninja logs Linux 64
if: ${{ (github.event.inputs.target_os == 'linux' || github.event.inputs.target_os == 'all') }}
shell: bash
run: |
cd $WORKSPACE
$WORKSPACE/ninjatracing/ninjatracing -a $WORKSPACE/chromium/src/out/lin64/.ninja_log >$WORKSPACE/chromium/src/out/lin64/ninja_log_trace.json
python3 $WORKSPACE/chromium/src/third_party/catapult/tracing/bin/trace2html $WORKSPACE/chromium/src/out/lin64/ninja_log_trace.json
- name: Build Cromite System WebView arm64
shell: bash
run: |
PATH=$WORKSPACE/chromium/src/third_party/llvm-build/Release+Asserts/bin:$WORKSPACE/depot_tools/:/usr/local/go/bin:$WORKSPACE/mtool/bin:$PATH
cd $WORKSPACE/chromium/src
echo "::group::-------- gn gen"
gn gen --args="target_os = \"android\" target_cpu = \"arm64\" $(cat /home/lg/working_dir/cromite/build/cromite.gn_args) system_webview_package_name=\"com.android.webview\" enable_trybot_verification=false " out/arm64_webview
echo "::endgroup::"
echo "::group::-------- gn args"
gn args out/arm64_webview/ --list --short
gn args out/arm64_webview/ --list >out/arm64_webview/gn_list
echo "::endgroup::"
vpython3 /home/lg/working_dir/depot_tools/siso.py ninja -C out/arm64_webview system_webview_apk system_webview_shell --offline
cp ../../cromite/build/RELEASE out/arm64_webview
- name: Generate clangd index for Android arm64
if: ${{ github.event.inputs.clangd == 'true' }}
shell: bash
run: |
PATH=$WORKSPACE/chromium/src/third_party/llvm-build/Release+Asserts/bin:$WORKSPACE/depot_tools/:/usr/local/go/bin:$WORKSPACE/mtool/bin:$PATH
cd $WORKSPACE/chromium/src
test -f out/arm64/cromite.idx || \
cp -r out/arm64 out/clangd && \
gn gen --args="import(\"/home/lg/working_dir/cromite/build/cromite.gn_args\") $(cat ../../build_args.gni) skip_clangd_unsupported_options = true" out/clangd && \
$WORKSPACE/ninja/ninja -C $WORKSPACE/chromium/src/out/clangd -a chrome_public_apk \
-t compdb cc cxx objc objcxx >$WORKSPACE/chromium/src/out/clangd/compile_commands.json && \
/home/lg/working_dir/clangd_snapshot_20250518/bin/clangd-indexer --executor=all-TUs out/clangd/compile_commands.json >out/arm64/cromite.idx && \
rm -rf out/clangd
-154
View File
@@ -1,154 +0,0 @@
name: Check git apply
permissions:
# actions: none
# checks: none
# contents: write
# deployments: none
# issues: none
# packages: none
pull-requests: write
# repository-projects: none
# security-events: none
# statuses: none
on:
push:
branches-ignore:
- 'ci'
paths:
- 'build/**'
workflow_dispatch:
inputs:
rtag:
description: 'uazo/cromite TAG or COMMIT'
required: true
default: ''
env:
RTAG: ${{ github.event.inputs.rtag }}
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: "Get value from dispatch"
run: |
if [ -z "${RTAG}" ]; then
echo "RTAG=$GITHUB_SHA" >> $GITHUB_ENV
echo "RTAG=$RTAG"
fi
- name: Prepare container
run: |
sudo apt update
sudo apt install -y wget unzip tar sed dos2unix patchutils wiggle curl
wget https://github.com/uazo/superpatch/releases/latest/download/SuperPatchUtils.tar.gz
tar xfz SuperPatchUtils.tar.gz
rm SuperPatchUtils.tar.gz
wget https://github.com/ericchiang/pup/releases/download/v0.4.0/pup_v0.4.0_linux_amd64.zip
unzip pup_v0.4.0_linux_amd64.zip
rm pup_v0.4.0_linux_amd64.zip
BRANCH=$(curl https://github.com/uazo/cromite/branch_commits/$RTAG | ./pup -p li.branch:last-child a text{})
if [ -z "${BRANCH}" ]; then
BRANCH=$(curl https://github.com/uazo/cromite/branch_commits/$RTAG a | ./pup -p li.branch:first-child a text{})
fi
if [ -z "${BRANCH}" ]; then
echo "Can not recover the base commit"
exit 1
fi
echo "BRANCH=$BRANCH" >> $GITHUB_ENV
- name: Checkout 'uazo/cromite' ${{ env.BRANCH }}
uses: actions/checkout@v2
with:
repository: 'uazo/cromite'
ref: ${{ github.event.inputs.rtag }}
path: 'cromite'
fetch-depth: 1
- name: Check chromium version
run: |
export HOME=$GITHUB_WORKSPACE
VERSION=$(cat ~/cromite/build/RELEASE)
echo "VERSION=$VERSION" >> $GITHUB_ENV
- name: Cache chromium sources
uses: actions/cache@v3
with:
path: chromium-src
key: chrsource-${{ env.VERSION }}
- name: Download chromium ${{ env.VERSION }} sources
run: |
export HOME=$GITHUB_WORKSPACE
./bin/SuperPatchUtils bromite $RTAG ~/chromium-src
mkdir -p ~/chromium/src && cp -rT ~/chromium-src ~/chromium/src
cd ~/chromium/src
git init
git config user.email "you@example.com"
git config user.name "Your Name"
git add .
git commit -m $VERSION
git tag -a $VERSION -m $VERSION
git add -f v8 && git commit -m ":NOEXPORT: v8" || true
- name: Apply patches ${{ github.event.inputs.rtag }}
run: |
export HOME=$GITHUB_WORKSPACE
cd ~/chromium/src
export SILENT=true
export SKIPAUTOGENERATED=true
bash ~/cromite/tools/apply-all-patch.sh || exit 1
rm -rf ~/cromite/build/patches-new/
rm ~/cromite/build/cromite_patches_list_new.txt
- name: Export patches
run: |
export HOME=$GITHUB_WORKSPACE
cd ~/chromium/src
bash ~/cromite/tools/export-all-patch.sh
cd ~/cromite
rm -rf build/patches/*
mv build/patches-new/* build/patches
rm -rf build/patches-new/
- name: Check differences CHANGES=${{ env.CHANGES }}
run: |
export HOME=$GITHUB_WORKSPACE
cd ~/cromite
CHANGES=0 && git diff --quiet || CHANGES=1
echo "CHANGES=$CHANGES" >> $GITHUB_ENV
if [[ CHANGES -eq 1 ]]; then
git add build/patches/*.patch
git diff --name-only --staged
# MESSAGE=$(git diff --name-only --staged)
# echo "MESSAGE='$MESSAGE'" >> $GITHUB_ENV
fi
- name: Create Pull Request
uses: peter-evans/create-pull-request@c5a7806660adbe173f04e3e038b0ccdcd758773c #v6.1.0
if: env.CHANGES == '1'
with:
token: ${{ secrets.CROMITE_PULLS }}
path: cromite
base: ${{ env.BRANCH }}
#push-to-fork: uazo/cromite
add-paths: |
build/patches/*.patch
commit-message: '[AUTO] Patches auto-rebase'
title: '[AUTO] Patches auto-rebase for ${{ env.BRANCH }} branch'
body: ${{ env.MESSAGE }}
delete-branch: true
branch-suffix: short-commit-hash
-68
View File
@@ -1,68 +0,0 @@
name: 'Check NIST database'
on:
workflow_dispatch:
permissions:
issues: write
pull-requests: write
jobs:
check:
runs-on: ubuntu-latest
steps:
- name: Checkout 'uazo/cromite' ${{ env.BRANCH }}
uses: actions/checkout@v2
with:
repository: 'uazo/cromite'
ref: ${{ github.event.inputs.rtag }}
path: 'cromite'
fetch-depth: 1
- name: Get data
run: |
sudo apt update
DEBIAN_FRONTEND=noninteractive sudo apt install -y sed
export HOME=$GITHUB_WORKSPACE
cd ~/cromite/tools
test -d cves || mkdir -p cves
cd cves
CY=$(date +%Y)
for i in $(seq 2020 $CY)
do
echo Asking for $i year
docker run --rm --name tapir stratosphereips/tapir:latest \
bash -c "python3 tapir.py -y $i libjxl -s" >>libjxl.ansi
done
sed -e 's/\x1b\[[0-9;]*m//g' <libjxl.ansi >libjxl.txt
rm libjxl.ansi
- name: Check differences
run: |
export HOME=$GITHUB_WORKSPACE
cd ~/cromite
CHANGES=0 && git diff --quiet || CHANGES=1
echo "CHANGES=$CHANGES" >> $GITHUB_ENV
if [[ CHANGES -eq 1 ]]; then
git add tools/cves/*.txt
git diff --name-only --staged
fi
- name: Create Pull Request
uses: peter-evans/create-pull-request@c5a7806660adbe173f04e3e038b0ccdcd758773c #v6.1.0
if: env.CHANGES == '1'
with:
token: ${{ secrets.CROMITE_PULLS }}
path: cromite
base: ${{ env.BRANCH }}
#push-to-fork: uazo/cromite
add-paths: |
tools/cves/*.txt
commit-message: 'AUTOMATED - CVE results'
title: New CVE results
delete-branch: true
branch-suffix: short-commit-hash
-130
View File
@@ -1,130 +0,0 @@
name: Execute Tests
permissions:
actions: none
checks: none
contents: none
deployments: none
issues: none
packages: none
pull-requests: none
repository-projects: none
security-events: none
statuses: none
on:
workflow_dispatch:
inputs:
sha:
description: 'uazo/bromite SHA'
required: true
default: 'ce2f07034a3d3b257e9bada65d8293a6786bb95f'
env:
BROMITE_SHA: ${{ github.event.inputs.sha }}
REMOVEDOCKERSUPPORT: true
USELOCALIMAGE: true
jobs:
get_image:
runs-on: self-hosted
steps:
- name: Mark image to test
shell: bash
run: |
docker tag uazo/bromite-build:$BROMITE_SHA uazo/bromite-build:test
exec-test:
runs-on: self-hosted
needs: get_image
if: success()
container:
image: uazo/bromite-build:test
env:
REMOVEDOCKERSUPPORT: true # CUSTOM RUNNER: remove sharing of docker socket
USELOCALIMAGE: true # CUSTOM RUNNER: permit use of local images
USEINTERNALNETWORK: true # CUSTOM RUNNER: create the docker network as internal
WORKSPACE: /home/lg/working_dir
ARTIFACS_DIR: /home/lg/working_dir/artifacs
volumes:
- /storage/images/${{ github.event.inputs.sha }}/out:/home/lg/working_dir/chromium/src/out/bromite:r
- /storage/images/${{ github.event.inputs.sha }}/out/tests:/home/lg/working_dir/chromium/src/out/tests
options: --device=/dev/kvm
steps:
- name: Prepare Test Container
shell: bash
run: |
# set workspace paths
PATH=$WORKSPACE/chromium/src/third_party/llvm-build/Release+Asserts/bin:$WORKSPACE/depot_tools/:/usr/local/go/bin:$WORKSPACE/mtool/bin:$PATH
cd $WORKSPACE
# copy artifacts
#cd chromium/src
#mkdir -p out/bromite
#cp -arp $ARTIFACS_DIR/out/* out/bromite
rm -rf out/tests/*
#mkdir -p out/tests
# reset proxy env
#HTTP_PROXY=
#HTTPS_PROXY=
#http_proxy=
#https_proxy=
# - name: Wait forever
# shell: bash
# run: |
# sleep infinity
- name: Execute chrome junit test
shell: bash
run: |
PATH=$WORKSPACE/chromium/src/third_party/llvm-build/Release+Asserts/bin:$WORKSPACE/depot_tools/:/usr/local/go/bin:$WORKSPACE/mtool/bin:$PATH
cd $WORKSPACE/chromium/src
out/bromite/bin/run_chrome_junit_tests --gtest_filter=*Bromite* || KO=1
- name: Start Android Emulator
shell: bash
run: |
PATH=$WORKSPACE/chromium/src/third_party/llvm-build/Release+Asserts/bin:$WORKSPACE/depot_tools/:/usr/local/go/bin:$WORKSPACE/mtool/bin:$PATH
cd $WORKSPACE/chromium/src
sudo mkdir -p /github/home/.android
sudo chmod 666 /github/home/.android/
tools/android/avd/avd.py install --avd-config ../../generic_android31.textpb -v
tools/android/avd/avd.py start --avd-config ../../generic_android31.textpb -v
- name: Execute unit tests
shell: bash
run: |
PATH=$WORKSPACE/chromium/src/third_party/llvm-build/Release+Asserts/bin:$WORKSPACE/depot_tools/:/usr/local/go/bin:$WORKSPACE/mtool/bin:$PATH
cd $WORKSPACE/chromium/src
out/bromite/unit_tests -v --fast-local-dev --gtest_filter=*Bromite* || KO=1
- name: Restart Android Emulator
shell: bash
run: |
PATH=$WORKSPACE/chromium/src/third_party/llvm-build/Release+Asserts/bin:$WORKSPACE/depot_tools/:/usr/local/go/bin:$WORKSPACE/mtool/bin:$PATH
cd $WORKSPACE/chromium/src
pkill -f qemu-system-x86
tools/android/avd/avd.py start --avd-config ../../generic_android31.textpb -v
- name: Execute instrumentation tests
shell: bash
run: |
PATH=$WORKSPACE/chromium/src/third_party/llvm-build/Release+Asserts/bin:$WORKSPACE/depot_tools/:/usr/local/go/bin:$WORKSPACE/mtool/bin:$PATH
cd $WORKSPACE/chromium/src
out/bromite/bin/run_chrome_public_test_apk -v --num-retries=1 --gtest_filter=*Bromite* || KO=1
#- name: Wait forever
# shell: bash
# run: |
# sleep infinity
- name: Copy results
shell: bash
run: |
sudo cp -r $WORKSPACE/chromium/src/out/bromite/TEST_RESULTS* $WORKSPACE/chromium/src/out/tests/
-219
View File
@@ -1,219 +0,0 @@
name: Release Cromite CI
permissions:
contents: write
on:
workflow_dispatch:
inputs:
sha:
description: 'uazo/cromite SHA'
required: true
default: ''
type:
description: 'runner? [dev/ci]'
required: true
default: 'ci'
draft:
description: 'draft? [true/false]'
required: true
default: 'false'
comment:
description: 'comment'
required: true
env:
CROMITE_SHA: ${{ github.event.inputs.sha }}
REMOVEDOCKERSUPPORT: true
USELOCALIMAGE: true
COMMENT: ${{ github.event.inputs.comment }}
jobs:
release:
runs-on: ${{ github.event.inputs.type }}
env:
IS_DRAFT: ${{ github.event.inputs.draft }}
OUTPUTFILE_ARM: /storage/images/${{ github.event.inputs.sha }}/android/false/arm/
OUTPUTFILE_ARM64: /storage/images/${{ github.event.inputs.sha }}/android/false/arm64/
OUTPUTFILE_X64: /storage/images/${{ github.event.inputs.sha }}/android/false/x64/
OUTPUTFILE_WIN: /storage/images/${{ github.event.inputs.sha }}/win/x64/
OUTPUTFILE_LIN: /storage/images/${{ github.event.inputs.sha }}/linux/false/lin64/
OUTPUTFILE_WV_ARM64: /storage/images/${{ github.event.inputs.sha }}/android/false/arm64_webview/
steps:
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Prepare container
run: |
wget https://github.com/ericchiang/pup/releases/download/v0.4.0/pup_v0.4.0_linux_amd64.zip
unzip pup_v0.4.0_linux_amd64.zip && rm pup_v0.4.0_linux_amd64.zip
BRANCH=$(curl https://github.com/uazo/cromite/branch_commits/$CROMITE_SHA | ./pup -p li.branch:last-child a text{} | xargs)
echo "BRANCH=$BRANCH" >> $GITHUB_ENV
- name: Checkout 'uazo/cromite'
uses: actions/checkout@v2
with:
repository: 'uazo/cromite'
path: 'cromite'
fetch-depth: 1
- name: Create release
shell: bash
run: |
VERSION=v$(cat ${{ env.OUTPUTFILE_ARM64 }}/RELEASE)
cd cromite/tools
GH=gh_2.21.1_linux_amd64/bin/gh
wget https://github.com/cli/cli/releases/download/v2.21.1/gh_2.21.1_linux_amd64.tar.gz
tar xfz gh_2.21.1_linux_amd64.tar.gz
echo ${{ secrets.GITHUB_TOKEN }} | $GH auth login --with-token
echo $COMMENT >note
$GH release create $VERSION-$CROMITE_SHA --notes-file note -d
# android arm
echo "::group::-------- android arm"
sudo cp ${{ env.OUTPUTFILE_ARM }}/apks/ChromePublic.apk arm_ChromePublic.apk
sudo chown runner arm_ChromePublic.apk
echo Uploading arm_ChromePublic
$GH release upload $VERSION-$CROMITE_SHA arm_ChromePublic.apk
echo "::endgroup::"
# android arm64
echo "::group::-------- android arm64"
sudo cp ${{ env.OUTPUTFILE_ARM64 }}/apks/ChromePublic.apk arm64_ChromePublic.apk
sudo chown runner arm64_ChromePublic.apk
echo Uploading arm64_ChromePublic
$GH release upload $VERSION-$CROMITE_SHA arm64_ChromePublic.apk
echo "::endgroup::"
# android x64
echo "::group::-------- android x64"
sudo cp ${{ env.OUTPUTFILE_X64 }}/apks/ChromePublic.apk x64_ChromePublic.apk
sudo chown runner x64_ChromePublic.apk
echo Uploading x64_ChromePublic
$GH release upload $VERSION-$CROMITE_SHA x64_ChromePublic.apk
echo "::endgroup::"
echo "::group::-------- chrome.size"
test $VERSION-$CROMITE_SHA $OUTPUTFILE_ARM64/chrome.size && \
$GH release upload $VERSION-$CROMITE_SHA $OUTPUTFILE_ARM64/chrome.size
echo "::endgroup::"
echo "::group::-------- ChromePublic.apk.mapping"
sudo cp ${{ env.OUTPUTFILE_ARM64 }}/apks/ChromePublic.apk.mapping arm64_ChromePublic.apk.mapping
$GH release upload $VERSION-$CROMITE_SHA arm64_ChromePublic.apk.mapping
sudo cp ${{ env.OUTPUTFILE_X64 }}/apks/ChromePublic.apk.mapping x64_ChromePublic.apk.mapping
$GH release upload $VERSION-$CROMITE_SHA x64_ChromePublic.apk.mapping
echo "::endgroup::"
echo "::group::-------- Uploading arm64_ninja_log_trace.html"
test $OUTPUTFILE_ARM64/ninja_log_trace.html && \
cp $OUTPUTFILE_ARM64/ninja_log_trace.html arm64_ninja_log_trace.html && \
$GH release upload $VERSION-$CROMITE_SHA arm64_ninja_log_trace.html
echo "::endgroup::"
# windows x64
echo "::group::-------- windows x64"
mkdir chrome-win/
cp $OUTPUTFILE_WIN/*.manifest chrome-win/
cp $OUTPUTFILE_WIN/chrome.dll chrome-win/
cp $OUTPUTFILE_WIN/chrome.exe chrome-win/
cp $OUTPUTFILE_WIN/chrome_100_percent.pak chrome-win/
cp $OUTPUTFILE_WIN/chrome_200_percent.pak chrome-win/
cp $OUTPUTFILE_WIN/chrome_elf.dll chrome-win/
cp $OUTPUTFILE_WIN/chrome_proxy.exe chrome-win/
cp $OUTPUTFILE_WIN/chrome_pwa_launcher.exe chrome-win/
cp $OUTPUTFILE_WIN/chrome_wer.dll chrome-win/
cp "/win_sdk/sdks/Win11SDK_10.0.26100.0/Windows Kits/10/Redist/D3D/x64/d3dcompiler_47.dll" chrome-win/
cp $OUTPUTFILE_WIN/elevation_service.exe chrome-win/
cp "$OUTPUTFILE_WIN/First Run" chrome-win/
cp $OUTPUTFILE_WIN/headless_lib_data.pak chrome-win/
cp $OUTPUTFILE_WIN/icudtl.dat chrome-win/
cp $OUTPUTFILE_WIN/libEGL.dll chrome-win/
cp $OUTPUTFILE_WIN/libGLESv2.dll chrome-win/
cp $OUTPUTFILE_WIN/Logo.png chrome-win/
cp $OUTPUTFILE_WIN/notification_helper.exe chrome-win/
cp $OUTPUTFILE_WIN/resources.pak chrome-win/
cp $OUTPUTFILE_WIN/SmallLogo.png chrome-win/
cp $OUTPUTFILE_WIN/snapshot_blob.bin chrome-win/
cp $OUTPUTFILE_WIN/VkICD_mock_icd.dll chrome-win/
cp $OUTPUTFILE_WIN/VkLayer_khronos_validation.dll chrome-win/
cp $OUTPUTFILE_WIN/vk_swiftshader.dll chrome-win/
cp $OUTPUTFILE_WIN/vulkan-1.dll chrome-win/
cp -r $OUTPUTFILE_WIN/locales chrome-win/locales
#test chrome-win.zip && rm chrome-win.zip
zip -r chrome-win.zip chrome-win/
echo Uploading chrome-win.zip
$GH release upload $VERSION-$CROMITE_SHA chrome-win.zip
echo "::endgroup::"
## linux
echo "::group::-------- linux x64"
mkdir chrome-lin/
cp $OUTPUTFILE_LIN/chrome chrome-lin/
cp $OUTPUTFILE_LIN/chrome_100_percent.pak chrome-lin/
cp $OUTPUTFILE_LIN/chrome_200_percent.pak chrome-lin/
cp $OUTPUTFILE_LIN/chrome_crashpad_handler chrome-lin/
cp $OUTPUTFILE_LIN/chrome-wrapper chrome-lin/
cp $OUTPUTFILE_LIN/icudtl.dat chrome-lin/
cp $OUTPUTFILE_LIN/libEGL.so chrome-lin/
cp $OUTPUTFILE_LIN/libGLESv2.so chrome-lin/
cp $OUTPUTFILE_LIN/libvulkan.so.1 chrome-lin/
cp $OUTPUTFILE_LIN/libqt5_shim.so chrome-lin/
cp $OUTPUTFILE_LIN/libqt6_shim.so chrome-lin/
cp $OUTPUTFILE_LIN/libvk_swiftshader.so chrome-lin/
cp -r $OUTPUTFILE_LIN/locales/ chrome-lin/locales
cp $OUTPUTFILE_LIN/product_logo_48.png chrome-lin/
cp $OUTPUTFILE_LIN/resources.pak chrome-lin/
cp $OUTPUTFILE_LIN/snapshot_blob.bin chrome-lin/
cp $OUTPUTFILE_LIN/xdg-mime chrome-lin/
cp $OUTPUTFILE_LIN/xdg-settings chrome-lin/
cp $OUTPUTFILE_LIN/chrome_sandbox chrome-lin/
tar -czvf chrome-lin64.tar.gz chrome-lin/
echo Uploading chrome-lin64.tar.gz
$GH release upload $VERSION-$CROMITE_SHA chrome-lin64.tar.gz
echo "::endgroup::"
# android arm64 symbols
echo "::group::-------- arm64 symbols"
zip arm64_symbols.zip ${{ env.OUTPUTFILE_ARM64 }}/dump_syms \
${{ env.OUTPUTFILE_ARM64 }}/minidump_stackwalk \
${{ env.OUTPUTFILE_ARM64 }}/libchrome.so
$GH release upload $VERSION-$CROMITE_SHA arm64_symbols.zip
echo "::endgroup::"
# android arm64
echo "::group::-------- android systemwebview arm64"
sudo cp ${{ env.OUTPUTFILE_WV_ARM64 }}/apks/SystemWebView.apk arm64_SystemWebView.apk
sudo chown runner arm64_SystemWebView.apk
sudo cp ${{ env.OUTPUTFILE_WV_ARM64 }}/apks/SystemWebViewShell.apk arm64_SystemWebViewShell.apk
sudo chown runner arm64_SystemWebViewShell.apk
echo Uploading arm64_SystemWebView
$GH release upload $VERSION-$CROMITE_SHA arm64_SystemWebView.apk
$GH release upload $VERSION-$CROMITE_SHA arm64_SystemWebViewShell.apk
echo "::endgroup::"
TIMESTAMP=$(date +%s -r chrome-win.zip)
echo >updateurl.txt "browser=chromium;os=windows;architecture=64-bit;timestamp=$TIMESTAMP;editor=uazo;channel=stable;repository=https://github.com/uazo/cromite/releases;download=https://github.com/uazo/cromite/releases/latest/download/chrome-win.zip;version=$(cat $OUTPUTFILE_WIN/RELEASE);revision=1;commit=$CROMITE_SHA"
$GH release upload $VERSION-$CROMITE_SHA updateurl.txt
$GH release edit $VERSION-$CROMITE_SHA -t $VERSION-$CROMITE_SHA
if [ $IS_DRAFT == "false" ]; then
$GH release edit $VERSION-$CROMITE_SHA --draft=false
fi
@@ -1,98 +0,0 @@
name: Release Additional Targets
permissions:
contents: write
on:
workflow_dispatch:
inputs:
sha:
description: 'uazo/cromite SHA'
required: true
default: ''
type:
description: 'runner? [dev/ci]'
required: true
default: 'ci'
env:
CROMITE_SHA: ${{ github.event.inputs.sha }}
REMOVEDOCKERSUPPORT: true
USELOCALIMAGE: true
jobs:
release:
runs-on: ${{ github.event.inputs.type }}
env:
IS_DRAFT: ${{ github.event.inputs.draft }}
OUTPUTFILE_X64: /storage/images/${{ github.event.inputs.sha }}/android/false/x64_webview/
OUTPUTFILE_CHR_ARM64: /storage/images/${{ github.event.inputs.sha }}/android/false/chr_arm64/
OUTPUTFILE_CHR_ARM: /storage/images/${{ github.event.inputs.sha }}/android/false/chr_arm/
OUTPUTFILE_CHR_X64: /storage/images/${{ github.event.inputs.sha }}/android/false/chr_x64/
steps:
- name: Prepare container
run: |
wget https://github.com/ericchiang/pup/releases/download/v0.4.0/pup_v0.4.0_linux_amd64.zip
unzip pup_v0.4.0_linux_amd64.zip && rm pup_v0.4.0_linux_amd64.zip
BRANCH=$(curl https://github.com/uazo/cromite/branch_commits/$CROMITE_SHA | ./pup -p li.branch:last-child a text{} | xargs)
echo "BRANCH=$BRANCH" >> $GITHUB_ENV
- name: Checkout 'uazo/cromite'
uses: actions/checkout@v2
with:
repository: 'uazo/cromite'
path: 'cromite'
fetch-depth: 1
- name: Create release
shell: bash
run: |
VERSION=v$(cat ${{ env.OUTPUTFILE_ARM64 }}/RELEASE)
cd cromite/tools
GH=gh_2.21.1_linux_amd64/bin/gh
wget https://github.com/cli/cli/releases/download/v2.21.1/gh_2.21.1_linux_amd64.tar.gz
tar xfz gh_2.21.1_linux_amd64.tar.gz
echo ${{ secrets.GITHUB_TOKEN }} | $GH auth login --with-token
# android x64
echo "::group::-------- android systemwebview x64"
sudo cp ${{ env.OUTPUTFILE_X64 }}/apks/SystemWebView.apk x64_SystemWebView.apk
sudo chown runner x64_SystemWebView.apk
sudo cp ${{ env.OUTPUTFILE_X64 }}/apks/SystemWebViewShell.apk x64_SystemWebViewShell.apk
sudo chown runner x64_SystemWebViewShell.apk
echo Uploading x64_SystemWebView
$GH release upload $VERSION-$CROMITE_SHA x64_SystemWebView.apk
$GH release upload $VERSION-$CROMITE_SHA x64_SystemWebViewShell.apk
echo "::endgroup::"
# vanilla chromium arm
echo "::group::-------- vanilla chromium arm"
sudo cp ${{ env.OUTPUTFILE_CHR_ARM }}/apks/ChromePublic.apk arm_VanillaChromium.apk
sudo chown runner arm_VanillaChromium.apk
echo Uploading arm_VanillaChromium
$GH release upload $VERSION-$CROMITE_SHA arm_VanillaChromium.apk
echo "::endgroup::"
# vanilla chromium arm64
echo "::group::-------- vanilla chromium arm64"
sudo cp ${{ env.OUTPUTFILE_CHR_ARM64 }}/apks/ChromePublic.apk arm64_VanillaChromium.apk
sudo chown runner arm64_VanillaChromium.apk
echo Uploading arm64_VanillaChromium
$GH release upload $VERSION-$CROMITE_SHA arm64_VanillaChromium.apk
echo "::endgroup::"
# vanilla chromium x64
echo "::group::-------- vanilla chromium x64"
sudo cp ${{ env.OUTPUTFILE_CHR_X64 }}/apks/ChromePublic.apk x64_VanillaChromium.apk
sudo chown runner x64_VanillaChromium.apk
echo Uploading x64_VanillaChromium
$GH release upload $VERSION-$CROMITE_SHA x64_VanillaChromium.apk
echo "::endgroup::"
-24
View File
@@ -1,24 +0,0 @@
name: 'Close stale issues and PRs'
on:
schedule:
- cron: '30 1 * * *'
workflow_dispatch:
permissions:
issues: write
pull-requests: write
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v6
with:
exempt-all-milestones: true
any-of-labels: 'awaiting info,wontfix'
days-before-stale: 5
days-before-close: 7
stale-issue-message: "This issue has been automatically marked as stale as there has been no recent activity in response to our request for more information. Please respond so that we can proceed with this issue."
close-issue-message: "This issue has been automatically closed as sufficient information hasn't been provided on the issue for further actions to be taken. Feel free to add more information."
-82
View File
@@ -1,82 +0,0 @@
name: Update patches doc
permissions:
# actions: none
# checks: none
# contents: write
# deployments: none
# issues: none
# packages: none
pull-requests: write
# repository-projects: none
# security-events: none
# statuses: none
on:
push:
branches:
- 'master'
paths:
- 'build/**'
workflow_dispatch:
inputs:
rtag:
description: 'uazo/cromite TAG or COMMIT'
required: true
default: ''
env:
RTAG: ${{ github.event.inputs.rtag }}
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: "Get value from dispatch"
run: |
if [ -z "${RTAG}" ]; then
echo "RTAG=$GITHUB_SHA" >> $GITHUB_ENV
echo "RTAG=$RTAG"
fi
- name: Checkout 'uazo/cromite' ${{ env.BRANCH }}
uses: actions/checkout@v2
with:
repository: 'uazo/cromite'
ref: ${{ github.event.inputs.rtag }}
path: 'cromite'
fetch-depth: 1
- name: Generate patches doc
run: |
export HOME=$GITHUB_WORKSPACE
bash ~/cromite/tools/extract-all-patch-data.sh ~/cromite/build/patches
- name: Check differences CHANGES=${{ env.CHANGES }}
run: |
export HOME=$GITHUB_WORKSPACE
cd ~/cromite
CHANGES=0 && git diff --quiet || CHANGES=1
echo "CHANGES=$CHANGES" >> $GITHUB_ENV
if [[ CHANGES -eq 1 ]]; then
git add docs/*.md
fi
- name: Create Pull Request
uses: peter-evans/create-pull-request@c5a7806660adbe173f04e3e038b0ccdcd758773c #v6.1.0
if: env.CHANGES == '1'
with:
token: ${{ secrets.CROMITE_PULLS }}
path: cromite
base: ${{ env.BRANCH }}
add-paths: |
docs/*.md
commit-message: '[AUTO][DOC] Generate patches doc for master branch'
title: '[AUTO][DOC] Generate patches doc for master branch'
body: ${{ env.MESSAGE }}
delete-branch: true
branch-suffix: short-commit-hash
-73
View File
@@ -1,73 +0,0 @@
name: Update fdroid repo
on:
workflow_dispatch:
inputs:
type:
description: 'runner? [dev/ci]'
required: true
default: 'ci'
env:
REMOVEDOCKERSUPPORT: true
USELOCALIMAGE: true
USEINTERNALNETWORK: true
jobs:
update-fdroid:
runs-on: ${{ github.event.inputs.type }}
container:
image: uazo/fdroidserver:latest
volumes:
- /tmp/forward-proxy:/tmp/forward-proxy
steps:
- name: Update fdroid repo
shell: bash
run: |
export https_proxy=http://127.0.0.1:8118
socat TCP-LISTEN:8118,reuseaddr,fork UNIX-CLIENT:/tmp/forward-proxy/proxy.sock &
socat TCP-LISTEN:1080,reuseaddr,fork UNIX-CLIENT:/tmp/forward-proxy/ftp.sock &
touch /etc/apt/apt.conf.d/proxy.conf
echo "Acquire::http::Proxy \"$https_proxy\";" >/etc/apt/apt.conf.d/proxy.conf
cd /
. fdroidserver-env/bin/activate
apt update
DEBIAN_FRONTEND=noninteractive apt update && apt install -y wget unzip
wget https://github.com/rclone/rclone/releases/download/v1.64.0/rclone-v1.64.0-linux-amd64.zip
unzip rclone-v1.64.0-linux-amd64.zip
export rclone=rclone-v1.64.0-linux-amd64/rclone
mkdir -p ~/.config/rclone
echo "${{ secrets.RCLONE_CONF }}" > ~/.config/rclone/rclone.conf
$rclone sync ftp:www.cromite.org/fdroid fdroid --log-level INFO --ftp-socks-proxy 127.0.0.1:1080
test -d /usr/share/man/man1 || mkdir -p /usr/share/man/man1
DEBIAN_FRONTEND=noninteractive apt install -y fdroidserver
cd fdroid/repo/
wget https://github.com/uazo/cromite/releases/latest/download/arm_ChromePublic.apk
wget https://github.com/uazo/cromite/releases/latest/download/arm64_ChromePublic.apk
wget https://github.com/uazo/cromite/releases/latest/download/x64_ChromePublic.apk
test arm_ChromePublic.apk.1 && rm arm_ChromePublic.apk && mv arm_ChromePublic.apk.1 arm_ChromePublic.apk
test arm64_ChromePublic.apk.1 && rm arm64_ChromePublic.apk && mv arm64_ChromePublic.apk.1 arm64_ChromePublic.apk
test x64_ChromePublic.apk.1 && rm x64_ChromePublic.apk && mv x64_ChromePublic.apk.1 x64_ChromePublic.apk
cd ..
gpg -d --passphrase "${{ secrets.FDROID_PASSPHRASE }}" --batch config.yml.asc >config.yml
gpg -d --passphrase "${{ secrets.FDROID_PASSPHRASE }}" --batch keystore.p12.asc >keystore.p12
fdroid update -c; fdroid update
rm config.yml keystore.p12
cd ..
test -f fdroid/config.yml && exit 1
test -f fdroid/keystore.p12 && exit 1
$rclone sync fdroid ftp:www.cromite.org/fdroid --log-level INFO --ftp-socks-proxy 127.0.0.1:1080
$rclone sync fdroid ftp:www.cromite.org/fdroid --log-level INFO --ftp-socks-proxy 127.0.0.1:1080
-6
View File
@@ -1,6 +0,0 @@
################################################################################
# This .gitignore file was automatically created by Microsoft(R) Visual Studio.
################################################################################
/.vs
/temp
+622
View File
@@ -0,0 +1,622 @@
# 81.0.4044.106
* remove option to add NTP as homepage (fixes https://github.com/bromite/bromite/issues/517)
# 81.0.4044.97
* disable browser auto-login by default
* show download prompt again
# 81.0.4044.83
# 81.0.4044.76
# 81.0.4044.70
* backport surface control fix (fixes https://github.com/bromite/bromite/issues/445)
# 81.0.4044.63
* use upstream fix for SD card not found issue (fixes https://github.com/bromite/bromite/issues/485)
* do not compile QR code sharing
* remove obsolete patch for GCM experiment status
* drop 2 patches for AImageReader crash fix (upstream has the same revert patches)
# 80.0.3987.118
* disable AImageReader for all ARM64 devices (fixes https://github.com/bromite/bromite/issues/497)
* use upstream possible workaround for SD card not found issue (fixes https://github.com/bromite/bromite/issues/485)
# 80.0.3987.109
* restored GPU workaround for the ARM/ARM64 AImageReader crash (https://github.com/bromite/bromite/issues/445)
# 80.0.3987.95
* enable user-agent freeze (fixes https://github.com/bromite/bromite/issues/483)
* fix issue with AMP (fixes https://github.com/bromite/bromite/issues/488)
* fix crash on home page (fixes https://github.com/bromite/bromite/issues/484)
# 80.0.3987.78
* removed ungoogled-chromium patch for non-remote developer tools resources
* removed patch for 64-bit webview (it is now a default from upstream)
* removed patch for enabling dark mode menu entry by default (it is now a default from upstream)
* removed patch for enabling download rename by default (it is now a default from upstream)
* removed some redundant Iridium safe browsing patches
# 79.0.3945.139
* remove patch to automatically disable video decoding acceleration on Android 10+ and arm64
* fix referral headers bug in non-DoH requests (fixes https://github.com/bromite/bromite/issues/470)
* disable smart selection by default, enable web search in incognito mode
* disable DRM media pre-provisioning (fixes https://github.com/bromite/bromite/issues/471)
# 79.0.3945.123
* updated User-agent version
* increase minimum DoH timeout to 400ms (fixes https://github.com/bromite/bromite/issues/437)
# 79.0.3945.111
* automatically disable video decoding acceleration on Android 10+ and arm64
* restore enable-horizontal-tab-switcher flag
* remove non-working contextual search settings
* disable QUIC by default
* remove logging for DoH timeouts
# 79.0.3945.107
* always show cookies, javascript and ads site settings (fixes https://github.com/bromite/bromite/issues/133)
* remove global ads and javascript menu options
# 79.0.3945.100
* log timeout values for DoH
* enable DFM (fixes https://github.com/bromite/bromite/issues/441)
* updated User-agent version
# 79.0.3945.94
* removed patches which do not apply anymore (Widevine version punting, always show homepage settings, network errors UMA recording)
* removed split APKs support (Play integration)
* disabled password reuse functionality (Play integration)
* re-introduced minimal headers for DoH
* removed Startpage
* disable feed support
* updated User-agent version
# 78.0.3904.130
* support user-specified subresources filter URL (fixes https://github.com/bromite/bromite/issues/2)
* revert removal of flag for disabling pull-to-refresh effect
* fix crash when entering no DoH URL (fixes https://github.com/bromite/bromite/issues/430)
* added Peter Lowe's Ad and tracking server list (fixes https://github.com/bromite/bromite/issues/423)
* enabled dav1d_decoder
# 78.0.3904.119
* replace fixed DNS-over-HTTPS feature flag with user-customizable option
* fix background playback issue (fixes https://github.com/bromite/bromite/issues/424)
# 78.0.3904.105
* add flag to disable WebGL (fixes https://github.com/bromite/bromite/issues/411)
* more selective AMP sanitization (fixes https://github.com/bromite/bromite/issues/410)
* build optimizations to disable debug information
# 78.0.3904.93
* introduce flags to disable browser fingerprinting capabilities (fixes https://github.com/bromite/bromite/issues/402)
* major enhancements to AMP sanitization for news/images
* remove duplicate network predictions privacy setting
* disable some signed exchanges features
* ungoogled-chromium-android: patches to block all GCM/GMS/PlayServices integrations
* ungoogled-chromium: block all connection requests to substituted domains
* disable GVR services build flag
* disable HEAD requests for single words typed and clicked in Omnibar
* increase number of autocomplete matches from 5 to 10
* replace DoH probe domain with RIPE domain
* merged fixes for adblock/javascript menu text (https://github.com/bromite/bromite/pull/398)
* updated User-agent phone model and version
# 78.0.3904.72
* updated User-agent phone model and version
* fix network predictions bug (fixes https://github.com/bromite/bromite/issues/387)
* fix crash in settings (fixes https://github.com/bromite/bromite/issues/388)
# 78.0.3904.63
* replace Beta DoH service URL for Google (https://developers.google.com/speed/public-dns/docs/doh/migration)
* disable AImageReaderMediaPlayer until upstream bug is fixed (https://bugs.chromium.org/p/chromium/issues/detail?id=977583)
* disabled face detection provider
* removed non-working SystemWebView adblock patch (not working since v77)
* bring back some privacy options which upstream moved to Sync settings (fixes https://github.com/bromite/bromite/issues/383)
# 77.0.3865.104
* revert upstream commit for search privacy options and related translations removal (fixes https://github.com/bromite/bromite/issues/375)
* remove unused patch for enabling subresource filter on all sites
# 77.0.3865.95
# 77.0.3865.81
* use native subresource filtering instead of Bromite engine
* introduce Bromite AdBlockUpdate service
* keep using Bromite engine for SystemWebView
* enable subresource filter for all sites
* disable subresource filter popup
* enable IPv6 probing by default
* drop DnsTransaction default security level patch
* drop patch to visualize all type of extensions
* drop patches for Network Service
* enable CFI for all architectures except x86
# 76.0.3809.129
* disable CFI to fix x86 crashes (fixes https://github.com/bromite/bromite/issues/357)
# 76.0.3809.115
* disable search-ready omnibox by default
* disable unified consent
# 76.0.3809.100
* use default feature flags for autofill (fixes https://github.com/bromite/bromite/issues/348)
# 76.0.3809.91
# 76.0.3809.85
* add flag to toggle Network Service
* disable Network Service by default
* do not record UMA for network errors
* use fixed User Agent and Android OS version
* dropped patch for history requirement of user gesture
# 75.0.3770.139
* disable media router and remoting by default (fixes https://github.com/bromite/bromite/issues/281)
* enable CFI in GN build flags
# 75.0.3770.132
# 75.0.3770.109
* disable payment support by default
* disable background sync by default
* better patch from GrapheneOS/Vanadium for disabling sensors access (fixes https://github.com/bromite/bromite/issues/319)
* use new patch for content settings sensors allow/block (fixes https://github.com/bromite/bromite/issues/319)
* fix impossible values in Battery Status API (fixes https://github.com/bromite/bromite/issues/322)
# 75.0.3770.86
# 75.0.3770.82
# 75.0.3770.70
* enable changing default downloads storage location by default
* enable download rename option by default
* disable offline pages in the downloads home to be opened in CCT by default
* increase minimum SDK from 17 to 19 (fixes https://github.com/bromite/bromite/issues/310)
* prefs: disable SigninAllowed by default
* prefs: always prompt for download directory by default
* build: remove calling untrusted hooks
# 75.0.3770.53
* fix crash when downloading or from browser-initiated requests (fixes https://github.com/bromite/bromite/issues/309)
# 75.0.3770.50
* disable dynamic module loading
* more fixes to allow building for SDK 17
# 74.0.3729.162
* remove recent tabs signin
# 74.0.3729.154
# 74.0.3729.141
# 74.0.3729.122
* remove more unnecessary permissions
# 74.0.3729.106
* remove account/sync menu entries (fixes https://github.com/bromite/bromite/issues/285)
* fix failed debug builds
# 74.0.3729.86
* enable dark mode settings entry by default
* fix permission request for Play services on reboot (fixes https://github.com/bromite/bromite/issues/281)
# 74.0.3729.80
* increase minimum SDK version to 17 (Jelly Bean 4.2)
* dropped obsolete patch for hyperlink auditing disable
# 73.0.3683.107
* dropped patch to disable smooth scrolling
* fixed custom tab intents issue (fixes https://github.com/bromite/bromite/issues/279)
# 73.0.3683.105
* removed Fanboy's Annoyance List and Peter Lowe's adservers list from filters
# 73.0.3683.97
* dropped redundant patch to hide NTP tiles (use home page + about:blank)
# 73.0.3683.88
* add option to use home page as NTP
# 73.0.3683.82
* remove force home page button flag
* enable site per process isolation for devices with memory > 1GB
* use 64-bit processes for SystemWebView
* disable local field trials seed (redundant)
* fix patch for classic new tab page (redundant)
# 73.0.3683.79
* add missing Qwant engine from default engines list (fixes https://github.com/bromite/bromite/issues/262)
* DoH: include upstream patch for DNS secure mode
* DoH: enable DNS secure mode by default
# 73.0.3683.70
# 73.0.3683.61
* drop patches with functionality now available from upstream (DuckDuckGo and Qwant search engines, TLS 1.3 final)
* add only DuckDuckGo Lite search engine
* provide image URL for Qwant
* disable safe browsing subresource filter by default
* fix PAC URL support in proxy configuration
# 72.0.3626.120
* add support for resource type in adblock engine (fixes https://github.com/bromite/bromite/issues/115)
* adblock engine speed optimizations
* use adblock engine also in SystemWebView
* add back uBlock Origin and EasyList filters
* added Fanboy's Annoyance List
* remove AdGuard filters
# 72.0.3626.119
* use AdGuard filters
* fixes for new tile rows usage
* re-introduce patch to hide NTP tiles
* disable NTP tile metrics collection
# 72.0.3626.114
* use 4 tile rows instead of 2 in the new tab page
* do not grant geolocation permission to default search engine (fixes https://github.com/bromite/bromite/issues/250)
# 72.0.3626.108
# 72.0.3626.99
# 72.0.3626.87
* update bookmarks view after import
# 72.0.3626.81
* serve empty content for blocked scripts/images (fixes https://github.com/bromite/bromite/issues/238)
* keep support of Jelly Bean (workaround for upstream https://bugs.chromium.org/p/chromium/issues/detail?id=923477)
# 72.0.3626.73
# 72.0.3626.68
* do not ignore save prompt for users without SD card (workaround for upstream wontfix https://bugs.chromium.org/p/chromium/issues/detail?id=916606)
* remove third_party/analytics patch (now fixed upstream in https://chromium.googlesource.com/chromium/src.git/+/64d6a56f094efbab83802c07ad3ddffa014f9903)
* AV1 codec support
# 71.0.3578.132
* add patches from AndroidHardening project (fixes https://github.com/bromite/bromite/issues/226)
# 71.0.3578.123
* disable jumbo builds (fixes https://github.com/bromite/bromite/issues/216 and https://github.com/bromite/bromite/issues/219)
* disable preview fetching
* do not consider Android Jelly Bean unsupported
# 71.0.3578.120
* fix breakage of translate quick answers by anti-AMP (fixes https://github.com/bromite/bromite/issues/210)
# 71.0.3578.115
* add AdGuard DNS-over-HTTPS option
* use green icon for SystemWebView
# 71.0.3578.110
# 71.0.3578.104
* fix AMP links sanitisation; have it working for news as well (fixes https://github.com/bromite/bromite/issues/202)
* revert upstream patch responsible for the broken save dialog prompt (upstream: https://bugs.chromium.org/p/chromium/issues/detail?id=916606)
# 71.0.3578.101
# 71.0.3578.98
* do not ask permissions for camera when importing bookmarks (fixes https://github.com/bromite/bromite/issues/200)
# 71.0.3578.88
* add proxy configuration page (see https://github.com/bromite/bromite/wiki/ProxyConfiguration)
* use more recent versions in User-Agent (fixes https://github.com/bromite/bromite/issues/156)
# 71.0.3578.85
* fix blurry adaptive icon (fixes https://github.com/bromite/bromite/issues/197)
# 71.0.3578.76
# 71.0.3578.72
* add flag to disable IPv6 probes
# 70.0.3538.107
* added adaptive icon (fixes https://github.com/bromite/bromite/issues/181)
* do not change randomisation at each call (fixes https://github.com/bromite/bromite/issues/177)
* do not enable #enable-scroll-anchor-serialization by default
# 70.0.3538.102
* do not grant notifications to default search engine
* remove all promos from bookmark manager page
* re-introduced various patches to eradicate binary blob dependencies (only Cast left)
* remove contacts picker permission
# 70.0.3538.95
* fix crash on bookmark edit activity (fixes https://github.com/bromite/bromite/issues/172)
* fix slow chrome://flags (fixes https://github.com/bromite/bromite/issues/173)
* enable TLS 1.3 final support by default (fixes https://github.com/bromite/bromite/issues/174)
* dropped some patches related to GCM/GMS on suspicion of being related to random crashes
# 70.0.3538.87
* enable history requirement of user gesture (fixes https://github.com/bromite/bromite/issues/171)
* enable serialization of scroll position changes while loading (fixes https://github.com/bromite/bromite/issues/171)
* remove passwords keyboard accessory option (fixes https://github.com/bromite/bromite/issues/171)
* some improvements to bookmark import/export interaction
* add flag to disable orientation API, disabled by default
* disable device motion API by default (fixes https://github.com/bromite/bromite/issues/171)
# 70.0.3538.83
* fix keep session cookies option showing on all site settings views
* fix blank site settings entry showing (fixes https://github.com/bromite/bromite/issues/166)
* offer builtin autocomplete for chrome://flags quick access
# 70.0.3538.80
* add flag to disable video resume functionality, allowing to not pause video playback on tab switch (fixes https://github.com/bromite/bromite/issues/108)
* prevent "are you there" prompts from appearing when playing videos
* completely disable update scheduler checks to fix a related crash
# 70.0.3538.77
* disable generic sensor APIs by default (fixes https://github.com/bromite/bromite/issues/160)
* introduce flag to disable device motion API (fixes https://github.com/bromite/bromite/issues/160)
* add Quad9 as a DNS-over-HTTPS (DoH) option (fixes https://github.com/bromite/bromite/issues/140)
# 70.0.3538.71
* fix bug with canvas fingerprinting (fixes https://github.com/bromite/bromite/issues/154)
# 70.0.3538.67
* re-enabled DNS-over-HTTPS (DoH) flag (fixes https://github.com/bromite/bromite/issues/139)
* dropped GCM removal patch
* disable kSigninAllowedOnNextStartup by default
* permanently disable query-in-omnibox (fixes https://github.com/bromite/bromite/issues/143)
# 69.0.3497.113
* disabled DNS-over-HTTPS (DoH) flag, not working since 69.0.3497.73 (see https://github.com/bromite/bromite/issues/139)
# 69.0.3497.109
# 69.0.3497.102
* ungoogled-chromium: disable network time tracker
* ungoogled-chromium: remove third-party/analytics
* ungoogled-chromium: always use local Devtools instead of remote files
* build without safebrowsing
* drop "Hide NTP tiles" flag
# 69.0.3497.91
* fixed crash when accessing site settings media preferences (fixes https://github.com/bromite/bromite/issues/122)
# 69.0.3497.73
* enabled WebRTC
* drop clear HTTP cache patch
# 68.0.3440.126
* add option to disallow custom tab intents (fixes https://github.com/bromite/bromite/issues/117)
* add option to keep local data until browser exit (fixes https://github.com/bromite/bromite/issues/56)
* remember preference for tabs persistence option
* extend anti-AMP to all search results
# 68.0.3440.121
* add option to not persist tabs across sessions (fixes https://github.com/bromite/bromite/issues/106)
* always incognito mode (fixes https://github.com/bromite/bromite/issues/18)
* disable domain reliability (ungoogled-chromium)
* more efficient adblock interception by using proper handler
* fix log message about default maximum connections
* improvement for exit menu patch
# 68.0.3440.110
* add import action to Bookmarks activity page
* use different user-agent version based on Android OS version
# 68.0.3440.90
* reduce rects randomisation by factor of 100
* use a fixed user-agent (fixes https://github.com/bromite/bromite/issues/103)
# 68.0.3440.87
* add export action to Bookmarks activity page
# 68.0.3440.81
* fix issue with filters with an excluded domain option
# 68.0.3440.72
* fix crash during some canvas rendering (fixes https://github.com/bromite/bromite/issues/95)
* new approach to adblock filtering (fixes https://github.com/bromite/bromite/issues/90)
* add a flag to enable higher maximum connections per host limit (fixes https://github.com/bromite/bromite/issues/61)
* add a flag to disable custom tab intents (fixes https://github.com/bromite/bromite/issues/81)
* add a flag to have an always-empty new tab page (fixes https://github.com/bromite/bromite/issues/82)
* reduced randomization of TextMetrics and ClientRects results
* disable ads metrics by default
* disable all field trials (fixes https://github.com/bromite/bromite/issues/83)
* re-introduced own battery API patch (fixes https://github.com/bromite/bromite/issues/80)
# 67.0.3396.107
* removed patch to use Android Media Player for URLs (fixes https://github.com/bromite/bromite/issues/71)
# 67.0.3396.101
* set home page to new tab page
* adjust order of new menu entries, remove help menu item (fixes https://github.com/bromite/bromite/issues/76)
* remove some Play Services integrations: Auth, Vision, GCM
* remove TOS/metrics and translate
* net/cert: increase default key length for newly-generated RSA keys
* dns: send IPv6 connectivity probes to RIPE DNS rather than Google
* profile-resetter: do not tick send-settings by default
* autofill: disable autofill download manager
* first_run: deactivate autoupdate globally
* safe_browsing: disable incident reporting
* safe_browsing: disable reporting of safebrowsing override
* safe_browsing: disable cookie transmission
* extensions: always show component extensions in the ext list
* translate: disable fetching of translate languages from server
# 67.0.3396.95
* reduce headers sent in DoH requests (fixes https://github.com/bromite/bromite/issues/70)
* serve DoH requests with maximum priority
* `CloudFlare` -> `Cloudflare` (fixes https://github.com/bromite/bromite/issues/73)
* fingerprint mitigations: cover also `ConvertToArrayBufferContents`
* removed redundant own patch for battery API
# 67.0.3396.92
* improve randomization for each retrieved Canvas data (fixes https://github.com/bromite/bromite/issues/69)
# 67.0.3396.88
* add flag for DNS-over-HTTPS (Google experimental DNS) (fixes https://github.com/bromite/bromite/issues/68)
* disable signin, translate and data saver UI/internal components (fixes https://github.com/bromite/bromite/issues/67)
* rename `GoogleEN` -> `Google In English` (fixes https://github.com/bromite/bromite/issues/66)
* re-enabled text metrics and ToDataURL, ToBlob with randomization of color data (fixes https://github.com/bromite/bromite/issues/52)
* open YouTube links in Bromite
* use Android Media Player for URLs
* add exit menu item
* hide "send reports to Google" menu item
# 67.0.3396.82
# 67.0.3396.76
# 67.0.3396.72
* add global toggle for adblock engine (https://github.com/bromite/bromite/issues/53)
# 67.0.3396.67
# 66.0.3359.202
* fix DevTools integration (https://github.com/bromite/bromite/issues/23)
* allow toggling of Javascript from New Tab Page (fixes https://github.com/bromite/bromite/issues/60)
# 66.0.3359.200
# 66.0.3359.196
# 66.0.3359.188
* increase max (persistent) connections per server from 6 to 15
* preliminary work for better canvas fingerprinting mitigations
# 66.0.3359.161
# 66.0.3359.148
* disable permanently all custom tab intents (https://github.com/bromite/bromite/issues/17)
* reduce randomization for client rects from 5% to 3%
# 65.0.3325.230
* fixed permission to access Google account issue (https://github.com/bromite/bromite/issues/11)
# 65.0.3325.218
* always set WideVine version
# 65.0.3325.204
* add menu option to toggle global Javascript preferences setting (https://github.com/bromite/bromite/issues/37)
* add fingeprinting mitigation for getClientRects, getBoundingClientRect
* set audio latency to fixed number
# 65.0.3325.198
* re-landed support for third-party AdBlock filters
* completed patches cleanup
# 65.0.3325.190
* block some Canvas and AudioBuffer APIs mostly used for fingerprinting (https://github.com/bromite/bromite/issues/15)
# 65.0.3325.176
* block plugins enumeration API
* block battery API
* remove device name and build id from User Agent
* added Qwant search engine
* disable non-working 3rd-party filters support
# 64.0.3282.204
* use H264 NEON optimizations also for arm64
* fix build of Stable channel
* started building vanilla Chromium releases as well
# 64.0.3282.193
* disable reporting
# 64.0.3282.182
* add support for domain-based adblock filters
* optimized memory allocation for filters
# 64.0.3282.168
* extension: allow playing youtube/vimeo videos in background (https://github.com/bromite/bromite/issues/16)
* never fetch most popular sites for new tab initialization, disable logo on new tab page
* some improvements to adblock filters
* disabled signin (ungoogled-chromium) (https://github.com/bromite/bromite/issues/31 and https://github.com/bromite/bromite/issues/11)
* disabled webRTC and crash uploaders (ungoogled-chromium)
* disabled translate (ungoogled-chromium)
* disabled Gaia & GCM (ungoogled-chromium)
* added clear HTTP cache menu item (ungoogled-chromium)
* disabled Google host detection (ungoogled-chromium)
* disabled profile avatar downloading (ungoogled-chromium)
* disabled intranet redirect detector (ungoogled-chromium)
* disabled plugin untraceable URLs (ungoogled-chromium)
# 64.0.3282.149
# 63.0.3239.150
* fixed crash when clicking on address bar lock (page info) or opening site settings (https://github.com/bromite/bromite/issues/28)
* build H264 with NEON optimizations for ARMv7
* more builds for arm64 architecture
# 63.0.3239.144
* fixed invalid AdBlock filter rule blocking all connections (https://github.com/bromite/bromite/issues/26)
# 63.0.3239.129
# 63.0.3239.122
* disable webRTC completely (https://github.com/bromite/bromite/issues/9)
* hyperlinks sanitization fixed and now accessible from Google logo click
* now building and publishing SystemWebView apks
# 63.0.3239.118
* limit impact of AMP-removal to not break tabs (https://github.com/bromite/bromite/issues/20)
* fix DuckDuckGo and StartPage suggestions (https://github.com/bromite/bromite/issues/19)
* revert /deep/ and ::shadow feature drop to attempt fixing DevTools support (https://github.com/bromite/bromite/issues/23)
* remove also ads from search results
* add Google search engine with English-only results, no RLZ and field trials
* fix build of x86 version (was broken in previous version)
# 63.0.3239.85
* no suggest URL for DuckDuckGo (https://github.com/bromite/bromite/issues/19)
* fixed 4chan blocking rule
* limit AMP links cleanup to search results only (fixes broken images/news result tabs)
# 63.0.3239.78
* correctly set version and build numbers
# 63.0.3239.73
# 63.0.3239.64
* fixed an issue with incognito new tab
* permanent disable for ToS/metrics and unused auto-updates check
# 63.0.3239.46
* removed search engine geolocation default patch
# 63.0.3239.38
# 63.0.3239.27
# 63.0.3239.24
* convert AMP search results to regular search results
# 63.0.3239.15
* remove URL tracking from Google search results
* disable webRTC by default (https://github.com/bromite/bromite/issues/9, still not working proper)
* do not enable search engine geolocation by default
* use own package name (closes https://github.com/bromite/bromite/issues/1)
* use 64bit WebView process
# 63.0.3239.10
* attempt enabling API keys (didn't work)
* added StartPage search engine (closes https://github.com/bromite/bromite/issues/3)
# 63.0.3239.6
* added Bromite patch for Google search results click-tracking removal
* added x86 target CPU
* fixed red blink frame
# 63.0.3235.2
* first release with NoChromo adblocking patch
* Bromite patch: disable NTP remote suggestions
* added some Inox/Iridium/Ungoogled-Chromium patches, namely:
* DuckDuckGo search engine
* disable battery status service
* disable formatting in OmniBox
* disable GCM status checks
* use local fonts instead of fonts from Google servers
* disable updater pings
* do not enable Google integrations by default (translation, lookup, etc)
* disable the ad promo system
* do not store passwords by default
* do not fetch Google promotions
* restore classic NTP
* only keep cookies until exit
* block third-party cookies
+73
View File
@@ -0,0 +1,73 @@
# Frequently Asked Questions
## Does Google Sync/Translate/Data saver work?
No.
This is not a limitation of Bromite but of all Chromium-based projects in general, as general public is not allowed to use Google's APIs for free unless when using Chrome.
Additionally, these features would not be privacy-friendly.
## Does Bromite require root?
No.
## Is Bromite de-googled?
Yes, although this has not been verified (and hardly can be) under all situations; if you were to find connections to cloud-based services please report them via the issue tracker.
Bromite uses [ungoogled-chromium's python script](https://github.com/Eloston/ungoogled-chromium/blob/master/utils/domain_substitution.py) to disable URLs in the codebase since version `78.0.3904.93`.
Projects which follow a strict approach on this are [Iridium](https://iridiumbrowser.de/) and [Inox patchset](https://github.com/gcarq/inox-patchset).
## Does Bromite support DRM media?
Yes, in order to play protected/encrypted media content the browser will use Android's DRM media framework to automatically negotiate access (same as Chromium).
This means for example that requests to Android license servers will be performed (`www.googleapis.com`), see https://w3c.github.io/encrypted-media/#direct-individualization
To disable this functionality you should disable protected content playback from Site settings -> Multimedia.
## What is the SystemWebView?
It is the core component of Android for all web page visualizations. For example when you access a new wifi network and need to activate it, that is using the SystemWebView. If you do not know what it is then you do not need to install it.
See also [the wiki page](https://github.com/bromite/bromite/wiki/Installing-SystemWebView) for community-contributed installation instructions.
Ad-blocking was present and always enabled in the SystemWebView from version `72.0.3626.120` till version `77.0.3865.104`, when it stopped working due to [upstream NetworkService changes](https://docs.google.com/document/d/1TZEuPvr2KAbP4_TZpuuwtEEArQsyAkc2HDu68l66YwU/edit?ts=598244df#heading=h.ougoi5i6508y).
## How to enable DNS-over-HTTPS?
See [this wiki page](https://github.com/bromite/bromite/wiki/Enabling-DNS-over-HTTPS).
## Can you add HTTPS everywhere?
No.
We cannot add add-ons to Bromite (merely some features).
## Is Bromite on Play Store?
No, and this is unlikely to change. Many limitations apply for submissions there, including which ads are allowed to be blocked.
Bromite favors user freedom in software choice: the device is yours so you get to choose which software to run on it, end of the story.
## Is Bromite on F-Droid?
It is not on the official F-Droid repository and there are no (more) plans to submit it.
You can use F-Droid client to install and receive updates via [the official Bromite F-Droid repository](https://www.bromite.org/fdroid).
## Does Bromite support WebRTC?
Yes, since version 69. While the desktop version of Chromium has an option to disable it (video/audio site settings), the Android version cannot.
The WebRTC functionality has always been using safe defaults to prevent leaks (disabled multiple routes and non-proxied UDP).
## Using Bromite will favour the monopoly of the Chromium/Blink engine, why do you develop and maintain Bromite?
In short, to show what a Chromium-based engine could do **for the user** if the user experience and needs were the main focus of modern browser design.
For an Android browser using an alternative engine see [Fennec F-Droid](https://f-droid.org/en/packages/org.mozilla.fennec_fdroid/).
## Does Bromite support extensions?
No; Bromite will support extensions only if upstream (Chromium) does, or similarly another project maintains the patch and functionality.
## Why do push notifications not work on this website?
The [Chromium Blink engine](https://www.chromium.org/blink) uses [GCM](https://en.wikipedia.org/wiki/Google_Cloud_Messaging) to deliver messages
when websites use the [Push API](https://w3c.github.io/push-api/); this will not work in Bromite because cloud integrations are disabled (GCM in this case).
[ServiceWorker notifications](https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration/showNotification) do work instead since they use
[android.app.Notification](https://developer.android.com/guide/topics/ui/notifiers/notifications).
## Can PWAs be installed?
PWAs are only supported as home shortcuts; WebAPKs will not work because they are generated server-side on googleapis.com (which is not allowed in Bromite).
+113 -163
View File
@@ -1,202 +1,152 @@
<a href="https://github.com/uazo/cromite/releases/latest">
<img src="https://img.shields.io/github/v/release/uazo/cromite" alt="current Cromite release" title="current Cromite release" />
</a>
<br>
# Bromite - Take back your browser
[![Build Cromite](https://github.com/uazo/cromite/actions/workflows/build_cromite.yaml/badge.svg)](https://github.com/uazo/cromite/actions/workflows/build_cromite.yaml)
<img src="https://www.bromite.org/release.svg" alt="current Bromite release" title="current Bromite release" /> <img src="https://www.bromite.org/license.svg" alt="GNU GPL v3" title="GNU VPL v3" />
# Cromite (a Bromite fork) - Take back your browser
<img title="Bromite - take back your browser!" src="https://www.bromite.org/android-icon-192x192.png" width="96" alt="Bromite" />
<a href="https://www.cromite.org">
<img title="Cromite - take back your browser!" src="https://www.cromite.org/app_icon.png" width="96" alt="Bromite" />
</a>
<br>
Bromite is a [Chromium](https://www.chromium.org/Home) fork with support for ad blocking and enhanced privacy.
Cromite is a [Chromium](https://www.chromium.org/Home) fork based on [Bromite](https://github.com/bromite/bromite) with built-in support for ad blocking and an eye for privacy.
Bromite is only available for Android v4.4 and above.
Cromite is available for Android arm64-v8a, arm32-v7a and x86_64, Android 10 and above, Windows and Linux 64bit.
<img src="https://www.bromite.org/bromite_bromite_gh_downloads.svg" alt="downloads on Github" title="downloads on Github" />
For the Frequently Asked Questions see [F.A.Q.](./FAQ.md).
For documentation see the [wiki](https://github.com/bromite/bromite/wiki).
# Goals
Cromite's goal is to
- limit the features built into the browser that can be used as a platform for tracking users' habits, and, if it is not technically possible, disable them and leave it up to the user to choose whether to re-enable them
- limit the close integration between the browser and its manufacturer
- not let the excellent research work done by csagan5 with Bromite be lost
Bromite aims at providing a no-clutter browsing experience without privacy-invasive features and with the addition of a fast ad-blocking engine.
Minimal UI changes are applied to help curbing the idea of "browser as an advertisement platform".
In addition, Cromite would like to promote greater integration with other non-profit, open source browsers, encouraging closer collaboration with others, and attempt to integrate them directly into Chromium once they have reached an appropriate level of maturity.
# Donate
Please donate to support development of Bromite and the costs for the build system.
[&rarr; Support development with a donation](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=JP3XTQPVRNET2): [![paypal](https://www.bromite.org/assets/img/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=JP3XTQPVRNET2)
<a href="bitcoin:bc1qmpyuqsvs3tz3uaysplmwjr33gg4rzu6cqweaq834ehc25vduxppqkrszel">BTC donations address</a>: `bc1qmpyuqsvs3tz3uaysplmwjr33gg4rzu6cqweaq834ehc25vduxppqkrszel`
ETH donations address: `0xf47ff39223d828f99fec5ab53bd068c5c0522042`
# Features
* customizable adblock filters via user-provided URL
* remove click-tracking and AMP from search results
* DNS-over-HTTPS support with any valid IETF DoH endpoint
* always-incognito mode
* disable all field trials permanently
* disable [QUIC](https://en.wikipedia.org/wiki/QUIC) by default
* disable smart search by default, allow web search from incognito mode
* always-visible cookies, javascript and ads site settings
* remove Play integration binary blobs
* use [CFI](https://en.wikipedia.org/wiki/Control-flow_integrity) on all architectures except x86
* disable media router and remoting by default
* disable dynamic module loading
* enable site-per-process isolation for all devices with memory > 1GB
* completely remove safe browsing and other privacy-unfriendly features
* [proxy configuration page](https://github.com/bromite/bromite/wiki/ProxyConfiguration) with PAC and custom proxy lists support
* [DuckDuckGo](https://duckduckgo.com/) and [Qwant](https://www.qwant.com/) search engines available by default
* flags to disable custom intents and clear session on exit
* flags to toggle anti-fingerprinting mitigations for canvas, audio, client rects, webGL and sensor APIs
* use frozen User-Agent to conceal real model and browser version
* privacy enhancement patches from [Iridium](https://iridiumbrowser.de/), [Inox patchset](https://github.com/gcarq/inox-patchset), [Brave](https://brave.com/) and [ungoogled-chromium](https://github.com/Eloston/ungoogled-chromium) projects
* security enhancement patches from [GrapheneOS](https://github.com/GrapheneOS) project
## Features not related to privacy
* import/export bookmarks
* allow playing videos in background tabs and disable pause on switching tabs
* all codecs included (proprietary, open H.264 etc.)
* [AV1 codec support](https://github.com/bromite/bromite/wiki/AV1-support)
* [dav1d](https://code.videolan.org/videolan/dav1d) decoder enabled by default
* built with official speed optimizations
* increase number of autocomplete matches from 5 to 10
* allow changing default download storage location
* do not ignore save prompt for users without SD cards
* disable articles and increase number of icons on new tab page
You can inspect all functionality/privacy changes by reading the [patches](https://github.com/bromite/bromite/tree/master/build/patches) and/or the [CHANGELOG](./CHANGELOG.md).
### Flags
Flags which have been retired from upstream Chromium but are still available in Bromite.
* `#enable-horizontal-tab-switcher`
* `#pull-to-refresh`
* `#enable-search-ready-omnibox`
# Privacy limitations
Cromite's privacy features, including anti-fingerprinting mitigations (which are not comprehensive), **are not to be considered useful for journalists and people living in countries with freedom limitations**, please look at [Tor Browser](https://www.torproject.org/download/) in such cases (better to use the desktop version).
Please note that this project is not free of bugs and that changing the behaviour of a browser can be risky and not without problems.
# Docs
- [Privacy Policy](https://github.com/uazo/cromite/blob/master/docs/PRIVACY_POLICY.md)
- [Features](https://github.com/uazo/cromite/blob/master/docs/FEATURES.md)
- [Faqs](https://github.com/uazo/cromite/blob/master/docs/FAQ.md)
- [How to build](https://github.com/uazo/cromite/blob/master/docs/HOW_TO_BUILD.md)
- [Patch list](https://github.com/uazo/cromite/blob/master/docs/PATCHES.md)
Bromite's privacy features, including anti-fingerprinting mitigations (which are not comprehensive), **are not to be considered useful for journalists and people living in countries with freedom limitations**, please look at [Tor Browser](https://www.torproject.org/download/) in such cases.
# Releases
All built versions are available as [releases](https://github.com/uazo/cromite/releases).
All built versions are available as [releases](https://github.com/bromite/bromite/releases); the [official website](https://www.bromite.org/) points to those releases and - when browsing via Android - it will automatically highlight the one apt for your device (or none otherwise).
Cromite is currently built for ARM, ARM64, Android x86, Windows x64 and Linux.
Each tag corresponds to a Chromium Stable release tag.
The following files will be present for each release:
Bromite is currently built for ARM, ARM64 and x86 and for the Android SDK versions 19 and 21; [Bromite SystemWebView](https://www.bromite.org/system_web_view) is provided as well (SDK21+).
For every Bromite build you can always find a matching [vanilla Chromium](https://www.bromite.org/chromium) build which is used for example to verify which issues are specific to Bromite or not.
#### Cromite apk for android:
- [arm64_ChromePublic.apk](https://github.com/uazo/cromite/releases/latest/download/arm64_ChromePublic.apk)
- [arm_ChromePublic.apk](https://github.com/uazo/cromite/releases/latest/download/arm_ChromePublic.apk)
- [x64_ChromePublic.apk](https://github.com/uazo/cromite/releases/latest/download/x64_ChromePublic.apk)
All official releases are also available through the [official third-party F-Droid repository](https://www.bromite.org/fdroid).
#### Linux package:
- [chrome-lin64.tar.gz](https://github.com/uazo/cromite/releases/latest/download/chrome-lin64.tar.gz)
#### Windows package:
- [chrome-win.zip](https://github.com/uazo/cromite/releases/latest/download/chrome-win.zip)
#### Debugging symbols and proguard file for java stacktrace deobfuscation
- x64_ChromePublic.apk.mapping
- arm64_ChromePublic.apk.mapping
- arm64_symbols.zip
#### Build time analysis file:
- arm64_ninja_log_trace.html
#### Chrlauncher autoupdate file:
- updateurl.txt
Additional files are also available: please note that these files are created by an [additional build](https://github.com/uazo/cromite/actions/workflows/build_additional_targets.yaml) separate from the release process, and therefore may not be immediately available.
#### Cromite System WebView apk for android:
- arm64_SystemWebView.apk
- x64_SystemWebView.apk
#### Vanilla Chromium for android (used for tests):
- arm64_VanillaChromium.apk
- arm_VanillaChromium.apk
- x64_VanillaChromium.apk
#### SystemWebView Shell (used for tests)
- arm64_SystemWebViewShell.apk
- x64_SystemWebViewShell.apk
### F-droid
Official F-droid repo url:
https://www.cromite.org/fdroid/repo/?fingerprint=49F37E74DEE483DCA2B991334FB5A0200787430D0B5F9A783DD5F13695E9517B
### Auto-update in Android
You will automatically receive notifications about new updates (and be able to install them) via the auto updater functionality.
You will be asked whether you want to activate the functionality during the first start-up.
### Auto-update setup for Windows
1. Download https://github.com/henrypp/chrlauncher/releases
2. Create a `chrlauncher.ini`
## Integrity and authenticity
You can verify the integrity of a downloaded APK file from this project with any `sha256sum`-compatible tool by downloading the corresponding `brm_X.Y.Z.sha256.txt` or `chr_X.Y.Z.sha256.txt` file, where X.Y.Z is the release version number. Example:
```
[chrlauncher]
# Custom Chromium update URL (string):
ChromiumUpdateUrl=https://github.com/uazo/cromite/releases/latest/download/updateurl.txt
# Command line for Chromium (string):
# note --user-data-dir= works better if path is absolute
# See here: http://peter.sh/experiments/chromium-command-line-switches/
ChromiumCommandLine=--user-data-dir="%LOCALAPPDATA%\Cromite\User Data" --no-default-browser-check
# to enable full logging in c:\temp\log.txt (daily rotate, no automatic deletion)
# ChromiumCommandLine=--enable-logging --v=0 --log-file=C:\temp\log.txt --user-data-dir=".\User Data" --no-default-browser-check
# Chromium executable file name (string):
ChromiumBinary=chrome.exe
# Chromium binaries directory (string):
# Relative (to chrlauncher directory) or full path (env. variables supported).
ChromiumDirectory=.\bin
```
To prevent deletion by Microsoft Defender each time the browser is updated, check the `user-data-dir` folder by modifying it accordingly.
### Enable network process sandbox in windows
I don't include any setups because I don't like the experience of not knowing what they do, so you must manually run this command on first installation:
```
cd <where_is_the_exe>
icacls . /grant "*S-1-15-2-2:(OI)(CI)(RX)"
```
see https://github.com/uazo/bromite-buildtools/issues/51
### Enable AppContainer for renderer process in windows
you can activate (highly recommended) the 'RendererAppContainer' flag from the command line with
```
--enable-features=RendererAppContainer
$ sha256sum --check brm_68.0.3440.54.sha256.txt
arm64_SystemWebView.apk: OK
arm64_ChromePublic.apk: OK
arm64_ChromeModernPublic.apk: OK
```
### Auto-update setup for linux
working in progress in https://github.com/uazo/cromite/issues/771
### Making Cromite work in Ubuntu 24.04 and its derivatives (kubuntu, etc)
This happens because, starting with Ubuntu 24.04, Apparmor
restricts the use of unprivileged user namespaces. To fix this, you have several options:
#### 1. Creating an apparmor profile for cromite
Create `/etc/apparmor.d/chrome`, and write:
You can verify authenticity, e.g. that the author ([csagan5](https://github.com/csagan5)) released the file, by using gpg2:
```
abi <abi/4.0>,
include <tunables/global>
profile cromite /home/user/cromite/chrome-lin/chrome flags=(unconfined) {
userns,
include if exists <local/chrome>
}
$ gpg2 --quiet --verify brm_68.0.3440.54.sha256.txt.asc
gpg: assuming signed data in 'brm_68.0.3440.54.sha256.txt'
gpg: Signature made Sun 08 Jul 2018 04:22:52 PM CEST using RSA key ID D85DC0C5
gpg: Good signature from "csagan5 <32685696+csagan5@users.noreply.github.com>"
```
replacing the cromite binary path with where you have placed cromite.
Now, run `sudo apparmor_parser -r /etc/apparmor.d/cromite` to apply the changes.
#### 2. Disabling the restriction until next reboot
`sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0`
#### 3. Disabling the restriction permanently
Add `kernel.apparmor_restrict_unprivileged_userns=0` to the file `/etc/sysctl.d/60-apparmor-namespace.conf`. Create the file if not exists.
You can download csagan5's public GnuPG key from here: [csagan5.asc](./csagan5.asc).
# Contributing
# How to build
Please submit issues following the issue template; beware that GitHub does not display the templates from mobile.
The [Bromite main repository](https://github.com/bromite/bromite) contains tags for each corresponding Chromium release (see https://chromium.googlesource.com/chromium/src.git).
Patches are welcome and accepted if they match the project goals.
Please refer to [official Chromium build documentation](https://www.chromium.org/developers/how-tos/get-the-code) to get started on how to build Chromium; if you can build Chromium for Android, you can build Bromite.
If you want to help me, [here](https://github.com/uazo/cromite/blob/master/docs/HELP_ME_PLEASE.md) is the list of things I would need.
The GN args used to build Bromite are available here: [GN_ARGS](./build/GN_ARGS).
The patches are to be applied second the order specified in the `bromite_patches_list.txt` file (you can use `git am`).
For any usage or development discussion please use GitHub Discussions: https://github.com/uazo/cromite/discussions
## How to build the filters
See upstream documentation: https://github.com/chromium/chromium/blob/master/components/subresource_filter/FILTER_LIST_GENERATION.md
Bromite uses an unindexed filter file, which is periodically published at https://github.com/bromite/filters
# Credits
* [Chromium project](https://www.chromium.org/Home) and developers
* [Bromite](https://github.com/bromite/bromite)
* [Iridium project](https://github.com/iridium-browser) for some patches
* [ungoogled-chromium](https://github.com/Eloston/ungoogled-chromium) for some patches
* [ungoogled-chromium-android](https://github.com/ungoogled-software/ungoogled-chromium-android) for some patches
* [GrapheneOS](https://github.com/GrapheneOS) for some security patches
* [Inox patchset](https://github.com/gcarq/inox-patchset) for some patches (via ungoogled-chromium)
* [Brave Browser](https://github.com/brave/brave-core) for some patches
* [Iridium project](https://github.com/iridium-browser) for some patches
* [ungoogled-chromium](https://github.com/Eloston/ungoogled-chromium) for some patches
* [ungoogled-chromium-android](https://github.com/ungoogled-software/ungoogled-chromium-android) for some patches
* [GrapheneOS](https://github.com/GrapheneOS) for some security patches
* [Inox patchset](https://github.com/gcarq/inox-patchset) for some patches (via ungoogled-chromium)
* [Brave Browser](https://github.com/brave/browser-android-tabs) for some patches
* [Vadim Pleshkov](http://vadimpleshkov.me/) for Bromite's logo
thanks to [austinhuang0131](https://github.com/austinhuang0131) for the svg icon
# Donate
If you want, you can donate to support cromite development through [paypal](https://www.paypal.com/pools/c/9e5lO2OIzb).
Current link:
- https://www.paypal.com/pools/c/9hEHZ6tElk
Historical fundraisings links:
- https://www.paypal.com/pools/c/9cwNgAQhRL
- https://www.paypal.com/pools/c/9e5lO2OIzb
# Filters credits
* [EasyList](https://easylist.to/#easylist)
* [EasyPrivacy](https://easylist.to/#easyprivacy)
* [uBlock Origin](https://github.com/uBlockOrigin)
* [Peter Lowe's Ad and tracking server list](https://pgl.yoyo.org/adservers/)
# License
Cromite is published under [GNU GPL v3](./LICENSE).
The patches published as part of the Bromite project are released under GNU GPL v3 only.
Cromite specific patches are under the GNU GPL-2+ licence.
Each individual patch contains specific information on the licence used.
The patches published as part of the Bromite project are released under [GNU GPL v3](./LICENSE).
[version-image]: https://img.shields.io/github/release/bromite/bromite.svg?style=flat-square
[version-url]: https://github.com/bromite/bromite/releases/latest
[license-image]: https://img.shields.io/github/license/bromite/bromite.svg
[license-url]: https://github.com/bromite/bromite/blob/master/LICENSE
+1
View File
@@ -0,0 +1 @@
document.write("<div>you shouldn't see this</div>");
+36
View File
@@ -0,0 +1,36 @@
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<iframe src="https://upload.wikimedia.org/wikipedia/commons/8/83/Artis%2C_enkele_flamingo%27s_-_SoundCloud_-_Beeld_en_Geluid.ogg" allow="autoplay" id="iframeAudio"></iframe>
<audio controls autoplay id="myAudio">
<!-- One or more source files, each referencing the same audio but in a different file format.
The browser will choose the first file which it is able to play. -->
<source src="https://upload.wikimedia.org/wikipedia/commons/8/83/Artis%2C_enkele_flamingo%27s_-_SoundCloud_-_Beeld_en_Geluid.ogg">
You will see this text if native audio playback is not supported.
<!-- You could use this fall-back feature to insert a JavaScript-based audio player. -->
</audio>
<small>Audio by <a href="https://soundcloud.com/beeldengeluid">Beeld en Geluid</a>
[<a href="http://creativecommons.org/licenses/by-sa/3.0">CC BY-SA 3.0</a>],
<a href="https://commons.wikimedia.org/wiki/File%3AArtis%2C_enkele_flamingo&#039;s_-_SoundCloud_-_Beeld_en_Geluid.ogg">via Wikimedia Commons</a>
</small>
<style>
#audio-example {
display: block;
}
</style>
Read more: https://html.com/attributes/audio-autoplay/#ixzz6dCxFrzCr
<script type="text/javascript">
document.getElementById("myAudio").play();
</script>
</body>
</html>
+38
View File
@@ -0,0 +1,38 @@
android_channel="stable"
blink_symbol_level=1
dcheck_always_on=false
debuggable_apks=false
dfmify_dev_ui=false
disable_android_lint=true
disable_autofill_assistant_dfm=true
disable_tab_ui_dfm=true
enable_av1_decoder=true
enable_dav1d_decoder=true
enable_feed_in_chrome=false
enable_gvr_services=false
enable_hangout_services_extension=false
enable_iterator_debugging=false
enable_mdns=false
enable_mse_mpeg2ts_stream_parser=true ffmpeg_branding="Chrome" proprietary_codecs=true
enable_nacl=false
enable_nacl_nonsfi=false
enable_remoting=false
enable_reporting=false
enable_resource_whitelist_generation=false
enable_vr=false
fieldtrial_testing_like_official_build=true
icu_use_data_file=true
is_cfi=false
is_component_build=false
is_debug=false
is_official_build=true
rtc_build_examples=false
safe_browsing_mode=0
symbol_level=1
target_os="android"
use_debug_fission=true
use_errorprone_java_compiler=false
use_jumbo_build=false
use_official_google_api_keys=false
use_openh264=true chrome_pgo_phase=0 full_wpo_on_official=true
use_sysroot=false
-1
View File
@@ -1 +0,0 @@
142.0.7444.60
+142
View File
@@ -0,0 +1,142 @@
Disable-third-party-cookies-by-default.patch
Revert-Remove-pre-unified-consent-code-in-sync-and-privacy-directory.patch
Restore-classic-new-tab-page.patch
Always-use-new-tab-page-for-default-home-page.patch
Always-allow-partner-customisation.patch
battery_status_service-disable-more-privacy-nightmares.patch
Battery-API-return-nothing.patch
updater-disable-updater-pings.patch
prefs-only-keep-cookies-until-exit.patch
Remove-EV-certificates.patch
promo-disable-Google-promotion-fetching.patch
Disable-omission-of-URL-elements-in-Omnibox.patch
Modify-default-preferences.patch
Do-not-store-passwords-by-default.patch
Disable-NTP-remote-suggestions-by-default.patch
Disable-references-to-fonts.googleapis.com.patch
Disable-WebRTC-by-default.patch
Never-send-any-crash-upload-data.patch
Hide-send-reports-checkbox.patch
Never-fetch-popular-sites.patch
ungoogled-chromium-Disable-webRTC-log-uploader.patch
ungoogled-chromium-Disable-untraceable-URLs.patch
ungoogled-chromium-Disable-translate-integration.patch
ungoogled-chromium-Disable-profile-avatar-downloading.patch
ungoogled-chromium-Disable-intranet-redirect-detector.patch
ungoogled-chromium-Disable-Google-host-detection.patch
ungoogled-chromium-Disable-GCM.patch
ungoogled-chromium-Disable-Gaia.patch
ungoogled-chromium-Disable-domain-reliability.patch
ungoogled-chromium-Disable-Network-Time-Tracker.patch
Disable-safe-browsing.patch
Skip-the-first-run-and-metrics.patch
Disable-all-promo-dialogs.patch
Disable-sync-services-menu-entry.patch
Remove-signin-and-data-saver-integrations.patch
Hide-passwords-manager-link.patch
Disable-Omaha-update-checks.patch
Disable-update-scheduler.patch
Add-English-only-search-engine.patch
Add-DuckDuckGo-Lite-search-engine.patch
Add-Qwant-search-engine.patch
Fix-crash-when-accessing-page-info-site-settings.patch
openH264-enable-ARM-ARM64-optimizations.patch
Switch-to-fstack-protector-strong.patch
Enable-fwrapv-in-Clang-for-non-UBSan-builds.patch
build-remove-calling-untrusted-hooks.patch
AV1-codec-support.patch
Inject-scripts-for-AMP-tracking-ads-and-video-functionality.patch
Allow-playing-audio-in-background.patch
Add-flag-to-control-video-playback-resume-feature.patch
Open-YouTube-links-in-Bromite.patch
Add-exit-menu-item.patch
Remove-help-menu-item.patch
AudioBuffer-AnalyserNode-fingerprinting-mitigations-via-IDL.patch
Multiple-fingerprinting-mitigations-for-canvas-text-and-client-rectangles.patch
Add-flags-to-disable-device-motion-and-orientation-APIs.patch
Disable-metrics-on-all-I-O-threads.patch
Always-respect-async-dns-flag-regardless-of-SDK-version.patch
Add-flag-to-configure-maximum-connections-per-host.patch
Add-site-settings-option-for-session-only-cookies.patch
Add-bookmark-import-export-actions.patch
Disable-promos-displayed-in-bookmarks-manager.patch
Add-an-always-incognito-mode.patch
Add-custom-tab-intents-privacy-option.patch
Add-option-to-not-persist-tabs-across-sessions.patch
Disable-fetching-of-all-field-trials.patch
Disable-seed-based-field-trials.patch
Disable-plugins-enumeration.patch
net-cert-increase-default-key-length-for-newly-generated-RSA-keys.patch
dns-send-IPv6-connectivity-probes-to-RIPE-DNS.patch
profile-resetter-do-not-tick-send-settings-by-default.patch
browser-ui-disable-warning-about-missing-API-keys.patch
autofill-disable-autofill-download-manager.patch
first_run-deactivate-autoupdate-globally.patch
translate-disable-fetching-of-translate-languages-from-server.patch
kill-TOS-and-metrics-opt-out.patch
kill-Translate.patch
kill-Vision.patch
kill-Location-fall-back-to-system.patch
kill-Auth.patch
Remove-dependency-on-com.google.android.gms.auth.patch
kill-GCM.patch
Remove-dependency-on-com.google.android.gcm.patch
Remove-dependency-on-com.google.android.gms.gcm.patch
Remove-dependency-on-com.google.android.play.patch
Remove-dependency-on-com.google.android.gms.vision-com.google.android.gms.clearcut-com.google.android.gms.phenotype.patch
Remove-dependency-on-com.google.android.gms.flags-com.google.android.gms.location.places-com.google.android.gms.stats.patch
Remove-dependency-on-com.google.android.gms.fido-com.google.android.gms.iid-com.google.android.gms.instantapps-com.google.android.gms.location.patch
Remove-dependency-on-com.google.android.gms.cast.patch
Remove-dependency-on-com.google.android.gms.common-auth-signin-dynamic-com.google.android.gms.tasks.patch
Remove-SMS-integration.patch
Do-not-compile-QR-code-sharing.patch
Allow-website-sign-in-without-account-sign-in.patch
Offer-builtin-autocomplete-for-chrome-flags.patch
Do-not-grant-notifications-to-default-search-engine.patch
Add-flag-to-disable-IPv6-probes.patch
Add-a-proxy-configuration-page.patch
Do-not-ignore-download-location-prompt-setting.patch
Disable-previews-by-default.patch
Use-4-tile-rows-never-show-logo.patch
Disable-metrics-collection-for-NTP-tiles.patch
Enable-site-per-process-isolation-for-devices-with-enough-memory.patch
Disable-dynamic-module-loading.patch
prefs-disable-signinallowed-by-default.patch
prefs-always-prompt-for-download-directory-by-default.patch
Disable-offline-pages-in-the-downloads-home-to-be-opened-in-CCT-by-default.patch
Enable-changing-default-downloads-storage-location-by-default.patch
disable-payment-support-by-default.patch
disable-background-sync-by-default.patch
disable-sensors-access-site-setting-by-default.patch
Disable-media-router-and-remoting-by-default.patch
Revert-Cleanup-Search-Ready-Omnibox-flag-since-it-has-launched.patch
Disable-search-ready-omnibox-by-default.patch
disable-AdsBlockedInfoBar.patch
Bromite-AdBlockUpdaterService.patch
Add-option-to-configure-the-ad-blocker-filters-URL.patch
Replace-DoH-probe-domain-with-RIPE-domain.patch
Increase-number-of-autocomplete-matches-from-5-to-10.patch
Disable-HEAD-requests-for-single-word-Omnibar-searches.patch
Block-all-connection-requests-with-qjz9zk-in-the-domain-name-or-with-a-trk-scheme.patch
Disable-some-signed-exchange-features.patch
Add-flag-to-disable-WebGL.patch
Add-user-setting-for-DNS-over-HTTPS-DoH-custom-URL.patch
Reduce-HTTP-headers-in-DoH-requests-to-bare-minimum.patch
Revert-flags-remove-disable-pull-to-refresh-effect.patch
Use-dummy-DFM-installer.patch
Disable-password-reuse-detection-on-android.patch
Allow-building-without-feed-support.patch
Disable-autofill-assistant-by-default.patch
Always-show-site-settings-for-cookies-javascript-and-ads.patch
Do-not-enable-QUIC-by-default.patch
Restore-enable-horizontal-tab-switcher-flag.patch
Use-a-minimum-DoH-timeout-of-400ms.patch
Disable-DRM-media-origin-IDs-preprovisioning.patch
Disable-smart-selection-by-default.patch
Enable-user-agent-freeze-by-default.patch
Disable-AImageReader-for-ARM64-P-and-ARM64-Q.patch
Upstream-internal-DownloadCollectionBridge-code.patch
Add-missing-android_provider.patch
Automated-domain-substitution.patch
show-download-prompt-again-by-default.patch
disable-browser-autologin-by-default.patch
-9
View File
@@ -1,9 +0,0 @@
# infra/config/generated/builders/ci/android-official/gn-args.json
debuggable_apks = false
is_official_build = true
# the official instructions use symbol_level=2 but I do not need the debug symbols
symbol_level = 0
# do not make the second build of v8
include_both_v8_snapshots = false
+6
View File
@@ -0,0 +1,6 @@
Revert-Remove-pre-unified-consent-code-in-sync-and-privacy-directory.patch
AV1-codec-support.patch
Switch-to-fstack-protector-strong.patch
Enable-fwrapv-in-Clang-for-non-UBSan-builds.patch
Disable-password-reuse-detection-on-android.patch
Allow-building-without-feed-support.patch
Binary file not shown.
Binary file not shown.
-36
View File
@@ -1,36 +0,0 @@
)]}'
{
"response": {
"server": "prod",
"protocol": "3.1",
"app": [
{
"appid": "gcmjkmgdlgnkkcocmoeiminaijmmjnii",
"status": "ok",
"updatecheck": {
"status": "ok",
"urls": {
"url": [
{
"codebase": "https://www.cromite.org/components/"
}
]
},
"manifest": {
"version": "1.0.0",
"packages": {
"package": [
{
"hash_sha256": "22639FA1B21D9D95E6343A6A58028B224903D23BA404537584A22236FCFC3482",
"name": "fonts_component.zip",
"fp": "1.22639FA1B21D9D95E6343A6A58028B224903D23BA404537584A22236FCFC3482",
"required": true
}
]
}
}
}
}
]
}
}
-32
View File
@@ -1,32 +0,0 @@
)]}' {
"response": {
"server": "prod",
"protocol": "4.0",
"apps": [
{
"appid": "gcmjkmgdlgnkkcocmoeiminaijmmjnii",
"status": "ok",
"updatecheck": {
"status": "ok",
"nextversion": "1.0.0",
"pipelines": [
{
"operations": [
{
"type": "download",
"urls": [ { "url": "https://www.cromite.org/components/fonts_component.zip" } ],
"out": { "sha256": "22639FA1B21D9D95E6343A6A58028B224903D23BA404537584A22236FCFC3482" },
"size": 60716451
},
{
"type": "crx3",
"in": { "sha256": "22639FA1B21D9D95E6343A6A58028B224903D23BA404537584A22236FCFC3482" }
}
]
}
]
}
}
]
}
}
-183
View File
@@ -1,183 +0,0 @@
android_channel="stable"
blink_symbol_level=1
build_contextual_search=false
build_with_tflite_lib=false
chrome_pgo_phase=0
dcheck_always_on=false
disable_fieldtrial_testing_config=true
enable_hangout_services_extension=false
enable_iterator_debugging=false
enable_mdns=false
enable_remoting=false
enable_reporting=false
enable_vr=false
exclude_unwind_tables=false
icu_use_data_file=true
is_component_build=false
is_debug=false
is_official_build=true
rtc_build_examples=false
symbol_level=1
treat_warnings_as_errors=true
use_debug_fission=true
use_errorprone_java_compiler=false
use_official_google_api_keys=false
use_rtti=false
webview_includes_weblayer=false
enable_arcore=false
enable_openxr=false
enable_cardboard=false
is_high_end_android=true
# media section
proprietary_codecs=true
ffmpeg_branding="Chrome"
enable_av1_decoder=true
enable_dav1d_decoder=true
# disable cisco OpenH264
media_use_openh264 = false
# decoder flags
if (target_os == "android" || target_os == "win") {
# codec supported by default
# android: https://developer.android.com/media/platform/supported-formats
# windows: https://learn.microsoft.com/en-us/windows/win32/medfound/codecobjects
# enable aac and h264 hw decoder only
enable_platform_aac_audio = true
enable_platform_h264_video = true
# enable hw decoder for h265 (hevc)
enable_platform_hevc = true
# disable dolby vision
enable_platform_dolby_vision = false
enable_platform_encrypted_dolby_vision = false
if (target_os == "win") {
# enable ac3/eac codec
enable_platform_ac3_eac3_audio = true
}
}
# disable passthrough audio codecs
enable_platform_dts_audio = false
# disabled the use of the context snapshot
# see https://github.com/uazo/cromite/pull/317 for context
use_v8_context_snapshot = false
# disable minikin engine
# see https://github.com/uazo/cromite/issues/697
use_minikin_hyphenation = false
# disable automatic update of sync-related cookies
# initial commit: https://source.chromium.org/chromium/chromium/src/+/fd9a841f7a63b9f5510f6b713d9c833d259c63ad
enable_bound_session_credentials = false
# Allows building without //third_party/unrar included, for license reasons
safe_browsing_use_unrar = false
# Keep disabled Google Request Header Integrity
# see https://chromium-review.googlesource.com/c/chromium/src/+/5778493
enable_request_header_integrity = false
# Disable precompiled headers because they are incompatible with the unsafe_buffers configuration
enable_precompiled_headers = false
# Disable integration with Gemini
enable_glic = false
# Disable TFLite with XNNPACK
build_tflite_with_xnnpack = false
declare_args() {
_is_debug_build = ""
build_webview = false
}
not_needed(["_target_build", "_is_debug_build"])
if (target_os == "android") {
target_os = "android" # fix traffic annotation auditor
#enable_kythe_annotations = true
chrome_public_manifest_package = "org.cromite.cromite"
system_webview_package_name="org.cromite.webview" #"com.android.webview"
system_webview_shell_package_name="org.cromite.webview_shell"
chrome_pgo_phase = 2 # enable pgo
# do not split Developer UI split into a separate Dynamic Feature Module
dfmify_dev_ui = false
if (getenv("USE_KEYSTORE") != "") {
android_keystore_path = "/home/lg/working_dir/cromite.keystore"
android_keystore_name = "cromite"
android_keystore_password = getenv("KEYSTORE_PASSWORD")
}
cromite_pref_hash_seed_bin = getenv("CROMITE_PREF_HASH_SEED_BIN")
disable_android_lint = true
_is_debug_build = getenv("TARGET_ISDEBUG")
if (_is_debug_build == "true") {
# print("Debug build on")
is_debug = true
is_official_build = false
dcheck_always_on = true
symbol_level = 1
strip_debug_info = false
generate_linker_map = false
# Disable static analysis
android_static_analysis = "off"
# Turns off all V8 debug features. Disables running V8 in a pseudo debug mode
# bypass build error -5 in clang_x64/mksnapshot
v8_enable_debugging_features = false
v8_dcheck_always_on = false
} else {
include_both_v8_snapshots = false
include_both_v8_snapshots_android_secondary_abi = false
generate_linker_map = true
}
if (build_webview) {
# 32 and 64bit
skip_secondary_abi_for_cq = false
}
}
if (target_os == "win") {
target_os = "win" # fix traffic annotation auditor
target_cpu = "x64"
symbol_level = 0
use_large_pdbs = true
enable_pdf = true
pdf_is_complete_lib = true
enable_plugins = true
enable_ppapi = false
chrome_pgo_phase = 2 # enable pgo
is_cfi = false # disable it
use_cfi_cast = false # disable it
}
if (target_os == "linux") {
target_os = "linux" # fix traffic annotation auditor
target_cpu = "x64"
symbol_level = 0
enable_pdf = true
pdf_is_complete_lib = true
enable_plugins = true
enable_ppapi = false
use_sysroot = true
chrome_pgo_phase = 2 # enable pgo
}
-330
View File
@@ -1,330 +0,0 @@
Do-not-link-with-libatomic.patch
Do-not-check-for-the-presence-of-use-remoteexec.patch
bromite-build-utils.patch
Add-cromite-flags-support.patch
Force-use-vpython3-for-some-scripts.patch
Permit-PGO-for-debug-builds.patch
Fix-chromium-vanilla.patch
Final-patch-for-chromium-vanilla.patch
Restore-chrome-password-store.patch
Remove-EV-certificates.patch
do-not-hide-.orig-files.patch
do-not-add-suffix-to-package-name.patch
exit-on-failure-of-inclusion.patch
Move-some-account-settings-back-to-privacy-settings.patch
kill-Vision.patch
kill-Location-fall-back-to-system.patch
kill-Auth.patch
Remove-binary-blob-integrations.patch
Remove-SMS-integration.patch
Remove-voice-recognition-integration.patch
Do-not-compile-QR-code-sharing.patch
Add-support-for-ISupportHelpAndFeedback.patch
Switch-to-fstack-protector-strong.patch
Enable-fwrapv-in-Clang-for-non-UBSan-builds.patch
Bromite-package-name.patch
Restore-classic-new-tab-page.patch
Always-use-new-tab-page-for-default-home-page.patch
disable-battery-status-updater.patch
Battery-API-return-nothing.patch
Disable-omission-of-URL-elements.patch
Modify-default-preferences.patch
Do-not-store-passwords-by-default.patch
Disable-NTP-remote-suggestions-by-default.patch
Disable-references-to-fonts.googleapis.com.patch
webRTC-do-not-expose-local-IP-addresses.patch
Never-fetch-popular-sites.patch
ungoogled-chromium-Disable-webRTC-log-uploader.patch
ungoogled-chromium-Disable-untraceable-URLs.patch
ungoogled-chromium-Disable-translate-integration.patch
ungoogled-chromium-Disable-profile-avatar.patch
ungoogled-chromium-Disable-intranet-detector.patch
ungoogled-chromium-no-special-hosts-domains.patch
ungoogled-chromium-Disable-Network-Time-Tracker.patch
Disable-all-promo-dialogs.patch
Disable-update-scheduler.patch
Add-search-engine.patch
Allow-playing-audio-in-background.patch
Add-flag-to-control-video-playback-resume-feature.patch
Add-exit-menu-item.patch
Remove-help-menu-item.patch
Multiple-fingerprinting-mitigations.patch
Add-flag-to-configure-maximum-connections-per-host.patch
Do-not-ignore-download-location-prompt-setting.patch
Add-support-for-writing-URIs.patch
Restore-BookmarkToolbar-setCurrentFolder.patch
Add-bookmark-import-export-actions.patch
Bookmarks-select-all-menu-entry.patch
Add-an-always-incognito-mode.patch
Keep-flag-to-allow-screenshots-in-Incognito-mode.patch
Add-option-to-not-persist-tabs-across-sessions.patch
Add-a-proxy-configuration-page.patch
Add-custom-tab-intents-privacy-option.patch
Disable-privacy-sandbox.patch
History-number-of-days-privacy-setting.patch
Disable-fetching-of-all-field-trials.patch
Disable-plugins-enumeration.patch
dns-send-IPv6-connectivity-probes-to-RIPE-DNS.patch
Add-flag-to-disable-IPv6-probes.patch
profile-resetter-disable-send-settings.patch
Do-not-build-API-keys-infobar.patch
autofill-miscellaneous.patch
Enable-native-Android-autofill.patch
translate-disable-fetching-of-languages-from-server.patch
Disable-various-metrics.patch
Enable-StrictOriginIsolation-and-SitePerProcess.patch
Use-64-bit-WebView-processes.patch
prefs-always-prompt-for-download-directory.patch
Disable-offline-pages-in-CCT.patch
Disable-media-router-and-remoting-by-default.patch
Restore-Search-Ready-Omnibox-flag.patch
disable-AdsBlockedInfoBar.patch
Bromite-subresource-adblocker.patch
Bromite-auto-updater.patch
Replace-DoH-probe-domain-with-RIPE-domain.patch
Increase-number-of-autocomplete-matches-to-10.patch
Disable-requests-for-single-word-Omnibar-searches.patch
Disable-some-signed-exchange-features.patch
DoH-improvements.patch
Reduce-HTTP-headers-in-DoH-requests-to-bare-minimum.patch
Revert-flags-remove-disable-pull-to-refresh-effect.patch
Use-dummy-DFM-installer.patch
Disable-feeds-support-by-default.patch
Disable-DRM-media-origin-IDs-preprovisioning.patch
Disable-smart-selection-by-default.patch
Guard-for-user-agent-reduction.patch
Add-menu-item-to-view-source.patch
Revert-removal-of-execution-context-address-space.patch
Block-gateway-attacks-via-websockets.patch
Enable-darken-websites-checkbox-in-themes.patch
Remove-blocklisted-URLs-upon-bookmark-creation.patch
Disable-the-DIAL-repeating-discovery.patch
Block-qjz9zk-or-trk-requests.patch
Hardening-against-incognito-mode-detection.patch
Restore-Simplified-NTP-launch.patch
Add-option-to-use-home-page-as-NTP.patch
Disable-text-fragments-by-default.patch
disable-WebView-variations-support.patch
Enable-network-isolation-features.patch
Revert-flags-remove-num-raster-threads.patch
webview-Hard-no-to-persistent-histograms.patch
Ignore-enterprise-policies-for-secure-DNS.patch
Add-menu-item-to-bookmark-all-tabs.patch
Re-introduce-modal-dialog-flag-to-close-all-tabs.patch
Add-option-to-force-tablet-UI.patch
Add-Alt-D-hotkey-to-focus-address-bar.patch
User-agent-customization.patch
Add-AllowUserCertificates-flag.patch
Add-IsCleartextPermitted-flag.patch
Add-flag-for-omnibox-autocomplete-filtering.patch
Add-flag-to-disable-external-intent-requests.patch
Enable-share-intent.patch
Logcat-crash-reports-UI.patch
Add-flag-to-disable-vibration.patch
mime_util-force-text-x-suse-ymp-to-be-downloaded.patch
Client-hints-overrides.patch
Allow-building-without-enable_reporting.patch
Experimental-user-scripts-support.patch
Keep-empty-tabs-between-sessions.patch
Disable-third-party-origin-trials.patch
Never-use-HTTP-probes-for-connection-detection.patch
Disable-Accessibility-service-by-default.patch
Disable-conversion-measurement-api.patch
Restore-offline-indicator-v2-flag.patch
Re-introduce-override_build_timestamp.patch
enable-ftrivial-auto-var-init-zero.patch
disable-appending-variations-header.patch
Disable-idle-detection.patch
Disable-minidump-upload-scheduling.patch
Revert-Permit-blocking-of-view-source.patch
Disable-safety-check.patch
Disable-all-predictors-code.patch
OpenSearch-miscellaneous.patch
Add-flag-for-save-data-header.patch
Disable-UA-full-version.patch
Dictionary-suggestions-for-the-Omnibox.patch
Disable-AsyncDNS-by-default.patch
Restore-LastTabStandingTracker.patch
Add-lifetime-options-for-permissions.patch
Disable-crash-reporting.patch
Samsung-Note-9-SDK27-crazylinker-workaround.patch
Disable-TLS-resumption.patch
Move-navigation-bar-to-bottom.patch
Welcome-screen.patch
Add-site-engagement-flag.patch
Enable-Certificate-Transparency.patch
Invalidate-components-public-key.patch
Improve-plain-text-rendering-on-mobile.patch
Remove-segmentation-platform.patch
Follow-only-system-dark-mode.patch
Remove-window-name-on-cross-origin-navigation.patch
Remove-preload-of-com.google.android.gms.fonts.patch
Partition-Blink-memory-cache.patch
Remove-navigator.connection-info.patch
Disable-PrivacyGuide.patch
sharing-hub-always-use-visible-URL.patch
Enable-HEVC-by-default.patch
Partition-blobs-by-top-frame-URL.patch
Override-Navigator-Language.patch
Remove-HTTP-referrals-in-cross-origin-navigation.patch
Enable-third-party-storage-partitioning.patch
Restore-adaptive-button-in-top-toolbar-customization.patch
Add-kill-switch-for-unsupported-clangd-flags.patch
WIN-enable-pdf-plugin.patch
WIN-disable-annotate-downloads.patch
Enable-HighEfficiencyMode-by-default.patch
WIN-Disable-TabHoverCard-images.patch
WIN-Fix-log-to-file.patch
WIN-Disable-updater.patch
WIN-Disable-first-run.patch
WIN-Add-some-prefs-to-secure-preferences.patch
WIN-Disable-search-for-image.patch
AudioBuffer-AnalyserNode-fp-mitigations.patch
add-browser-policy.patch
Always-open-browser-controls-in-new-tab.patch
Partitioning-all-cookies-by-top-frame-domain.patch
Disable-FedCm.patch
Disable-BackForwardCache.patch
Disable-visited-pseudo-class.patch
Add-setting-to-clear-data-on-exit.patch
Improve-the-browser-sandbox.patch
Disable-csp-reports.patch
Fonts-fingerprinting-mitigation.patch
Keyboard-protection-flag.patch
Disable-privacy-issues-in-password-manager.patch
Partition-HSTS-cache-by-NAK.patch
Warning-message-for-unsupported-hardware-aes.patch
Enable-Document-Open-Inheritance-Removal.patch
Add-setting-to-invert-tap-and-long-tap.patch
Remove-ChromiumNetworkAdapter.patch
Internal-firewall.patch
Disable-devtools-remote-and-custom-protocols.patch
Remove-detection-of-captive-portals.patch
Remove-auth-header-upon-cross-origin-redirect.patch
Clear-CORS-Preflight-Cache-on-clearing-data.patch
Multi-Screen-Window-Placement-API-fix.patch
Add-a-flag-to-disable-GamePad-API.patch
Disable-WebGPU.patch
Disable-GetInstalledRelatedApps-API.patch
Disable-GSA-by-default.patch
Disallowing-MIDI-permission-by-default.patch
Disable-Compression-Dictionary-Transport.patch
Disallow-Android-App-Scheme-as-referrer.patch
Content-settings-infrastructure.patch
Add-autoplay-site-setting.patch
Site-setting-for-images.patch
JIT-site-settings.patch
Add-webGL-site-setting.patch
Add-webRTC-site-settings.patch
Show-site-settings-for-cookies-javascript-and-ads.patch
Viewport-Protection-flag.patch
Revert-remove-allowscript-content-setting-secondary-url.patch
Timezone-customization.patch
Change-popup-site-setting.patch
Disable-speechSynthesis-getVoices-API.patch
Remove-support-for-device-memory-and-cpu-recovery.patch
Log-dangling-attributes-in-some-html-elements.patch
Keep-Side-Panel-Companion-disabled.patch
Lock-Profile-Cookie-Database.patch
Compress-libchrome-to-free-up-some-space.patch
Cromite-Branding.patch
Disable-Feeback-Collector.patch
Disable-remote-altsvc-for-h3-connections.patch
do-not-block-build-incompatible-profiles.patch
Allow-DocumentPiP-if-PopupsAndRedirects-are-active.patch
allow-the-download-of-clang-for-windows-crossbuild.patch
Add-option-to-disable-snapshots.patch
Enable-Android-Dynamic-Performance-Framework.patch
Fix-crash-on-customize-profile-ui.patch
Enable-ImprovedBookmarks-by-default.patch
Partition-MediaDeviceId-by-default.patch
Keep-disabled-FetchLaterAPI.patch
Disable-ranker-url-fetcher.patch
Disable-prefers-reduced-transparency-media-query.patch
Block-Intents-While-Locked.patch
Keep-Manta-Service-Disabled.patch
Disable-Service-and-Shared-workers-on-3P-iframe.patch
Disable-Real-Box.patch
Always-allow-inspect-fallback.patch
Add-PartialLowEndModeOnMidRangeDevices-flag.patch
Use-list-mode-for-tab-switcher.patch
Chrome-web-store-protection.patch
Enable-search-engine-settings-desktop-ui.patch
Disable-Android-AppRestrictions.patch
Customize-selection-popup.patch
Enables-deactivation-of-the-js-debugger-statement.patch
Enable-gwp-asan-on-Android.patch
Disable-Read-Aloud-by-default.patch
Disable-Compose-feature.patch
Disable-offline-autofetch-flag.patch
Show-NTP-at-startup.patch
Enable-platform-aac-audio-and-h264-video.patch
Disable-Paint-Preview-by-default.patch
Do-not-use-Windows-ClearType-Text-Tuner-setting.patch
Private-network-access-content-settings.patch
Allow-building-without-supervised-users.patch
Keep-ComputePressure-disabled.patch
Android-Toolbar-Scroll-Ablation-setting.patch
Keep-disabled-WebViewMediaIntegrityApi.patch
Enable-menu-on-reload-button.patch
Enable-Global-Privacy-Control.patch
Enable-Do-Not-Track-by-default.patch
Media-fingerprinting-mitigations.patch
Use-BoringSSL-for-RandBytes.patch
Disable-support-for-pointer-device-id.patch
Disable-CSS-blink-feature-support.patch
Close-Sessions-On-Ip-Change.patch
Ask-for-restart-on-connection-change.patch
Bubble-Locking-on-UI-DevTools.patch
Add-a-GN-flag-to-disable-trybot-verification.patch
Override-the-MV2-deprecation.patch
Remove-sideloading-of-version-dll.patch
Use-browser-navigation-handler.patch
Cromite-Branding--improve-settings-ui.patch
Disable-Posture-API.patch
PublicKeyCredential-fingerprinting-mitigations.patch
Disable-Web-Bluetooth-by-default-in-desktop-platforms.patch
Enable-Cert-Management-UI.patch
Enable-ProcessBoundStringEncryption-by-default.patch
Prevent-mouse-wheel-fingerprinting-on-Windows.patch
Enable-component-updater.patch
Android-fonts-fingerprinting-mitigation.patch
Disable-Android-Tab-Declutter.patch
Disable-CSSDynamicRangeLimit.patch
Disable-prefers-reduced-motion.patch
Disable-css-preferred-text-scale.patch
Disable-Viewport-Segments.patch
Keep-disabled-cache-sharing-for-pervasive-scripts.patch
High-Resolution-Timing-Mitigation.patch
Enable-snackbar-swipe.patch
Add-cromite-test-support.patch
Android-Pixel-Perfect-Mode.patch
Set-caret-blink-interval-to-default.patch
Set-the-screen-frame-rate-to-60-Hz.patch
Disable-Device-Attributes-API.patch
Add-setting-to-enable-Credman-for-passkeys.patch
Temp-disable-UseContextSnapshot.patch
Enable-ClientHello-Segmentation.patch
Disable-Sticky-User-Activation-Across-Same-Origin-Navigation.patch
# temporary or wip patches
Temp-PerformanceNavigationTiming-privacy-fix.patch
Temp-disable-predictive-back-gesture.patch
TEMP-Add-a-log-to-track-strange-behavior.patch
Temp-guard-FileSystemAccessPersistentPermissions.patch
Never-treat-Proguard-warnings-as-errors.patch
Temp-disable-experimental-web-platform-features.patch
Block-leakage-of-urls-in-sandbox-iframes.patch
Fix-chromium-build-bugs.patch
Try-to-fix-2082.patch
Temp-use-PREVIEW-for-IDCompositionDevice5.patch
# adblock patches
eyeo-133.0.6943.49-base.patch
eyeo-133.0.6943.49-chrome_integration.patch
eyeo-133.0.6943.49-android_api.patch
eyeo-133.0.6943.49-android_settings.patch
eyeo-133.0.6943.49-extension_api.patch
Eyeo-Adblock-for-Cromite.patch
-1
View File
@@ -1 +0,0 @@
zz-patch-list.txt
+234
View File
@@ -0,0 +1,234 @@
From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Sun, 16 Dec 2018 15:24:19 +0100
Subject: AV1 codec support
libaom build fixes (requires -fPIC)
Report AV1 as playable on Android
---
media/base/mime_util_internal.cc | 6 +++++-
third_party/libaom/BUILD.gn | 6 ++++--
third_party/libaom/libaom_srcs.gni | 5 +++++
.../config/linux/arm-neon-cpu-detect/config/aom_config.asm | 2 +-
.../config/linux/arm-neon-cpu-detect/config/aom_config.h | 2 +-
.../source/config/linux/arm-neon/config/aom_config.asm | 2 +-
.../libaom/source/config/linux/arm-neon/config/aom_config.h | 2 +-
.../libaom/source/config/linux/arm/config/aom_config.asm | 2 +-
.../libaom/source/config/linux/arm/config/aom_config.h | 2 +-
.../libaom/source/config/linux/arm64/config/aom_config.asm | 2 +-
.../libaom/source/config/linux/arm64/config/aom_config.h | 2 +-
.../source/config/linux/generic/config/aom_config.asm | 2 +-
.../libaom/source/config/linux/generic/config/aom_config.h | 2 +-
.../libaom/source/config/linux/x64/config/aom_config.asm | 2 +-
.../libaom/source/config/linux/x64/config/aom_config.h | 2 +-
15 files changed, 26 insertions(+), 15 deletions(-)
diff --git a/media/base/mime_util_internal.cc b/media/base/mime_util_internal.cc
--- a/media/base/mime_util_internal.cc
+++ b/media/base/mime_util_internal.cc
@@ -562,9 +562,13 @@ bool MimeUtil::IsCodecSupportedOnAndroid(
case THEORA:
return false;
- // AV1 is not supported on Android yet.
+ // AV1 is supported on Android.
case AV1:
+#if BUILDFLAG(ENABLE_AV1_DECODER)
+ return true;
+#else
return false;
+#endif
// ----------------------------------------------------------------------
// The remaining codecs may be supported depending on platform abilities.
diff --git a/third_party/libaom/BUILD.gn b/third_party/libaom/BUILD.gn
--- a/third_party/libaom/BUILD.gn
+++ b/third_party/libaom/BUILD.gn
@@ -74,7 +74,7 @@ if (enable_libaom_decoder) {
sources = aom_dsp_common_asm_sse2
sources += aom_dsp_common_asm_ssse3
sources += aom_ports_asm_x86
- defines = [ "CHROMIUM" ]
+ defines = [ "CHROMIUM", "PIC" ]
include_dirs = libaom_include_dirs
}
@@ -158,7 +158,7 @@ if (enable_libaom_decoder) {
configs += [ "//build/config/compiler:no_chromium_code" ]
if (current_cpu == "arm") {
configs -= [ "//build/config/compiler:compiler_arm_fpu" ]
- cflags = [ "-mfpu=neon" ]
+ cflags = [ "-mfpu=neon", "-fPIC" ]
}
configs += [ ":libaom_config" ]
@@ -202,6 +202,8 @@ if (enable_libaom_decoder) {
if (current_cpu == "arm64" || cpu_arch_full == "arm-neon" ||
cpu_arch_full == "arm-neon-cpu-detect") {
deps += [ ":libaom_intrinsics_neon" ]
+ # will detect CPU
+ sources += aom_ports_arm_sources
}
if (is_android) {
deps += [ "//third_party/android_ndk:cpu_features" ]
diff --git a/third_party/libaom/libaom_srcs.gni b/third_party/libaom/libaom_srcs.gni
--- a/third_party/libaom/libaom_srcs.gni
+++ b/third_party/libaom/libaom_srcs.gni
@@ -488,6 +488,11 @@ aom_mem_sources = [
aom_ports_asm_x86 = [ "//third_party/libaom/source/libaom/aom_ports/emms.asm" ]
+aom_ports_arm_sources = [
+ "//third_party/libaom/source/libaom/aom_ports/arm_cpudetect.c",
+ "//third_party/libaom/source/libaom/aom_ports/arm.h",
+ ]
+
aom_rtcd_sources = [
"//third_party/libaom/source/libaom/aom_dsp/aom_dsp_rtcd.c",
"//third_party/libaom/source/libaom/aom_dsp/aom_dsp_rtcd_defs.pl",
diff --git a/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_config.asm b/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_config.asm
--- a/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_config.asm
+++ b/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_config.asm
@@ -45,7 +45,7 @@ CONFIG_MULTITHREAD equ 1
CONFIG_NORMAL_TILE_MODE equ 1
CONFIG_ONE_PASS_SVM equ 0
CONFIG_OS_SUPPORT equ 1
-CONFIG_PIC equ 0
+CONFIG_PIC equ 1
CONFIG_RD_DEBUG equ 0
CONFIG_RUNTIME_CPU_DETECT equ 1
CONFIG_SHARED equ 0
diff --git a/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_config.h b/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_config.h
--- a/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_config.h
+++ b/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_config.h
@@ -47,7 +47,7 @@
#define CONFIG_NORMAL_TILE_MODE 1
#define CONFIG_ONE_PASS_SVM 0
#define CONFIG_OS_SUPPORT 1
-#define CONFIG_PIC 0
+#define CONFIG_PIC 1
#define CONFIG_RD_DEBUG 0
#define CONFIG_RUNTIME_CPU_DETECT 1
#define CONFIG_SHARED 0
diff --git a/third_party/libaom/source/config/linux/arm-neon/config/aom_config.asm b/third_party/libaom/source/config/linux/arm-neon/config/aom_config.asm
--- a/third_party/libaom/source/config/linux/arm-neon/config/aom_config.asm
+++ b/third_party/libaom/source/config/linux/arm-neon/config/aom_config.asm
@@ -45,7 +45,7 @@ CONFIG_MULTITHREAD equ 1
CONFIG_NORMAL_TILE_MODE equ 1
CONFIG_ONE_PASS_SVM equ 0
CONFIG_OS_SUPPORT equ 1
-CONFIG_PIC equ 0
+CONFIG_PIC equ 1
CONFIG_RD_DEBUG equ 0
CONFIG_RUNTIME_CPU_DETECT equ 0
CONFIG_SHARED equ 0
diff --git a/third_party/libaom/source/config/linux/arm-neon/config/aom_config.h b/third_party/libaom/source/config/linux/arm-neon/config/aom_config.h
--- a/third_party/libaom/source/config/linux/arm-neon/config/aom_config.h
+++ b/third_party/libaom/source/config/linux/arm-neon/config/aom_config.h
@@ -47,7 +47,7 @@
#define CONFIG_NORMAL_TILE_MODE 1
#define CONFIG_ONE_PASS_SVM 0
#define CONFIG_OS_SUPPORT 1
-#define CONFIG_PIC 0
+#define CONFIG_PIC 1
#define CONFIG_RD_DEBUG 0
#define CONFIG_RUNTIME_CPU_DETECT 0
#define CONFIG_SHARED 0
diff --git a/third_party/libaom/source/config/linux/arm/config/aom_config.asm b/third_party/libaom/source/config/linux/arm/config/aom_config.asm
--- a/third_party/libaom/source/config/linux/arm/config/aom_config.asm
+++ b/third_party/libaom/source/config/linux/arm/config/aom_config.asm
@@ -45,7 +45,7 @@ CONFIG_MULTITHREAD equ 1
CONFIG_NORMAL_TILE_MODE equ 1
CONFIG_ONE_PASS_SVM equ 0
CONFIG_OS_SUPPORT equ 1
-CONFIG_PIC equ 0
+CONFIG_PIC equ 1
CONFIG_RD_DEBUG equ 0
CONFIG_RUNTIME_CPU_DETECT equ 0
CONFIG_SHARED equ 0
diff --git a/third_party/libaom/source/config/linux/arm/config/aom_config.h b/third_party/libaom/source/config/linux/arm/config/aom_config.h
--- a/third_party/libaom/source/config/linux/arm/config/aom_config.h
+++ b/third_party/libaom/source/config/linux/arm/config/aom_config.h
@@ -47,7 +47,7 @@
#define CONFIG_NORMAL_TILE_MODE 1
#define CONFIG_ONE_PASS_SVM 0
#define CONFIG_OS_SUPPORT 1
-#define CONFIG_PIC 0
+#define CONFIG_PIC 1
#define CONFIG_RD_DEBUG 0
#define CONFIG_RUNTIME_CPU_DETECT 0
#define CONFIG_SHARED 0
diff --git a/third_party/libaom/source/config/linux/arm64/config/aom_config.asm b/third_party/libaom/source/config/linux/arm64/config/aom_config.asm
--- a/third_party/libaom/source/config/linux/arm64/config/aom_config.asm
+++ b/third_party/libaom/source/config/linux/arm64/config/aom_config.asm
@@ -45,7 +45,7 @@ CONFIG_MULTITHREAD equ 1
CONFIG_NORMAL_TILE_MODE equ 1
CONFIG_ONE_PASS_SVM equ 0
CONFIG_OS_SUPPORT equ 1
-CONFIG_PIC equ 0
+CONFIG_PIC equ 1
CONFIG_RD_DEBUG equ 0
CONFIG_RUNTIME_CPU_DETECT equ 0
CONFIG_SHARED equ 0
diff --git a/third_party/libaom/source/config/linux/arm64/config/aom_config.h b/third_party/libaom/source/config/linux/arm64/config/aom_config.h
--- a/third_party/libaom/source/config/linux/arm64/config/aom_config.h
+++ b/third_party/libaom/source/config/linux/arm64/config/aom_config.h
@@ -47,7 +47,7 @@
#define CONFIG_NORMAL_TILE_MODE 1
#define CONFIG_ONE_PASS_SVM 0
#define CONFIG_OS_SUPPORT 1
-#define CONFIG_PIC 0
+#define CONFIG_PIC 1
#define CONFIG_RD_DEBUG 0
#define CONFIG_RUNTIME_CPU_DETECT 0
#define CONFIG_SHARED 0
diff --git a/third_party/libaom/source/config/linux/generic/config/aom_config.asm b/third_party/libaom/source/config/linux/generic/config/aom_config.asm
--- a/third_party/libaom/source/config/linux/generic/config/aom_config.asm
+++ b/third_party/libaom/source/config/linux/generic/config/aom_config.asm
@@ -45,7 +45,7 @@ CONFIG_MULTITHREAD equ 1
CONFIG_NORMAL_TILE_MODE equ 1
CONFIG_ONE_PASS_SVM equ 0
CONFIG_OS_SUPPORT equ 1
-CONFIG_PIC equ 0
+CONFIG_PIC equ 1
CONFIG_RD_DEBUG equ 0
CONFIG_RUNTIME_CPU_DETECT equ 1
CONFIG_SHARED equ 0
diff --git a/third_party/libaom/source/config/linux/generic/config/aom_config.h b/third_party/libaom/source/config/linux/generic/config/aom_config.h
--- a/third_party/libaom/source/config/linux/generic/config/aom_config.h
+++ b/third_party/libaom/source/config/linux/generic/config/aom_config.h
@@ -47,7 +47,7 @@
#define CONFIG_NORMAL_TILE_MODE 1
#define CONFIG_ONE_PASS_SVM 0
#define CONFIG_OS_SUPPORT 1
-#define CONFIG_PIC 0
+#define CONFIG_PIC 1
#define CONFIG_RD_DEBUG 0
#define CONFIG_RUNTIME_CPU_DETECT 1
#define CONFIG_SHARED 0
diff --git a/third_party/libaom/source/config/linux/x64/config/aom_config.asm b/third_party/libaom/source/config/linux/x64/config/aom_config.asm
--- a/third_party/libaom/source/config/linux/x64/config/aom_config.asm
+++ b/third_party/libaom/source/config/linux/x64/config/aom_config.asm
@@ -35,7 +35,7 @@
%define CONFIG_NORMAL_TILE_MODE 1
%define CONFIG_ONE_PASS_SVM 0
%define CONFIG_OS_SUPPORT 1
-%define CONFIG_PIC 0
+%define CONFIG_PIC 1
%define CONFIG_RD_DEBUG 0
%define CONFIG_RUNTIME_CPU_DETECT 1
%define CONFIG_SHARED 0
diff --git a/third_party/libaom/source/config/linux/x64/config/aom_config.h b/third_party/libaom/source/config/linux/x64/config/aom_config.h
--- a/third_party/libaom/source/config/linux/x64/config/aom_config.h
+++ b/third_party/libaom/source/config/linux/x64/config/aom_config.h
@@ -47,7 +47,7 @@
#define CONFIG_NORMAL_TILE_MODE 1
#define CONFIG_ONE_PASS_SVM 0
#define CONFIG_OS_SUPPORT 1
-#define CONFIG_PIC 0
+#define CONFIG_PIC 1
#define CONFIG_RD_DEBUG 0
#define CONFIG_RUNTIME_CPU_DETECT 1
#define CONFIG_SHARED 0
--
2.17.1
@@ -1,133 +0,0 @@
From: uazo <uazo@users.noreply.github.com>
Date: Mon, 26 Apr 2021 13:28:24 +0000
Subject: Add AllowUserCertificates flag
Original License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
.../chromium/chrome/browser/app/ChromeActivity.java | 3 +++
chrome/browser/flags/android/chrome_feature_list.cc | 1 +
.../chrome/browser/flags/ChromeFeatureList.java | 4 ++++
.../Add-AllowUserCertificates-flag.inc | 13 +++++++++++++
.../Add-AllowUserCertificates-flag.inc | 3 +++
.../Add-AllowUserCertificates-flag.inc | 1 +
net/android/java/src/org/chromium/net/X509Util.java | 5 +++++
7 files changed, 30 insertions(+)
create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Add-AllowUserCertificates-flag.inc
create mode 100644 cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Add-AllowUserCertificates-flag.inc
create mode 100644 cromite_flags/chrome/browser/flags/android/chrome_feature_list_h/Add-AllowUserCertificates-flag.inc
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
@@ -242,6 +242,7 @@ import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.content_public.browser.SelectionPopupController;
import org.chromium.content_public.browser.WebContents;
import org.chromium.content_public.common.ContentSwitches;
+import org.chromium.net.X509Util;
import org.chromium.printing.PrintManagerDelegateImpl;
import org.chromium.printing.PrintingController;
import org.chromium.printing.PrintingControllerImpl;
@@ -1004,6 +1005,8 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
super.onStartWithNative();
ChromeActivitySessionTracker.getInstance().onStartWithNative(getProfileProviderSupplier());
+ X509Util.AllowUserCertificates = ChromeFeatureList.isEnabled(
+ ChromeFeatureList.ALLOW_USER_CERTIFICATES);
// postDeferredStartupIfNeeded() is called in TabModelSelectorTabObsever#onLoadStopped(),
// #onPageLoadFinished() and #onCrash(). If we are not actively loading a tab (e.g.
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -185,6 +185,7 @@ const base::Feature* const kFeaturesExposedToJava[] = {
&feed::kFeedPerformanceStudy,
&feed::kFeedShowSignInCommand,
&feed::kFeedSignedOutViewDemotion,
+ &kAllowUserCertificates,
&feed::kFeedRecyclerBinderUnmountOnDetach,
&feed::kInterestFeedV2,
&feed::kWebFeedAwareness,
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -164,6 +164,7 @@ public abstract class ChromeFeatureList {
"AccountForSuppressedKeyboardInsets";
public static final String ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION_V2 =
"AdaptiveButtonInTopToolbarCustomizationV2";
+ public static final String ALLOW_USER_CERTIFICATES = "AllowUserCertificates";
public static final String ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_PAGE_SUMMARY =
"AdaptiveButtonInTopToolbarPageSummary";
public static final String ALLOW_TAB_CLOSING_UPON_MINIMIZATION =
@@ -807,6 +808,8 @@ public abstract class ChromeFeatureList {
public static final CachedFlag sAndroidWindowPopupResizeAfterSpawn =
newCachedFlag(ANDROID_WINDOW_POPUP_RESIZE_AFTER_SPAWN, false, true);
public static final CachedFlag sAppSpecificHistory = newCachedFlag(APP_SPECIFIC_HISTORY, true);
+ public static final CachedFlag sAllowUserCertificates =
+ newCachedFlag(ALLOW_USER_CERTIFICATES, false);
public static final CachedFlag sAppSpecificHistoryViewIntent =
newCachedFlag(APP_SPECIFIC_HISTORY_VIEW_INTENT, true);
public static final CachedFlag sAsyncNotificationManager =
@@ -1130,6 +1133,7 @@ public abstract class ChromeFeatureList {
sAllowTabClosingUponMinimization,
sAndroidAnimatedProgressBarInBrowser,
sAndroidAnimatedProgressBarInViz,
+ sAllowUserCertificates,
sAndroidAppIntegrationModule,
sAndroidAppIntegrationMultiDataSource,
sAndroidBottomToolbar,
diff --git a/cromite_flags/chrome/browser/about_flags_cc/Add-AllowUserCertificates-flag.inc b/cromite_flags/chrome/browser/about_flags_cc/Add-AllowUserCertificates-flag.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/chrome/browser/about_flags_cc/Add-AllowUserCertificates-flag.inc
@@ -0,0 +1,13 @@
+#ifdef FLAG_SECTION
+
+#if BUILDFLAG(IS_ANDROID)
+
+ {"allow-user-certificates",
+ "Allow user certificates",
+ "Allow user CA certificates during "
+ "validation of the certificate chain", kOsAndroid,
+ FEATURE_VALUE_TYPE(chrome::android::kAllowUserCertificates)},
+
+#endif
+
+#endif
diff --git a/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Add-AllowUserCertificates-flag.inc b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Add-AllowUserCertificates-flag.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Add-AllowUserCertificates-flag.inc
@@ -0,0 +1,3 @@
+CROMITE_FEATURE(kAllowUserCertificates,
+ "AllowUserCertificates",
+ base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/cromite_flags/chrome/browser/flags/android/chrome_feature_list_h/Add-AllowUserCertificates-flag.inc b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_h/Add-AllowUserCertificates-flag.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_h/Add-AllowUserCertificates-flag.inc
@@ -0,0 +1 @@
+BASE_DECLARE_FEATURE(kAllowUserCertificates);
diff --git a/net/android/java/src/org/chromium/net/X509Util.java b/net/android/java/src/org/chromium/net/X509Util.java
--- a/net/android/java/src/org/chromium/net/X509Util.java
+++ b/net/android/java/src/org/chromium/net/X509Util.java
@@ -537,6 +537,8 @@ public class X509Util {
return userRootBytes.toArray(new byte[0][]);
}
+ public static boolean AllowUserCertificates = false;
+
public static AndroidCertVerifyResult verifyServerCertificates(
byte[][] certChain,
String authType,
@@ -639,6 +641,9 @@ public class X509Util {
X509Certificate root = verifiedChain.get(verifiedChain.size() - 1);
isIssuedByKnownRoot = isKnownRoot(root);
}
+ if (AllowUserCertificates == false && isIssuedByKnownRoot == false)
+ return new AndroidCertVerifyResult(CertVerifyStatusAndroid.NO_TRUSTED_ROOT);
+
return new AndroidCertVerifyResult(
CertVerifyStatusAndroid.OK, isIssuedByKnownRoot, verifiedChain);
}
--
@@ -1,26 +0,0 @@
From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Tue, 9 Mar 2021 19:43:00 +0100
Subject: Add Alt+D hotkey to focus address bar
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
.../src/org/chromium/chrome/browser/KeyboardShortcuts.java | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/KeyboardShortcuts.java b/chrome/android/java/src/org/chromium/chrome/browser/KeyboardShortcuts.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/KeyboardShortcuts.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/KeyboardShortcuts.java
@@ -883,6 +883,12 @@ public class KeyboardShortcuts {
KeyEvent.KEYCODE_ESCAPE,
KeyEvent.META_CTRL_ON);
}
+ addShortcut(context,
+ shortcutGroupsById,
+ R.string.keyboard_shortcut_chrome_feature_group_header,
+ R.string.keyboard_shortcut_address_bar,
+ KeyEvent.KEYCODE_D,
+ KeyEvent.META_ALT_ON);
return new ArrayList<>(shortcutGroupsById.values());
}
--
@@ -0,0 +1,902 @@
From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Thu, 12 Oct 2017 11:06:18 +0200
Subject: Add DuckDuckGo Lite search engine
---
.../search_engines/prepopulated_engines.json | 10 +
.../search_engines/search_engine_type.h | 1 +
.../template_url_prepopulate_data.cc | 190 +++++++++---------
3 files changed, 107 insertions(+), 94 deletions(-)
diff --git a/components/search_engines/prepopulated_engines.json b/components/search_engines/prepopulated_engines.json
--- a/components/search_engines/prepopulated_engines.json
+++ b/components/search_engines/prepopulated_engines.json
@@ -91,6 +91,16 @@
"id": 68
},
+ "duckduckgo_light": {
+ "name": "DuckDuckGo Light",
+ "keyword": "duckduckgo.com/lite",
+ "favicon_url": "https://duckduckgo.com/favicon.ico",
+ "search_url": "https://duckduckgo.com/lite/?q={searchTerms}",
+ "suggest_url": "https://duckduckgo.com/ac/?q={searchTerms}&type=list",
+ "type": "SEARCH_ENGINE_DUCKDUCKGOLIGHT",
+ "id": 12
+ },
+
"duckduckgo": {
"name": "DuckDuckGo",
"keyword": "duckduckgo.com",
diff --git a/components/search_engines/search_engine_type.h b/components/search_engines/search_engine_type.h
--- a/components/search_engines/search_engine_type.h
+++ b/components/search_engines/search_engine_type.h
@@ -65,6 +65,7 @@ enum SearchEngineType {
SEARCH_ENGINE_360,
SEARCH_ENGINE_COCCOC,
SEARCH_ENGINE_DUCKDUCKGO,
+ SEARCH_ENGINE_DUCKDUCKGOLIGHT,
SEARCH_ENGINE_PARSIJOO,
SEARCH_ENGINE_QWANT,
SEARCH_ENGINE_GIVERO,
diff --git a/components/search_engines/template_url_prepopulate_data.cc b/components/search_engines/template_url_prepopulate_data.cc
--- a/components/search_engines/template_url_prepopulate_data.cc
+++ b/components/search_engines/template_url_prepopulate_data.cc
@@ -35,6 +35,7 @@ const PrepopulatedEngine* const engines_default[] = {
&googleen, &google,
&bing,
&yahoo,
+ &duckduckgo, &duckduckgo_light,
};
// Note, the below entries are sorted by country code, not the name in comment.
@@ -44,7 +45,7 @@ const PrepopulatedEngine* const engines_AE[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yandex_ru,
};
@@ -53,7 +54,7 @@ const PrepopulatedEngine* const engines_AL[] = {
&googleen, &google,
&yahoo,
&bing,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yandex_ru,
};
@@ -62,7 +63,7 @@ const PrepopulatedEngine* const engines_AR[] = {
&googleen, &google,
&bing,
&yahoo_ar,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -70,7 +71,7 @@ const PrepopulatedEngine* const engines_AR[] = {
const PrepopulatedEngine* const engines_AT[] = {
&googleen, &google,
&bing,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yahoo_at,
&ecosia,
};
@@ -79,7 +80,7 @@ const PrepopulatedEngine* const engines_AT[] = {
const PrepopulatedEngine* const engines_AU[] = {
&googleen, &google,
&bing,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yahoo_au,
&ecosia,
};
@@ -89,7 +90,7 @@ const PrepopulatedEngine* const engines_BA[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ask,
};
@@ -99,7 +100,7 @@ const PrepopulatedEngine* const engines_BE[] = {
&bing,
&yahoo,
&ecosia,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
};
// Bulgaria
@@ -107,7 +108,7 @@ const PrepopulatedEngine* const engines_BG[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yandex_ru,
};
@@ -116,7 +117,7 @@ const PrepopulatedEngine* const engines_BH[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -125,7 +126,7 @@ const PrepopulatedEngine* const engines_BI[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ask,
};
@@ -134,7 +135,7 @@ const PrepopulatedEngine* const engines_BN[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -143,7 +144,7 @@ const PrepopulatedEngine* const engines_BO[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -152,7 +153,7 @@ const PrepopulatedEngine* const engines_BR[] = {
&googleen, &google,
&bing,
&yahoo_br,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -170,7 +171,7 @@ const PrepopulatedEngine* const engines_BZ[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ask,
};
@@ -179,7 +180,7 @@ const PrepopulatedEngine* const engines_CA[] = {
&googleen, &google,
&bing,
&yahoo_ca,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -187,7 +188,7 @@ const PrepopulatedEngine* const engines_CA[] = {
const PrepopulatedEngine* const engines_CH[] = {
&googleen, &google,
&bing,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yahoo_ch,
&ecosia,
};
@@ -197,7 +198,7 @@ const PrepopulatedEngine* const engines_CL[] = {
&googleen, &google,
&bing,
&yahoo_cl,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -216,7 +217,7 @@ const PrepopulatedEngine* const engines_CO[] = {
&bing,
&yahoo_co,
&ecosia,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
};
// Costa Rica
@@ -224,7 +225,7 @@ const PrepopulatedEngine* const engines_CR[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -234,7 +235,7 @@ const PrepopulatedEngine* const engines_CZ[] = {
&seznam_cz,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
};
// Germany
@@ -242,7 +243,7 @@ const PrepopulatedEngine* const engines_DE[] = {
&googleen, &google,
&bing,
&yahoo_de,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -251,7 +252,7 @@ const PrepopulatedEngine* const engines_DK[] = {
&googleen, &google,
&bing,
&yahoo_dk,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -260,7 +261,7 @@ const PrepopulatedEngine* const engines_DO[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -270,7 +271,7 @@ const PrepopulatedEngine* const engines_DZ[] = {
&yahoo,
&bing,
&yandex_ru,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
};
// Ecuador
@@ -279,7 +280,7 @@ const PrepopulatedEngine* const engines_EC[] = {
&bing,
&yahoo,
&ecosia,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
};
// Estonia
@@ -297,7 +298,7 @@ const PrepopulatedEngine* const engines_EG[] = {
&yahoo,
&bing,
&yandex_ru,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
};
// Spain
@@ -305,7 +306,7 @@ const PrepopulatedEngine* const engines_ES[] = {
&googleen, &google,
&bing,
&yahoo_es,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -314,7 +315,7 @@ const PrepopulatedEngine* const engines_FI[] = {
&googleen, &google,
&bing,
&yahoo_fi,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yandex_ru,
};
@@ -323,7 +324,7 @@ const PrepopulatedEngine* const engines_FO[] = {
&googleen, &google,
&bing,
&yahoo_dk,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -341,7 +342,7 @@ const PrepopulatedEngine* const engines_GB[] = {
&googleen, &google,
&bing,
&yahoo_uk,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -350,7 +351,7 @@ const PrepopulatedEngine* const engines_GR[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yandex_ru,
};
@@ -360,7 +361,7 @@ const PrepopulatedEngine* const engines_GT[] = {
&bing,
&yahoo,
&ecosia,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
};
// Hong Kong
@@ -378,7 +379,7 @@ const PrepopulatedEngine* const engines_HN[] = {
&bing,
&yahoo,
&yandex_ru,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
};
// Croatia
@@ -386,7 +387,7 @@ const PrepopulatedEngine* const engines_HR[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -395,7 +396,7 @@ const PrepopulatedEngine* const engines_HU[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -404,7 +405,7 @@ const PrepopulatedEngine* const engines_ID[] = {
&googleen, &google,
&yahoo_id,
&bing,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yandex_com,
};
@@ -413,7 +414,7 @@ const PrepopulatedEngine* const engines_IE[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -423,7 +424,7 @@ const PrepopulatedEngine* const engines_IL[] = {
&bing,
&yahoo,
&yandex_ru,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
};
// India
@@ -431,7 +432,7 @@ const PrepopulatedEngine* const engines_IN[] = {
&googleen, &google,
&yahoo_in,
&bing,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yandex_ru,
};
@@ -441,7 +442,7 @@ const PrepopulatedEngine* const engines_IQ[] = {
&yahoo,
&bing,
&yandex_ru,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
};
// Iran
@@ -457,7 +458,7 @@ const PrepopulatedEngine* const engines_IR[] = {
const PrepopulatedEngine* const engines_IS[] = {
&googleen, &google,
&bing,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yahoo,
&ecosia,
};
@@ -467,7 +468,7 @@ const PrepopulatedEngine* const engines_IT[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -476,7 +477,7 @@ const PrepopulatedEngine* const engines_JM[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ask,
};
@@ -485,7 +486,7 @@ const PrepopulatedEngine* const engines_JO[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yandex_com,
};
@@ -495,7 +496,7 @@ const PrepopulatedEngine* const engines_JP[] = {
&yahoo_jp,
&bing,
&baidu,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
};
// Kenya
@@ -503,7 +504,7 @@ const PrepopulatedEngine* const engines_KE[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yandex_ru,
};
@@ -521,7 +522,7 @@ const PrepopulatedEngine* const engines_KW[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yandex_com,
};
@@ -539,7 +540,7 @@ const PrepopulatedEngine* const engines_LB[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -547,7 +548,7 @@ const PrepopulatedEngine* const engines_LB[] = {
const PrepopulatedEngine* const engines_LI[] = {
&googleen, &google,
&bing,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yahoo,
&ecosia,
};
@@ -558,14 +559,14 @@ const PrepopulatedEngine* const engines_LT[] = {
&bing,
&yahoo,
&yandex_ru,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
};
// Luxembourg
const PrepopulatedEngine* const engines_LU[] = {
&googleen, &google,
&bing,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yahoo,
&ecosia,
};
@@ -576,7 +577,7 @@ const PrepopulatedEngine* const engines_LV[] = {
&yandex_ru,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
};
// Libya
@@ -585,7 +586,7 @@ const PrepopulatedEngine* const engines_LY[] = {
&yahoo,
&bing,
&yandex_com,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
};
// Morocco
@@ -593,7 +594,7 @@ const PrepopulatedEngine* const engines_MA[] = {
&googleen, &google,
&yahoo,
&bing,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yandex_com,
};
@@ -601,7 +602,7 @@ const PrepopulatedEngine* const engines_MA[] = {
const PrepopulatedEngine* const engines_MC[] = {
&googleen, &google,
&bing,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yahoo,
&qwant,
};
@@ -611,7 +612,7 @@ const PrepopulatedEngine* const engines_MD[] = {
&googleen, &google,
&yandex_ru,
&mail_ru,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&bing,
};
@@ -621,7 +622,7 @@ const PrepopulatedEngine* const engines_ME[] = {
&bing,
&yahoo,
&yandex_ru,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
};
// Macedonia
@@ -629,7 +630,7 @@ const PrepopulatedEngine* const engines_MK[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yandex_ru,
};
@@ -639,7 +640,7 @@ const PrepopulatedEngine* const engines_MX[] = {
&bing,
&yahoo_mx,
&ecosia,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
};
// Malaysia
@@ -647,7 +648,7 @@ const PrepopulatedEngine* const engines_MY[] = {
&googleen, &google,
&bing,
&yahoo_my,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&baidu,
};
@@ -656,8 +657,9 @@ const PrepopulatedEngine* const engines_NI[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
+ &duckduckgo_light,
};
// Netherlands
@@ -665,7 +667,7 @@ const PrepopulatedEngine* const engines_NL[] = {
&googleen, &google,
&bing,
&yahoo_nl,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yandex_ru,
};
@@ -674,7 +676,7 @@ const PrepopulatedEngine* const engines_NO[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yandex_ru,
};
@@ -682,7 +684,7 @@ const PrepopulatedEngine* const engines_NO[] = {
const PrepopulatedEngine* const engines_NZ[] = {
&googleen, &google,
&bing,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yahoo_nz,
&ecosia,
};
@@ -692,7 +694,7 @@ const PrepopulatedEngine* const engines_OM[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -701,7 +703,7 @@ const PrepopulatedEngine* const engines_PA[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -711,7 +713,7 @@ const PrepopulatedEngine* const engines_PE[] = {
&bing,
&yahoo_pe,
&ecosia,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
};
// Philippines
@@ -720,7 +722,7 @@ const PrepopulatedEngine* const engines_PH[] = {
&yahoo_ph,
&bing,
&ecosia,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
};
// Pakistan
@@ -728,7 +730,7 @@ const PrepopulatedEngine* const engines_PK[] = {
&googleen, &google,
&yahoo,
&bing,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yandex_com,
};
@@ -737,7 +739,7 @@ const PrepopulatedEngine* const engines_PL[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yandex_ru,
};
@@ -746,7 +748,7 @@ const PrepopulatedEngine* const engines_PR[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -755,7 +757,7 @@ const PrepopulatedEngine* const engines_PT[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -764,7 +766,7 @@ const PrepopulatedEngine* const engines_PY[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -773,7 +775,7 @@ const PrepopulatedEngine* const engines_QA[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yandex_com,
};
@@ -782,7 +784,7 @@ const PrepopulatedEngine* const engines_RO[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yandex_ru,
};
@@ -791,7 +793,7 @@ const PrepopulatedEngine* const engines_RS[] = {
&googleen, &google,
&yahoo,
&bing,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yandex_ru,
};
@@ -809,7 +811,7 @@ const PrepopulatedEngine* const engines_RW[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&mail_ru,
};
@@ -819,7 +821,7 @@ const PrepopulatedEngine* const engines_SA[] = {
&bing,
&yahoo,
&yandex_com,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
};
// Sweden
@@ -827,7 +829,7 @@ const PrepopulatedEngine* const engines_SE[] = {
&googleen, &google,
&bing,
&yahoo_se,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -844,7 +846,7 @@ const PrepopulatedEngine* const engines_SG[] = {
const PrepopulatedEngine* const engines_SI[] = {
&googleen, &google,
&bing,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yahoo,
&yandex_ru,
};
@@ -854,7 +856,7 @@ const PrepopulatedEngine* const engines_SK[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&seznam_cz,
};
@@ -863,7 +865,7 @@ const PrepopulatedEngine* const engines_SV[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -873,7 +875,7 @@ const PrepopulatedEngine* const engines_SY[] = {
&bing,
&yahoo,
&yandex_ru,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
};
// Thailand
@@ -881,7 +883,7 @@ const PrepopulatedEngine* const engines_TH[] = {
&googleen, &google,
&yahoo_th,
&bing,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&baidu,
};
@@ -891,7 +893,7 @@ const PrepopulatedEngine* const engines_TN[] = {
&yahoo,
&bing,
&yandex_ru,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
};
// Turkey
@@ -900,7 +902,7 @@ const PrepopulatedEngine* const engines_TR[] = {
&yandex_tr,
&yahoo_tr,
&bing,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
};
// Trinidad and Tobago
@@ -908,7 +910,7 @@ const PrepopulatedEngine* const engines_TT[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ask,
};
@@ -926,7 +928,7 @@ const PrepopulatedEngine* const engines_TZ[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&yandex_ru,
};
@@ -944,7 +946,7 @@ const PrepopulatedEngine* const engines_US[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -953,7 +955,7 @@ const PrepopulatedEngine* const engines_UY[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -962,7 +964,7 @@ const PrepopulatedEngine* const engines_VE[] = {
&googleen, &google,
&yahoo_ve,
&bing,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&ecosia,
};
@@ -981,7 +983,7 @@ const PrepopulatedEngine* const engines_YE[] = {
&bing,
&yahoo,
&yandex_ru,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
};
// South Africa
@@ -989,7 +991,7 @@ const PrepopulatedEngine* const engines_ZA[] = {
&googleen, &google,
&bing,
&yahoo,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
&baidu,
};
@@ -999,7 +1001,7 @@ const PrepopulatedEngine* const engines_ZW[] = {
&bing,
&yahoo,
&ask,
- &duckduckgo,
+ &duckduckgo, &duckduckgo_light,
};
// ----------------------------------------------------------------------------
--
2.17.1
File diff suppressed because it is too large Load Diff
@@ -1,59 +0,0 @@
From: uazo <uazo@users.noreply.github.com>
Date: Mon, 26 Apr 2021 15:04:11 +0000
Subject: Add IsCleartextPermitted flag
Original License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
.../about_flags_cc/Add-IsCleartextPermitted-flag.inc | 8 ++++++++
.../base/features_cc/Add-IsCleartextPermitted-flag.inc | 3 +++
.../net/base/features_h/Add-IsCleartextPermitted-flag.inc | 1 +
net/url_request/url_request_http_job.cc | 5 +++++
4 files changed, 17 insertions(+)
create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Add-IsCleartextPermitted-flag.inc
create mode 100644 cromite_flags/net/base/features_cc/Add-IsCleartextPermitted-flag.inc
create mode 100644 cromite_flags/net/base/features_h/Add-IsCleartextPermitted-flag.inc
diff --git a/cromite_flags/chrome/browser/about_flags_cc/Add-IsCleartextPermitted-flag.inc b/cromite_flags/chrome/browser/about_flags_cc/Add-IsCleartextPermitted-flag.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/chrome/browser/about_flags_cc/Add-IsCleartextPermitted-flag.inc
@@ -0,0 +1,8 @@
+#ifdef FLAG_SECTION
+
+ {"cleartext-permitted",
+ "Allow cleartext traffic",
+ "Allow insecure connections over HTTP", kOsAll,
+ FEATURE_VALUE_TYPE(net::features::kIsCleartextPermitted)},
+
+#endif
diff --git a/cromite_flags/net/base/features_cc/Add-IsCleartextPermitted-flag.inc b/cromite_flags/net/base/features_cc/Add-IsCleartextPermitted-flag.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/net/base/features_cc/Add-IsCleartextPermitted-flag.inc
@@ -0,0 +1,3 @@
+CROMITE_FEATURE(kIsCleartextPermitted,
+ "IsCleartextPermitted",
+ base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/cromite_flags/net/base/features_h/Add-IsCleartextPermitted-flag.inc b/cromite_flags/net/base/features_h/Add-IsCleartextPermitted-flag.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/net/base/features_h/Add-IsCleartextPermitted-flag.inc
@@ -0,0 +1 @@
+NET_EXPORT BASE_DECLARE_FEATURE(kIsCleartextPermitted);
diff --git a/net/url_request/url_request_http_job.cc b/net/url_request/url_request_http_job.cc
--- a/net/url_request/url_request_http_job.cc
+++ b/net/url_request/url_request_http_job.cc
@@ -413,6 +413,11 @@ std::unique_ptr<URLRequestJob> URLRequestHttpJob::Create(URLRequest* request) {
}
}
+ if (base::FeatureList::IsEnabled(net::features::kIsCleartextPermitted) == false) {
+ return std::make_unique<URLRequestErrorJob>(request,
+ ERR_CLEARTEXT_NOT_PERMITTED);
+ }
+
#if BUILDFLAG(IS_ANDROID)
// Check whether the app allows cleartext traffic to this host, and return
// ERR_CLEARTEXT_NOT_PERMITTED if not.
--
@@ -1,76 +0,0 @@
From: uazo <uazo@users.noreply.github.com>
Date: Wed, 6 Dec 2023 10:21:45 +0000
Subject: Add PartialLowEndModeOnMidRangeDevices flag
adds a new flag in chrome://flags to re-enable the experiment
License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
---
base/features.cc | 4 ++++
content/renderer/render_process_impl.cc | 9 +++++++++
.../Add-PartialLowEndModeOnMidRangeDevices-flag.inc | 12 ++++++++++++
3 files changed, 25 insertions(+)
create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Add-PartialLowEndModeOnMidRangeDevices-flag.inc
diff --git a/base/features.cc b/base/features.cc
--- a/base/features.cc
+++ b/base/features.cc
@@ -188,6 +188,10 @@ bool IsReducePPMsEnabled() {
return g_is_reduce_ppms_enabled.load(std::memory_order_relaxed);
}
+#if BUILDFLAG(IS_ANDROID)
+SET_CROMITE_FEATURE_DISABLED(kPartialLowEndModeOnMidRangeDevices);
+#endif
+
void Init(EmitThreadControllerProfilerMetadata
emit_thread_controller_profiler_metadata) {
g_is_reduce_ppms_enabled.store(FeatureList::IsEnabled(kReducePPMs),
diff --git a/content/renderer/render_process_impl.cc b/content/renderer/render_process_impl.cc
--- a/content/renderer/render_process_impl.cc
+++ b/content/renderer/render_process_impl.cc
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "base/features.h"
#include "content/renderer/render_process_impl.h"
#include "build/build_config.h"
@@ -122,10 +123,18 @@ RenderProcessImpl::RenderProcessImpl()
base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kDisallowV8FeatureFlagOverrides);
if (!disallow_v8_feature_flag_overrides) {
+#if BUILDFLAG(IS_ANDROID)
+ if (base::SysInfo::IsLowEndDevice()
+ && base::FeatureList::IsEnabled(base::features::kPartialLowEndModeOnMidRangeDevices)) {
+ std::string_view optimize_flag("--optimize-for-size");
+ v8::V8::SetFlagsFromString(optimize_flag.data(), optimize_flag.size());
+ }
+#else
if (base::SysInfo::IsLowEndDevice()) {
std::string_view optimize_flag("--optimize-for-size");
v8::V8::SetFlagsFromString(optimize_flag.data(), optimize_flag.size());
}
+#endif
////////////////////////////////////////////////////////////////////////////
// V8 flags are typically set in gin/v8_initializer.cc. Only those flags
diff --git a/cromite_flags/chrome/browser/about_flags_cc/Add-PartialLowEndModeOnMidRangeDevices-flag.inc b/cromite_flags/chrome/browser/about_flags_cc/Add-PartialLowEndModeOnMidRangeDevices-flag.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/chrome/browser/about_flags_cc/Add-PartialLowEndModeOnMidRangeDevices-flag.inc
@@ -0,0 +1,12 @@
+#if BUILDFLAG(IS_ANDROID)
+
+#ifdef FLAG_SECTION
+
+ {"partial-lowendmode-on-midrange-devices",
+ "Partial Low End Mode On Mid Range Devices",
+ "Enables the LowEndDeviceMode experiment in devices with 4-6 gb of ram.",
+ kOsAndroid, FEATURE_VALUE_TYPE(base::features::kPartialLowEndModeOnMidRangeDevices)},
+
+#endif
+
+#endif
--
+999
View File
@@ -0,0 +1,999 @@
From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Mon, 12 Mar 2018 20:31:44 +0100
Subject: Add Qwant search engine
Specify image URL in upstream engine definition
Make search engine selectable in default list
---
.../search_engines/prepopulated_engines.json | 1 +
.../template_url_prepopulate_data.cc | 216 +++++++++---------
2 files changed, 109 insertions(+), 108 deletions(-)
diff --git a/components/search_engines/prepopulated_engines.json b/components/search_engines/prepopulated_engines.json
--- a/components/search_engines/prepopulated_engines.json
+++ b/components/search_engines/prepopulated_engines.json
@@ -193,6 +193,7 @@
"favicon_url": "https://www.qwant.com/favicon.ico",
"search_url": "https://www.qwant.com/?q={searchTerms}&client=opensearch",
"suggest_url": "https://api.qwant.com/api/suggest/?q={searchTerms}&client=opensearch",
+ "image_url": "https://www.qwant.com/?t=images&q={searchTerms}",
"type": "SEARCH_ENGINE_QWANT",
"id": 94
},
diff --git a/components/search_engines/template_url_prepopulate_data.cc b/components/search_engines/template_url_prepopulate_data.cc
--- a/components/search_engines/template_url_prepopulate_data.cc
+++ b/components/search_engines/template_url_prepopulate_data.cc
@@ -32,7 +32,7 @@ namespace {
// Default (for countries with no better engine set)
const PrepopulatedEngine* const engines_default[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -42,7 +42,7 @@ const PrepopulatedEngine* const engines_default[] = {
// Engine selection by country ------------------------------------------------
// United Arab Emirates
const PrepopulatedEngine* const engines_AE[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -51,7 +51,7 @@ const PrepopulatedEngine* const engines_AE[] = {
// Albania
const PrepopulatedEngine* const engines_AL[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&yahoo,
&bing,
&duckduckgo, &duckduckgo_light,
@@ -60,7 +60,7 @@ const PrepopulatedEngine* const engines_AL[] = {
// Argentina
const PrepopulatedEngine* const engines_AR[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo_ar,
&duckduckgo, &duckduckgo_light,
@@ -69,7 +69,7 @@ const PrepopulatedEngine* const engines_AR[] = {
// Austria
const PrepopulatedEngine* const engines_AT[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&duckduckgo, &duckduckgo_light,
&yahoo_at,
@@ -78,7 +78,7 @@ const PrepopulatedEngine* const engines_AT[] = {
// Australia
const PrepopulatedEngine* const engines_AU[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&duckduckgo, &duckduckgo_light,
&yahoo_au,
@@ -87,7 +87,7 @@ const PrepopulatedEngine* const engines_AU[] = {
// Bosnia and Herzegovina
const PrepopulatedEngine* const engines_BA[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -96,7 +96,7 @@ const PrepopulatedEngine* const engines_BA[] = {
// Belgium
const PrepopulatedEngine* const engines_BE[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&ecosia,
@@ -105,7 +105,7 @@ const PrepopulatedEngine* const engines_BE[] = {
// Bulgaria
const PrepopulatedEngine* const engines_BG[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -114,7 +114,7 @@ const PrepopulatedEngine* const engines_BG[] = {
// Bahrain
const PrepopulatedEngine* const engines_BH[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -123,7 +123,7 @@ const PrepopulatedEngine* const engines_BH[] = {
// Burundi
const PrepopulatedEngine* const engines_BI[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -132,7 +132,7 @@ const PrepopulatedEngine* const engines_BI[] = {
// Brunei
const PrepopulatedEngine* const engines_BN[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -141,7 +141,7 @@ const PrepopulatedEngine* const engines_BN[] = {
// Bolivia
const PrepopulatedEngine* const engines_BO[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -150,7 +150,7 @@ const PrepopulatedEngine* const engines_BO[] = {
// Brazil
const PrepopulatedEngine* const engines_BR[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo_br,
&duckduckgo, &duckduckgo_light,
@@ -159,7 +159,7 @@ const PrepopulatedEngine* const engines_BR[] = {
// Belarus
const PrepopulatedEngine* const engines_BY[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&yandex_by,
&mail_ru,
&bing,
@@ -168,7 +168,7 @@ const PrepopulatedEngine* const engines_BY[] = {
// Belize
const PrepopulatedEngine* const engines_BZ[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -177,7 +177,7 @@ const PrepopulatedEngine* const engines_BZ[] = {
// Canada
const PrepopulatedEngine* const engines_CA[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo_ca,
&duckduckgo, &duckduckgo_light,
@@ -186,7 +186,7 @@ const PrepopulatedEngine* const engines_CA[] = {
// Switzerland
const PrepopulatedEngine* const engines_CH[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&duckduckgo, &duckduckgo_light,
&yahoo_ch,
@@ -195,7 +195,7 @@ const PrepopulatedEngine* const engines_CH[] = {
// Chile
const PrepopulatedEngine* const engines_CL[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo_cl,
&duckduckgo, &duckduckgo_light,
@@ -206,14 +206,14 @@ const PrepopulatedEngine* const engines_CL[] = {
const PrepopulatedEngine* const engines_CN[] = {
&baidu,
&sogou,
- &googleen, &google,
+ &googleen, &google, &qwant,
&so_360,
&bing,
};
// Colombia
const PrepopulatedEngine* const engines_CO[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo_co,
&ecosia,
@@ -222,7 +222,7 @@ const PrepopulatedEngine* const engines_CO[] = {
// Costa Rica
const PrepopulatedEngine* const engines_CR[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -231,7 +231,7 @@ const PrepopulatedEngine* const engines_CR[] = {
// Czech Republic
const PrepopulatedEngine* const engines_CZ[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&seznam_cz,
&bing,
&yahoo,
@@ -240,7 +240,7 @@ const PrepopulatedEngine* const engines_CZ[] = {
// Germany
const PrepopulatedEngine* const engines_DE[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo_de,
&duckduckgo, &duckduckgo_light,
@@ -249,7 +249,7 @@ const PrepopulatedEngine* const engines_DE[] = {
// Denmark
const PrepopulatedEngine* const engines_DK[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo_dk,
&duckduckgo, &duckduckgo_light,
@@ -258,7 +258,7 @@ const PrepopulatedEngine* const engines_DK[] = {
// Dominican Republic
const PrepopulatedEngine* const engines_DO[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -267,7 +267,7 @@ const PrepopulatedEngine* const engines_DO[] = {
// Algeria
const PrepopulatedEngine* const engines_DZ[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&yahoo,
&bing,
&yandex_ru,
@@ -276,7 +276,7 @@ const PrepopulatedEngine* const engines_DZ[] = {
// Ecuador
const PrepopulatedEngine* const engines_EC[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&ecosia,
@@ -285,7 +285,7 @@ const PrepopulatedEngine* const engines_EC[] = {
// Estonia
const PrepopulatedEngine* const engines_EE[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yandex_ru,
&yahoo,
@@ -294,7 +294,7 @@ const PrepopulatedEngine* const engines_EE[] = {
// Egypt
const PrepopulatedEngine* const engines_EG[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&yahoo,
&bing,
&yandex_ru,
@@ -303,7 +303,7 @@ const PrepopulatedEngine* const engines_EG[] = {
// Spain
const PrepopulatedEngine* const engines_ES[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo_es,
&duckduckgo, &duckduckgo_light,
@@ -312,7 +312,7 @@ const PrepopulatedEngine* const engines_ES[] = {
// Finland
const PrepopulatedEngine* const engines_FI[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo_fi,
&duckduckgo, &duckduckgo_light,
@@ -321,7 +321,7 @@ const PrepopulatedEngine* const engines_FI[] = {
// Faroe Islands
const PrepopulatedEngine* const engines_FO[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo_dk,
&duckduckgo, &duckduckgo_light,
@@ -330,7 +330,7 @@ const PrepopulatedEngine* const engines_FO[] = {
// France
const PrepopulatedEngine* const engines_FR[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo_fr,
&qwant,
@@ -339,7 +339,7 @@ const PrepopulatedEngine* const engines_FR[] = {
// United Kingdom
const PrepopulatedEngine* const engines_GB[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo_uk,
&duckduckgo, &duckduckgo_light,
@@ -348,7 +348,7 @@ const PrepopulatedEngine* const engines_GB[] = {
// Greece
const PrepopulatedEngine* const engines_GR[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -357,7 +357,7 @@ const PrepopulatedEngine* const engines_GR[] = {
// Guatemala
const PrepopulatedEngine* const engines_GT[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&ecosia,
@@ -366,7 +366,7 @@ const PrepopulatedEngine* const engines_GT[] = {
// Hong Kong
const PrepopulatedEngine* const engines_HK[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&yahoo_hk,
&bing,
&yandex_com,
@@ -375,7 +375,7 @@ const PrepopulatedEngine* const engines_HK[] = {
// Honduras
const PrepopulatedEngine* const engines_HN[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&yandex_ru,
@@ -384,7 +384,7 @@ const PrepopulatedEngine* const engines_HN[] = {
// Croatia
const PrepopulatedEngine* const engines_HR[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -393,7 +393,7 @@ const PrepopulatedEngine* const engines_HR[] = {
// Hungary
const PrepopulatedEngine* const engines_HU[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -402,7 +402,7 @@ const PrepopulatedEngine* const engines_HU[] = {
// Indonesia
const PrepopulatedEngine* const engines_ID[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&yahoo_id,
&bing,
&duckduckgo, &duckduckgo_light,
@@ -411,7 +411,7 @@ const PrepopulatedEngine* const engines_ID[] = {
// Ireland
const PrepopulatedEngine* const engines_IE[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -420,7 +420,7 @@ const PrepopulatedEngine* const engines_IE[] = {
// Israel
const PrepopulatedEngine* const engines_IL[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&yandex_ru,
@@ -429,7 +429,7 @@ const PrepopulatedEngine* const engines_IL[] = {
// India
const PrepopulatedEngine* const engines_IN[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&yahoo_in,
&bing,
&duckduckgo, &duckduckgo_light,
@@ -438,7 +438,7 @@ const PrepopulatedEngine* const engines_IN[] = {
// Iraq
const PrepopulatedEngine* const engines_IQ[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&yahoo,
&bing,
&yandex_ru,
@@ -447,7 +447,7 @@ const PrepopulatedEngine* const engines_IQ[] = {
// Iran
const PrepopulatedEngine* const engines_IR[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&yandex_ru,
@@ -456,7 +456,7 @@ const PrepopulatedEngine* const engines_IR[] = {
// Iceland
const PrepopulatedEngine* const engines_IS[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&duckduckgo, &duckduckgo_light,
&yahoo,
@@ -465,7 +465,7 @@ const PrepopulatedEngine* const engines_IS[] = {
// Italy
const PrepopulatedEngine* const engines_IT[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -474,7 +474,7 @@ const PrepopulatedEngine* const engines_IT[] = {
// Jamaica
const PrepopulatedEngine* const engines_JM[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -483,7 +483,7 @@ const PrepopulatedEngine* const engines_JM[] = {
// Jordan
const PrepopulatedEngine* const engines_JO[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -492,7 +492,7 @@ const PrepopulatedEngine* const engines_JO[] = {
// Japan
const PrepopulatedEngine* const engines_JP[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&yahoo_jp,
&bing,
&baidu,
@@ -501,7 +501,7 @@ const PrepopulatedEngine* const engines_JP[] = {
// Kenya
const PrepopulatedEngine* const engines_KE[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -510,7 +510,7 @@ const PrepopulatedEngine* const engines_KE[] = {
// South Korea
const PrepopulatedEngine* const engines_KR[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&naver,
&bing,
&daum,
@@ -519,7 +519,7 @@ const PrepopulatedEngine* const engines_KR[] = {
// Kuwait
const PrepopulatedEngine* const engines_KW[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -528,7 +528,7 @@ const PrepopulatedEngine* const engines_KW[] = {
// Kazakhstan
const PrepopulatedEngine* const engines_KZ[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&yandex_kz,
&mail_ru,
&bing,
@@ -537,7 +537,7 @@ const PrepopulatedEngine* const engines_KZ[] = {
// Lebanon
const PrepopulatedEngine* const engines_LB[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -546,7 +546,7 @@ const PrepopulatedEngine* const engines_LB[] = {
// Liechtenstein
const PrepopulatedEngine* const engines_LI[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&duckduckgo, &duckduckgo_light,
&yahoo,
@@ -555,7 +555,7 @@ const PrepopulatedEngine* const engines_LI[] = {
// Lithuania
const PrepopulatedEngine* const engines_LT[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&yandex_ru,
@@ -564,7 +564,7 @@ const PrepopulatedEngine* const engines_LT[] = {
// Luxembourg
const PrepopulatedEngine* const engines_LU[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&duckduckgo, &duckduckgo_light,
&yahoo,
@@ -573,7 +573,7 @@ const PrepopulatedEngine* const engines_LU[] = {
// Latvia
const PrepopulatedEngine* const engines_LV[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&yandex_ru,
&bing,
&yahoo,
@@ -582,7 +582,7 @@ const PrepopulatedEngine* const engines_LV[] = {
// Libya
const PrepopulatedEngine* const engines_LY[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&yahoo,
&bing,
&yandex_com,
@@ -591,7 +591,7 @@ const PrepopulatedEngine* const engines_LY[] = {
// Morocco
const PrepopulatedEngine* const engines_MA[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&yahoo,
&bing,
&duckduckgo, &duckduckgo_light,
@@ -600,7 +600,7 @@ const PrepopulatedEngine* const engines_MA[] = {
// Monaco
const PrepopulatedEngine* const engines_MC[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&duckduckgo, &duckduckgo_light,
&yahoo,
@@ -609,7 +609,7 @@ const PrepopulatedEngine* const engines_MC[] = {
// Moldova
const PrepopulatedEngine* const engines_MD[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&yandex_ru,
&mail_ru,
&duckduckgo, &duckduckgo_light,
@@ -618,7 +618,7 @@ const PrepopulatedEngine* const engines_MD[] = {
// Montenegro
const PrepopulatedEngine* const engines_ME[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&yandex_ru,
@@ -627,7 +627,7 @@ const PrepopulatedEngine* const engines_ME[] = {
// Macedonia
const PrepopulatedEngine* const engines_MK[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -636,7 +636,7 @@ const PrepopulatedEngine* const engines_MK[] = {
// Mexico
const PrepopulatedEngine* const engines_MX[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo_mx,
&ecosia,
@@ -645,7 +645,7 @@ const PrepopulatedEngine* const engines_MX[] = {
// Malaysia
const PrepopulatedEngine* const engines_MY[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo_my,
&duckduckgo, &duckduckgo_light,
@@ -654,7 +654,7 @@ const PrepopulatedEngine* const engines_MY[] = {
// Nicaragua
const PrepopulatedEngine* const engines_NI[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -664,7 +664,7 @@ const PrepopulatedEngine* const engines_NI[] = {
// Netherlands
const PrepopulatedEngine* const engines_NL[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo_nl,
&duckduckgo, &duckduckgo_light,
@@ -673,7 +673,7 @@ const PrepopulatedEngine* const engines_NL[] = {
// Norway
const PrepopulatedEngine* const engines_NO[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -682,7 +682,7 @@ const PrepopulatedEngine* const engines_NO[] = {
// New Zealand
const PrepopulatedEngine* const engines_NZ[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&duckduckgo, &duckduckgo_light,
&yahoo_nz,
@@ -691,7 +691,7 @@ const PrepopulatedEngine* const engines_NZ[] = {
// Oman
const PrepopulatedEngine* const engines_OM[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -700,7 +700,7 @@ const PrepopulatedEngine* const engines_OM[] = {
// Panama
const PrepopulatedEngine* const engines_PA[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -709,7 +709,7 @@ const PrepopulatedEngine* const engines_PA[] = {
// Peru
const PrepopulatedEngine* const engines_PE[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo_pe,
&ecosia,
@@ -718,7 +718,7 @@ const PrepopulatedEngine* const engines_PE[] = {
// Philippines
const PrepopulatedEngine* const engines_PH[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&yahoo_ph,
&bing,
&ecosia,
@@ -727,7 +727,7 @@ const PrepopulatedEngine* const engines_PH[] = {
// Pakistan
const PrepopulatedEngine* const engines_PK[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&yahoo,
&bing,
&duckduckgo, &duckduckgo_light,
@@ -736,7 +736,7 @@ const PrepopulatedEngine* const engines_PK[] = {
// Poland
const PrepopulatedEngine* const engines_PL[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -745,7 +745,7 @@ const PrepopulatedEngine* const engines_PL[] = {
// Puerto Rico
const PrepopulatedEngine* const engines_PR[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -754,7 +754,7 @@ const PrepopulatedEngine* const engines_PR[] = {
// Portugal
const PrepopulatedEngine* const engines_PT[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -763,7 +763,7 @@ const PrepopulatedEngine* const engines_PT[] = {
// Paraguay
const PrepopulatedEngine* const engines_PY[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -772,7 +772,7 @@ const PrepopulatedEngine* const engines_PY[] = {
// Qatar
const PrepopulatedEngine* const engines_QA[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -781,7 +781,7 @@ const PrepopulatedEngine* const engines_QA[] = {
// Romania
const PrepopulatedEngine* const engines_RO[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -790,7 +790,7 @@ const PrepopulatedEngine* const engines_RO[] = {
// Serbia
const PrepopulatedEngine* const engines_RS[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&yahoo,
&bing,
&duckduckgo, &duckduckgo_light,
@@ -799,7 +799,7 @@ const PrepopulatedEngine* const engines_RS[] = {
// Russia
const PrepopulatedEngine* const engines_RU[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&yandex_ru,
&mail_ru,
&bing,
@@ -808,7 +808,7 @@ const PrepopulatedEngine* const engines_RU[] = {
// Rwanda
const PrepopulatedEngine* const engines_RW[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -817,7 +817,7 @@ const PrepopulatedEngine* const engines_RW[] = {
// Saudi Arabia
const PrepopulatedEngine* const engines_SA[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&yandex_com,
@@ -826,7 +826,7 @@ const PrepopulatedEngine* const engines_SA[] = {
// Sweden
const PrepopulatedEngine* const engines_SE[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo_se,
&duckduckgo, &duckduckgo_light,
@@ -835,7 +835,7 @@ const PrepopulatedEngine* const engines_SE[] = {
// Singapore
const PrepopulatedEngine* const engines_SG[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yandex_com,
&yahoo_sg,
@@ -844,7 +844,7 @@ const PrepopulatedEngine* const engines_SG[] = {
// Slovenia
const PrepopulatedEngine* const engines_SI[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&duckduckgo, &duckduckgo_light,
&yahoo,
@@ -853,7 +853,7 @@ const PrepopulatedEngine* const engines_SI[] = {
// Slovakia
const PrepopulatedEngine* const engines_SK[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -862,7 +862,7 @@ const PrepopulatedEngine* const engines_SK[] = {
// El Salvador
const PrepopulatedEngine* const engines_SV[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -871,7 +871,7 @@ const PrepopulatedEngine* const engines_SV[] = {
// Syria
const PrepopulatedEngine* const engines_SY[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&yandex_ru,
@@ -880,7 +880,7 @@ const PrepopulatedEngine* const engines_SY[] = {
// Thailand
const PrepopulatedEngine* const engines_TH[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&yahoo_th,
&bing,
&duckduckgo, &duckduckgo_light,
@@ -889,7 +889,7 @@ const PrepopulatedEngine* const engines_TH[] = {
// Tunisia
const PrepopulatedEngine* const engines_TN[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&yahoo,
&bing,
&yandex_ru,
@@ -898,7 +898,7 @@ const PrepopulatedEngine* const engines_TN[] = {
// Turkey
const PrepopulatedEngine* const engines_TR[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&yandex_tr,
&yahoo_tr,
&bing,
@@ -907,7 +907,7 @@ const PrepopulatedEngine* const engines_TR[] = {
// Trinidad and Tobago
const PrepopulatedEngine* const engines_TT[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -916,7 +916,7 @@ const PrepopulatedEngine* const engines_TT[] = {
// Taiwan
const PrepopulatedEngine* const engines_TW[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&yahoo_tw,
&bing,
&baidu,
@@ -925,7 +925,7 @@ const PrepopulatedEngine* const engines_TW[] = {
// Tanzania
const PrepopulatedEngine* const engines_TZ[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -934,7 +934,7 @@ const PrepopulatedEngine* const engines_TZ[] = {
// Ukraine
const PrepopulatedEngine* const engines_UA[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&yandex_ua,
&bing,
&mail_ru,
@@ -943,7 +943,7 @@ const PrepopulatedEngine* const engines_UA[] = {
// United States
const PrepopulatedEngine* const engines_US[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -952,7 +952,7 @@ const PrepopulatedEngine* const engines_US[] = {
// Uruguay
const PrepopulatedEngine* const engines_UY[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -961,7 +961,7 @@ const PrepopulatedEngine* const engines_UY[] = {
// Venezuela
const PrepopulatedEngine* const engines_VE[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&yahoo_ve,
&bing,
&duckduckgo, &duckduckgo_light,
@@ -970,7 +970,7 @@ const PrepopulatedEngine* const engines_VE[] = {
// Vietnam
const PrepopulatedEngine* const engines_VN[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&coccoc,
&yahoo,
&bing,
@@ -979,7 +979,7 @@ const PrepopulatedEngine* const engines_VN[] = {
// Yemen
const PrepopulatedEngine* const engines_YE[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&yandex_ru,
@@ -988,7 +988,7 @@ const PrepopulatedEngine* const engines_YE[] = {
// South Africa
const PrepopulatedEngine* const engines_ZA[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&duckduckgo, &duckduckgo_light,
@@ -997,7 +997,7 @@ const PrepopulatedEngine* const engines_ZA[] = {
// Zimbabwe
const PrepopulatedEngine* const engines_ZW[] = {
- &googleen, &google,
+ &googleen, &google, &qwant,
&bing,
&yahoo,
&ask,
--
2.17.1
@@ -1,40 +0,0 @@
From: uazo <uazo@users.noreply.github.com>
Date: Mon, 2 Sep 2024 07:03:38 +0000
Subject: Add a GN flag to disable trybot verification
Adds flag in GN to deactivate the check performed by some google build bots.
The flag is deactivated when generating the system webview with
skip_secondary_abi_for_cq=true in arm64.
License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
---
chrome/android/expectations/expectations.gni | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/chrome/android/expectations/expectations.gni b/chrome/android/expectations/expectations.gni
--- a/chrome/android/expectations/expectations.gni
+++ b/chrome/android/expectations/expectations.gni
@@ -5,8 +5,12 @@
import("//build/config/android/config.gni")
import("//build/config/coverage/coverage.gni")
+declare_args() {
+ enable_trybot_verification = true
+}
+
# Chosen to match android-binary-size trybot.
-enable_libs_and_assets_verification =
+enable_libs_and_assets_verification = enable_trybot_verification &&
!enable_chrome_android_internal && !is_component_build &&
!use_jacoco_coverage && is_official_build &&
((target_cpu == "arm64" || target_cpu == "x64") &&
@@ -16,7 +20,7 @@ enable_libs_and_assets_verification =
# use_jacoco_coverage: Adds proguard flags.
# android_channel: Manifest entries vary based on channel.
# target_cpu: android:versionCode varies.
-enable_manifest_verification =
+enable_manifest_verification = enable_trybot_verification &&
!is_java_debug && !enable_chrome_android_internal && !use_jacoco_coverage &&
((target_cpu == "arm64" || target_cpu == "x64") &&
android_channel == "stable")
--
@@ -1,116 +0,0 @@
From: uazo <uazo@users.noreply.github.com>
Date: Fri, 21 Apr 2023 13:10:20 +0000
Subject: Add a flag to disable GamePad API
Adds restrict-gamepad-access flag (default active) to disable GamePad API.
License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
---
chrome/browser/flag-metadata.json | 4 ++--
content/child/runtime_features.cc | 2 ++
.../about_flags_cc/Add-a-flag-to-disable-GamePad-API.inc | 7 +++++++
device/gamepad/public/cpp/gamepad_features.cc | 8 ++++++++
device/gamepad/public/cpp/gamepad_features.h | 2 ++
.../blink/renderer/modules/gamepad/navigator_gamepad.cc | 6 ++++++
6 files changed, 27 insertions(+), 2 deletions(-)
create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Add-a-flag-to-disable-GamePad-API.inc
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -8924,9 +8924,9 @@
"expiry_milestone": 150
},
{
- "name": "restrict-gamepad-access",
+ "name": "restrict-gamepad-access", // restrict-gamepad-access"
"owners": [ "//device/gamepad/OWNERS", "jameshollyer@chromium.org" ],
- "expiry_milestone": 96
+ "expiry_milestone": -1
},
{
"name": "rewriter-api-for-gemini-nano",
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -265,6 +265,8 @@ void SetRuntimeFeaturesFromChromiumFeatures() {
{wf::EnablePaymentApp, raw_ref(features::kServiceWorkerPaymentApps)},
{wf::EnablePeriodicBackgroundSync,
raw_ref(features::kPeriodicBackgroundSync)},
+ {wf::EnableRestrictGamepadAccess,
+ raw_ref(features::kRestrictGamepadAccess)},
{wf::EnableSecurePaymentConfirmation,
raw_ref(features::kSecurePaymentConfirmation)},
{wf::EnableSecurePaymentConfirmationDebug,
diff --git a/cromite_flags/chrome/browser/about_flags_cc/Add-a-flag-to-disable-GamePad-API.inc b/cromite_flags/chrome/browser/about_flags_cc/Add-a-flag-to-disable-GamePad-API.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/chrome/browser/about_flags_cc/Add-a-flag-to-disable-GamePad-API.inc
@@ -0,0 +1,7 @@
+#ifdef FLAG_SECTION
+
+ {"restrict-gamepad-access", "Restrict gamepad access",
+ "Disable the Gamepad API", kOsAll,
+ FEATURE_VALUE_TYPE(features::kRestrictGamepadAccess)},
+
+#endif
diff --git a/device/gamepad/public/cpp/gamepad_features.cc b/device/gamepad/public/cpp/gamepad_features.cc
--- a/device/gamepad/public/cpp/gamepad_features.cc
+++ b/device/gamepad/public/cpp/gamepad_features.cc
@@ -37,4 +37,12 @@ bool IsGamepadMultitouchEnabled() {
return false;
}
+CROMITE_FEATURE(kRestrictGamepadAccess,
+ "RestrictGamepadAccess",
+ base::FEATURE_ENABLED_BY_DEFAULT);
+
+bool IsRestrictGamepadAccessEnabled() {
+ return base::FeatureList::IsEnabled(kRestrictGamepadAccess);
+}
+
} // namespace features
diff --git a/device/gamepad/public/cpp/gamepad_features.h b/device/gamepad/public/cpp/gamepad_features.h
--- a/device/gamepad/public/cpp/gamepad_features.h
+++ b/device/gamepad/public/cpp/gamepad_features.h
@@ -15,8 +15,10 @@ GAMEPAD_FEATURES_EXPORT BASE_DECLARE_FEATURE(
GAMEPAD_FEATURES_EXPORT BASE_DECLARE_FEATURE(kEnableGamepadMultitouch);
GAMEPAD_FEATURES_EXPORT BASE_DECLARE_FEATURE(
kEnableSimulatedGamepadDataFetcher);
+GAMEPAD_FEATURES_EXPORT BASE_DECLARE_FEATURE(kRestrictGamepadAccess);
GAMEPAD_FEATURES_EXPORT bool IsGamepadMultitouchEnabled();
+GAMEPAD_FEATURES_EXPORT bool IsRestrictGamepadAccessEnabled();
} // namespace features
diff --git a/third_party/blink/renderer/modules/gamepad/navigator_gamepad.cc b/third_party/blink/renderer/modules/gamepad/navigator_gamepad.cc
--- a/third_party/blink/renderer/modules/gamepad/navigator_gamepad.cc
+++ b/third_party/blink/renderer/modules/gamepad/navigator_gamepad.cc
@@ -27,6 +27,7 @@
#include "base/auto_reset.h"
#include "device/gamepad/public/cpp/gamepads.h"
+#include "device/gamepad/public/cpp/gamepad_features.h"
#include "third_party/blink/public/common/privacy_budget/identifiability_metric_builder.h"
#include "third_party/blink/public/common/privacy_budget/identifiability_study_settings.h"
#include "third_party/blink/public/mojom/frame/user_activation_notification_type.mojom-blink.h"
@@ -114,6 +115,9 @@ void RecordGamepadsForIdentifiabilityStudy(
HeapVector<Member<Gamepad>> NavigatorGamepad::getGamepads(
Navigator& navigator,
ExceptionState& exception_state) {
+ if (::features::IsRestrictGamepadAccessEnabled()) {
+ return HeapVector<Member<Gamepad>>();
+ }
if (!navigator.DomWindow()) {
// Using an existing NavigatorGamepad if one exists, but don't create one
// for a detached window, as its subclasses depend on a non-null window.
@@ -420,6 +424,8 @@ void NavigatorGamepad::SampleAndCompareGamepadState() {
void NavigatorGamepad::DispatchGamepadEvent(const AtomicString& event_name,
Gamepad* gamepad) {
+ if (::features::IsRestrictGamepadAccessEnabled())
+ return;
// Ensure that we're blocking re-entrancy.
DCHECK(processing_events_);
DCHECK(has_connection_event_listener_);
--
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,343 +0,0 @@
From: uazo <uazo@users.noreply.github.com>
Date: Sat, 7 Nov 2020 21:59:18 +0000
Subject: Add autoplay site setting
Original License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
Require: Content-settings-infrastructure.patch
---
.../res/drawable-hdpi/settings_autoplay.png | Bin 0 -> 456 bytes
.../res/drawable-mdpi/settings_autoplay.png | Bin 0 -> 296 bytes
.../res/drawable-xhdpi/settings_autoplay.png | Bin 0 -> 551 bytes
.../res/drawable-xxhdpi/settings_autoplay.png | Bin 0 -> 792 bytes
.../drawable-xxxhdpi/settings_autoplay.png | Bin 0 -> 1064 bytes
.../impl/BromiteAutoplayContentSetting.java | 93 ++++++++++++++++++
.../bromite_content_settings/autoplay.grdp | 21 ++++
.../bromite_content_settings/autoplay.inc | 12 +++
.../core/browser/content_settings_registry.cc | 2 +-
.../core/html/media/autoplay_policy.cc | 14 +++
.../core/html/media/autoplay_policy.h | 4 +
11 files changed, 145 insertions(+), 1 deletion(-)
create mode 100644 components/browser_ui/site_settings/android/java/res/drawable-hdpi/settings_autoplay.png
create mode 100644 components/browser_ui/site_settings/android/java/res/drawable-mdpi/settings_autoplay.png
create mode 100644 components/browser_ui/site_settings/android/java/res/drawable-xhdpi/settings_autoplay.png
create mode 100644 components/browser_ui/site_settings/android/java/res/drawable-xxhdpi/settings_autoplay.png
create mode 100644 components/browser_ui/site_settings/android/java/res/drawable-xxxhdpi/settings_autoplay.png
create mode 100644 components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromiteAutoplayContentSetting.java
create mode 100644 components/browser_ui/strings/bromite_content_settings/autoplay.grdp
create mode 100644 components/content_settings/core/browser/bromite_content_settings/autoplay.inc
diff --git a/components/browser_ui/site_settings/android/java/res/drawable-hdpi/settings_autoplay.png b/components/browser_ui/site_settings/android/java/res/drawable-hdpi/settings_autoplay.png
new file mode 100644
index 0000000000000000000000000000000000000000..a8a9265f14cd8445ad1f55845099e60dc3c4edf1
GIT binary patch
literal 456
zcmV;(0XP1MP)<h;3K|Lk000e1NJLTq001Na001Ni1ONa4O9@aD0004xNkl<Zcmd^>
zv2MaJ5QYmZs7m@68Tt%)0T}7#GcJmh4B69}fh}W`x!sUhd4N1chpY%8u@-es;cQTy
zGbWY1VQ**q%l&uuT^{am%=;qbIaI7>hvTfF;<*Ut{eMAbL!QB&HFUzBXR~2P41Zx8
z)>!6-O>RP(9xN_j-$FSZiy-wPUj)-Jl(4<5Et;Mc!<K5}jwP!>dwn%v3G5VXX+fR6
zfpz3x+Y|Y)K6`aNHVw{qdv4}^DAdl0F;g<cu%;M_QeJHg8RVIajV_AK%qV!0vEmv1
z#vVbjZa-Q+lSd;emiMaVzX)Z*+nGY^7d%tYY9KFz2z6mO9x2+}RepX<5}`zKxo)iR
zz{m)~NhMClXs`4GHM$vG2T_S4KzpqpIGl{BX8{q3sfX5s0TlVSK=Ataj-&0{v9#{N
z{;&j_q`#yfB8jBm<%OhAge7edm84b@`b2QRo9WRKN#xNwD<h5zoBL8ri$BDs;tw$`
y{$1Kp0i#npN<C~x1#L&}8>IV|-Tf!x{>CqV{oZM{Igf1s0000<MNUMnLSTY>m&@A#
literal 0
HcmV?d00001
diff --git a/components/browser_ui/site_settings/android/java/res/drawable-mdpi/settings_autoplay.png b/components/browser_ui/site_settings/android/java/res/drawable-mdpi/settings_autoplay.png
new file mode 100644
index 0000000000000000000000000000000000000000..49fa10d44f4007532d0d03d15fdcb1a715857e96
GIT binary patch
literal 296
zcmV+@0oVSCP)<h;3K|Lk000e1NJLTq000;O000;W1ONa4N`Cco0002*Nkl<Zc-p;F
zu?>ST5R5=Hk+X;yg9#|y{3AI^L4jN_0yR^lp<y0UAY}`bhK9U}6x+c{;s$?XpYHT`
z_WQ8+DiaXc!3Y!8NIOv`U+9>_9hQ%}W9}t45w<H~z#4hQDkf8`VbB=1O|%hcI?jda
zV;k+`LgB0>TQfw*%xg4TCAk}wycg<C;jW}mI*Sz_g!XRC-~-OCu{Db@O*?8?8^Rj&
zS{^N1H6fiLjCAC#fRLNPkP|W*!URjjT!AiQtzvYZ{t%#iA(xXD1Xz-(u@oBGf2}Be
u*BbnAfuj*Re80yVxjo)NA1L&T?!2C$I@?4>V>|Ky0000<MNUMnLSTX*1bI&Y
literal 0
HcmV?d00001
diff --git a/components/browser_ui/site_settings/android/java/res/drawable-xhdpi/settings_autoplay.png b/components/browser_ui/site_settings/android/java/res/drawable-xhdpi/settings_autoplay.png
new file mode 100644
index 0000000000000000000000000000000000000000..5a4128a5e02949de754f9cab2635824eda8c539c
GIT binary patch
literal 551
zcmV+?0@(eDP)<h;3K|Lk000e1NJLTq001xm001xu1ONa4{R=S+0005*Nkl<Zc-rk(
zy>fy;5RRo0wX?Hwh9Zw(#Vgp}9uO@kj!GT?W_XdLp-A4qiidDg@B~=L$xN`2Fo6Ry
zoC`9!!WnNX*>%6WZ+~v@;l6HTnG5Pb03nIUF_Q>F2&iK&{=v0ABR=d&Dwa&+>$CpO
zN8o1rO<Uv$u0HDF9##;Ow3|Q-tE-%+18~W?=HLW7u&HLKOxcVLm1<yTUrsfUGq~xX
zqx<cUyx0DE0A@`^cGeUaIn=iCwjFlbea(GBJf>jQOd%dgDu@oJ0JqvZU3NJ!T~_A+
zw>7k!d)Tk%U1PSM!@i8g3Qx?K@4o3Chv27xSRb|1lL*LZCn{;7NuQNv<q5!Ftw$V!
zc)av3R5$TCJ)+DZDSW^ao>676eW3vl6flwYSMx=l(G+1kL4+N%tlEhfAQy}(nDFWr
zbXw{Z4tCiO1OTTBcDW68nyP>kgahDIfn8VxO;uQ6Yd8Q-71auD*mMx(DnrEqaH<To
z&_)dhyat$p1K?CKh1bGGfX(<C05JbrZN`P>Q#wV`gM2wnZ5*JY22WGzg(js{SktOi
z^lWxu_H1_Y+jaYe^U~wOk$z>$zx3sgE%FC1e02PlFgl8cUvcTd1Q~vNjPEQT-<g7p
p?=l}ClAlmgAAvHTvG;Wo>j%AMEx!+_@2>y=002ovPDHLkV1fY;_gnw~
literal 0
HcmV?d00001
diff --git a/components/browser_ui/site_settings/android/java/res/drawable-xxhdpi/settings_autoplay.png b/components/browser_ui/site_settings/android/java/res/drawable-xxhdpi/settings_autoplay.png
new file mode 100644
index 0000000000000000000000000000000000000000..7fceb8c2b546970a3720e8ab225799aa03895b7f
GIT binary patch
literal 792
zcmV+z1LypSP)<h;3K|Lk000e1NJLTq002k;002k`1ONa4|Kxkj0008tNkl<ZcmeHN
zv2Nl_5Kd(&P^2J2k<wEAFOV*wK{6%nd}~AH7AGB@E1m)cC{TL;PY?@4L47q{DkQ2)
zgu;oFPN%!E!Ny}lw9<LD9oFB@H#0js!$l#56r!s*CDlL=Bg|=u6>VsP6)iEx2tCzs
zN?!=Ys;Vvm+R!dxZSbnPR`u*)=$?G~q+QDONj}}54UDQIpq+dnupUkhrgMXd90~(9
z>D-*sHYV1z%eSyr=BeO3;m5&Ge2@<pO;xiip5YmGMb*%ROFljhg4(L5++aL|o)4Xt
z#%NjP*f=bsMdO23efEqzx#k+Py)EC-cdk<X`U-t|-#g6Ixz21IO!tgFux}-M*tcpx
z+bE=rR*I5^H|s7_BE7>~l(<Z;9NA<MwvEhAv<UAec5h`y4E^$WnI||NFX<&hz9~zC
z>oA;)6G#{m)`C=tNtmpB)?rp!gtK?*J1gwU@xCMXrLcRedOG_Aoa>~>!hiCJ<GzU?
zU4g;RFi3>{ojT&^9q|2A6eswfXXRwNew}jUlw`DpvbTS<8sy~{`pMeAwZ6%yL!Xy$
zN2*G=JTQ;lS${M|)Hzo?si<yxhaM+sazIk*Xq?iqof0qI(UJg?P=^+O4kR2zHF)`D
zl|_IA)LCU-!l_0)@}9u|IUq50<g;J&;sK4Ankxn*pe__Vqj<GBGo&d7B%n^2OnV;x
zfh7Y}69W=Zr)o@h8E>K0Up2cT1|*=)t}wk-{0CUjdxjX0fI83Mf&Ybo(3S(znzB<m
z^)SCv%fntq6%#ah*z2DdwY@s>U#@89zg#sfKk^r7!;A&m>sd-zwDXs+niu)Z|Ao(>
z;TfMn@`obY`5%hfKBYBiHdqh(w`25gSn1i))3E8OQ(Krf&Sz(7oX<QX`)FaR!DvC-
z;R|!`ZTxsjnS4B@Ou=|cg8`miBTkKmz^eW)jLCUb2{*+b2?DrQRj0pNXexyiQpitx
WnED%yq_MdG0000<MNUMnLSTZmtagO}
literal 0
HcmV?d00001
diff --git a/components/browser_ui/site_settings/android/java/res/drawable-xxxhdpi/settings_autoplay.png b/components/browser_ui/site_settings/android/java/res/drawable-xxxhdpi/settings_autoplay.png
new file mode 100644
index 0000000000000000000000000000000000000000..92a315bb00ac1f4dc675e894bf4af3ba7c68bf39
GIT binary patch
literal 1064
zcmV+@1lRkCP)<h;3K|Lk000e1NJLTq003YB003YJ1ONa4NRhv@000B;Nkl<Zc-rk-
zF-Rjp6x}q5UMCS0#3Pl(5mH&l%1Q;{uKI6w6G2RqfI_g2*e8Om;Gwl(ZGDB6<Z@mY
z41!h)DtJW--GhTGoY}a$GqZ^U^QZnZ|INPr^Z%bejuk6btXQ$4Pc|mmBCFCqouNZL
z+*6<WxThXEbVmEE$`&^!KcwMX<5*@*wCR=nknxH(Yhrn8{DYY8r>Mvd@I-#RfhTrA
zML#uC<7*jKp)UCfqsuC_%t(wck71K;$=5J$u~{A)viWQYSLEv(xME8~Gk$Frr{wD&
zI9;0^#@?^uf&63!9@uK4#y8Tm7iz{GPOt-V=gT=S+ekOkUbdWb=Rw%P3EhS2?={j1
znNJh=@$S+WRQC#g>V2o{6{t=Z?|z3LG~wtMZ-y=hF8Pd>n~yV_n@0=J13_GRGrG;6
z!}Wm09<l3XrRL0HmmUXf$+b79b@vCEkE8V|m6_M4a5NCYj5h8ElLt5Mf{yv!1>6J^
zi6*pop5R{>=jCZ_r}{L`gMViY9x2#y;<%R48&%;r*r_TXTLH$uVB1MRu#FdSHKn7?
z`-}(CeD>8zNbpUBfCq&DBPizKc3=Bf2#S%UBhDc1I|)nBzrdE{;{7Yp^VBj!$TQBx
zU|S+zz^3T;B^;-eQx(qzY{qtLVzw3S*uwXXPwGdTn6<_H_N*cX4be2o$8UU5g&+nP
ztP-!%(B(t6s4>q!uz#qm24H<k2=lrzDi~B0_J233?tcwcDq&ZkQ87A!4)}QA%f<zu
zN+mDL=L_s0dX?>oQ*Am<Tmb4+LW?hjMXctzD}w*YO8`)&lA9OoSdl_b7mgzXK%Gi_
z?u=G6wV#{`bvXd)RH8aJPdie9oUbr@1vvofRPqXZWjjJ~o-Oiq9zP`qK%Gi{imxNF
z#ZV>GxMfcqM;3rOm2koVsD>M`&n>zm4?vwt*x~f|!wop&79@E9>Qn-8+GpV^zc}AJ
zFAqSSO71+T*$FqG_g1BxlLw$qrE-qb>xHV|o^zsEc>wBE^0J)HeYgSrw<?XaJOFhn
zHPW0;|APTQNjCuVDP;an+!=-&MJXXSYW_iHekj4JNd|K$X%6Ph52wvfXhcC<e@cl`
zVkxC4tod=0da3dbmbI2u4)v8)uq;{FLQA%=g_7RFmf@vE<BPjPEU%+9qVl@=7aZzW
zOoyYnVlw}dPjsfExn`|pg0EQ(zvwo+)xh{>55wDS3~zX{EoY-``m=49hBUsaw;r=*
z+}2~(e82VBHh+(@{oX!+2n#ThdxByg0maD|^ghF~58(`dil|N~cLlAek3rFLSGLCO
ib6hJ{tXQ#P#rX?0El=KlH_u1_0000<MNUMnLSTX(y!wd%
literal 0
HcmV?d00001
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromiteAutoplayContentSetting.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromiteAutoplayContentSetting.java
new file mode 100644
--- /dev/null
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromiteAutoplayContentSetting.java
@@ -0,0 +1,93 @@
+/*
+ This file is part of Bromite.
+
+ Bromite is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Bromite is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Bromite. If not, see <https://www.gnu.org/licenses/>.
+*/
+
+package org.chromium.components.browser_ui.site_settings.impl;
+
+import org.chromium.components.browser_ui.site_settings.R;
+
+import org.chromium.components.browser_ui.site_settings.BromiteCustomContentSetting;
+import org.chromium.components.browser_ui.site_settings.ContentSettingsResources;
+import org.chromium.components.browser_ui.site_settings.SiteSettingsCategory;
+import org.chromium.components.content_settings.ContentSetting;
+import org.chromium.components.content_settings.ContentSettingsType;
+import org.chromium.content_public.browser.BrowserContextHandle;
+
+import androidx.annotation.Nullable;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import java.util.ArrayList;
+
+public class BromiteAutoplayContentSetting extends BromiteCustomContentSetting {
+ public BromiteAutoplayContentSetting() {
+ super(/*contentSettingsType*/ ContentSettingsType.AUTOPLAY,
+ /*defaultEnabledValue*/ ContentSetting.ALLOW,
+ /*defaultDisabledValue*/ ContentSetting.BLOCK,
+ /*allowException*/ true,
+ /*preferenceKey*/ "autoplay",
+ /*profilePrefKey*/ "autoplay");
+ }
+
+ @Override
+ public ContentSettingsResources.ResourceItem getResourceItem() {
+ return new ContentSettingsResources.ResourceItem(
+ /*icon*/ R.drawable.settings_autoplay,
+ /*title*/ R.string.autoplay_permission_title,
+ /*defaultEnabledValue*/ getDefaultEnabledValue(),
+ /*defaultDisabledValue*/ getDefaultDisabledValue(),
+ /*enabledSummary*/ R.string.website_settings_category_autoplay_enabled,
+ /*disabledSummary*/ R.string.website_settings_category_autoplay_disabled,
+ /*summaryOverrideForScreenReader*/ 0);
+ }
+
+ @Override
+ public int getCategorySummary(@Nullable @ContentSetting int value) {
+ switch (value) {
+ case ContentSetting.ALLOW:
+ return R.string.website_settings_category_autoplay_enabled;
+ case ContentSetting.BLOCK:
+ return R.string.website_settings_category_autoplay_disabled;
+ default:
+ return 0;
+ }
+ }
+
+ @Override
+ public int getCategoryDescription() {
+ return R.string.website_settings_add_site_description_autoplay;
+ }
+
+ @Override
+ public boolean requiresTriStateContentSetting() {
+ return false;
+ }
+
+ @Override
+ public boolean showOnlyDescriptions() {
+ return true;
+ }
+
+ @Override
+ public int getAddExceptionDialogMessage() {
+ return R.string.website_settings_category_autoplay_enabled;
+ }
+
+ @Override
+ public @Nullable Boolean considerException(SiteSettingsCategory category, @ContentSetting int value) {
+ return value != ContentSetting.BLOCK;
+ }
+}
diff --git a/components/browser_ui/strings/bromite_content_settings/autoplay.grdp b/components/browser_ui/strings/bromite_content_settings/autoplay.grdp
new file mode 100644
--- /dev/null
+++ b/components/browser_ui/strings/bromite_content_settings/autoplay.grdp
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_AUTOPLAY_PERMISSION_TITLE" desc='Title for the Autoplay settings screen [CHAR-LIMIT=32]' formatter_data="android_java">
+ Autoplay
+ </message>
+ <message name="IDS_WEBSITE_SETTINGS_ADD_SITE_DESCRIPTION_AUTOPLAY" desc="The description for the allow autoplay of muted videos for website dialog." formatter_data="android_java">
+ Allow autoplay for a specific site.
+ </message>
+ <message name="IDS_WEBSITE_SETTINGS_CATEGORY_AUTOPLAY_ENABLED" desc="Summary text explaining that sites are allowed to compile JavaScript in JIT mode." formatter_data="android_java">
+ Allow sites to automatically play muted videos
+ </message>
+ <message name="IDS_WEBSITE_SETTINGS_CATEGORY_AUTOPLAY_DISABLED" desc="Summary text explaining that sites are running JavaScript in JITless mode." formatter_data="android_java">
+ Autoplay disabled
+ </message>
+ <message name="IDS_SETTINGS_SITE_SETTINGS_AUTOPLAY_ALLOWED_EXCEPTIONS" desc="Label for the allowed exceptions site list of the autoplay setting.">
+ Allowed to autoplay
+ </message>
+ <message name="IDS_SETTINGS_SITE_SETTINGS_AUTOPLAY_BLOCKED_EXCEPTIONS" desc="Label for the blocked exceptions site list of the autoplay setting.">
+ Not allowed to autoplay
+ </message>
+</grit-part>
diff --git a/components/content_settings/core/browser/bromite_content_settings/autoplay.inc b/components/content_settings/core/browser/bromite_content_settings/autoplay.inc
new file mode 100644
--- /dev/null
+++ b/components/content_settings/core/browser/bromite_content_settings/autoplay.inc
@@ -0,0 +1,12 @@
+ content_settings::WebsiteSettingsRegistry::GetInstance()
+ ->GetMutable(ContentSettingsType::AUTOPLAY)
+ ->set_show_into_info_page()
+ .set_desktop_ui()
+ .set_is_renderer_content_setting()
+ .set_title_ui(IDS_AUTOPLAY_PERMISSION_TITLE)
+ .set_description_ui(IDS_WEBSITE_SETTINGS_ADD_SITE_DESCRIPTION_AUTOPLAY)
+ .set_allowed_ui(IDS_WEBSITE_SETTINGS_CATEGORY_AUTOPLAY_ENABLED)
+ .set_blocked_ui(IDS_WEBSITE_SETTINGS_CATEGORY_AUTOPLAY_DISABLED)
+ .set_allowed_exceptions_ui(IDS_SETTINGS_SITE_SETTINGS_AUTOPLAY_ALLOWED_EXCEPTIONS)
+ .set_blocked_exceptions_ui(IDS_SETTINGS_SITE_SETTINGS_AUTOPLAY_BLOCKED_EXCEPTIONS)
+ .set_mid_sentence_ui(IDS_AUTOPLAY_PERMISSION_TITLE);
diff --git a/components/content_settings/core/browser/content_settings_registry.cc b/components/content_settings/core/browser/content_settings_registry.cc
--- a/components/content_settings/core/browser/content_settings_registry.cc
+++ b/components/content_settings/core/browser/content_settings_registry.cc
@@ -255,7 +255,7 @@ void ContentSettingsRegistry::Init() {
ContentSettingsInfo::INHERIT_IN_INCOGNITO,
PermissionSettingsInfo::EXCEPTIONS_ON_SECURE_ORIGINS_ONLY);
- Register(ContentSettingsType::AUTOPLAY, "autoplay", CONTENT_SETTING_ALLOW,
+ Register(ContentSettingsType::AUTOPLAY, "autoplay", CONTENT_SETTING_BLOCK,
WebsiteSettingsInfo::UNSYNCABLE, /*allowlisted_primary_schemes=*/{},
/*valid_settings=*/{CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK},
WebsiteSettingsInfo::TOP_ORIGIN_ONLY_SCOPE,
diff --git a/third_party/blink/renderer/core/html/media/autoplay_policy.cc b/third_party/blink/renderer/core/html/media/autoplay_policy.cc
--- a/third_party/blink/renderer/core/html/media/autoplay_policy.cc
+++ b/third_party/blink/renderer/core/html/media/autoplay_policy.cc
@@ -9,6 +9,7 @@
#include "third_party/blink/public/mojom/autoplay/autoplay.mojom-blink.h"
#include "third_party/blink/public/mojom/frame/lifecycle.mojom-blink.h"
#include "third_party/blink/public/mojom/webpreferences/web_preferences.mojom-blink.h"
+#include "third_party/blink/public/platform/web_content_settings_client.h"
#include "third_party/blink/public/platform/web_media_player.h"
#include "third_party/blink/public/web/web_local_frame.h"
#include "third_party/blink/public/web/web_local_frame_client.h"
@@ -346,6 +347,8 @@ void AutoplayPolicy::TryUnlockingUserGesture() {
}
bool AutoplayPolicy::IsGestureNeededForPlayback() const {
+ if (!IsAutoplayAllowedPerSettings())
+ return true;
if (!IsLockedPendingUserGesture())
return false;
@@ -457,6 +460,17 @@ void AutoplayPolicy::MaybeSetAutoplayInitiated() {
}
}
+bool AutoplayPolicy::IsAutoplayAllowedPerSettings() const {
+ LocalFrame* frame = element_->GetDocument().GetFrame();
+ if (!frame)
+ return false;
+ if (auto* settings_client = frame->GetContentSettingsClient()) {
+ return settings_client->AllowContentSetting(
+ ContentSettingsType::AUTOPLAY, /*default_value*/ false);
+ }
+ return true;
+}
+
bool AutoplayPolicy::ShouldAutoplay() {
if (!element_->GetExecutionContext() ||
element_->GetExecutionContext()->IsSandboxed(
diff --git a/third_party/blink/renderer/core/html/media/autoplay_policy.h b/third_party/blink/renderer/core/html/media/autoplay_policy.h
--- a/third_party/blink/renderer/core/html/media/autoplay_policy.h
+++ b/third_party/blink/renderer/core/html/media/autoplay_policy.h
@@ -148,6 +148,10 @@ class CORE_EXPORT AutoplayPolicy final
// should use, if checking to see if an action is allowed.
bool IsLockedPendingUserGesture() const;
+ // Return true if and only if the settings allow autoplay of media on this
+ // frame.
+ bool IsAutoplayAllowedPerSettings() const;
+
bool IsAutoplayingMutedInternal(bool muted) const;
bool IsOrWillBeAutoplayingMutedInternal(bool muted) const;
--
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,932 +0,0 @@
From: uazo <uazo@users.noreply.github.com>
Date: Fri, 22 Aug 2025 15:41:58 +0000
Subject: Add cromite test support
Allows the activation of specific APIs used for cromite testing.
API are only available on the chrome://version page.
It allows the use of tools such as Browserstack for test automation.
Do not activate the corresponding options (available in the developer
settings) if you do not know what you are doing.
License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
---
.../java/res/xml/developer_preferences.xml | 12 ++
.../init/ProcessInitializationHandler.java | 6 +-
.../tracing/settings/DeveloperSettings.java | 2 +-
chrome/browser/BUILD.gn | 5 +
chrome/browser/android/devtools_server.cc | 10 +
...ontent_browser_client_receiver_bindings.cc | 10 +
.../cromite/cromite_private_api_host.cc | 74 +++++++
.../cromite/cromite_private_api_host.h | 54 +++++
.../browser/flags/cromite/sActAsWebView.java | 33 +++
.../cromite/sEnableCromiteTestSupport.java | 33 +++
.../NotificationPermissionController.java | 1 +
chrome/browser/ui/startup/bad_flags_prompt.cc | 1 +
chrome/common/BUILD.gn | 1 +
.../cromite_private_api_extension.mojom | 7 +
chrome/renderer/BUILD.gn | 2 +
.../chrome_content_renderer_client.cc | 2 +
.../cromite/cromite_private_api_extension.cc | 203 ++++++++++++++++++
.../cromite/cromite_private_api_extension.h | 65 ++++++
.../component_updater_service.h | 1 +
.../browser/devtools/devtools_http_handler.cc | 7 +-
content/browser/log_console_message.cc | 15 +-
content/browser/log_console_message.h | 3 +-
.../renderer_host/render_frame_host_impl.cc | 13 +-
.../about_flags_cc/Enable-test-support.inc | 19 ++
.../Enable-test-support.inc | 7 +
.../Enable-test-support.inc | 2 +
26 files changed, 581 insertions(+), 7 deletions(-)
create mode 100644 chrome/browser/cromite/cromite_private_api_host.cc
create mode 100644 chrome/browser/cromite/cromite_private_api_host.h
create mode 100644 chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/cromite/sActAsWebView.java
create mode 100644 chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/cromite/sEnableCromiteTestSupport.java
create mode 100644 chrome/common/cromite_private_api_extension.mojom
create mode 100644 chrome/renderer/cromite/cromite_private_api_extension.cc
create mode 100644 chrome/renderer/cromite/cromite_private_api_extension.h
create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Enable-test-support.inc
create mode 100644 cromite_flags/content/public/common/content_features_cc/Enable-test-support.inc
create mode 100644 cromite_flags/content/public/common/content_features_h/Enable-test-support.inc
diff --git a/chrome/android/java/res/xml/developer_preferences.xml b/chrome/android/java/res/xml/developer_preferences.xml
--- a/chrome/android/java/res/xml/developer_preferences.xml
+++ b/chrome/android/java/res/xml/developer_preferences.xml
@@ -12,6 +12,18 @@ found in the LICENSE file.
android:fragment="org.chromium.chrome.browser.tracing.settings.TracingSettings"
android:key="tracing"
android:title="Tracing" />
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
+ android:key="enable_cromite_test_support"
+ android:title="Enable support for cromite test"
+ android:summary="Setting allows the activation of specific APIs used for cromite testing. Do not activate if you do not know what you are doing."
+ app:featureName="enable-cromite-test-support"
+ app:needRestart="true" />
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
+ android:key="act_as_webview"
+ android:title="Enable webview support for cromite test"
+ android:summary="Setting allows the activation of specific APIs used for cromite testing. Do not activate if you do not know what you are doing."
+ app:featureName="act-as-webview"
+ app:needRestart="true" />
<Preference
android:key="test_gwp_asan"
android:title="Test Gwp Asan"/>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
@@ -145,6 +145,7 @@ import org.chromium.ui.base.SelectFileDialog;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.edge_to_edge.EdgeToEdgeStateProvider;
import org.chromium.url.GURL;
+import org.chromium.chrome.browser.flags.cromite.sActAsWebView;
import java.io.File;
import java.nio.charset.StandardCharsets;
@@ -713,7 +714,10 @@ public class ProcessInitializationHandler {
tasks.add(
() -> {
- mDevToolsServer = new DevToolsServer(DEV_TOOLS_SERVER_SOCKET_PREFIX);
+ String socketPrefix = DEV_TOOLS_SERVER_SOCKET_PREFIX;
+ if (sActAsWebView.getInstance().isEnabled())
+ socketPrefix = "weblayer";
+ mDevToolsServer = new DevToolsServer(socketPrefix);
mDevToolsServer.setRemoteDebuggingEnabled(
true, DevToolsServer.Security.ALLOW_DEBUG_PERMISSION);
});
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tracing/settings/DeveloperSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/tracing/settings/DeveloperSettings.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/tracing/settings/DeveloperSettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tracing/settings/DeveloperSettings.java
@@ -35,7 +35,7 @@ public class DeveloperSettings extends ChromeBaseSettingsFragment implements Emb
private final ObservableSupplier<String> mPageTitle =
new ObservableSupplierImpl<>(MSG_DEVELOPER_OPTIONS_TITLE);
- private static @Nullable Boolean sIsEnabledForTests;
+ private static @Nullable Boolean sIsEnabledForTests = true;
public static boolean shouldShowDeveloperSettings() {
// Always enabled on canary, dev and local builds, otherwise can be enabled by tapping the
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -188,6 +188,11 @@ source_set("shell_integration") {
# require many files from it. This makes linking more efficient.
static_library("browser") {
sources = [
+ "cromite/cromite_private_api_host.cc",
+ "cromite/cromite_private_api_host.h",
+ ]
+
+ sources += [
"about_flags.cc",
"accessibility/accessibility_labels_service.cc",
"accessibility/accessibility_labels_service.h",
diff --git a/chrome/browser/android/devtools_server.cc b/chrome/browser/android/devtools_server.cc
--- a/chrome/browser/android/devtools_server.cc
+++ b/chrome/browser/android/devtools_server.cc
@@ -12,6 +12,7 @@
#include "base/command_line.h"
#include "base/compiler_specific.h"
#include "base/files/file_path.h"
+#include "base/feature_list.h"
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/strings/string_number_conversions.h"
@@ -32,6 +33,7 @@
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_delegate.h"
+#include "content/public/common/content_features.h"
#include "content/public/common/content_switches.h"
#include "content/public/common/url_constants.h"
#include "net/base/net_errors.h"
@@ -64,6 +66,8 @@ const int kBackLog = 10;
bool AuthorizeSocketAccessWithDebugPermission(
const net::UnixDomainServerSocket::Credentials& credentials) {
+ if (base::FeatureList::IsEnabled(features::kEnableCromiteTestSupport))
+ return true;
JNIEnv* env = base::android::AttachCurrentThread();
return Java_DevToolsServer_checkDebugPermission(env, credentials.process_id,
credentials.user_id) ||
@@ -127,6 +131,10 @@ DevToolsServer::DevToolsServer(const std::string& socket_name_prefix)
: socket_name_(base::StringPrintf(kDevToolsChannelNameFormat,
socket_name_prefix.c_str())),
is_started_(false) {
+ if (base::FeatureList::IsEnabled(features::kActAsWebView)) {
+ socket_name_ = base::StringPrintf("%s_devtools_remote_%d",
+ socket_name_prefix.c_str(), getpid());
+ }
// Override the socket name if one is specified on the command line.
const base::CommandLine& command_line =
*base::CommandLine::ForCurrentProcess();
@@ -144,6 +152,8 @@ void DevToolsServer::Start(bool allow_debug_permission) {
if (is_started_)
return;
+ DLOG(INFO) << "---DevToolsServer::Start allow_debug_permission=" << allow_debug_permission;
+ DLOG(INFO) << "---socket_name_=" << socket_name_;
net::UnixDomainServerSocket::AuthCallback auth_callback =
allow_debug_permission
? base::BindRepeating(&AuthorizeSocketAccessWithDebugPermission)
diff --git a/chrome/browser/chrome_content_browser_client_receiver_bindings.cc b/chrome/browser/chrome_content_browser_client_receiver_bindings.cc
--- a/chrome/browser/chrome_content_browser_client_receiver_bindings.cc
+++ b/chrome/browser/chrome_content_browser_client_receiver_bindings.cc
@@ -10,6 +10,7 @@
#include "build/build_config.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chrome_browser_interface_binders.h"
+#include "chrome/browser/cromite/cromite_private_api_host.h"
#include "chrome/browser/chrome_browser_interface_binders_webui.h"
#include "chrome/browser/chrome_content_browser_client.h"
#include "chrome/browser/chrome_content_browser_client_parts.h"
@@ -494,6 +495,15 @@ void ChromeContentBrowserClient::
render_frame_host);
},
&render_frame_host));
+ associated_registry.AddInterface<
+ chrome::mojom::CromitePrivateApiExtension>(base::BindRepeating(
+ [](content::RenderFrameHost* render_frame_host,
+ mojo::PendingAssociatedReceiver<
+ chrome::mojom::CromitePrivateApiExtension> receiver) {
+ CromitePrivateApiHost::BindHost(std::move(receiver),
+ render_frame_host);
+ },
+ &render_frame_host));
associated_registry.AddInterface<
chrome::mojom::GoogleAccountsPrivateApiExtension>(base::BindRepeating(
[](content::RenderFrameHost* render_frame_host,
diff --git a/chrome/browser/cromite/cromite_private_api_host.cc b/chrome/browser/cromite/cromite_private_api_host.cc
new file mode 100644
--- /dev/null
+++ b/chrome/browser/cromite/cromite_private_api_host.cc
@@ -0,0 +1,74 @@
+#include "chrome/browser/cromite/cromite_private_api_host.h"
+
+#include "base/json/json_writer.h"
+
+#include "chrome/browser/browser_process.h"
+#include "components/component_updater/component_updater_service.h"
+#include "components/update_client/crx_update_item.h"
+#include "content/public/browser/document_user_data.h"
+#include "content/public/browser/navigation_handle.h"
+#include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/site_instance.h"
+
+CromitePrivateApiHost::CromitePrivateApiHost(
+ content::RenderFrameHost* rfh)
+ : DocumentUserData<CromitePrivateApiHost>(rfh),
+ receiver_(this) {}
+
+CromitePrivateApiHost::~CromitePrivateApiHost() = default;
+
+DOCUMENT_USER_DATA_KEY_IMPL(CromitePrivateApiHost);
+
+void CromitePrivateApiHost::BindReceiver(
+ mojo::PendingAssociatedReceiver<
+ chrome::mojom::CromitePrivateApiExtension> receiver) {
+ receiver_.Bind(std::move(receiver));
+}
+
+void CromitePrivateApiHost::GetComponentData(
+ const std::string& id,
+ GetComponentDataCallback callback) {
+ LOG(INFO) << "---CromitePrivateApiHost::GetComponentData "
+ << "id=" << id;
+ const raw_ptr<component_updater::ComponentUpdateService>
+ component_updater = g_browser_process->component_updater();
+
+ update_client::CrxUpdateItem item;
+ if (component_updater->GetComponentDetails(id, &item) && item.component) {
+ base::Value::Dict dict;
+ dict.Set("id", id);
+ dict.Set("version", item.component->version.GetString());
+ dict.Set("status", (int)item.state);
+
+ std::string json_string;
+ base::JSONWriter::WriteWithOptions(
+ dict, base::JSONWriter::OPTIONS_PRETTY_PRINT, &json_string);
+ base::TrimWhitespaceASCII(json_string, base::TRIM_ALL, &json_string);
+
+ std::move(callback).Run(json_string);
+ }
+}
+
+void CromitePrivateApiHost::StartComponentUpdate(const std::string& id) {
+ LOG(INFO) << "---CromitePrivateApiHost::StartComponentUpdate "
+ << "id=" << id;
+ const raw_ptr<component_updater::ComponentUpdateService>
+ component_updater = g_browser_process->component_updater();
+ component_updater->GetOnDemandUpdater().OnDemandUpdate(
+ id, component_updater::OnDemandUpdater::Priority::FOREGROUND,
+ component_updater::Callback());
+}
+
+void CromitePrivateApiHost::SetEnableLogConsole(bool enabled) {
+ enable_log_console_ = enabled;
+}
+
+// static
+void CromitePrivateApiHost::BindHost(
+ mojo::PendingAssociatedReceiver<
+ chrome::mojom::CromitePrivateApiExtension> receiver,
+ content::RenderFrameHost* render_frame_host) {
+ CromitePrivateApiHost* api_host =
+ CromitePrivateApiHost::GetOrCreateForCurrentDocument(render_frame_host);
+ api_host->BindReceiver(std::move(receiver));
+}
diff --git a/chrome/browser/cromite/cromite_private_api_host.h b/chrome/browser/cromite/cromite_private_api_host.h
new file mode 100644
--- /dev/null
+++ b/chrome/browser/cromite/cromite_private_api_host.h
@@ -0,0 +1,54 @@
+#ifndef CHROME_BROWSER_CROMITE_PRIVATE_API_HOST_H_
+#define CHROME_BROWSER_CROMITE_PRIVATE_API_HOST_H_
+
+#include <string>
+
+#include "base/functional/callback.h"
+#include "chrome/common/cromite_private_api_extension.mojom.h"
+#include "content/public/browser/document_user_data.h"
+#include "mojo/public/cpp/bindings/associated_receiver.h"
+
+namespace content {
+class NavigationHandle;
+class RenderFrameHost;
+} // namespace content
+
+class CromitePrivateApiHost
+ : public chrome::mojom::CromitePrivateApiExtension,
+ public content::DocumentUserData<CromitePrivateApiHost> {
+ public:
+ ~CromitePrivateApiHost() override;
+ CromitePrivateApiHost(const CromitePrivateApiHost&) = delete;
+ CromitePrivateApiHost& operator=(const CromitePrivateApiHost&) =
+ delete;
+
+ static void BindHost(
+ mojo::PendingAssociatedReceiver<
+ chrome::mojom::CromitePrivateApiExtension> receiver,
+ content::RenderFrameHost* render_frame_host);
+
+ void BindReceiver(mojo::PendingAssociatedReceiver<
+ chrome::mojom::CromitePrivateApiExtension> receiver);
+
+ bool IsLogConsoleEnabled() const { return enable_log_console_; }
+
+ // chrome::mojom::CromitePrivateApiExtension:
+ void GetComponentData(const std::string& id,
+ GetComponentDataCallback callback) override;
+ void StartComponentUpdate(const std::string& id) override;
+ void SetEnableLogConsole(bool can_show) override;
+
+ private:
+ explicit CromitePrivateApiHost(
+ content::RenderFrameHost* rfh);
+
+ friend DocumentUserData;
+ DOCUMENT_USER_DATA_KEY_DECL();
+
+ mojo::AssociatedReceiver<chrome::mojom::CromitePrivateApiExtension>
+ receiver_;
+
+ bool enable_log_console_ = false;
+};
+
+#endif // CHROME_BROWSER_CROMITE_PRIVATE_API_HOST_H_
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/cromite/sActAsWebView.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/cromite/sActAsWebView.java
new file mode 100644
--- /dev/null
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/cromite/sActAsWebView.java
@@ -0,0 +1,33 @@
+/*
+ This file is part of Cromite.
+
+ Cromite is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Cromite is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Cromite. If not, see <https://www.gnu.org/licenses/>.
+*/
+
+package org.chromium.chrome.browser.flags.cromite;
+
+import org.chromium.components.cached_flags.CachedFlag;
+import org.chromium.chrome.browser.flags.ChromeFeatureMap;
+
+public class sActAsWebView {
+ private static final CachedFlag sInstance =
+ new CachedFlag(ChromeFeatureMap.getInstance(),
+ "ActAsWebView", false);
+
+ private sActAsWebView() {}
+
+ public static CachedFlag getInstance() {
+ return sInstance;
+ }
+}
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/cromite/sEnableCromiteTestSupport.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/cromite/sEnableCromiteTestSupport.java
new file mode 100644
--- /dev/null
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/cromite/sEnableCromiteTestSupport.java
@@ -0,0 +1,33 @@
+/*
+ This file is part of Cromite.
+
+ Cromite is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Cromite is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Cromite. If not, see <https://www.gnu.org/licenses/>.
+*/
+
+package org.chromium.chrome.browser.flags.cromite;
+
+import org.chromium.components.cached_flags.CachedFlag;
+import org.chromium.chrome.browser.flags.ChromeFeatureMap;
+
+public class sEnableCromiteTestSupport {
+ private static final CachedFlag sInstance =
+ new CachedFlag(ChromeFeatureMap.getInstance(),
+ "EnableCromiteTestSupport", false);
+
+ private sEnableCromiteTestSupport() {}
+
+ public static CachedFlag getInstance() {
+ return sInstance;
+ }
+}
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionController.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionController.java
--- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionController.java
+++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionController.java
@@ -182,6 +182,7 @@ public class NotificationPermissionController implements UnownedUserData {
* @return True if any UI was shown (either rationale dialog or OS prompt), false otherwise.
*/
public boolean requestPermissionIfNeeded(boolean contextual) {
+ if (!contextual) return false;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU || DeviceInfo.isRetailDemoMode()) {
return false;
}
diff --git a/chrome/browser/ui/startup/bad_flags_prompt.cc b/chrome/browser/ui/startup/bad_flags_prompt.cc
--- a/chrome/browser/ui/startup/bad_flags_prompt.cc
+++ b/chrome/browser/ui/startup/bad_flags_prompt.cc
@@ -210,6 +210,7 @@ static const base::Feature* kBadFeatureFlagsInAboutFlags[] = {
#if BUILDFLAG(IS_ANDROID)
&chrome::android::kCommandLineOnNonRooted,
+ &features::kEnableCromiteTestSupport,
#endif
// This flag disables security for the Page Embedded Permission Control, for
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn
--- a/chrome/common/BUILD.gn
+++ b/chrome/common/BUILD.gn
@@ -671,6 +671,7 @@ mojom("mojo_bindings") {
sources = [
"chrome_render_frame.mojom",
"google_accounts_private_api_extension.mojom",
+ "cromite_private_api_extension.mojom",
"media/webrtc_logging.mojom",
"net/net_error_page_support.mojom",
"net_benchmarking.mojom",
diff --git a/chrome/common/cromite_private_api_extension.mojom b/chrome/common/cromite_private_api_extension.mojom
new file mode 100644
--- /dev/null
+++ b/chrome/common/cromite_private_api_extension.mojom
@@ -0,0 +1,7 @@
+module chrome.mojom;
+
+interface CromitePrivateApiExtension {
+ GetComponentData(string id) => (string response);
+ StartComponentUpdate(string id);
+ SetEnableLogConsole(bool enabled);
+};
diff --git a/chrome/renderer/BUILD.gn b/chrome/renderer/BUILD.gn
--- a/chrome/renderer/BUILD.gn
+++ b/chrome/renderer/BUILD.gn
@@ -80,6 +80,8 @@ static_library("renderer") {
"chrome_render_thread_observer.cc",
"chrome_render_thread_observer.h",
"custom_menu_commands.h",
+ "cromite/cromite_private_api_extension.cc",
+ "cromite/cromite_private_api_extension.h",
"google_accounts_private_api_extension.cc",
"google_accounts_private_api_extension.h",
"google_accounts_private_api_util.cc",
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc
--- a/chrome/renderer/chrome_content_renderer_client.cc
+++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -56,6 +56,7 @@
#include "chrome/renderer/chrome_render_frame_observer.h"
#include "chrome/renderer/chrome_render_thread_observer.h"
#include "chrome/renderer/controlled_frame/controlled_frame_extensions_renderer_api_provider.h"
+#include "chrome/renderer/cromite/cromite_private_api_extension.h"
#include "chrome/renderer/google_accounts_private_api_extension.h"
#include "chrome/renderer/loadtimes_extension_bindings.h"
#include "chrome/renderer/media/flash_embed_rewrite.h"
@@ -661,6 +662,7 @@ void ChromeContentRendererClient::RenderFrameCreated(
TrustedVaultEncryptionKeysExtension::Create(render_frame);
GoogleAccountsPrivateApiExtension::Create(render_frame);
+ CromitePrivateApiExtension::Create(render_frame);
if (render_frame->IsMainFrame())
new webapps::WebPageMetadataAgent(render_frame);
diff --git a/chrome/renderer/cromite/cromite_private_api_extension.cc b/chrome/renderer/cromite/cromite_private_api_extension.cc
new file mode 100644
--- /dev/null
+++ b/chrome/renderer/cromite/cromite_private_api_extension.cc
@@ -0,0 +1,203 @@
+#include "chrome/renderer/cromite/cromite_private_api_extension.h"
+
+#include "chrome/common/chrome_features.h"
+#include "content/public/common/content_features.h"
+#include "content/public/common/isolated_world_ids.h"
+#include "content/public/renderer/chrome_object_extensions_utils.h"
+#include "content/public/renderer/render_frame.h"
+#include "gin/arguments.h"
+#include "gin/function_template.h"
+#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
+#include "third_party/blink/public/platform/platform.h"
+#include "third_party/blink/public/platform/scheduler/web_agent_group_scheduler.h"
+#include "third_party/blink/public/web/web_local_frame.h"
+#include "v8/include/v8-context.h"
+#include "v8/include/v8-function.h"
+
+namespace {
+
+bool ShouldExposeCromitePrivateApi(
+ content::RenderFrame* render_frame) {
+ DCHECK(render_frame);
+ if (!base::FeatureList::IsEnabled(features::kEnableCromiteTestSupport))
+ return false;
+
+ GURL origin_url = GURL("chrome://version");
+ const url::Origin& allowed_origin = url::Origin::Create(origin_url);
+
+ const url::Origin origin = render_frame->GetWebFrame()->GetSecurityOrigin();
+ return origin == allowed_origin;
+}
+
+}
+
+CromitePrivateApiExtension::PendingRequest::PendingRequest(
+ v8::Isolate* isolate,
+ v8::Local<v8::Context> context,
+ v8::Local<v8::Promise::Resolver> resolver)
+ : isolate(isolate),
+ context(isolate, context),
+ promise_resolver(isolate, resolver) {}
+
+CromitePrivateApiExtension::PendingRequest::~PendingRequest() = default;
+
+// static
+void CromitePrivateApiExtension::Create(content::RenderFrame* frame) {
+ new CromitePrivateApiExtension(frame);
+}
+
+CromitePrivateApiExtension::CromitePrivateApiExtension(
+ content::RenderFrame* frame)
+ : content::RenderFrameObserver(frame) {}
+
+CromitePrivateApiExtension::~CromitePrivateApiExtension() =
+ default;
+
+void CromitePrivateApiExtension::OnDestruct() {
+ delete this;
+}
+
+void CromitePrivateApiExtension::DidCreateScriptContext(
+ v8::Local<v8::Context> v8_context,
+ int32_t world_id) {
+ if (!render_frame() || world_id != content::ISOLATED_WORLD_ID_GLOBAL) {
+ return;
+ }
+
+ if (ShouldExposeCromitePrivateApi(render_frame())) {
+ InjectScript();
+ }
+}
+
+void CromitePrivateApiExtension::InjectScript() {
+ DCHECK(render_frame());
+
+ blink::WebLocalFrame* web_frame = render_frame()->GetWebFrame();
+ v8::Isolate* isolate = web_frame->GetAgentGroupScheduler()->Isolate();
+ v8::HandleScope handle_scope(isolate);
+ v8::Local<v8::Context> context = web_frame->MainWorldScriptContext();
+ if (context.IsEmpty()) {
+ return;
+ }
+
+ v8::Context::Scope context_scope(context);
+
+ v8::Local<v8::Object> window =
+ content::GetOrCreateObject(isolate, context, "window");
+ v8::Local<v8::Object> oCromiteObject =
+ content::GetOrCreateObject(isolate, context, window, "cromite");
+
+ oCromiteObject
+ ->Set(
+ context, gin::StringToSymbol(isolate, "getComponentData"),
+ gin::CreateFunctionTemplate(
+ isolate, base::BindRepeating(
+ &CromitePrivateApiExtension::GetComponentData,
+ weak_ptr_factory_.GetWeakPtr()))
+ ->GetFunction(context)
+ .ToLocalChecked())
+ .Check();
+
+ oCromiteObject
+ ->Set(
+ context, gin::StringToSymbol(isolate, "startComponentUpdate"),
+ gin::CreateFunctionTemplate(
+ isolate, base::BindRepeating(
+ &CromitePrivateApiExtension::StartComponentUpdate,
+ weak_ptr_factory_.GetWeakPtr()))
+ ->GetFunction(context)
+ .ToLocalChecked())
+ .Check();
+
+ oCromiteObject
+ ->Set(
+ context, gin::StringToSymbol(isolate, "setEnableLogConsole"),
+ gin::CreateFunctionTemplate(
+ isolate, base::BindRepeating(
+ &CromitePrivateApiExtension::SetEnableLogConsole,
+ weak_ptr_factory_.GetWeakPtr()))
+ ->GetFunction(context)
+ .ToLocalChecked())
+ .Check();
+}
+
+void CromitePrivateApiExtension::GetComponentData(gin::Arguments* args) {
+ std::string component_id;
+ if (!args->GetNext(&component_id)) {
+ args->ThrowError();
+ return;
+ }
+
+ if (!remote_.is_bound()) {
+ render_frame()->GetRemoteAssociatedInterfaces()->GetInterface(&remote_);
+ }
+
+ v8::Isolate* isolate = args->isolate();
+ v8::Local<v8::Context> context = isolate->GetCurrentContext();
+
+ v8::Local<v8::Promise::Resolver> resolver =
+ v8::Promise::Resolver::New(context).ToLocalChecked();
+ v8::Local<v8::Promise> promise = resolver->GetPromise();
+
+ base::UnguessableToken request_id = base::UnguessableToken::Create();
+ pending_requests_.emplace(
+ request_id,
+ std::make_unique<PendingRequest>(isolate, context, resolver));
+
+ remote_->GetComponentData(component_id,
+ base::BindOnce(&CromitePrivateApiExtension::OnGetComponentData,
+ weak_ptr_factory_.GetWeakPtr(), request_id));
+
+ args->Return(promise);
+}
+
+void CromitePrivateApiExtension::OnGetComponentData(const base::UnguessableToken callback_id,
+ const std::string& result) {
+ auto iter = pending_requests_.find(callback_id);
+ if (iter == pending_requests_.end())
+ return;
+
+ std::unique_ptr<PendingRequest> request = std::move(iter->second);
+ pending_requests_.erase(iter);
+
+ v8::HandleScope handle_scope(request->isolate);
+ v8::Local<v8::Context> context =
+ request->context.Get(request->isolate);
+ v8::Local<v8::Promise::Resolver> resolver =
+ request->promise_resolver.Get(request->isolate);
+
+ LOG(INFO) << "---CromitePrivateApiExtension::OnGetComponentData4";
+ resolver->Resolve(context,
+ gin::StringToV8(request->isolate, result))
+ .ToChecked();
+
+ LOG(INFO) << "---CromitePrivateApiExtension::OnGetComponentData5";
+}
+
+void CromitePrivateApiExtension::StartComponentUpdate(gin::Arguments* args) {
+ std::string component_id;
+ if (!args->GetNext(&component_id)) {
+ args->ThrowError();
+ return;
+ }
+
+ if (!remote_.is_bound()) {
+ render_frame()->GetRemoteAssociatedInterfaces()->GetInterface(&remote_);
+ }
+
+ remote_->StartComponentUpdate(component_id);
+}
+
+void CromitePrivateApiExtension::SetEnableLogConsole(gin::Arguments* args) {
+ bool enabled;
+ if (!args->GetNext(&enabled)) {
+ args->ThrowError();
+ return;
+ }
+
+ if (!remote_.is_bound()) {
+ render_frame()->GetRemoteAssociatedInterfaces()->GetInterface(&remote_);
+ }
+
+ remote_->SetEnableLogConsole(enabled);
+}
diff --git a/chrome/renderer/cromite/cromite_private_api_extension.h b/chrome/renderer/cromite/cromite_private_api_extension.h
new file mode 100644
--- /dev/null
+++ b/chrome/renderer/cromite/cromite_private_api_extension.h
@@ -0,0 +1,65 @@
+#ifndef CHROME_RENDERER_CROMITE_PRIVATE_API_EXTENSION_H_
+#define CHROME_RENDERER_CROMITE_PRIVATE_API_EXTENSION_H_
+
+#include "base/memory/weak_ptr.h"
+#include "chrome/common/cromite_private_api_extension.mojom.h"
+#include "content/public/renderer/render_frame_observer.h"
+#include "mojo/public/cpp/bindings/associated_remote.h"
+#include "v8/include/v8.h"
+
+namespace gin {
+class Arguments;
+} // namespace gin
+
+class CromitePrivateApiExtension : public content::RenderFrameObserver {
+ public:
+ // Creates a new instance, with ownership transferred to |*frame|.
+ static void Create(content::RenderFrame* frame);
+
+ CromitePrivateApiExtension(const CromitePrivateApiExtension&) =
+ delete;
+ CromitePrivateApiExtension& operator=(
+ const CromitePrivateApiExtension&) = delete;
+
+ ~CromitePrivateApiExtension() override;
+
+ // content::RenderFrameObserver:
+ void OnDestruct() override;
+ void DidCreateScriptContext(v8::Local<v8::Context> v8_context,
+ int32_t world_id) override;
+
+ private:
+
+ struct PendingRequest {
+ PendingRequest(
+ v8::Isolate* isolate,
+ v8::Local<v8::Context> context,
+ v8::Local<v8::Promise::Resolver> resolver);
+
+ ~PendingRequest();
+
+ raw_ptr<v8::Isolate> isolate;
+ v8::Global<v8::Context> context;
+ v8::Global<v8::Promise::Resolver> promise_resolver;
+ };
+
+ explicit CromitePrivateApiExtension(content::RenderFrame* frame);
+
+ void InjectScript();
+
+ void GetComponentData(gin::Arguments* args);
+ void OnGetComponentData(const base::UnguessableToken callback_id,
+ const std::string& label);
+ void StartComponentUpdate(gin::Arguments* args);
+ void SetEnableLogConsole(gin::Arguments* args);
+
+ std::map<const base::UnguessableToken,
+ std::unique_ptr<PendingRequest>> pending_requests_;
+
+ mojo::AssociatedRemote<chrome::mojom::CromitePrivateApiExtension>
+ remote_;
+ base::WeakPtrFactory<CromitePrivateApiExtension> weak_ptr_factory_{
+ this};
+};
+
+#endif // CHROME_RENDERER_CROMITE_PRIVATE_API_EXTENSION_H_
diff --git a/components/component_updater/component_updater_service.h b/components/component_updater/component_updater_service.h
--- a/components/component_updater/component_updater_service.h
+++ b/components/component_updater/component_updater_service.h
@@ -242,6 +242,7 @@ class OnDemandUpdater {
// the update will be applied. The caller can subscribe to component update
// service notifications and provide an optional callback to get the result
// of the call. The function does not implement any cooldown interval.
+ public:
virtual void OnDemandUpdate(const std::string& id,
Priority priority,
Callback callback) = 0;
diff --git a/content/browser/devtools/devtools_http_handler.cc b/content/browser/devtools/devtools_http_handler.cc
--- a/content/browser/devtools/devtools_http_handler.cc
+++ b/content/browser/devtools/devtools_http_handler.cc
@@ -16,6 +16,7 @@
#include "base/command_line.h"
#include "base/compiler_specific.h"
#include "base/files/file_util.h"
+#include "base/feature_list.h"
#include "base/functional/bind.h"
#include "base/functional/callback_helpers.h"
#include "base/json/json_writer.h"
@@ -46,6 +47,7 @@
#include "content/public/browser/devtools_manager_delegate.h"
#include "content/public/browser/devtools_socket_factory.h"
#include "content/public/common/content_client.h"
+#include "content/public/common/content_features.h"
#include "content/public/common/content_switches.h"
#include "content/public/common/url_constants.h"
#include "net/base/io_buffer.h"
@@ -588,9 +590,12 @@ void DevToolsHttpHandler::OnJsonRequest(
if (command == "version") {
base::Value::Dict version;
+ auto browser = GetContentClient()->browser()->GetProduct();
+ if (base::FeatureList::IsEnabled(features::kEnableCromiteTestSupport))
+ browser = "Chrome/0.0.0.0";
version.Set("Protocol-Version", DevToolsAgentHost::GetProtocolVersion());
version.Set("WebKit-Version", embedder_support::GetWebKitVersion());
- version.Set("Browser", GetContentClient()->browser()->GetProduct());
+ version.Set("Browser", browser);
version.Set("User-Agent", GetContentClient()->browser()->GetUserAgent());
version.Set("V8-Version", V8_VERSION_STRING);
std::string host = info.GetHeaderValue("host");
diff --git a/content/browser/log_console_message.cc b/content/browser/log_console_message.cc
--- a/content/browser/log_console_message.cc
+++ b/content/browser/log_console_message.cc
@@ -17,10 +17,23 @@ void LogConsoleMessage(blink::mojom::ConsoleMessageLevel log_level,
int32_t line_number,
bool is_builtin_component,
bool is_off_the_record,
- const std::u16string& source_id) {
+ const std::u16string& source_id,
+ bool is_log_console_enabled) {
+ if (base::FeatureList::IsEnabled(features::kEnableCromiteTestSupport)) {
+ LOG(INFO) << "CONSOLE:"
+ << "\"" << message << "\", source: " << source_id << " (" << line_number
+ << ")";
+ return;
+ }
const int32_t resolved_level =
is_builtin_component ? ConsoleMessageLevelToLogSeverity(log_level)
: ::logging::LOGGING_INFO;
+ if (is_log_console_enabled) {
+ logging::LogMessage("CONSOLE", line_number, resolved_level).stream()
+ << "\"" << message << "\", source: " << source_id << " (" << line_number
+ << ")";
+ return;
+ }
if (::logging::GetMinLogLevel() > resolved_level)
return;
diff --git a/content/browser/log_console_message.h b/content/browser/log_console_message.h
--- a/content/browser/log_console_message.h
+++ b/content/browser/log_console_message.h
@@ -19,7 +19,8 @@ void LogConsoleMessage(blink::mojom::ConsoleMessageLevel log_level,
int32_t line_number,
bool is_builtin_component,
bool is_off_the_record,
- const std::u16string& source_id);
+ const std::u16string& source_id,
+ bool is_log_console_enabled = false);
} // namespace content
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -319,6 +319,8 @@
#include "url/origin.h"
#include "url/url_constants.h"
+//#include "chrome/browser/cromite/cromite_private_api_host.h"
+
#if BUILDFLAG(IS_ANDROID)
#include "content/browser/accessibility/browser_accessibility_manager_android.h"
#include "content/browser/android/content_url_loader_factory.h"
@@ -4773,7 +4775,8 @@ void RenderFrameHostImpl::DidAddMessageToConsole(
if (delegate_->DidAddMessageToConsole(this, log_level, message, line_no,
updated_source_id,
untrusted_stack_trace)) {
- return;
+ if (!base::FeatureList::IsEnabled(features::kEnableCromiteTestSupport))
+ return;
}
// Pass through log severity only on builtin components pages to limit console
@@ -4790,8 +4793,14 @@ void RenderFrameHostImpl::DidAddMessageToConsole(
const bool is_off_the_record =
GetSiteInstance()->GetBrowserContext()->IsOffTheRecord();
+ bool is_log_console_enabled = false;
+ // CromitePrivateApiHost* cromite_data =
+ // CromitePrivateApiHost::GetForCurrentDocument(this);
+ // if (cromite_data) {
+ // is_log_console_enabled = cromite_data->IsLogConsoleEnabled();
+ // }
LogConsoleMessage(log_level, message, line_no, is_builtin_component,
- is_off_the_record, updated_source_id);
+ is_off_the_record, updated_source_id, is_log_console_enabled);
}
void RenderFrameHostImpl::FrameSizeChanged(const gfx::Size& frame_size) {
diff --git a/cromite_flags/chrome/browser/about_flags_cc/Enable-test-support.inc b/cromite_flags/chrome/browser/about_flags_cc/Enable-test-support.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/chrome/browser/about_flags_cc/Enable-test-support.inc
@@ -0,0 +1,19 @@
+#ifdef FLAG_SECTION
+
+ {"enable-cromite-test-support",
+ "Enable support for cromite test",
+ "Setting allows the activation of specific APIs used for cromite testing. "
+ "Do not activate if you do not know what you are doing.", kOsAll,
+ FEATURE_VALUE_TYPE(features::kEnableCromiteTestSupport)},
+
+#if BUILDFLAG(IS_ANDROID)
+
+ {"act-as-webview",
+ "Enable webview support for cromite test",
+ "Setting allows the activation of specific APIs used for cromite testing. "
+ "Do not activate if you do not know what you are doing.", kOsAndroid,
+ FEATURE_VALUE_TYPE(features::kActAsWebView)},
+
+#endif
+
+#endif
diff --git a/cromite_flags/content/public/common/content_features_cc/Enable-test-support.inc b/cromite_flags/content/public/common/content_features_cc/Enable-test-support.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/content/public/common/content_features_cc/Enable-test-support.inc
@@ -0,0 +1,7 @@
+CROMITE_FEATURE(kEnableCromiteTestSupport,
+ "EnableCromiteTestSupport",
+ base::FEATURE_DISABLED_BY_DEFAULT);
+
+CROMITE_FEATURE(kActAsWebView,
+ "ActAsWebView",
+ base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/cromite_flags/content/public/common/content_features_h/Enable-test-support.inc b/cromite_flags/content/public/common/content_features_h/Enable-test-support.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/content/public/common/content_features_h/Enable-test-support.inc
@@ -0,0 +1,2 @@
+CONTENT_EXPORT BASE_DECLARE_FEATURE(kEnableCromiteTestSupport);
+CONTENT_EXPORT BASE_DECLARE_FEATURE(kActAsWebView);
--
@@ -2,437 +2,114 @@ From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Wed, 29 Aug 2018 11:03:44 +0200
Subject: Add custom tab intents privacy option
Add custom tab intents privacy option and force
open external links in incognito flag.
Use the CCT ephemeral mode.
Flags are mutually exclusive.
See also: https://github.com/bromite/bromite/issues/1474
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
.../java/res/xml/privacy_preferences.xml | 15 ++++++
.../browser/LaunchIntentDispatcher.java | 21 ++++++++
.../CustomTabIntentDataProvider.java | 22 ++++----
.../customtabs/CustomTabsConnection.java | 3 +-
.../IncognitoCustomTabIntentDataProvider.java | 14 +++++
.../privacy/settings/PrivacySettings.java | 51 +++++++++++++++++++
.../flags/android/chrome_feature_list.cc | 5 +-
.../browser/flags/ChromeFeatureList.java | 3 ++
.../chrome/browser/tab/TabAssociatedApp.java | 6 ++-
...Add-custom-tab-intents-privacy-option.grdp | 25 +++++++++
.../OriginVerifier.java | 5 ++
.../core/common/language_experiments.cc | 1 +
.../add-custom-tab-intents-privacy-option.inc | 1 +
13 files changed, 158 insertions(+), 14 deletions(-)
create mode 100644 chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Add-custom-tab-intents-privacy-option.grdp
create mode 100644 cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/add-custom-tab-intents-privacy-option.inc
chrome/android/java/res/values/values.xml | 3 +++
chrome/android/java/res/xml/privacy_preferences.xml | 5 +++++
.../chrome/browser/LaunchIntentDispatcher.java | 3 +++
.../browser/settings/privacy/PrivacySettings.java | 11 +++++++++++
.../ui/android/strings/android_chrome_strings.grd | 7 +++++++
5 files changed, 29 insertions(+)
diff --git a/chrome/android/java/res/values/values.xml b/chrome/android/java/res/values/values.xml
--- a/chrome/android/java/res/values/values.xml
+++ b/chrome/android/java/res/values/values.xml
@@ -14,6 +14,9 @@
<item name="top_controls_show_threshold" format="float" type="dimen">0.5</item>
<item name="top_controls_hide_threshold" format="float" type="dimen">0.5</item>
+ <string name="allow_custom_tab_intents_title">Allow custom tab intents from applications</string>
+ <string name="allow_custom_tab_intents_summary">When disabled, all custom tab intents will be processed as regular navigation instead</string>
+
<!-- The number of thumbnails that the thumbnail cache can hold. -->
<integer name="default_thumbnail_cache_size">5</integer>
<!-- The number of approximation thumbnails that the approximation cache can hold. -->
diff --git a/chrome/android/java/res/xml/privacy_preferences.xml b/chrome/android/java/res/xml/privacy_preferences.xml
--- a/chrome/android/java/res/xml/privacy_preferences.xml
+++ b/chrome/android/java/res/xml/privacy_preferences.xml
@@ -52,6 +52,21 @@ found in the LICENSE file.
android:key="cromite_flags"
android:title="@string/cromite_flags_title"
app:url="@string/cromite_flags_url" />
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
@@ -29,6 +29,11 @@
android:fragment="org.chromium.chrome.browser.settings.privacy.DoNotTrackSettings"
android:key="do_not_track"
android:title="@string/do_not_track_title" />
+ <org.chromium.chrome.browser.settings.ChromeBaseCheckBoxPreference
+ android:key="allow_custom_tab_intents"
+ android:title="@string/allow_custom_tab_intents_title"
+ android:summary="@string/allow_custom_tab_intents_summary"
+ android:defaultValue="false" />
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
+ android:title="@string/uses_separate_storagepartition_for_cct_title"
+ android:summary="@string/uses_separate_storagepartition_for_cct_summary"
+ app:featureName="maylaunchurl-uses-separate-storage-partition"
+ app:needRestart="true" />
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
+ android:key="open_external_links_incognito"
+ android:title="@string/open_external_links_incognito_title"
+ android:summary="@string/open_external_links_incognito_summary"
+ android:defaultValue="false" />
<Preference
android:key="preload_pages"
android:title="@string/preload_pages_title"
android:key="clear_browsing_data"
android:title="@string/clear_browsing_data_title"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java b/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java
@@ -62,6 +62,9 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Set;
+import org.chromium.chrome.browser.privacy.settings.PrivacySettings;
+import org.chromium.chrome.browser.tab.TabLaunchType;
+
/**
* Dispatches incoming intents to the appropriate activity based on the current configuration and
* Intent fired.
@@ -264,6 +267,9 @@ public class LaunchIntentDispatcher {
@@ -43,6 +43,7 @@ import org.chromium.chrome.browser.notifications.NotificationPlatformBridge;
import org.chromium.chrome.browser.partnercustomizations.PartnerBrowserCustomizations;
import org.chromium.chrome.browser.searchwidget.SearchActivity;
import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.settings.privacy.PrivacySettings;
import org.chromium.chrome.browser.util.IntentUtils;
import org.chromium.chrome.browser.util.UrlConstants;
import org.chromium.chrome.browser.vr.VrModuleProvider;
@@ -251,6 +252,8 @@ public class LaunchIntentDispatcher implements IntentHandler.IntentHandlerDelega
*/
public static boolean isCustomTabIntent(Intent intent) {
if (intent == null) return false;
+ if (!ContextUtils.getAppSharedPreferences()
+ .getBoolean(PrivacySettings.PREF_ALLOW_CUSTOM_TAB_INTENTS, false))
+ if (!ContextUtils.getAppSharedPreferences().getBoolean(PrivacySettings.PREF_ALLOW_CUSTOM_TAB_INTENTS, false))
+ return false;
Log.w(
TAG,
"CustomTabsIntent#shouldAlwaysUseBrowserUI() = "
@@ -292,6 +298,10 @@ public class LaunchIntentDispatcher {
// Make sure the result of the CustomTabActivity is forwarded to the client.
newIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
if (CustomTabsIntent.shouldAlwaysUseBrowserUI(intent)
|| !intent.hasExtra(CustomTabsIntent.EXTRA_SESSION)) {
return false;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacySettings.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacySettings.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacySettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacySettings.java
@@ -41,6 +41,8 @@ public class PrivacySettings
+ if (ContextUtils.getAppSharedPreferences()
+ .getBoolean(PrivacySettings.PREF_OPEN_EXTERNAL_LINKS_INCOGNITO, false))
+ newIntent.putExtra(IntentHandler.EXTRA_OPEN_NEW_INCOGNITO_TAB, true);
+
// Since configureIntentForResizableCustomTab() might change the componenet/class
// associated with the passed intent, it needs to be called after #setClassName(context,
// CustomTabActivity.class.getName());
@@ -489,6 +499,17 @@ public class LaunchIntentDispatcher {
if (Intent.ACTION_VIEW.equals(newIntent.getAction())
&& !IntentHandler.wasIntentSenderChrome(newIntent)) {
+
+ if (ContextUtils.getAppSharedPreferences().getBoolean(
+ PrivacySettings.PREF_OPEN_EXTERNAL_LINKS_INCOGNITO, false)) {
+ Context applicationContext = ContextUtils.getApplicationContext();
+ newIntent = IntentHandler.createTrustedOpenNewTabIntent(applicationContext,
+ /*incognito*/true);
+ newIntent.setData(mIntent.getData());
+ newIntent.setPackage(applicationContext.getPackageName());
+ IntentHandler.setTabLaunchType(newIntent, TabLaunchType.FROM_EXTERNAL_APP);
+ newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
if (!chromeTabbedTaskExists(mActivity)) {
newIntent.putExtra(IntentHandler.EXTRA_STARTED_TABBED_CHROME_TASK, true);
}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java
@@ -238,16 +238,16 @@ public class CustomTabIntentDataProvider extends BrowserServicesIntentDataProvid
// Extra whose value is an array of ints that is supplied to
// SyntheticTrialRegistry::RegisterExternalExperiments().
- public static final String EXPERIMENT_IDS =
- "org.chromium.chrome.browser.customtabs.AGA_EXPERIMENT_IDS";
+ // public static final String EXPERIMENT_IDS =
+ // "org.chromium.chrome.browser.customtabs.AGA_EXPERIMENT_IDS";
// These Extra Intent parameters allow an Intent to enable or disable a set of Features.
// The set of Features that may be enabled or disabled is restricted by the code,
// and initially only two Features may be enabled together, or disabled together.
- public static final String EXPERIMENTS_ENABLE =
- "org.chromium.chrome.browser.customtabs.EXPERIMENTS_ENABLE";
- public static final String EXPERIMENTS_DISABLE =
- "org.chromium.chrome.browser.customtabs.EXPERIMENTS_DISABLE";
+ // public static final String EXPERIMENTS_ENABLE =
+ // "org.chromium.chrome.browser.customtabs.EXPERIMENTS_ENABLE";
+ // public static final String EXPERIMENTS_DISABLE =
+ // "org.chromium.chrome.browser.customtabs.EXPERIMENTS_DISABLE";
/**
* Extra that, if set, makes the Custom Tab Activity's height to be x pixels, the Custom Tab
@@ -689,7 +689,7 @@ public class CustomTabIntentDataProvider extends BrowserServicesIntentDataProvid
TrustedWebActivityIntentBuilder.EXTRA_SCREEN_ORIENTATION,
ScreenOrientation.DEFAULT));
- mGsaExperimentIds = IntentUtils.safeGetIntArrayExtra(intent, EXPERIMENT_IDS);
+ mGsaExperimentIds = null; //IntentUtils.safeGetIntArrayExtra(intent, EXPERIMENT_IDS);
mBreakPointDp = getActivityBreakPointFromIntent(intent);
mInitialActivityHeight = getInitialActivityHeightFromIntent(intent);
@@ -702,8 +702,8 @@ public class CustomTabIntentDataProvider extends BrowserServicesIntentDataProvid
intent, EXTRA_ACTIVITY_HEIGHT_RESIZE_BEHAVIOR, ACTIVITY_HEIGHT_DEFAULT);
mIsPartialCustomTabFixedHeight = activityHeightResizeBehavior == ACTIVITY_HEIGHT_FIXED;
- mInteractWithBackground = CustomTabsIntent.isBackgroundInteractionEnabled(intent);
- if (IntentUtils.safeHasExtra(intent, EXTRA_ENABLE_BACKGROUND_INTERACTION)) {
+ mInteractWithBackground = false; // CustomTabsIntent.isBackgroundInteractionEnabled(intent);
+ if (((false)) && IntentUtils.safeHasExtra(intent, EXTRA_ENABLE_BACKGROUND_INTERACTION)) {
@BackgroundInteractBehavior
int backgroundInteractBehavior =
IntentUtils.safeGetIntExtra(
@@ -1294,7 +1294,9 @@ public class CustomTabIntentDataProvider extends BrowserServicesIntentDataProvid
public @CustomTabProfileType int getCustomTabMode() {
return AlwaysIncognitoLinkInterceptor.isAlwaysIncognito()
? CustomTabProfileType.INCOGNITO
- : CustomTabProfileType.REGULAR;
+ : (ChromeFeatureList.sMayLaunchurlUsesSeparateStoragePartition.isEnabled()
+ ? CustomTabProfileType.EPHEMERAL
+ : CustomTabProfileType.REGULAR);
}
@Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java
@@ -782,7 +782,7 @@ public class CustomTabsConnection {
ThreadUtils.assertOnUiThread();
if (extras == null) return;
int[] experimentIds =
- IntentUtils.safeGetIntArray(extras, CustomTabIntentDataProvider.EXPERIMENT_IDS);
+ null; //IntentUtils.safeGetIntArray(extras, CustomTabIntentDataProvider.EXPERIMENT_IDS);
if (experimentIds == null) return;
// When ids are set through cct, they should not override existing ids.
boolean override = false;
@@ -999,6 +999,7 @@ public class CustomTabsConnection {
PostTask.postTask(
TaskTraits.UI_DEFAULT,
() -> {
+ if ((true)) return; // Disable CCTPostMessageAPI
// Attempt to verify origin synchronously. If successful directly initialize
// postMessage channel for session.
Uri verifiedOrigin = verifyOriginForSession(session, uid, postMessageOrigin);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/IncognitoCustomTabIntentDataProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/IncognitoCustomTabIntentDataProvider.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/IncognitoCustomTabIntentDataProvider.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/IncognitoCustomTabIntentDataProvider.java
@@ -43,6 +43,9 @@ import org.chromium.components.browser_ui.widget.TintedDrawable;
import java.util.ArrayList;
import java.util.List;
+import org.chromium.base.ContextUtils;
+import org.chromium.chrome.browser.privacy.settings.PrivacySettings;
+
/**
* A model class that parses the incoming intent for incognito Custom Tabs specific customization
* data.
@@ -125,6 +128,9 @@ public class IncognitoCustomTabIntentDataProvider extends BrowserServicesIntentD
}
private static boolean isIntentFromThirdPartyAllowed() {
+ if (ContextUtils.getAppSharedPreferences()
+ .getBoolean(PrivacySettings.PREF_OPEN_EXTERNAL_LINKS_INCOGNITO, false))
+ return true;
return ChromeFeatureList.sCctIncognitoAvailableToThirdParty.isEnabled();
}
@@ -222,6 +228,10 @@ public class IncognitoCustomTabIntentDataProvider extends BrowserServicesIntentD
}
public static boolean isValidIncognitoIntent(Intent intent, boolean recordMetrics) {
+ if (ContextUtils.getAppSharedPreferences()
+ .getBoolean(PrivacySettings.PREF_OPEN_EXTERNAL_LINKS_INCOGNITO, false)) {
+ return true;
+ }
if (!isIncognitoRequested(intent)) return false;
var session = SessionHolder.getSessionHolderFromIntent(intent);
if (isIntentFromThirdPartyAllowed()
@@ -332,6 +342,10 @@ public class IncognitoCustomTabIntentDataProvider extends BrowserServicesIntentD
@Override
public @CustomTabProfileType int getCustomTabMode() {
+ if (ContextUtils.getAppSharedPreferences()
+ .getBoolean(PrivacySettings.PREF_OPEN_EXTERNAL_LINKS_INCOGNITO, false)) {
+ return CustomTabProfileType.EPHEMERAL;
+ }
return CustomTabProfileType.INCOGNITO;
}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java
@@ -11,6 +11,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.drawable.Drawable;
+import android.os.Build;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.style.ClickableSpan;
@@ -79,6 +80,15 @@ import org.chromium.ui.text.SpanApplier;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
+import android.app.role.RoleManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ResolveInfo;
+import android.provider.Settings;
+import android.text.TextUtils;
+import org.chromium.base.IntentUtils;
+import org.chromium.base.PackageManagerUtils;
+
import androidx.preference.PreferenceCategory;
import org.chromium.chrome.browser.contextualsearch.ContextualSearchManager;
import org.chromium.base.shared_preferences.SharedPreferencesManager;
@@ -153,6 +163,9 @@ public class PrivacySettings extends ChromeBaseSettingsFragment
startTag, endTag, new ChromeClickableSpan(context, onClickCallback));
}
+ private ChromeSwitchPreference allowCustomTabIntentsPref;
+ private ChromeSwitchPreference openExternalLinksPref;
+
@Override
public void onCreatePreferencesCromite(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
mPageTitle.set(getString(R.string.prefs_privacy_security));
@@ -384,6 +397,9 @@ public class PrivacySettings extends ChromeBaseSettingsFragment
new SpanApplier.SpanInfo("<link2>", "</link2>", servicesLink));
}
private ManagedPreferenceDelegate mManagedPreferenceDelegate;
+ public static final String PREF_ALLOW_CUSTOM_TAB_INTENTS = "allow_custom_tab_intents";
+ public static final String PREF_OPEN_EXTERNAL_LINKS_INCOGNITO = "open_external_links_incognito";
+
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String key = preference.getKey();
@@ -404,6 +420,31 @@ public class PrivacySettings extends ChromeBaseSettingsFragment
} else if (PREF_SEARCH_SUGGESTIONS.equals(key)) {
UserPrefs.get(getProfile())
.setBoolean(Pref.SEARCH_SUGGEST_ENABLED, (boolean) newValue);
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
SettingsUtils.addPreferencesFromResource(this, R.xml.privacy_preferences);
@@ -76,6 +78,10 @@ public class PrivacySettings
Pref.CAN_MAKE_PAYMENT_ENABLED, (boolean) newValue);
} else if (PREF_NETWORK_PREDICTIONS.equals(key)) {
PrivacyPreferencesManager.getInstance().setNetworkPredictionEnabled((boolean) newValue);
+ } else if (PREF_ALLOW_CUSTOM_TAB_INTENTS.equals(key)) {
+ SharedPreferences.Editor sharedPreferencesEditor = ContextUtils.getAppSharedPreferences().edit();
+ sharedPreferencesEditor.putBoolean(PREF_ALLOW_CUSTOM_TAB_INTENTS, (boolean)newValue);
+ sharedPreferencesEditor.apply();
+ // check default browser
+ if ((boolean)newValue) {
+ ResolveInfo info = PackageManagerUtils.resolveDefaultWebBrowserActivity();
+ if (info == null || info.match == 0 ||
+ !TextUtils.equals(ContextUtils.getApplicationContext().getPackageName(),
+ info.activityInfo.packageName)) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+ RoleManager roleManager = (RoleManager) getContext().getSystemService(Context.ROLE_SERVICE);
+ Intent intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_BROWSER);
+ startActivityForResult(intent, 0);
+ } else {
+ Intent intent = new Intent(Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ IntentUtils.safeStartActivity(getContext(), intent);
+ }
+ }
+ }
+ } else if (PREF_OPEN_EXTERNAL_LINKS_INCOGNITO.equals(key)) {
+ SharedPreferences.Editor sharedPreferencesEditor = ContextUtils.getAppSharedPreferences().edit();
+ sharedPreferencesEditor.putBoolean(PREF_OPEN_EXTERNAL_LINKS_INCOGNITO, (boolean)newValue);
+ sharedPreferencesEditor.apply();
} else if (PREF_SEARCH_SUGGESTIONS.equals(key)) {
PrefServiceBridge.getInstance().setBoolean(Pref.SEARCH_SUGGEST_ENABLED, (boolean) newValue);
}
return true;
}
@@ -436,6 +477,16 @@ public class PrivacySettings extends ChromeBaseSettingsFragment
UserPrefs.get(getProfile()).getBoolean(Pref.CAN_MAKE_PAYMENT_ENABLED));
@@ -111,6 +117,11 @@ public class PrivacySettings
prefServiceBridge.getBoolean(Pref.CAN_MAKE_PAYMENT_ENABLED));
}
+ allowCustomTabIntentsPref =
+ (ChromeSwitchPreference) findPreference(PREF_ALLOW_CUSTOM_TAB_INTENTS);
+ ChromeBaseCheckBoxPreference allowCustomTabIntentsPref =
+ (ChromeBaseCheckBoxPreference) findPreference(PREF_ALLOW_CUSTOM_TAB_INTENTS);
+ allowCustomTabIntentsPref.setOnPreferenceChangeListener(this);
+ allowCustomTabIntentsPref.setManagedPreferenceDelegate(mManagedPreferenceDelegate);
+
+ openExternalLinksPref =
+ (ChromeSwitchPreference) findPreference(PREF_OPEN_EXTERNAL_LINKS_INCOGNITO);
+ openExternalLinksPref.setOnPreferenceChangeListener(this);
+ openExternalLinksPref.setManagedPreferenceDelegate(mManagedPreferenceDelegate);
+
Preference doNotTrackPref = findPreference(PREF_DO_NOT_TRACK);
if (doNotTrackPref != null) {
doNotTrackPref.setSummary(
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -909,8 +909,9 @@ BASE_FEATURE(kMagicStackAndroid, base::FEATURE_ENABLED_BY_DEFAULT);
// Enables an experimental feature which forces mayLaunchUrl to use a different
// storage partition. This may reduce performance. This should not be enabled by
// default.
-BASE_FEATURE(kMayLaunchUrlUsesSeparateStoragePartition,
- base::FEATURE_DISABLED_BY_DEFAULT);
+CROMITE_FEATURE(kMayLaunchUrlUsesSeparateStoragePartition,
+ "MayLaunchUrlUsesSeparateStoragePartition",
+ base::FEATURE_DISABLED_BY_DEFAULT);
doNotTrackPref.setSummary(prefServiceBridge.getBoolean(Pref.ENABLE_DO_NOT_TRACK)
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -3863,6 +3863,13 @@ Only you can see what your camera is looking at. The site can't see your camera'
<message name="IDS_NEAR_OOM_REDUCTION_DECLINE" desc="The text of the button letting the user decline the browser's intervention, so that the page can be reloaded.">
Show original
</message>
+ <!-- Allow custom tab intents -->
+ <message name="IDS_ALLOW_CUSTOM_TAB_INTENTS_TITLE" desc="Text for 'Allow custom tab intents' settings-privacy option.">
+ Allow custom tab intents
+ </message>
+ <message name="IDS_ALLOW_CUSTOM_TAB_INTENTS_SUMMARY" desc="Summary text for 'Allow custom tab intents' settings-privacy option.">
+ Allow applications to open custom tab intents, similar to webview.
+ </message>
BASE_FEATURE(kMediaIndicatorsAndroid, base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -991,6 +991,8 @@ public abstract class ChromeFeatureList {
MOST_VISITED_TILES_CUSTOMIZATION,
/* defaultValue= */ false,
/* defaultValueInTests= */ true);
+ public static final CachedFlag sMayLaunchurlUsesSeparateStoragePartition =
+ newCachedFlag(MAYLAUNCHURL_USES_SEPARATE_STORAGE_PARTITION, false);
public static final CachedFlag sMostVisitedTilesReselect =
newCachedFlag(MOST_VISITED_TILES_RESELECT, false);
public static final CachedFlag sMultiInstanceApplicationStatusCleanup =
@@ -1224,6 +1226,7 @@ public abstract class ChromeFeatureList {
sMiniOriginBar,
sMitigateLegacySearchEnginePromoOverlap,
sMostVisitedTilesCustomization,
+ sMayLaunchurlUsesSeparateStoragePartition,
sMostVisitedTilesReselect,
sMultiInstanceApplicationStatusCleanup,
sMvcUpdateViewWhenModelChanged,
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabAssociatedApp.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabAssociatedApp.java
--- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabAssociatedApp.java
+++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabAssociatedApp.java
@@ -88,7 +88,11 @@ public final class TabAssociatedApp extends TabWebContentsUserData implements Im
public static boolean isOpenedFromExternalApp(Tab tab) {
TabAssociatedApp app = get(tab);
if (app == null) return false;
-
+ if (ContextUtils.getAppSharedPreferences()
+ .getBoolean("open_external_links_incognito", false) &&
+ tab.isIncognito() &&
+ tab.getLaunchType() == TabLaunchType.FROM_EXTERNAL_APP)
+ return true;
String packageName = ContextUtils.getApplicationContext().getPackageName();
return tab.getLaunchType() == TabLaunchType.FROM_EXTERNAL_APP
&& !TextUtils.equals(app.getAppId(), packageName);
diff --git a/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Add-custom-tab-intents-privacy-option.grdp b/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Add-custom-tab-intents-privacy-option.grdp
new file mode 100644
--- /dev/null
+++ b/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Add-custom-tab-intents-privacy-option.grdp
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <!-- Allow custom tab intents -->
+ <message name="IDS_ALLOW_CUSTOM_TAB_INTENTS_TITLE" desc="Text for 'Allow custom tab intents' settings-privacy option.">
+ Allow custom tab intents.
+ </message>
+ <message name="IDS_ALLOW_CUSTOM_TAB_INTENTS_SUMMARY" desc="Summary text for 'Allow custom tab intents' settings-privacy option.">
+ Allow applications to open custom tab intents, similar to webview. To work, Cromite must be set as the default browser.
+ </message>
+
+ <message name="IDS_USES_SEPARATE_STORAGEPARTITION_FOR_CCT_TITLE" desc="Text for 'Use ephemeral mode for CCT' settings-privacy option.">
+ Use ephemeral mode for CCT
+ </message>
+ <message name="IDS_USES_SEPARATE_STORAGEPARTITION_FOR_CCT_SUMMARY" desc="Summary text for 'Use ephemeral mode for CCT' settings-privacy option.">
+ Use a separate storage partition when opening custom tab intents
+ </message>
+
+ <!-- Open External Links in Incognito -->
+ <message name="IDS_OPEN_EXTERNAL_LINKS_INCOGNITO_TITLE" desc="Text for 'Open external links in incognito' settings-privacy option.">
+ Open external links in incognito
+ </message>
+ <message name="IDS_OPEN_EXTERNAL_LINKS_INCOGNITO_SUMMARY" desc="Summary text for 'Open external links in incognito' settings-privacy option.">
+ Force the opening of all external links in incognito mode and uses the CCT ephemeral mode. Caution: there is only one incognito profile.
+ </message>
+</grit-part>
diff --git a/components/content_relationship_verification/android/java/src/org/chromium/components/content_relationship_verification/OriginVerifier.java b/components/content_relationship_verification/android/java/src/org/chromium/components/content_relationship_verification/OriginVerifier.java
--- a/components/content_relationship_verification/android/java/src/org/chromium/components/content_relationship_verification/OriginVerifier.java
+++ b/components/content_relationship_verification/android/java/src/org/chromium/components/content_relationship_verification/OriginVerifier.java
@@ -181,6 +181,11 @@ public abstract class OriginVerifier {
assert mNativeOriginVerifier != 0
: "Either provide a browserContextHandle to "
+ "OriginVerifier#ctor or call initNativeOriginVerifier.";
+ if ((true)) {
+ PostTask.runOrPostTask(
+ TaskTraits.UI_DEFAULT, new VerifiedCallback(origin, false, null));
+ return;
+ }
String scheme = origin.uri().getScheme();
String host = assumeNonNull(origin.uri().getHost());
diff --git a/components/language/core/common/language_experiments.cc b/components/language/core/common/language_experiments.cc
--- a/components/language/core/common/language_experiments.cc
+++ b/components/language/core/common/language_experiments.cc
@@ -20,4 +20,5 @@ BASE_FEATURE(kTranslateOpenSettings, base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kDisableGeoLanguageModel, base::FEATURE_ENABLED_BY_DEFAULT);
+SET_CROMITE_FEATURE_DISABLED(kCctAutoTranslate);
} // namespace language
diff --git a/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/add-custom-tab-intents-privacy-option.inc b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/add-custom-tab-intents-privacy-option.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/add-custom-tab-intents-privacy-option.inc
@@ -0,0 +1 @@
+// explicitly empty
--
<!-- Autofill Assistant preferences -->
<message name="IDS_PREFS_AUTOFILL_ASSISTANT_TITLE" desc="Title for the Autofill Assistant preferences screen. [CHAR-LIMIT=32]">
--
2.17.1
+44 -97
View File
@@ -3,119 +3,66 @@ Date: Tue, 31 Jan 2017 22:12:27 -0500
Subject: Add exit menu item
Corrected Exit functionality
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
chrome/android/java/res/values/ids.xml | 1 +
.../org/chromium/chrome/browser/ChromeTabbedActivity.java | 4 ++++
.../org/chromium/chrome/browser/app/ChromeActivity.java | 6 ++++++
.../chrome/browser/init/ChromeLifetimeController.java | 2 ++
.../tabbed_mode/TabbedAppMenuPropertiesDelegate.java | 7 +++++++
.../browser/ui/android/strings/android_chrome_strings.grd | 3 +++
6 files changed, 23 insertions(+)
chrome/android/java/res/menu/main_menu.xml | 2 ++
.../src/org/chromium/chrome/browser/ChromeActivity.java | 2 ++
.../chrome/browser/init/ChromeLifetimeController.java | 6 +++++-
.../browser/ui/android/strings/android_chrome_strings.grd | 3 +++
4 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/chrome/android/java/res/values/ids.xml b/chrome/android/java/res/values/ids.xml
--- a/chrome/android/java/res/values/ids.xml
+++ b/chrome/android/java/res/values/ids.xml
@@ -123,6 +123,7 @@ found in the LICENSE file.
<item type="id" name="ntp_feed_header_menu_item_toggle_switch" />
diff --git a/chrome/android/java/res/menu/main_menu.xml b/chrome/android/java/res/menu/main_menu.xml
--- a/chrome/android/java/res/menu/main_menu.xml
+++ b/chrome/android/java/res/menu/main_menu.xml
@@ -87,6 +87,8 @@
android:title="@string/menu_help" />
<item android:id="@+id/enter_vr_id"
android:title="@string/enter_vr" />
+ <item android:id="@+id/exit_id"
+ android:title="@string/menu_exit" />
</group>
<!-- App Menu -->
+ <item type="id" name="exit_id" />
<item type="id" name="icon_row_menu_id" />
<item type="id" name="forward_menu_id" />
<item type="id" name="bookmark_this_page_id" />
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -358,6 +358,8 @@ import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Supplier;
+import org.chromium.chrome.browser.lifetime.ApplicationLifetime;
+
/**
* This is the main activity for ChromeMobile when not running in document mode. All the tabs are
* accessible via a chrome specific tab switching UI.
@@ -3882,6 +3884,8 @@ public class ChromeTabbedActivity extends ChromeActivity {
.closeTabs(
TabClosureParams.closeTab(currentTab).build(), /* allowDialog= */ true);
RecordUserAction.record("MobileTabClosed");
<!-- Items shown only in the tab switcher -->
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -2044,6 +2044,8 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
AddToHomescreenCoordinator.showForAppMenu(
this, getWindowAndroid(), getModalDialogManager(), currentTab.getWebContents());
RecordUserAction.record("MobileMenuAddToHomescreen");
+ } else if (id == R.id.exit_id) {
+ ApplicationLifetime.terminate(false);
} else if (id == R.id.close_all_tabs_menu_id) {
boolean allowUndo = TabClosureParamsUtils.shouldAllowUndo(triggeringMotion);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
@@ -63,6 +63,7 @@ import org.chromium.base.supplier.UnownedUserDataSupplier;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ActivityTabProvider;
import org.chromium.chrome.browser.ActivityUtils;
+import org.chromium.chrome.browser.lifetime.ApplicationLifetime;
import org.chromium.chrome.browser.ChromeActivitySessionTracker;
import org.chromium.chrome.browser.ChromeApplicationImpl;
import org.chromium.chrome.browser.ChromeKeyboardVisibilityDelegate;
@@ -2529,6 +2530,11 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
return true;
}
+ if (id == R.id.exit_id) {
+ ApplicationLifetime.terminate(false);
+ return true;
+ }
+
if (id == R.id.update_menu_id) {
UpdateMenuItemHelper.getInstance(
getProfileProviderSupplier().get().getOriginalProfile())
} else if (id == R.id.open_webapk_id) {
Context context = ContextUtils.getApplicationContext();
String packageName =
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeLifetimeController.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeLifetimeController.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeLifetimeController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeLifetimeController.java
@@ -20,6 +20,7 @@ import org.chromium.build.annotations.MonotonicNonNull;
import org.chromium.build.annotations.NullMarked;
import org.chromium.chrome.browser.BrowserRestartActivity;
import org.chromium.chrome.browser.lifetime.ApplicationLifetime;
+import org.chromium.chrome.browser.incognito.IncognitoNotificationManager;
@@ -82,7 +82,11 @@ class ChromeLifetimeController implements ApplicationLifetime.Observer,
/**
* Answers requests to kill and (potentially) restart Chrome's main browser process.
@@ -76,6 +77,7 @@ class ChromeLifetimeController
@Override
public void onTerminate(boolean restart) {
+ IncognitoNotificationManager.dismissIncognitoNotification();
mRestartChromeOnDestroy = restart;
// Tell all Chrome Activities to finish themselves.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java
@@ -410,6 +410,13 @@ public class TabbedAppMenuPropertiesDelegate extends AppMenuPropertiesDelegateIm
maybeAddDividerLine(modelList, R.id.menu_item_content_filter_divider_line_id);
modelList.add(buildContentFilterHelpCenterMenuItem(currentTab));
}
+
+ modelList.add(new MVCListAdapter.ListItem(
+ AppMenuHandler.AppMenuItemType.STANDARD,
+ buildModelForStandardMenuItem(
+ R.id.exit_id,
+ R.string.menu_exit,
+ shouldShowIconBeforeItem() ? R.drawable.ic_exit_to_app_white_24dp : 0)));
// Kick off a timer to kill the process after a delay, which fires only if the Activities
// take too long to be finished.
- mHandler.postDelayed(mRestartRunnable, WATCHDOG_DELAY_MS);
+ if (restart) {
+ mHandler.postDelayed(mRestartRunnable, WATCHDOG_DELAY_MS);
+ } else {
+ fireBrowserRestartActivityIntent();
+ }
}
private Runnable buildUpdateStateChangedObserver() {
@Override
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -4317,6 +4317,9 @@ To change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>delete the Chrome d
<message name="IDS_MENU_AUTO_DARK_WEB_CONTENTS" desc="Menu item in Chrome's overflow/options menu. When Chrome's browser UI is set to dark theme and this option is checked, sites will have a dark theme automatically applied as well. [CHAR_LIMIT=24]">
Dark theme
@@ -2818,6 +2818,9 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_MENU_SETTINGS" desc="Menu item for opening browser settings. [CHAR-LIMIT=27]">
Settings
</message>
+ <message name="IDS_MENU_EXIT" desc="Menu item for exit browser. [CHAR-LIMIT=27]">
+ Exit
+ </message>
<message name="IDS_MENU_READER_MODE_PREFS" desc="Menu item to show reader mode preferences pane, which allows users to change the appearance (font size, theme, etc.) of the page. [CHAR_LIMIT=27]">
Appearance
<message name="IDS_MENU_CLOSE_ALL_TABS" desc="Menu item for closing all open tabs. [CHAR-LIMIT=27]">
Close all tabs
</message>
--
--
2.17.1
@@ -1,137 +0,0 @@
From: Blaise <BlaiseD@GMail.com>
Date: Sat, 22 Aug 2020 08:52:40 -0500
Subject: Add flag for omnibox autocomplete filtering
Adds a flag that restricts whether search history, clipboard, bookmarks
and internal chrome:// pages will be used for the autocomplete results.
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
.../browser/autocomplete_controller.cc | 10 ++++++
.../omnibox/browser/history_url_provider.cc | 3 ++
components/omnibox/browser/search_provider.cc | 4 +++
components/url_formatter/url_fixer.cc | 4 +++
...lag-for-omnibox-autocomplete-filtering.inc | 32 +++++++++++++++++++
5 files changed, 53 insertions(+)
create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Add-flag-for-omnibox-autocomplete-filtering.inc
diff --git a/components/omnibox/browser/autocomplete_controller.cc b/components/omnibox/browser/autocomplete_controller.cc
--- a/components/omnibox/browser/autocomplete_controller.cc
+++ b/components/omnibox/browser/autocomplete_controller.cc
@@ -23,6 +23,7 @@
#include "base/check_op.h"
#include "base/containers/contains.h"
+#include "base/command_line.h"
#include "base/feature_list.h"
#include "base/format_macros.h"
#include "base/functional/bind.h"
@@ -571,6 +572,15 @@ AutocompleteController::AutocompleteController(
provider_client_->GetOmniboxTriggeredFeatureService()),
steady_state_omnibox_position_(
metrics::OmniboxEventProto::UNKNOWN_POSITION) {
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch("omnibox-autocomplete-filtering")) {
+ const std::string flag_value = base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII("omnibox-autocomplete-filtering");
+ provider_types &= AutocompleteProvider::TYPE_KEYWORD | AutocompleteProvider::TYPE_SEARCH |
+ AutocompleteProvider::TYPE_HISTORY_URL | AutocompleteProvider::TYPE_BOOKMARK | AutocompleteProvider::TYPE_BUILTIN;
+ if (!base::Contains(flag_value, "bookmarks"))
+ provider_types &= ~AutocompleteProvider::TYPE_BOOKMARK;
+ if (!base::Contains(flag_value, "chrome"))
+ provider_types &= ~AutocompleteProvider::TYPE_BUILTIN;
+ }
provider_types &= ~OmniboxFieldTrial::GetDisabledProviderTypes();
// Providers run in the order they're added. Async providers should run first
diff --git a/components/omnibox/browser/history_url_provider.cc b/components/omnibox/browser/history_url_provider.cc
--- a/components/omnibox/browser/history_url_provider.cc
+++ b/components/omnibox/browser/history_url_provider.cc
@@ -488,6 +488,9 @@ void HistoryURLProvider::Start(const AutocompleteInput& input,
if (fixed_up_input.type() != metrics::OmniboxInputType::QUERY)
matches_.push_back(what_you_typed_match);
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch("omnibox-autocomplete-filtering"))
+ return;
+
// We'll need the history service to run both passes, so try to obtain it.
history::HistoryService* const history_service =
client()->GetHistoryService();
diff --git a/components/omnibox/browser/search_provider.cc b/components/omnibox/browser/search_provider.cc
--- a/components/omnibox/browser/search_provider.cc
+++ b/components/omnibox/browser/search_provider.cc
@@ -17,6 +17,7 @@
#include "base/base64.h"
#include "base/feature_list.h"
#include "base/functional/bind.h"
+#include "base/command_line.h"
#include "base/functional/callback.h"
#include "base/i18n/break_iterator.h"
#include "base/i18n/case_conversion.h"
@@ -637,6 +638,9 @@ void SearchProvider::Run(bool query_is_private) {
}
void SearchProvider::DoHistoryQuery(bool minimal_changes) {
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch("omnibox-autocomplete-filtering"))
+ return;
+
// The history query results are synchronous, so if minimal_changes is true,
// we still have the last results and don't need to do anything.
if (minimal_changes)
diff --git a/components/url_formatter/url_fixer.cc b/components/url_formatter/url_fixer.cc
--- a/components/url_formatter/url_fixer.cc
+++ b/components/url_formatter/url_fixer.cc
@@ -11,6 +11,8 @@
#include "base/check_op.h"
#include "base/compiler_specific.h"
+#include "base/containers/contains.h"
+#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/i18n/char_iterator.h"
@@ -644,6 +646,8 @@ GURL FixupURLInternal(const std::string& text,
FixupHost(trimmed, parts.host, parts.scheme.is_valid(), desired_tld, &url);
if (chrome_url && !parts.host.is_valid()) {
+ if (!base::CommandLine::ForCurrentProcess()->HasSwitch("omnibox-autocomplete-filtering") ||
+ base::Contains(base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII("omnibox-autocomplete-filtering"), "chrome"))
url.append(kChromeUIDefaultHost);
}
FixupPort(trimmed, parts.port, &url);
diff --git a/cromite_flags/chrome/browser/about_flags_cc/Add-flag-for-omnibox-autocomplete-filtering.inc b/cromite_flags/chrome/browser/about_flags_cc/Add-flag-for-omnibox-autocomplete-filtering.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/chrome/browser/about_flags_cc/Add-flag-for-omnibox-autocomplete-filtering.inc
@@ -0,0 +1,32 @@
+#if BUILDFLAG(IS_ANDROID)
+
+#ifdef FEATURE_PARAM_SECTION
+
+const FeatureEntry::Choice kOmniboxAutocompleteFiltering[] = {
+ {flags_ui::kGenericExperimentChoiceDefault, "", ""},
+ {"Search suggestions only",
+ "omnibox-autocomplete-filtering",
+ "search"},
+ {"Search suggestions and bookmarks",
+ "omnibox-autocomplete-filtering",
+ "search-bookmarks"},
+ {"Search suggestions and internal chrome pages",
+ "omnibox-autocomplete-filtering",
+ "search-chrome"},
+ {"Search suggestions, bookmarks, and internal chrome pages",
+ "omnibox-autocomplete-filtering",
+ "search-bookmarks-chrome"},
+};
+
+#endif
+
+#ifdef FLAG_SECTION
+
+ {"omnibox-autocomplete-filtering",
+ "Omnibox Autocomplete Filtering",
+ "Restrict omnibox autocomplete results to a combination of search suggestions (if enabled), bookmarks, and internal chrome pages.",
+ kOsAll, MULTI_VALUE_TYPE(kOmniboxAutocompleteFiltering)},
+
+#endif
+
+#endif
--
@@ -1,73 +0,0 @@
From: Wengling Chen <feiyu2817@gmail.com>
Date: Mon, 1 Feb 2021 19:18:55 +0200
Subject: Add flag for save-data-header
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
.../loader/browser_initiated_resource_request.cc | 8 ++++++++
.../about_flags_cc/Add-flag-for-save-data-header.inc | 10 ++++++++++
.../cpp/features_cc/Add-flag-for-save-data-header.inc | 4 ++++
.../cpp/features_h/Add-flag-for-save-data-header.inc | 1 +
4 files changed, 23 insertions(+)
create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Add-flag-for-save-data-header.inc
create mode 100644 cromite_flags/services/network/public/cpp/features_cc/Add-flag-for-save-data-header.inc
create mode 100644 cromite_flags/services/network/public/cpp/features_h/Add-flag-for-save-data-header.inc
diff --git a/content/browser/loader/browser_initiated_resource_request.cc b/content/browser/loader/browser_initiated_resource_request.cc
--- a/content/browser/loader/browser_initiated_resource_request.cc
+++ b/content/browser/loader/browser_initiated_resource_request.cc
@@ -4,6 +4,9 @@
#include "content/browser/loader/browser_initiated_resource_request.h"
+#include "base/feature_list.h"
+#include "services/network/public/cpp/features.h"
+
#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/content_browser_client.h"
@@ -37,8 +40,13 @@ void UpdateAdditionalHeadersForBrowserInitiatedRequest(
// Save-Data was previously included in hints for workers, thus we cannot
// remove it for the time being. If you're reading this, consider building
// permissions policies for workers and/or deprecating this inclusion.
+ bool setHeader = false;
if (is_for_worker_script &&
GetContentClient()->browser()->IsDataSaverEnabled(browser_context)) {
+ setHeader = true;
+ }
+ setHeader |= base::FeatureList::IsEnabled(network::features::kEnableSaveDataHeader);
+ if (setHeader) {
if (should_update_existing_headers) {
headers->RemoveHeader("Save-Data");
}
diff --git a/cromite_flags/chrome/browser/about_flags_cc/Add-flag-for-save-data-header.inc b/cromite_flags/chrome/browser/about_flags_cc/Add-flag-for-save-data-header.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/chrome/browser/about_flags_cc/Add-flag-for-save-data-header.inc
@@ -0,0 +1,10 @@
+
+#ifdef FLAG_SECTION
+
+ // Bromite save data header
+ {"enable-save-data-header",
+ "Enable save-data header",
+ "Enable save-data header without enabling Data Saver.", kOsAll,
+ FEATURE_VALUE_TYPE(network::features::kEnableSaveDataHeader)},
+
+#endif
diff --git a/cromite_flags/services/network/public/cpp/features_cc/Add-flag-for-save-data-header.inc b/cromite_flags/services/network/public/cpp/features_cc/Add-flag-for-save-data-header.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/services/network/public/cpp/features_cc/Add-flag-for-save-data-header.inc
@@ -0,0 +1,4 @@
+// Enable save-data header separately (without enabled data reduction service).
+CROMITE_FEATURE(kEnableSaveDataHeader,
+ "EnableSaveDataHeader",
+ base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/cromite_flags/services/network/public/cpp/features_h/Add-flag-for-save-data-header.inc b/cromite_flags/services/network/public/cpp/features_h/Add-flag-for-save-data-header.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/services/network/public/cpp/features_h/Add-flag-for-save-data-header.inc
@@ -0,0 +1 @@
+COMPONENT_EXPORT(NETWORK_CPP) BASE_DECLARE_FEATURE(kEnableSaveDataHeader);
--
@@ -5,18 +5,69 @@ Subject: Add flag to configure maximum connections per host
With the introduction of this flag it is possible to increase the maximum
allowed connections per host; this can however be detrimental to devices
with limited CPU/memory resources and it is disabled by default.
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
chrome/browser/about_flags.cc | 8 ++++++++
chrome/browser/flag_descriptions.cc | 4 ++++
chrome/browser/flag_descriptions.h | 3 +++
.../common/network_features.cc | 3 +++
.../common/network_features.h | 4 ++++
.../common/network_switch_list.h | 4 ++++
.../spoof_checks/top_domains/BUILD.gn | 1 +
...o-configure-maximum-connections-per-host.inc | 17 +++++++++++++++++
net/socket/client_socket_pool_manager.cc | 17 +++++++++++++++++
6 files changed, 46 insertions(+)
create mode 100644 cromite_flags/chrome/browser/about_flags_cc/add-flag-to-configure-maximum-connections-per-host.inc
8 files changed, 44 insertions(+)
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -736,6 +736,11 @@ const FeatureEntry::Choice kForceEffectiveConnectionTypeChoices[] = {
net::kEffectiveConnectionType4G},
};
+const FeatureEntry::Choice kMaxConnectionsPerHostChoices[] = {
+ {features::kMaxConnectionsPerHostChoiceDefault, "", ""},
+ {features::kMaxConnectionsPerHostChoice15, switches::kMaxConnectionsPerHost, "15"},
+};
+
// Ensure that all effective connection types returned by Network Quality
// Estimator (NQE) are also exposed via flags.
static_assert(net::EFFECTIVE_CONNECTION_TYPE_LAST + 2 ==
@@ -2702,6 +2707,9 @@ const FeatureEntry kFeatureEntries[] = {
flag_descriptions::kPassiveDocumentEventListenersName,
flag_descriptions::kPassiveDocumentEventListenersDescription, kOsAll,
FEATURE_VALUE_TYPE(features::kPassiveDocumentEventListeners)},
+ {"max-connections-per-host", flag_descriptions::kMaxConnectionsPerHostName,
+ flag_descriptions::kMaxConnectionsPerHostDescription, kOsAll,
+ MULTI_VALUE_TYPE(kMaxConnectionsPerHostChoices)},
{"document-passive-wheel-event-listeners",
flag_descriptions::kPassiveDocumentWheelEventListenersName,
flag_descriptions::kPassiveDocumentWheelEventListenersDescription, kOsAll,
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -1181,6 +1181,10 @@ const char kMediaInspectorLoggingDescription[] =
"project; #enable-devtools-experiments must also be enabled as well on "
"desktop platforms";
+const char kMaxConnectionsPerHostName[] = "Maximum connections per host";
+const char kMaxConnectionsPerHostDescription[] =
+ "Customize maximum allowed connections per host.";
+
const char kMediaRouterCastAllowAllIPsName[] =
"Connect to Cast devices on all IP addresses";
const char kMediaRouterCastAllowAllIPsDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -703,6 +703,9 @@ extern const char kMarkHttpAsWarningAndDangerousOnFormEdits[];
extern const char kMediaInspectorLoggingName[];
extern const char kMediaInspectorLoggingDescription[];
+extern const char kMaxConnectionsPerHostName[];
+extern const char kMaxConnectionsPerHostDescription[];
+
extern const char kMediaRouterCastAllowAllIPsName[];
extern const char kMediaRouterCastAllowAllIPsDescription[];
diff --git a/components/network_session_configurator/common/network_features.cc b/components/network_session_configurator/common/network_features.cc
--- a/components/network_session_configurator/common/network_features.cc
+++ b/components/network_session_configurator/common/network_features.cc
@@ -45,7 +96,7 @@ diff --git a/components/network_session_configurator/common/network_features.h b
diff --git a/components/network_session_configurator/common/network_switch_list.h b/components/network_session_configurator/common/network_switch_list.h
--- a/components/network_session_configurator/common/network_switch_list.h
+++ b/components/network_session_configurator/common/network_switch_list.h
@@ -19,6 +19,10 @@ NETWORK_SWITCH(kEnableUserAlternateProtocolPorts,
@@ -22,6 +22,10 @@ NETWORK_SWITCH(kEnableUserAlternateProtocolPorts,
// Enables the QUIC protocol. This is a temporary testing flag.
NETWORK_SWITCH(kEnableQuic, "enable-quic")
@@ -59,50 +110,28 @@ diff --git a/components/network_session_configurator/common/network_switch_list.
diff --git a/components/url_formatter/spoof_checks/top_domains/BUILD.gn b/components/url_formatter/spoof_checks/top_domains/BUILD.gn
--- a/components/url_formatter/spoof_checks/top_domains/BUILD.gn
+++ b/components/url_formatter/spoof_checks/top_domains/BUILD.gn
@@ -90,6 +90,7 @@ executable("make_top_domain_list_variables") {
@@ -73,6 +73,7 @@ executable("make_top_domain_list_variables") {
"//base",
"//base:i18n",
"//components/url_formatter/spoof_checks/common_words:common",
"//third_party/icu",
+ "//components/network_session_configurator/common"
]
if (is_ios) {
frameworks = [ "UIKit.framework" ]
diff --git a/cromite_flags/chrome/browser/about_flags_cc/add-flag-to-configure-maximum-connections-per-host.inc b/cromite_flags/chrome/browser/about_flags_cc/add-flag-to-configure-maximum-connections-per-host.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/chrome/browser/about_flags_cc/add-flag-to-configure-maximum-connections-per-host.inc
@@ -0,0 +1,17 @@
+#ifdef FEATURE_PARAM_SECTION
+
+const FeatureEntry::Choice kMaxConnectionsPerHostChoices[] = {
+ {features::kMaxConnectionsPerHostChoiceDefault, "", ""},
+ {features::kMaxConnectionsPerHostChoice15, switches::kMaxConnectionsPerHost, "15"},
+};
+
+#endif
+
+#ifdef FLAG_SECTION
+
+ {"max-connections-per-host",
+ "Maximum connections per host",
+ "Customize maximum allowed connections per host.", kOsAll,
+ MULTI_VALUE_TYPE(kMaxConnectionsPerHostChoices)},
+
+#endif
libs = [ "UIKit.framework" ]
diff --git a/net/socket/client_socket_pool_manager.cc b/net/socket/client_socket_pool_manager.cc
--- a/net/socket/client_socket_pool_manager.cc
+++ b/net/socket/client_socket_pool_manager.cc
@@ -22,6 +22,10 @@
#include "net/socket/client_socket_handle.h"
@@ -20,6 +20,10 @@
#include "net/socket/client_socket_pool.h"
#include "net/socket/connect_job.h"
#include "net/ssl/ssl_config.h"
+#include "components/network_session_configurator/common/network_switches.h"
+
+#include "base/command_line.h"
+#include "base/strings/string_number_conversions.h"
#include "net/ssl/ssl_config.h"
#include "url/gurl.h"
#include "url/scheme_host_port.h"
namespace net {
@@ -187,6 +191,19 @@ void ClientSocketPoolManager::set_max_sockets_per_pool(
int ClientSocketPoolManager::max_sockets_per_group(
HttpNetworkSession::SocketPoolType pool_type) {
@@ -123,4 +152,6 @@ diff --git a/net/socket/client_socket_pool_manager.cc b/net/socket/client_socket
return g_max_sockets_per_group[pool_type];
}
--
--
2.17.1
@@ -3,37 +3,71 @@ Date: Thu, 25 Oct 2018 23:13:34 +0200
Subject: Add flag to control video playback resume feature
Disable it by default on Android as it is everywhere else
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
...lag-to-control-video-playback-resume-feature.inc | 13 +++++++++++++
...lag-to-control-video-playback-resume-feature.inc | 1 +
2 files changed, 14 insertions(+)
create mode 100644 cromite_flags/chrome/browser/about_flags_cc/add-flag-to-control-video-playback-resume-feature.inc
create mode 100644 cromite_flags/media/base/media_switches_cc/add-flag-to-control-video-playback-resume-feature.inc
chrome/browser/about_flags.cc | 4 ++++
chrome/browser/flag_descriptions.cc | 5 +++++
chrome/browser/flag_descriptions.h | 3 +++
media/base/media_switches.cc | 6 +-----
4 files changed, 13 insertions(+), 5 deletions(-)
diff --git a/cromite_flags/chrome/browser/about_flags_cc/add-flag-to-control-video-playback-resume-feature.inc b/cromite_flags/chrome/browser/about_flags_cc/add-flag-to-control-video-playback-resume-feature.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/chrome/browser/about_flags_cc/add-flag-to-control-video-playback-resume-feature.inc
@@ -0,0 +1,13 @@
+#ifdef FLAG_SECTION
+
+#if BUILDFLAG(IS_ANDROID)
+
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -1697,6 +1697,10 @@ const FeatureEntry kFeatureEntries[] = {
#if defined(USE_AURA)
{"overlay-scrollbars", flag_descriptions::kOverlayScrollbarsName,
flag_descriptions::kOverlayScrollbarsDescription,
+ {"resume-background-video",
+ "Resume background video.",
+ "Resume background video playback when tab re-gains focus; additionally, "
+ "it will pause video playback every single time you switch tabs.", kOsAll,
+ flag_descriptions::kResumeBackgroundVideoName,
+ flag_descriptions::kResumeBackgroundVideoDescription, kOsAll,
+ FEATURE_VALUE_TYPE(media::kResumeBackgroundVideo)},
// Uses the system preference on Mac (a different implementation).
// On Android, this is always enabled.
kOsAura, FEATURE_VALUE_TYPE(features::kOverlayScrollbar)},
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -800,6 +800,11 @@ const char kMemlogStackModeNative[] = "Native";
const char kMemlogStackModeNativeWithThreadNames[] = "Native with thread names";
const char kMemlogStackModePseudo[] = "Trace events";
+const char kResumeBackgroundVideoName[] = "Resume background video.";
+const char kResumeBackgroundVideoDescription[] =
+ "Resume background video playback when tab re-gains focus; additionally, "
+ "it will pause video playback every single time you switch tabs.";
+
+#endif // BUILDFLAG(IS_ANDROID)
const char kEnablePixelCanvasRecordingName[] = "Enable pixel canvas recording";
const char kEnablePixelCanvasRecordingDescription[] =
"Pixel canvas recording allows the compositor to raster contents aligned "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -462,6 +462,9 @@ extern const char kEnablePortalsDescription[];
extern const char kEnablePortalsCrossOriginName[];
extern const char kEnablePortalsCrossOriginDescription[];
+extern const char kResumeBackgroundVideoName[];
+extern const char kResumeBackgroundVideoDescription[];
+
+#endif // ifdef FLAG_SECTION
diff --git a/cromite_flags/media/base/media_switches_cc/add-flag-to-control-video-playback-resume-feature.inc b/cromite_flags/media/base/media_switches_cc/add-flag-to-control-video-playback-resume-feature.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/media/base/media_switches_cc/add-flag-to-control-video-playback-resume-feature.inc
@@ -0,0 +1 @@
+SET_CROMITE_FEATURE_DISABLED(kResumeBackgroundVideo);
--
extern const char kEnablePixelCanvasRecordingName[];
extern const char kEnablePixelCanvasRecordingDescription[];
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc
--- a/media/base/media_switches.cc
+++ b/media/base/media_switches.cc
@@ -229,11 +229,7 @@ const base::Feature kPreloadMetadataLazyLoad{"PreloadMetadataLazyLoad",
// when in background.
const base::Feature kResumeBackgroundVideo {
"resume-background-video",
-#if defined(OS_ANDROID)
- base::FEATURE_ENABLED_BY_DEFAULT
-#else
- base::FEATURE_DISABLED_BY_DEFAULT
-#endif
+ base::FEATURE_DISABLED_BY_DEFAULT
};
// Enable Media Capabilities with finch-parameters.
--
2.17.1
@@ -2,80 +2,155 @@ From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Sun, 18 Nov 2018 13:06:49 +0100
Subject: Add flag to disable IPv6 probes
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
.../about_flags_cc/add-flag-to-disable-IPv6-probes.inc | 8 ++++++++
.../base/features_cc/add-flag-to-disable-IPv6-probes.inc | 3 +++
.../base/features_h/add-flag-to-disable-IPv6-probes.inc | 2 ++
net/BUILD.gn | 1 +
net/dns/host_resolver_manager.cc | 8 ++++++++
5 files changed, 22 insertions(+)
create mode 100644 cromite_flags/chrome/browser/about_flags_cc/add-flag-to-disable-IPv6-probes.inc
create mode 100644 cromite_flags/net/base/features_cc/add-flag-to-disable-IPv6-probes.inc
create mode 100644 cromite_flags/net/base/features_h/add-flag-to-disable-IPv6-probes.inc
chrome/browser/about_flags.cc | 5 +++++
chrome/browser/flag_descriptions.cc | 4 ++++
chrome/browser/flag_descriptions.h | 3 +++
components/subresource_filter/tools/BUILD.gn | 6 ++++++
.../url_formatter/spoof_checks/top_domains/BUILD.gn | 3 ++-
net/dns/host_resolver_manager.cc | 9 ++++++++-
services/network/public/cpp/features.cc | 4 ++++
services/network/public/cpp/features.h | 2 ++
8 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/cromite_flags/chrome/browser/about_flags_cc/add-flag-to-disable-IPv6-probes.inc b/cromite_flags/chrome/browser/about_flags_cc/add-flag-to-disable-IPv6-probes.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/chrome/browser/about_flags_cc/add-flag-to-disable-IPv6-probes.inc
@@ -0,0 +1,8 @@
+#ifdef FLAG_SECTION
+
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -3334,6 +3334,11 @@ const FeatureEntry kFeatureEntries[] = {
kMarkHttpAsFeatureVariations,
"HTTPReallyBadFinal")},
+ {"ipv6-probing",
+ "Enable IPv6 probing.",
+ "Send IPv6 probes to a RIPE DNS address to verify IPv6 connectivity.", kOsAll,
+ FEATURE_VALUE_TYPE(net::features::kIPv6Probing)},
+ flag_descriptions::kIPv6ProbingName,
+ flag_descriptions::kIPv6ProbingDescription, kOsAll,
+ FEATURE_VALUE_TYPE(network::features::kIPv6Probing)},
+
+#endif // ifdef FLAG_SECTION
diff --git a/cromite_flags/net/base/features_cc/add-flag-to-disable-IPv6-probes.inc b/cromite_flags/net/base/features_cc/add-flag-to-disable-IPv6-probes.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/net/base/features_cc/add-flag-to-disable-IPv6-probes.inc
@@ -0,0 +1,3 @@
+CROMITE_FEATURE(kIPv6Probing,
+ "IPv6Probing",
+ base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/cromite_flags/net/base/features_h/add-flag-to-disable-IPv6-probes.inc b/cromite_flags/net/base/features_h/add-flag-to-disable-IPv6-probes.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/net/base/features_h/add-flag-to-disable-IPv6-probes.inc
@@ -0,0 +1,2 @@
+// Enable IPv6 ping probes to RIPE DNS.
+NET_EXPORT BASE_DECLARE_FEATURE(kIPv6Probing);
diff --git a/net/BUILD.gn b/net/BUILD.gn
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -1172,6 +1172,7 @@ component("net") {
":net_deps",
"//components/miracle_parameter/common",
"//components/network_time/time_tracker",
#if !defined(OS_ANDROID)
{"enable-web-authentication-testing-api",
flag_descriptions::kEnableWebAuthenticationTestingAPIName,
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -2381,6 +2381,10 @@ const char kContextualSearchRankerQueryDescription[] =
const char kContextualSearchSecondTapName[] =
"Contextual Search second tap triggering";
+const char kIPv6ProbingName[] = "Enable IPv6 probing.";
+const char kIPv6ProbingDescription[] =
+ "Send IPv6 probes to a RIPE DNS address to verify IPv6 connectivity.";
+
const char kContextualSearchSecondTapDescription[] =
"Enables triggering on a second tap gesture even when Ranker would "
"normally suppress that tap.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -528,6 +528,9 @@ extern const char kEnableWasmThreadsName[];
extern const char kEnableWasmThreadsDescription[];
extern const char kEnableWasmTieringName[];
+extern const char kIPv6ProbingName[];
+extern const char kIPv6ProbingDescription[];
+
extern const char kEnableWasmTieringDescription[];
extern const char kEvDetailsInPageInfoName[];
diff --git a/components/subresource_filter/tools/BUILD.gn b/components/subresource_filter/tools/BUILD.gn
--- a/components/subresource_filter/tools/BUILD.gn
+++ b/components/subresource_filter/tools/BUILD.gn
@@ -50,6 +50,8 @@ if (!is_ios) {
deps = [
":tools_lib",
"//base",
+ "//components/network_session_configurator/common",
+ "//services/network/public/cpp"
]
}
@@ -61,6 +63,8 @@ if (!is_ios) {
":tools_lib",
"../core/common",
"//base",
+ "//components/network_session_configurator/common",
+ "//services/network/public/cpp",
]
}
@@ -70,6 +74,8 @@ if (!is_ios) {
"ruleset_converter:support",
"//base",
"//third_party/protobuf:protobuf_lite",
+ "//components/network_session_configurator/common",
+ "//services/network/public/cpp"
]
}
diff --git a/components/url_formatter/spoof_checks/top_domains/BUILD.gn b/components/url_formatter/spoof_checks/top_domains/BUILD.gn
--- a/components/url_formatter/spoof_checks/top_domains/BUILD.gn
+++ b/components/url_formatter/spoof_checks/top_domains/BUILD.gn
@@ -73,7 +73,8 @@ executable("make_top_domain_list_variables") {
"//base",
"//base:i18n",
"//third_party/icu",
- "//components/network_session_configurator/common"
+ "//components/network_session_configurator/common",
"//net/http:transport_security_state_generated_files",
"//third_party/simdutf",
+ "//services/network/public/cpp",
]
if (is_ios) {
libs = [ "UIKit.framework" ]
diff --git a/net/dns/host_resolver_manager.cc b/net/dns/host_resolver_manager.cc
--- a/net/dns/host_resolver_manager.cc
+++ b/net/dns/host_resolver_manager.cc
@@ -115,6 +115,7 @@
#include "net/log/net_log_event_type.h"
#include "net/log/net_log_source.h"
#include "net/log/net_log_source_type.h"
+#include "services/network/public/cpp/features.h"
#include "net/log/net_log_with_source.h"
@@ -92,6 +92,7 @@
#include "net/socket/client_socket_factory.h"
#include "net/socket/datagram_client_socket.h"
#include "net/url_request/url_request_context.h"
@@ -1493,6 +1494,13 @@ int HostResolverManager::StartIPv6ReachabilityCheck(
return OK;
}
+#include "services/network/public/cpp/features.h"
#include "url/url_canon_ip.h"
+ if (!base::FeatureList::IsEnabled(net::features::kIPv6Probing)) {
+ probing_ipv6_ = false;
+ last_ipv6_probe_result_ = false;
+ last_ipv6_probe_time_ = base::TimeTicks();
+ return OK;
+ }
#if BUILDFLAG(ENABLE_MDNS)
@@ -3593,8 +3594,14 @@ bool HostResolverManager::IsIPv6Reachable(const NetLogWithSource& net_log) {
bool cached = true;
if ((tick_clock_->NowTicks() - last_ipv6_probe_time_).InMilliseconds() >
kIPv6ProbePeriodMs) {
- SetLastIPv6ProbeResult(
+
if (probing_ipv6_) {
ipv6_request_callbacks_.push_back(std::move(callback));
return ERR_IO_PENDING;
--
+ if (!base::FeatureList::IsEnabled(network::features::kIPv6Probing)) {
+ // pretend IPv6 connectivy probe is successful when probing is disabled
+ SetLastIPv6ProbeResult(true);
+ } else {
+ SetLastIPv6ProbeResult(
IsGloballyReachable(IPAddress(kIPv6ProbeAddress), net_log));
+ }
cached = false;
}
net_log.AddEvent(
diff --git a/services/network/public/cpp/features.cc b/services/network/public/cpp/features.cc
--- a/services/network/public/cpp/features.cc
+++ b/services/network/public/cpp/features.cc
@@ -52,6 +52,10 @@ const base::Feature kReporting{"Reporting", base::FEATURE_ENABLED_BY_DEFAULT};
const base::Feature kThrottleDelayable{"ThrottleDelayable",
base::FEATURE_ENABLED_BY_DEFAULT};
+// Enable IPv6 ping probes to RIPE DNS.
+const base::Feature kIPv6Probing{"IPv6Probing",
+ base::FEATURE_ENABLED_BY_DEFAULT};
+
// When kPriorityRequestsDelayableOnSlowConnections is enabled, HTTP
// requests fetched from a SPDY/QUIC/H2 proxies can be delayed by the
// ResourceScheduler just as HTTP/1.1 resources are. However, requests from such
diff --git a/services/network/public/cpp/features.h b/services/network/public/cpp/features.h
--- a/services/network/public/cpp/features.h
+++ b/services/network/public/cpp/features.h
@@ -21,6 +21,8 @@ extern const base::Feature kNetworkErrorLogging;
COMPONENT_EXPORT(NETWORK_CPP)
extern const base::Feature kNetworkService;
COMPONENT_EXPORT(NETWORK_CPP)
+extern const base::Feature kIPv6Probing;
+COMPONENT_EXPORT(NETWORK_CPP)
extern const base::Feature kOutOfBlinkCors;
COMPONENT_EXPORT(NETWORK_CPP)
extern const base::Feature kReporting;
--
2.17.1
@@ -0,0 +1,53 @@
From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Sat, 16 Nov 2019 11:18:09 +0100
Subject: Add flag to disable WebGL
---
chrome/browser/about_flags.cc | 3 +++
chrome/browser/flag_descriptions.cc | 4 ++++
chrome/browser/flag_descriptions.h | 3 +++
3 files changed, 10 insertions(+)
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -1544,6 +1544,9 @@ const FeatureEntry kFeatureEntries[] = {
flag_descriptions::kAccelerated2dCanvasName,
flag_descriptions::kAccelerated2dCanvasDescription, kOsAll,
SINGLE_DISABLE_VALUE_TYPE(switches::kDisableAccelerated2dCanvas)},
+ {switches::kDisableWebGL, flag_descriptions::kDisableWebGLName,
+ flag_descriptions::kDisableWebGLDescription, kOsAll,
+ SINGLE_DISABLE_VALUE_TYPE(switches::kDisableWebGL)},
{"composited-layer-borders", flag_descriptions::kCompositedLayerBordersName,
flag_descriptions::kCompositedLayerBordersDescription, kOsAll,
SINGLE_VALUE_TYPE(cc::switches::kShowCompositedLayerBorders)},
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -414,6 +414,10 @@ const char kDevtoolsExperimentsDescription[] =
"Enables Developer Tools experiments. Use Settings panel in Developer "
"Tools to toggle individual experiments.";
+const char kDisableWebGLName[] = "Disable all versions of WebGL";
+
+const char kDisableWebGLDescription[] = "Disable all versions of WebGL";
+
const char kDisableBestEffortTasksName[] = "Skip best effort tasks";
const char kDisableBestEffortTasksDescription[] =
"With this flag on, tasks of the lowest priority will not be executed "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -264,6 +264,9 @@ extern const char kDeviceDiscoveryNotificationsDescription[];
extern const char kDevtoolsExperimentsName[];
extern const char kDevtoolsExperimentsDescription[];
+extern const char kDisableWebGLName[];
+extern const char kDisableWebGLDescription[];
+
extern const char kDisableBestEffortTasksName[];
extern const char kDisableBestEffortTasksDescription[];
--
2.17.1
@@ -1,277 +0,0 @@
From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Tue, 25 May 2021 19:46:14 +0200
Subject: Add flag to disable external intent requests
Adds a new flag that allows to control the switch with same name;
when flag is disabled no external intent will ever be allowed,
for any URL except for the tel: schema.
This also reverts commit b710cefb53b558a8bcd884f6baf0229ba4225721 and
enables IntentBlockExternalFormRedirectsNoGesture.
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
.../java/res/xml/privacy_preferences.xml | 7 +++-
.../customtabs/CustomTabDelegateFactory.java | 2 ++
.../ExternalNavigationDelegateImpl.java | 4 ++-
.../cromite/sAllowExternalIntentRequests.java | 33 +++++++++++++++++++
...g-to-disable-external-intent-requests.grdp | 9 +++++
.../android/external_intents_features.cc | 7 +++-
.../android/external_intents_features.h | 1 +
.../ExternalIntentsFeatures.java | 6 ++++
.../ExternalNavigationHandler.java | 21 ++++++++++++
...ag-to-disable-external-intent-requests.inc | 13 ++++++++
...t-Delete-block-external-form-redirects.inc | 15 +++++++++
...ag-to-disable-external-intent-requests.inc | 3 ++
12 files changed, 118 insertions(+), 3 deletions(-)
create mode 100644 chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/cromite/sAllowExternalIntentRequests.java
create mode 100644 chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Add-flag-to-disable-external-intent-requests.grdp
create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Add-flag-to-disable-external-intent-requests.inc
create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Revert-Delete-block-external-form-redirects.inc
create mode 100644 cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Add-flag-to-disable-external-intent-requests.inc
diff --git a/chrome/android/java/res/xml/privacy_preferences.xml b/chrome/android/java/res/xml/privacy_preferences.xml
--- a/chrome/android/java/res/xml/privacy_preferences.xml
+++ b/chrome/android/java/res/xml/privacy_preferences.xml
@@ -77,7 +77,12 @@ found in the LICENSE file.
android:title="@string/settings_incognito_tab_lock_title"
android:summary="@string/settings_incognito_tab_lock_summary_android_setting_off"
android:persistent="false" />
-
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
+ android:key="allow_external_intent_requests"
+ android:title="@string/allow_external_intent_requests_title"
+ android:summary="@string/allow_external_intent_requests_summary"
+ app:featureName="AllowExternalIntentRequests"
+ app:needRestart="false" />
<PreferenceCategory
android:key="security_section"
android:title="@string/security_section_title" />
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabDelegateFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabDelegateFactory.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabDelegateFactory.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabDelegateFactory.java
@@ -38,6 +38,7 @@ import org.chromium.chrome.browser.ephemeraltab.EphemeralTabCoordinator;
import org.chromium.chrome.browser.externalnav.ExternalNavigationDelegateImpl;
import org.chromium.chrome.browser.flags.ActivityType;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.cromite.sAllowExternalIntentRequests;
import org.chromium.chrome.browser.fullscreen.BrowserControlsManager;
import org.chromium.chrome.browser.fullscreen.FullscreenManager;
import org.chromium.chrome.browser.init.ChromeActivityNativeDelegate;
@@ -156,6 +157,7 @@ public class CustomTabDelegateFactory implements TabDelegateFactory {
@Override
public boolean shouldDisableAllExternalIntents() {
+ if (!sAllowExternalIntentRequests.getInstance().isEnabled()) return true;
return mActivityType == ActivityType.AUTH_TAB
&& ChromeFeatureList.sCctAuthTabDisableAllExternalIntents.isEnabled();
}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl.java
@@ -25,6 +25,7 @@ import org.chromium.base.PackageManagerUtils;
import org.chromium.build.annotations.NullMarked;
import org.chromium.build.annotations.Nullable;
import org.chromium.chrome.browser.ChromeTabbedActivity2;
+import org.chromium.chrome.browser.flags.cromite.sAllowExternalIntentRequests;
import org.chromium.chrome.browser.IntentHandler;
import org.chromium.chrome.browser.browserservices.intents.WebappConstants;
import org.chromium.chrome.browser.document.ChromeLauncherActivity;
@@ -119,7 +120,8 @@ public class ExternalNavigationDelegateImpl implements ExternalNavigationDelegat
@Override
public boolean shouldDisableExternalIntentRequestsForUrl(
ExternalNavigationParams params, Intent intent) {
- return false;
+ if ("tel".equals(params.getUrl().getScheme())) return false;
+ return !sAllowExternalIntentRequests.getInstance().isEnabled();
}
@Override
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/cromite/sAllowExternalIntentRequests.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/cromite/sAllowExternalIntentRequests.java
new file mode 100644
--- /dev/null
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/cromite/sAllowExternalIntentRequests.java
@@ -0,0 +1,33 @@
+/*
+ This file is part of Cromite.
+
+ Cromite is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Cromite is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Cromite. If not, see <https://www.gnu.org/licenses/>.
+*/
+
+package org.chromium.chrome.browser.flags.cromite;
+
+import org.chromium.components.cached_flags.CachedFlag;
+import org.chromium.chrome.browser.flags.ChromeFeatureMap;
+
+public class sAllowExternalIntentRequests {
+ private static final CachedFlag sInstance =
+ new CachedFlag(ChromeFeatureMap.getInstance(),
+ "AllowExternalIntentRequests", false);
+
+ private sAllowExternalIntentRequests() {}
+
+ public static CachedFlag getInstance() {
+ return sInstance;
+ }
+}
diff --git a/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Add-flag-to-disable-external-intent-requests.grdp b/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Add-flag-to-disable-external-intent-requests.grdp
new file mode 100644
--- /dev/null
+++ b/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Add-flag-to-disable-external-intent-requests.grdp
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_ALLOW_EXTERNAL_INTENT_REQUESTS_TITLE" desc="">
+ Allow forward URL requests to external intents
+ </message>
+ <message name="IDS_ALLOW_EXTERNAL_INTENT_REQUESTS_SUMMARY" desc="">
+ If disabled, URL requests will never allow redirection to an external intent, such as open application. Caution: since no verification is possible on the information, allows linkage between browser browsing and activity on the application.
+ </message>
+</grit-part>
diff --git a/components/external_intents/android/external_intents_features.cc b/components/external_intents/android/external_intents_features.cc
--- a/components/external_intents/android/external_intents_features.cc
+++ b/components/external_intents/android/external_intents_features.cc
@@ -29,7 +29,6 @@ const base::Feature* const kFeaturesExposedToJava[] = {
&kNavigationCaptureRefactorAndroid, &kAuxiliaryNavigationStaysInBrowser,
&kReparentTopLevelNavigationFromPWA, &kReparentAuxiliaryNavigationFromPWA,
&kAuxiliaryNavigationStaysInPWA};
-
} // namespace
// Alphabetical:
@@ -52,7 +51,13 @@ BASE_FEATURE(kReparentAuxiliaryNavigationFromPWA,
BASE_FEATURE(kAuxiliaryNavigationStaysInPWA, base::FEATURE_DISABLED_BY_DEFAULT);
+CROMITE_FEATURE(kIntentBlockExternalFormRedirectsNoGesture,
+ "IntentBlockExternalFormRedirectsNoGesture",
+ base::FEATURE_ENABLED_BY_DEFAULT);
+
static jlong JNI_ExternalIntentsFeatures_GetFeature(JNIEnv* env, jint ordinal) {
+ if (ordinal == -1)
+ return reinterpret_cast<jlong>(&kIntentBlockExternalFormRedirectsNoGesture);
return reinterpret_cast<jlong>(kFeaturesExposedToJava[ordinal]);
}
diff --git a/components/external_intents/android/external_intents_features.h b/components/external_intents/android/external_intents_features.h
--- a/components/external_intents/android/external_intents_features.h
+++ b/components/external_intents/android/external_intents_features.h
@@ -9,6 +9,7 @@
namespace external_intents {
+BASE_DECLARE_FEATURE(kIntentBlockExternalFormRedirectsNoGesture);
BASE_DECLARE_FEATURE(kExternalNavigationDebugLogs);
BASE_DECLARE_FEATURE(kBlockFrameRenavigations);
BASE_DECLARE_FEATURE(kBlockIntentsToSelf);
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java
--- a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java
+++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java
@@ -19,6 +19,12 @@ import org.chromium.build.annotations.NullMarked;
@JNINamespace("external_intents")
@NullMarked
public class ExternalIntentsFeatures {
+ public static final String INTENT_BLOCK_EXTERNAL_FORM_REDIRECT_NO_GESTURE_NAME =
+ "IntentBlockExternalFormRedirectsNoGesture";
+
+ public static final ExternalIntentsFeature INTENT_BLOCK_EXTERNAL_FORM_REDIRECT_NO_GESTURE =
+ new ExternalIntentsFeature(-1, INTENT_BLOCK_EXTERNAL_FORM_REDIRECT_NO_GESTURE_NAME);
+
public static final String EXTERNAL_NAVIGATION_DEBUG_LOGS_NAME = "ExternalNavigationDebugLogs";
public static final String BLOCK_INTENTS_TO_SELF_NAME = "BlockIntentsToSelf";
public static final String NAVIGATION_CAPTURE_REFACTOR_ANDROID_NAME =
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java
--- a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java
+++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java
@@ -1623,6 +1623,12 @@ public class ExternalNavigationHandler {
return false;
}
+ /** Wrapper of check against the feature to support overriding for testing. */
+ @VisibleForTesting
+ boolean blockExternalFormRedirectsWithoutGesture() {
+ return ExternalIntentsFeatures.INTENT_BLOCK_EXTERNAL_FORM_REDIRECT_NO_GESTURE.isEnabled();
+ }
+
private OverrideUrlLoadingResult shouldOverrideUrlLoadingInternal(
ExternalNavigationParams params,
Intent targetIntent,
@@ -1716,6 +1722,21 @@ public class ExternalNavigationHandler {
return OverrideUrlLoadingResult.forNoOverride();
}
+ // http://crbug.com/839751: Require user gestures for form submits to external
+ // protocols.
+ // TODO(tedchoc): Turn this on by default once we verify this change does
+ // not break the world.
+ int pageTransitionCore = params.getPageTransition() & PageTransition.CORE_MASK;
+ boolean isFormSubmit = pageTransitionCore == PageTransition.FORM_SUBMIT;
+ boolean isRedirectFromFormSubmit = isFormSubmit && params.isRedirect();
+ if (isRedirectFromFormSubmit && !incomingIntentRedirect && !params.hasUserGesture()
+ && blockExternalFormRedirectsWithoutGesture()) {
+ if (debug()) {
+ Log.i(TAG, "Incoming form intent attempting to redirect without user gesture");
+ }
+ return OverrideUrlLoadingResult.forNoOverride();
+ }
+
if (hasInternalScheme(params.getUrl(), targetIntent)
|| hasContentScheme(params.getUrl(), targetIntent)
|| hasFileSchemeInIntentURI(params.getUrl(), targetIntent)
diff --git a/cromite_flags/chrome/browser/about_flags_cc/Add-flag-to-disable-external-intent-requests.inc b/cromite_flags/chrome/browser/about_flags_cc/Add-flag-to-disable-external-intent-requests.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/chrome/browser/about_flags_cc/Add-flag-to-disable-external-intent-requests.inc
@@ -0,0 +1,13 @@
+#if BUILDFLAG(IS_ANDROID)
+
+#ifdef FLAG_SECTION
+
+ {"allow-external-intent-requests",
+ "Allow forward URL requests to external intents",
+ "If disabled, URL requests will never"
+ "allow for redirecting to an external intent.", kOsAndroid,
+ SINGLE_DISABLE_VALUE_TYPE("disable-external-intent-requests")},
+
+#endif
+
+#endif
diff --git a/cromite_flags/chrome/browser/about_flags_cc/Revert-Delete-block-external-form-redirects.inc b/cromite_flags/chrome/browser/about_flags_cc/Revert-Delete-block-external-form-redirects.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/chrome/browser/about_flags_cc/Revert-Delete-block-external-form-redirects.inc
@@ -0,0 +1,15 @@
+#if BUILDFLAG(IS_ANDROID)
+
+#ifdef FLAG_SECTION
+
+ {"block-external-form-redirects-no-gesture",
+ "Block intents from form submissions without user gesture",
+ "Require a user gesture that triggered a form submission in order to "
+ "allow for redirecting to an external intent.",
+ kOsAndroid,
+ FEATURE_VALUE_TYPE(
+ external_intents::kIntentBlockExternalFormRedirectsNoGesture)},
+
+#endif
+
+#endif
diff --git a/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Add-flag-to-disable-external-intent-requests.inc b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Add-flag-to-disable-external-intent-requests.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Add-flag-to-disable-external-intent-requests.inc
@@ -0,0 +1,3 @@
+CROMITE_FEATURE(kAllowExternalIntentRequests,
+ "AllowExternalIntentRequests",
+ base::FEATURE_DISABLED_BY_DEFAULT);
--
@@ -1,118 +0,0 @@
From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Sun, 27 Jun 2021 17:35:39 +0200
Subject: Add flag to disable vibration
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
content/child/runtime_features.cc | 1 +
.../about_flags_cc/Add-flag-to-disable-vibration.inc | 8 ++++++++
.../content_features_cc/Add-flag-to-disable-vibration.inc | 4 ++++
.../content_features_h/Add-flag-to-disable-vibration.inc | 1 +
third_party/blink/public/platform/web_runtime_features.h | 1 +
.../renderer/modules/vibration/vibration_controller.cc | 3 +++
.../renderer/platform/exported/web_runtime_features.cc | 4 ++++
.../renderer/platform/runtime_enabled_features.json5 | 4 ++++
8 files changed, 26 insertions(+)
create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Add-flag-to-disable-vibration.inc
create mode 100644 cromite_flags/content/public/common/content_features_cc/Add-flag-to-disable-vibration.inc
create mode 100644 cromite_flags/content/public/common/content_features_h/Add-flag-to-disable-vibration.inc
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -105,6 +105,7 @@ void SetRuntimeFeatureDefaultsForPlatform(
if (command_line.HasSwitch(switches::kDisableMediaSessionAPI)) {
WebRuntimeFeatures::EnableMediaSession(false);
}
+ WebRuntimeFeatures::EnableVibration(base::FeatureList::IsEnabled(features::kVibration));
#endif
#if BUILDFLAG(IS_ANDROID)
diff --git a/cromite_flags/chrome/browser/about_flags_cc/Add-flag-to-disable-vibration.inc b/cromite_flags/chrome/browser/about_flags_cc/Add-flag-to-disable-vibration.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/chrome/browser/about_flags_cc/Add-flag-to-disable-vibration.inc
@@ -0,0 +1,8 @@
+#ifdef FLAG_SECTION
+
+ {"enable-vibration",
+ "Vibration",
+ "Enable vibration API; an user gesture will still be needed.", kOsAll,
+ FEATURE_VALUE_TYPE(features::kVibration)},
+
+#endif
diff --git a/cromite_flags/content/public/common/content_features_cc/Add-flag-to-disable-vibration.inc b/cromite_flags/content/public/common/content_features_cc/Add-flag-to-disable-vibration.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/content/public/common/content_features_cc/Add-flag-to-disable-vibration.inc
@@ -0,0 +1,4 @@
+// Enables vibration; an user gesture will still be required if enabled.
+CROMITE_FEATURE(kVibration,
+ "VibrationEnabled",
+ base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/cromite_flags/content/public/common/content_features_h/Add-flag-to-disable-vibration.inc b/cromite_flags/content/public/common/content_features_h/Add-flag-to-disable-vibration.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/content/public/common/content_features_h/Add-flag-to-disable-vibration.inc
@@ -0,0 +1 @@
+CONTENT_EXPORT BASE_DECLARE_FEATURE(kVibration);
diff --git a/third_party/blink/public/platform/web_runtime_features.h b/third_party/blink/public/platform/web_runtime_features.h
--- a/third_party/blink/public/platform/web_runtime_features.h
+++ b/third_party/blink/public/platform/web_runtime_features.h
@@ -70,6 +70,7 @@ class BLINK_PLATFORM_EXPORT WebRuntimeFeatures : public WebRuntimeFeaturesBase {
static void EnableFingerprintingCanvasImageDataNoise(bool);
static void EnableFluentScrollbars(bool);
static void EnableFluentOverlayScrollbars(bool);
+ static void EnableVibration(bool);
static void EnableLocalNetworkAccessWebRTC(bool);
diff --git a/third_party/blink/renderer/modules/vibration/vibration_controller.cc b/third_party/blink/renderer/modules/vibration/vibration_controller.cc
--- a/third_party/blink/renderer/modules/vibration/vibration_controller.cc
+++ b/third_party/blink/renderer/modules/vibration/vibration_controller.cc
@@ -28,6 +28,7 @@
#include "third_party/blink/renderer/core/frame/local_frame.h"
#include "third_party/blink/renderer/core/frame/navigator.h"
#include "third_party/blink/renderer/core/page/page.h"
+#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
// Maximum number of entries in a vibration pattern.
const unsigned kVibrationPatternLengthMax = 99;
@@ -108,6 +109,8 @@ bool VibrationController::vibrate(Navigator& navigator,
// reference to |window| or |navigator| was retained in another window.
if (!navigator.DomWindow())
return false;
+ if (!RuntimeEnabledFeatures::VibrationEnabled())
+ return false;
return From(navigator).Vibrate(pattern);
}
diff --git a/third_party/blink/renderer/platform/exported/web_runtime_features.cc b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
--- a/third_party/blink/renderer/platform/exported/web_runtime_features.cc
+++ b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
@@ -52,6 +52,10 @@ void WebRuntimeFeatures::EnableTestOnlyFeatures(bool enable) {
RuntimeEnabledFeatures::SetTestFeaturesEnabled(enable);
}
+void WebRuntimeFeatures::EnableVibration(bool enable) {
+ RuntimeEnabledFeatures::SetVibrationEnabled(enable);
+}
+
void WebRuntimeFeatures::EnableOriginTrialControlledFeatures(bool enable) {
RuntimeEnabledFeatures::SetOriginTrialControlledFeaturesEnabled(enable);
}
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -1070,6 +1070,10 @@
{
name: "CompositingDecisionAtAnimationPhaseBoundaries"
},
+ {
+ name: "Vibration",
+ status: "stable",
+ },
{
name: "CompositionForegroundMarkers",
status: {
--
@@ -0,0 +1,184 @@
From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Mon, 22 Oct 2018 21:29:53 +0200
Subject: Add flags to disable device motion and orientation APIs
Both flags will be disabled by default and prevent usage of gyroscope and
legacy acceleration events.
---
chrome/browser/about_flags.cc | 6 ++++++
chrome/browser/flag_descriptions.cc | 8 ++++++++
chrome/browser/flag_descriptions.h | 6 ++++++
content/child/runtime_features.cc | 3 +++
content/public/common/content_features.cc | 10 ++++++++++
content/public/common/content_features.h | 2 ++
.../blink/public/platform/web_runtime_features.h | 2 ++
.../blink/renderer/modules/modules_initializer.cc | 9 ++++++---
.../renderer/platform/exported/web_runtime_features.cc | 8 ++++++++
.../renderer/platform/runtime_enabled_features.json5 | 8 ++++++++
10 files changed, 59 insertions(+), 3 deletions(-)
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -1771,6 +1771,12 @@ const FeatureEntry kFeatureEntries[] = {
{"enable-gpu-rasterization", flag_descriptions::kGpuRasterizationName,
flag_descriptions::kGpuRasterizationDescription, kOsAll,
MULTI_VALUE_TYPE(kEnableGpuRasterizationChoices)},
+ {"enable-device-motion", flag_descriptions::kEnableDeviceMotionName,
+ flag_descriptions::kEnableDeviceMotionDescription, kOsAll,
+ FEATURE_VALUE_TYPE(features::kDeviceMotion)},
+ {"enable-device-orientation", flag_descriptions::kEnableDeviceOrientationName,
+ flag_descriptions::kEnableDeviceOrientationDescription, kOsAll,
+ FEATURE_VALUE_TYPE(features::kDeviceOrientation)},
{"enable-oop-rasterization", flag_descriptions::kOopRasterizationName,
flag_descriptions::kOopRasterizationDescription, kOsAll,
MULTI_VALUE_TYPE(kEnableOopRasterizationChoices)},
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -594,6 +594,14 @@ const char kWinrtSensorsImplementationDescription[] =
"Enables usage of the Windows.Devices.Sensors WinRT APIs on Windows for "
"sensors";
+const char kEnableDeviceMotionName[] = "Enable device motion";
+const char kEnableDeviceMotionDescription[] =
+ "Enable device motion API which is used to detect changes in acceleration";
+
+const char kEnableDeviceOrientationName[] = "Enable device orientation";
+const char kEnableDeviceOrientationDescription[] =
+ "Enable device orientation API which is used to detect changes in orientation";
+
const char kEnableGenericSensorExtraClassesName[] =
"Generic Sensor Extra Classes";
const char kEnableGenericSensorExtraClassesDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -362,6 +362,12 @@ extern const char kWinrtGeolocationImplementationDescription[];
extern const char kWinrtSensorsImplementationName[];
extern const char kWinrtSensorsImplementationDescription[];
+extern const char kEnableDeviceMotionName[];
+extern const char kEnableDeviceMotionDescription[];
+
+extern const char kEnableDeviceOrientationName[];
+extern const char kEnableDeviceOrientationDescription[];
+
extern const char kEnableGenericSensorExtraClassesName[];
extern const char kEnableGenericSensorExtraClassesDescription[];
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -87,6 +87,9 @@ void SetRuntimeFeatureDefaultsForPlatform(
command_line.HasSwitch(
switches::kEnableGpuMemoryBufferCompositorResources) &&
!command_line.HasSwitch(switches::kDisableWebGLImageChromium) &&
+ WebRuntimeFeatures::EnableDeviceMotion(base::FeatureList::IsEnabled(features::kDeviceMotion));
+ WebRuntimeFeatures::EnableDeviceOrientation(base::FeatureList::IsEnabled(features::kDeviceOrientation));
+
!command_line.HasSwitch(switches::kDisableGpu) &&
base::FeatureList::IsEnabled(features::kWebGLImageChromium);
#else
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -756,6 +756,16 @@ const base::Feature kExperimentalProductivityFeatures{
// TODO(rouslan): Remove this.
const base::Feature kWebPayments{"WebPayments",
base::FEATURE_ENABLED_BY_DEFAULT};
+// Enables the device motion API used to track device acceleration;
+// no user authorization or notifications happens when in use.
+const base::Feature kDeviceMotion{"DeviceMotion",
+ base::FEATURE_DISABLED_BY_DEFAULT};
+
+// Enables the device orientation API used to track device orientation;
+// no user authorization or notifications happens when in use.
+const base::Feature kDeviceOrientation{"DeviceOrientation",
+ base::FEATURE_DISABLED_BY_DEFAULT};
+
// Makes WebRTC use ECDSA certs by default (i.e., when no cert type was
// specified in JS).
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -165,6 +165,8 @@ CONTENT_EXPORT extern const base::Feature kWebXrHitTest;
CONTENT_EXPORT extern const base::Feature kWebXrIncubations;
CONTENT_EXPORT extern const base::Feature kWebXrPermissionsApi;
+CONTENT_EXPORT extern const base::Feature kDeviceMotion, kDeviceOrientation;
+
#if defined(OS_ANDROID)
CONTENT_EXPORT extern const base::Feature kAndroidAutofillAccessibility;
CONTENT_EXPORT extern const base::Feature
diff --git a/third_party/blink/public/platform/web_runtime_features.h b/third_party/blink/public/platform/web_runtime_features.h
--- a/third_party/blink/public/platform/web_runtime_features.h
+++ b/third_party/blink/public/platform/web_runtime_features.h
@@ -100,6 +100,8 @@ class WebRuntimeFeatures {
BLINK_PLATFORM_EXPORT static void EnableCSSHexAlphaColor(bool);
BLINK_PLATFORM_EXPORT static void EnableSameSiteByDefaultCookies(bool);
BLINK_PLATFORM_EXPORT static void EnableScrollTopLeftInterop(bool);
+ BLINK_PLATFORM_EXPORT static void EnableDeviceMotion(bool);
+ BLINK_PLATFORM_EXPORT static void EnableDeviceOrientation(bool);
BLINK_PLATFORM_EXPORT static void EnableKeyboardFocusableScrollers(bool);
BLINK_PLATFORM_EXPORT static void EnableDatabase(bool);
BLINK_PLATFORM_EXPORT static void EnableDecodeJpeg420ImagesToYUV(bool);
diff --git a/third_party/blink/renderer/modules/modules_initializer.cc b/third_party/blink/renderer/modules/modules_initializer.cc
--- a/third_party/blink/renderer/modules/modules_initializer.cc
+++ b/third_party/blink/renderer/modules/modules_initializer.cc
@@ -245,9 +245,12 @@ void ModulesInitializer::InitInspectorAgentSession(
void ModulesInitializer::OnClearWindowObjectInMainWorld(
Document& document,
const Settings& settings) const {
- DeviceMotionController::From(document);
- DeviceOrientationController::From(document);
- DeviceOrientationAbsoluteController::From(document);
+ if (RuntimeEnabledFeatures::DeviceMotionEnabled())
+ DeviceMotionController::From(document);
+ if (RuntimeEnabledFeatures::DeviceOrientationEnabled()) {
+ DeviceOrientationController::From(document);
+ DeviceOrientationAbsoluteController::From(document);
+ }
NavigatorGamepad::From(document);
NavigatorServiceWorker::From(document);
DOMWindowStorageController::From(document);
diff --git a/third_party/blink/renderer/platform/exported/web_runtime_features.cc b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
--- a/third_party/blink/renderer/platform/exported/web_runtime_features.cc
+++ b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
@@ -183,6 +183,14 @@ void WebRuntimeFeatures::EnableScrollTopLeftInterop(bool enable) {
RuntimeEnabledFeatures::SetScrollTopLeftInteropEnabled(enable);
}
+void WebRuntimeFeatures::EnableDeviceMotion(bool enable) {
+ RuntimeEnabledFeatures::SetDeviceMotionEnabled(enable);
+}
+
+void WebRuntimeFeatures::EnableDeviceOrientation(bool enable) {
+ RuntimeEnabledFeatures::SetDeviceOrientationEnabled(enable);
+}
+
void WebRuntimeFeatures::EnableKeyboardFocusableScrollers(bool enable) {
RuntimeEnabledFeatures::SetKeyboardFocusableScrollersEnabled(enable);
}
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -1171,6 +1171,14 @@
name: "OffscreenCanvasCommit",
status: "experimental",
},
+ {
+ name: "DeviceMotion",
+ status: "stable",
+ },
+ {
+ name: "DeviceOrientation",
+ status: "stable",
+ },
{
name: "OnDeviceChange",
// Android does not yet support SystemMonitor.
--
2.17.1
@@ -1,75 +0,0 @@
From: uazo <uazo@users.noreply.github.com>
Date: Thu, 20 Oct 2022 09:34:48 +0000
Subject: Add kill switch for unsupported clangd flags
Allows build with clangd by suppressing unsupported parameters
Original License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
build/config/compiler/BUILD.gn | 17 ++++++++++++++---
build_overrides/build.gni | 3 +++
2 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -715,7 +715,7 @@ config("compiler") {
# TODO(crbug.com/376278218): This causes segfault on Linux ARM builds.
# It also causes segfault on Linux s390x:
# https://github.com/llvm/llvm-project/issues/149511
- if (is_linux && use_lld && current_cpu != "arm" && current_cpu != "s390x") {
+ if (is_linux && !skip_clangd_unsupported_options && use_lld && current_cpu != "arm" && current_cpu != "s390x") {
cflags += [ "-Wa,--crel,--allow-experimental-crel" ]
}
}
@@ -1848,7 +1848,7 @@ config("clang_revision") {
# e.g. by setting in the the project's .gn file.
config("clang_warning_suppression") {
# Some build configs use older versions of clang that don't support WSMs
- if (use_clang_warning_suppression_file) {
+ if (use_clang_warning_suppression_file && !skip_clangd_unsupported_options) {
from_build_root =
rebase_path(clang_warning_suppression_file, root_build_dir)
inputs = [ clang_warning_suppression_file ]
@@ -2183,7 +2183,9 @@ config("default_warnings") {
# TODO(crbug.com/432275627): Fix and re-enable.
"-Wno-uninitialized-const-pointer",
]
-
+ if (skip_clangd_unsupported_options) {
+ cflags -= [ "-Wno-uninitialized-const-pointer" ]
+ }
cflags_cc += [
# TODO(crbug.com/328490295): Fix and re-enable for C flags.
"-Wenum-compare-conditional",
@@ -2237,6 +2239,15 @@ config("default_warnings") {
ldflags += [ "-Wno-version-check" ]
}
+ if (skip_clangd_unsupported_options) {
+ cflags -= [
+ "-Wno-thread-safety-reference-return",
+ "-Wno-nontrivial-memcall",
+ ]
+ cflags_cc -= [
+ ]
+ }
+
# Disable the GNU line marker warning when building a target with Icecc,
# ccache, or both. This warning appears frequently when compiling
# files that use GNU-style line markers with Clang and Icecc. It can
diff --git a/build_overrides/build.gni b/build_overrides/build.gni
--- a/build_overrides/build.gni
+++ b/build_overrides/build.gni
@@ -54,6 +54,9 @@ declare_args() {
# Allows googletest to pretty-print various absl types.
gtest_enable_absl_printers = true
+ # Allows clangd builds by suppressing unsupported parameters
+ skip_clangd_unsupported_options = false
+
# Allow projects that wish to stay on C++17 to override Chromium's default.
# TODO(crbug.com/40251117): evaluate removing this end of 2023
use_cxx17 = false
--
File diff suppressed because it is too large Load Diff
@@ -1,931 +0,0 @@
From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Thu, 18 Feb 2021 21:22:52 +0100
Subject: Add menu item to bookmark all tabs
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
chrome/android/java/res/values/ids.xml | 1 +
.../chrome/browser/ChromeTabbedActivity.java | 43 +++++++++++++++++++
.../TabbedAppMenuPropertiesDelegate.java | 15 +++++++
.../bookmarks/android/bookmark_bridge.cc | 42 ++++++++++++++++++
.../bookmarks/android/bookmark_bridge.h | 8 ++++
.../browser/bookmarks/BookmarkBridge.java | 41 ++++++++++++++++++
.../browser/bookmarks/bookmark_html_writer.cc | 14 +++++-
.../bookmarks/bookmark_parent_folder.cc | 1 +
.../permanent_folder_ordering_tracker.cc | 2 +
.../dialogs/DownloadLocationCustomView.java | 4 +-
.../strings/android_chrome_strings.grd | 3 ++
.../bookmark_ui_operations_helper.cc | 2 +
.../bookmark_bar_page_handler.cc | 2 +
components/bookmark_bar_strings.grdp | 6 +++
.../bookmarks/browser/bookmark_codec.cc | 20 +++++++--
components/bookmarks/browser/bookmark_codec.h | 7 ++-
.../browser/bookmark_load_details.cc | 15 +++++--
.../bookmarks/browser/bookmark_load_details.h | 2 +
.../bookmarks/browser/bookmark_model.cc | 3 +-
components/bookmarks/browser/bookmark_model.h | 7 +++
components/bookmarks/browser/bookmark_node.cc | 13 ++++++
components/bookmarks/browser/bookmark_node.h | 4 ++
.../bookmarks/browser/bookmark_storage.cc | 2 +
.../bookmarks/browser/bookmark_uuids.cc | 3 ++
components/bookmarks/browser/bookmark_uuids.h | 1 +
components/bookmarks/browser/model_loader.cc | 9 +++-
.../bookmark_specifics_conversions.cc | 1 +
27 files changed, 257 insertions(+), 14 deletions(-)
diff --git a/chrome/android/java/res/values/ids.xml b/chrome/android/java/res/values/ids.xml
--- a/chrome/android/java/res/values/ids.xml
+++ b/chrome/android/java/res/values/ids.xml
@@ -191,6 +191,7 @@ found in the LICENSE file.
<item type="id" name="menu_select_tabs" />
<item type="id" name="menu_item_content_filter_divider_line_id" />
<item type="id" name="menu_item_content_filter_help_center_id" />
+ <item type="id" name="bookmark_all_tabs_menu_id" />
<!-- Custom Tabs -->
<item type="id" name="view_id_tag_key" />
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -100,6 +100,7 @@ import org.chromium.chrome.browser.bookmarks.BookmarkPane;
import org.chromium.chrome.browser.bookmarks.BookmarkUtils;
import org.chromium.chrome.browser.browserservices.intents.WebappConstants;
import org.chromium.chrome.browser.compositor.CompositorViewHolder;
+import org.chromium.chrome.browser.bookmarks.BookmarkModel;
import org.chromium.chrome.browser.compositor.layouts.Layout;
import org.chromium.chrome.browser.compositor.layouts.LayoutManagerChrome;
import org.chromium.chrome.browser.compositor.layouts.LayoutManagerChromePhone;
@@ -296,6 +297,9 @@ import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTaskTrackerFac
import org.chromium.chrome.browser.ui.desktop_windowing.AppHeaderUtils;
import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeUtils;
import org.chromium.chrome.browser.ui.extensions.windowing.ExtensionWindowControllerBridgeFactory;
+import org.chromium.chrome.browser.ui.messages.snackbar.Snackbar;
+import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
+import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager.SnackbarController;
import org.chromium.chrome.browser.ui.searchactivityutils.SearchActivityClient;
import org.chromium.chrome.browser.ui.searchactivityutils.SearchActivityExtras.IntentOrigin;
import org.chromium.chrome.browser.ui.signin.BottomSheetSigninAndHistorySyncConfig;
@@ -309,6 +313,8 @@ import org.chromium.chrome.browser.usage_stats.UsageStatsService;
import org.chromium.chrome.browser.util.ChromeAccessibilityUtil;
import org.chromium.chrome.browser.xr.scenecore.XrSceneCoreSessionInitializerImpl;
import org.chromium.chrome.browser.xr.scenecore.XrSceneCoreSessionManagerImpl;
+import org.chromium.components.bookmarks.BookmarkId;
+import org.chromium.components.bookmarks.BookmarkItem;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
import org.chromium.components.browser_ui.util.BrowserControlsVisibilityDelegate;
import org.chromium.components.browser_ui.util.ComposedBrowserControlsVisibilityDelegate;
@@ -3910,6 +3916,8 @@ public class ChromeTabbedActivity extends ChromeActivity {
CloseAllTabsDialog.show(
this, getModalDialogManagerSupplier(), tabModelSelector, closeAllTabsRunnable);
RecordUserAction.record("MobileMenuCloseAllTabs");
+ } else if (id == R.id.bookmark_all_tabs_menu_id) {
+ bookmarkAllTabs();
} else if (id == R.id.close_all_incognito_tabs_menu_id) {
boolean allowUndo = TabClosureParamsUtils.shouldAllowUndo(triggeringMotion);
@@ -4030,6 +4038,41 @@ public class ChromeTabbedActivity extends ChromeActivity {
getTabModalLifetimeHandler().onOmniboxFocusChanged(hasFocus);
}
+ private void bookmarkAllTabs() {
+ TabModel tabModel = getTabModelSelector().getCurrentModel();
+ int count = tabModel.getCount();
+ Log.i(TAG, "bookmarkAllTabs(): %d tabs to bookmark", count);
+ if (count == 0) {
+ return;
+ }
+
+ final BookmarkModel bookmarkModel = mBookmarkModelSupplier.get();
+ bookmarkModel.finishLoadingBookmarkModel(() -> {
+ for (int i = 0; i < tabModel.getCount(); i++) {
+ Tab tab = tabModel.getTabAt(i);
+ if (tab.isNativePage()) {
+ continue;
+ }
+ bookmarkModel.addToTabsCollection(tab);
+ }
+ BookmarkId parent = bookmarkModel.getTabsCollectionFolderId();
+ BookmarkItem bookmarkItem = bookmarkModel.getBookmarkById(parent);
+ String folderName = "";
+ if (bookmarkItem != null) {
+ folderName = bookmarkItem.getTitle();
+ }
+ SnackbarController snackbarController = new SnackbarController() {
+ @Override
+ public void onAction(Object actionData) {
+ }
+ };
+ Snackbar snackbar = Snackbar.make(folderName, snackbarController, Snackbar.TYPE_ACTION,
+ Snackbar.UMA_BOOKMARK_ADDED)
+ .setTemplateText(getString(R.string.bookmark_page_saved_folder));
+ getSnackbarManager().showSnackbar(snackbar);
+ });
+ }
+
private void recordLauncherShortcutAction(boolean isIncognito) {
if (isIncognito) {
RecordUserAction.record("Android.LauncherShortcut.NewIncognitoTab");
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java
@@ -291,6 +291,14 @@ public class TabbedAppMenuPropertiesDelegate extends AppMenuPropertiesDelegateIm
// Bookmarks
modelList.add(buildBookmarksItem());
+ // Add bookmark all item
+ modelList.add(new MVCListAdapter.ListItem(
+ AppMenuHandler.AppMenuItemType.STANDARD,
+ buildModelForStandardMenuItem(
+ R.id.bookmark_all_tabs_menu_id,
+ R.string.menu_bookmark_all_tabs,
+ shouldShowIconBeforeItem() ? R.drawable.ic_folder_blue_24dp : 0)));
+
// Recent Tabs
if (shouldShowRecentTabsItem()) modelList.add(buildRecentTabsItem());
@@ -466,6 +474,13 @@ public class TabbedAppMenuPropertiesDelegate extends AppMenuPropertiesDelegateIm
}
modelList.add(buildCloseAllTabsItem());
if (shouldShowTinkerTank()) modelList.add(buildTinkerTankItem());
+ // Add bookmark all item
+ modelList.add(new MVCListAdapter.ListItem(
+ AppMenuHandler.AppMenuItemType.STANDARD,
+ buildModelForStandardMenuItem(
+ R.id.bookmark_all_tabs_menu_id,
+ R.string.menu_bookmark_all_tabs,
+ shouldShowIconBeforeItem() ? R.drawable.ic_folder_blue_24dp : 0)));
modelList.add(buildSelectTabsItem());
if (shouldShowQuickDeleteItem()) modelList.add(buildQuickDeleteItem());
modelList.add(buildSettingsItem());
diff --git a/chrome/browser/bookmarks/android/bookmark_bridge.cc b/chrome/browser/bookmarks/android/bookmark_bridge.cc
--- a/chrome/browser/bookmarks/android/bookmark_bridge.cc
+++ b/chrome/browser/bookmarks/android/bookmark_bridge.cc
@@ -340,6 +340,33 @@ jboolean BookmarkBridge::AreAccountBookmarkFoldersActive(JNIEnv* env) {
return bookmark_model_->account_mobile_node() != nullptr;
}
+base::android::ScopedJavaLocalRef<jobject>
+BookmarkBridge::GetBookmarkIdForTabsCollection(
+ JNIEnv* env,
+ const JavaParamRef<jobject>& url) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+ GURL gurl = url::GURLAndroid::ToNativeGURL(env, url);
+
+ bookmarks::BookmarkModel* model =
+ BookmarkModelFactory::GetForBrowserContext(profile_);
+
+ std::vector<raw_ptr<const bookmarks::BookmarkNode, VectorExperimental>> nodes =
+ model->GetNodesByURL(gurl);
+ std::sort(nodes.begin(), nodes.end(), &bookmarks::MoreRecentlyAdded);
+
+ for (const BookmarkNode* node : nodes) {
+ for (const auto& child : model->tabs_collection_node()->children()) {
+ if (node->id() == child->id()) {
+ return JavaBookmarkIdCreateBookmarkId(env, node->id(),
+ GetBookmarkType(node));
+ }
+ }
+ }
+
+ return nullptr;
+}
+
base::android::ScopedJavaLocalRef<jobject>
BookmarkBridge::GetMostRecentlyAddedUserBookmarkIdForUrl(JNIEnv* env,
const GURL& url) {
@@ -452,6 +479,7 @@ void BookmarkBridge::GetAllFoldersWithDepths(
// Vector to temporarily contain all child bookmarks at same level for sorting
std::vector<const BookmarkNode*> bookmarks = {
bookmark_model_->mobile_node(),
+ bookmark_model_->tabs_collection_node(),
bookmark_model_->bookmark_bar_node(),
bookmark_model_->other_node(),
};
@@ -560,6 +588,9 @@ std::vector<const BookmarkNode*> BookmarkBridge::GetTopLevelFolderIdsImpl(
top_level_folders.push_back(other_node);
}
+ const BookmarkNode* tabs_collection_node = bookmark_model_->tabs_collection_node();
+ top_level_folders.push_back(tabs_collection_node);
+
const BookmarkNode* reading_list_node =
local_or_syncable_reading_list_manager_->GetRoot();
if (IsPermanentFolderVisible(
@@ -1237,6 +1268,17 @@ void BookmarkBridge::GetBookmarksOfType(
AddBookmarkNodesToBookmarkIdList(env, j_list, results);
}
+ScopedJavaLocalRef<jobject> BookmarkBridge::GetTabsCollectionFolderId(
+ JNIEnv* env,
+ const JavaParamRef<jobject>& obj) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ const BookmarkNode* tabs_collection_node = bookmark_model_->tabs_collection_node();
+ ScopedJavaLocalRef<jobject> folder_id_obj =
+ JavaBookmarkIdCreateBookmarkId(
+ env, tabs_collection_node->id(), GetBookmarkType(tabs_collection_node));
+ return folder_id_obj;
+}
+
ScopedJavaLocalRef<jobject> BookmarkBridge::AddFolder(
JNIEnv* env,
const JavaParamRef<jobject>& j_parent_id_obj,
diff --git a/chrome/browser/bookmarks/android/bookmark_bridge.h b/chrome/browser/bookmarks/android/bookmark_bridge.h
--- a/chrome/browser/bookmarks/android/bookmark_bridge.h
+++ b/chrome/browser/bookmarks/android/bookmark_bridge.h
@@ -106,6 +106,10 @@ class BookmarkBridge : public ProfileObserver,
jboolean AreAccountBookmarkFoldersActive(JNIEnv* env);
+ base::android::ScopedJavaLocalRef<jobject> GetBookmarkIdForTabsCollection(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& url);
+
base::android::ScopedJavaLocalRef<jobject>
GetMostRecentlyAddedUserBookmarkIdForUrl(JNIEnv* env, const GURL& url);
const bookmarks::BookmarkNode* GetMostRecentlyAddedUserBookmarkIdForUrlImpl(
@@ -245,6 +249,10 @@ class BookmarkBridge : public ProfileObserver,
const base::android::JavaParamRef<jobject>& j_list,
jint type);
+ base::android::ScopedJavaLocalRef<jobject> GetTabsCollectionFolderId(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& obj);
+
base::android::ScopedJavaLocalRef<jobject> AddFolder(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& j_parent_id_obj,
diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java
--- a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java
@@ -16,6 +16,7 @@ import org.jni_zero.JniType;
import org.jni_zero.NativeMethods;
import org.chromium.base.ContextUtils;
+import org.chromium.base.Log;
import org.chromium.base.ObserverList;
import org.chromium.base.ThreadUtils;
import org.chromium.base.metrics.RecordUserAction;
@@ -26,6 +27,7 @@ import org.chromium.chrome.browser.partnerbookmarks.PartnerBookmarksShim;
import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
import org.chromium.chrome.browser.preferences.ChromeSharedPreferences;
import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.tab.Tab;
import org.chromium.components.bookmarks.BookmarkId;
import org.chromium.components.bookmarks.BookmarkItem;
import org.chromium.components.bookmarks.BookmarkType;
@@ -47,6 +49,7 @@ import java.util.function.BiConsumer;
class BookmarkBridge {
private static final OneshotSupplierImpl<BookmarkModel.PartnerBookmarkIteratorProvider>
sPartnerBookmarkIteratorSupplier = new OneshotSupplierImpl<>();
+ private static final String TAG = "BookmarkBridge";
private final ObserverList<BookmarkModelObserver> mObservers = new ObserverList<>();
private final Profile mProfile;
@@ -385,6 +388,16 @@ class BookmarkBridge {
return mMobileFolderId;
}
+ /**
+ * @return The BookmarkId for the Tabs collecction folder node
+ */
+ public BookmarkId getTabsCollectionFolderId() {
+ ThreadUtils.assertOnUiThread();
+ assert mIsNativeBookmarkModelLoaded;
+ return BookmarkBridgeJni.get().getTabsCollectionFolderId(
+ mNativeBookmarkBridge, BookmarkBridge.this);
+ }
+
/** Returns Id representing the special "other" folder from bookmark model. */
public @Nullable BookmarkId getOtherFolderId() {
ThreadUtils.assertOnUiThread();
@@ -882,6 +895,29 @@ class BookmarkBridge {
.addToReadingList(mNativeBookmarkBridge, parentId, title, url);
}
+ // Used to bookmark all tabs in a specific folder, created if not existing
+ public BookmarkId addToTabsCollection(Tab tab) {
+ BookmarkId parent = getTabsCollectionFolderId();
+ BookmarkId existingId = BookmarkBridgeJni.get().getBookmarkIdForTabsCollection(
+ mNativeBookmarkBridge, tab.getOriginalUrl());
+ if (existingId != null && existingId.getId() != BookmarkId.INVALID_ID) {
+ BookmarkId existingBookmarkId = new BookmarkId(existingId.getId(), BookmarkType.NORMAL);
+ BookmarkItem existingBookmark = getBookmarkById(existingBookmarkId);
+ if (parent.equals(existingBookmark.getParentId())) {
+ // bookmark already exists in the tabs collection folder
+ return existingBookmarkId;
+ }
+ }
+ BookmarkId bookmarkId =
+ addBookmark(parent, getChildCount(parent), tab.getTitle(), tab.getUrl());
+
+ if (bookmarkId == null) {
+ Log.e(TAG,
+ "Failed to add bookmarks: parentTypeAndId %s", parent);
+ }
+ return bookmarkId;
+ }
+
/**
* Helper method to mark an item as read.
*
@@ -1099,6 +1135,9 @@ class BookmarkBridge {
BookmarkId getMostRecentlyAddedUserBookmarkIdForUrl(
long nativeBookmarkBridge, @JniType("GURL") GURL url);
+ BookmarkId getBookmarkIdForTabsCollection(
+ long nativeBookmarkBridge, GURL url);
+
BookmarkItem getBookmarkById(long nativeBookmarkBridge, long id, int type);
void getTopLevelFolderIds(
@@ -1120,6 +1159,8 @@ class BookmarkBridge {
BookmarkId getRootFolderId(long nativeBookmarkBridge);
+ BookmarkId getTabsCollectionFolderId(long nativeBookmarkBridge, BookmarkBridge caller);
+
BookmarkId getMobileFolderId(long nativeBookmarkBridge);
BookmarkId getOtherFolderId(long nativeBookmarkBridge);
diff --git a/chrome/browser/bookmarks/bookmark_html_writer.cc b/chrome/browser/bookmarks/bookmark_html_writer.cc
--- a/chrome/browser/bookmarks/bookmark_html_writer.cc
+++ b/chrome/browser/bookmarks/bookmark_html_writer.cc
@@ -169,14 +169,15 @@ class Writer : public base::RefCountedThreadSafe<Writer> {
BookmarkCodec codec;
local_bookmarks_ =
codec.Encode(model->bookmark_bar_node(), model->other_node(),
- model->mobile_node(), /*sync_metadata_str=*/std::string());
+ model->mobile_node(), model->tabs_collection_node(),
+ /*sync_metadata_str=*/std::string());
if (model->account_bookmark_bar_node()) {
CHECK(model->account_other_node());
CHECK(model->account_mobile_node());
account_bookmarks_ = codec.Encode(
model->account_bookmark_bar_node(), model->account_other_node(),
- model->account_mobile_node(), /*sync_metadata_str=*/std::string());
+ model->account_mobile_node(), /*tabs_folder_node*/ nullptr, /*sync_metadata_str=*/std::string());
} else {
CHECK(!model->account_other_node());
CHECK(!model->account_mobile_node());
@@ -210,6 +211,9 @@ class Writer : public base::RefCountedThreadSafe<Writer> {
base::Value::Dict* mobile_folder_value = local_permanent_folders->FindDict(
BookmarkCodec::kMobileBookmarkFolderNameKey);
CHECK(mobile_folder_value);
+ base::Value::Dict* tabs_collection_value =
+ local_permanent_folders->FindDict(BookmarkCodec::kTabsBookmarkFolderNameKey);
+ CHECK(tabs_collection_value);
base::Value::Dict* account_permanent_folders =
account_bookmarks_.FindDict(BookmarkCodec::kRootsKey);
@@ -285,6 +289,10 @@ class Writer : public base::RefCountedThreadSafe<Writer> {
return bookmark_html_writer::Result::kCouldNotWriteNodes;
}
+ if (!WriteDescendants(*tabs_collection_value)) {
+ return bookmark_html_writer::Result::kCouldNotWriteNodes;
+ }
+
DecrementIndent();
if (!Write(kFolderChildrenEnd) || !Write(kNewline)) {
@@ -431,6 +439,7 @@ class Writer : public base::RefCountedThreadSafe<Writer> {
case BookmarkNode::URL:
case BookmarkNode::OTHER_NODE:
case BookmarkNode::MOBILE:
+ case BookmarkNode::TABS_COLLECTION:
NOTREACHED();
}
@@ -559,6 +568,7 @@ void BookmarkFaviconFetcher::ExportBookmarks() {
ExtractUrls(model->bookmark_bar_node());
ExtractUrls(model->other_node());
ExtractUrls(model->mobile_node());
+ ExtractUrls(model->tabs_collection_node());
if (model->account_bookmark_bar_node()) {
CHECK(model->account_other_node());
diff --git a/chrome/browser/bookmarks/bookmark_parent_folder.cc b/chrome/browser/bookmarks/bookmark_parent_folder.cc
--- a/chrome/browser/bookmarks/bookmark_parent_folder.cc
+++ b/chrome/browser/bookmarks/bookmark_parent_folder.cc
@@ -18,6 +18,7 @@ BookmarkParentFolder GetBookmarkParentFolderFromPermanentNode(
CHECK(node->is_permanent_node());
switch (node->type()) {
case bookmarks::BookmarkNode::URL:
+ case bookmarks::BookmarkNode::TABS_COLLECTION:
NOTREACHED();
case bookmarks::BookmarkNode::FOLDER:
// TODO(crbug.com/381252292): Consider extending type with a value
diff --git a/chrome/browser/bookmarks/permanent_folder_ordering_tracker.cc b/chrome/browser/bookmarks/permanent_folder_ordering_tracker.cc
--- a/chrome/browser/bookmarks/permanent_folder_ordering_tracker.cc
+++ b/chrome/browser/bookmarks/permanent_folder_ordering_tracker.cc
@@ -26,6 +26,7 @@ bool IsValidTrackedType(BookmarkNode::Type type) {
switch (type) {
case bookmarks::BookmarkNode::URL:
case bookmarks::BookmarkNode::FOLDER:
+ case bookmarks::BookmarkNode::TABS_COLLECTION:
NOTREACHED();
case bookmarks::BookmarkNode::BOOKMARK_BAR:
@@ -303,6 +304,7 @@ void PermanentFolderOrderingTracker::SetTrackedPermanentNodes() {
switch (tracked_type_) {
case bookmarks::BookmarkNode::URL:
case bookmarks::BookmarkNode::FOLDER:
+ case bookmarks::BookmarkNode::TABS_COLLECTION:
NOTREACHED();
case bookmarks::BookmarkNode::BOOKMARK_BAR:
diff --git a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/dialogs/DownloadLocationCustomView.java b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/dialogs/DownloadLocationCustomView.java
--- a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/dialogs/DownloadLocationCustomView.java
+++ b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/dialogs/DownloadLocationCustomView.java
@@ -88,7 +88,7 @@ public class DownloadLocationCustomView extends ScrollView
mDirectoryAdapter.update();
}
- void setTitle(CharSequence title) {
+ public void setTitle(CharSequence title) {
mTitle.setText(title);
}
@@ -96,7 +96,7 @@ public class DownloadLocationCustomView extends ScrollView
mSubtitleView.setText(subtitle);
}
- void setFileName(CharSequence fileName) {
+ public void setFileName(CharSequence fileName) {
mFileName.setText(fileName);
}
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -4437,6 +4437,9 @@ To change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>delete the Chrome d
<message name="IDS_MENU_SELECT_TABS" desc="Menu item for bulk editing tabs. [CHAR_LIMIT=27]">
Select tabs
</message>
+ <message name="IDS_MENU_BOOKMARK_ALL_TABS" desc="Menu item to bookmark all tabs. [CHAR-LIMIT=27]">
+ Bookmark all tabs
+ </message>
<message name="IDS_MENU_GET_IMAGE_DESCRIPTIONS" desc="Menu item to start getting alt text accessibility image labels/descriptions [CHAR_LIMIT=27]">
Get image descriptions
</message>
diff --git a/chrome/browser/ui/bookmarks/bookmark_ui_operations_helper.cc b/chrome/browser/ui/bookmarks/bookmark_ui_operations_helper.cc
--- a/chrome/browser/ui/bookmarks/bookmark_ui_operations_helper.cc
+++ b/chrome/browser/ui/bookmarks/bookmark_ui_operations_helper.cc
@@ -105,6 +105,8 @@ ui::mojom::DragOperation BookmarkUIOperationsHelper::DropBookmarks(
if (is_reorder) {
base::UmaHistogramEnumeration("Bookmarks.ReorderDropTarget", target);
switch (target_parent()->GetType()) {
+ case bookmarks::BookmarkNode::TABS_COLLECTION:
+ break;
case bookmarks::BookmarkNode::URL:
NOTREACHED();
case bookmarks::BookmarkNode::FOLDER:
diff --git a/chrome/browser/ui/webui_browser/bookmark_bar_page_handler.cc b/chrome/browser/ui/webui_browser/bookmark_bar_page_handler.cc
--- a/chrome/browser/ui/webui_browser/bookmark_bar_page_handler.cc
+++ b/chrome/browser/ui/webui_browser/bookmark_bar_page_handler.cc
@@ -37,6 +37,8 @@ bookmark_bar::mojom::BookmarkType ConvertType(
return bookmark_bar::mojom::BookmarkType::OTHER_NODE;
case bookmarks::BookmarkNode::MOBILE:
return bookmark_bar::mojom::BookmarkType::MOBILE;
+ case bookmarks::BookmarkNode::TABS_COLLECTION:
+ NOTREACHED();
}
NOTREACHED();
}
diff --git a/components/bookmark_bar_strings.grdp b/components/bookmark_bar_strings.grdp
--- a/components/bookmark_bar_strings.grdp
+++ b/components/bookmark_bar_strings.grdp
@@ -15,6 +15,9 @@
<message name="IDS_BOOKMARK_BAR_MOBILE_FOLDER_NAME" desc="Name shown in the tree for the mobile bookmarks folder">
Mobile bookmarks
</message>
+ <message name="IDS_BOOKMARK_BAR_TABS_COLLECTION_FOLDER_NAME" desc="Name shown in the tree for the tabs collection bookmarks folder">
+ Tabs collection
+ </message>
<message name="IDS_BOOKMARK_BAR_OTHER_FOLDER_NAME" desc="Name shown in the tree for the other bookmarks folder">
Other bookmarks
</message>
@@ -29,6 +32,9 @@
<message name="IDS_BOOKMARK_BAR_MOBILE_FOLDER_NAME" desc="In Title Case: Name shown in the tree for the mobile bookmarks folder">
Mobile Bookmarks
</message>
+ <message name="IDS_BOOKMARK_BAR_TABS_COLLECTION_FOLDER_NAME" desc="Name shown in the tree for the tabs collection bookmarks folder">
+ Tabs Collection
+ </message>
<message name="IDS_BOOKMARK_BAR_OTHER_FOLDER_NAME" desc="In Title Case: Name shown in the tree for the other bookmarks folder">
Other Bookmarks
</message>
diff --git a/components/bookmarks/browser/bookmark_codec.cc b/components/bookmarks/browser/bookmark_codec.cc
--- a/components/bookmarks/browser/bookmark_codec.cc
+++ b/components/bookmarks/browser/bookmark_codec.cc
@@ -39,6 +39,7 @@ const char BookmarkCodec::kBookmarkBarFolderNameKey[] = "bookmark_bar";
const char BookmarkCodec::kOtherBookmarkFolderNameKey[] = "other";
// The value is left as 'synced' for historical reasons.
const char BookmarkCodec::kMobileBookmarkFolderNameKey[] = "synced";
+const char BookmarkCodec::kTabsBookmarkFolderNameKey[] = "tabs";
const char BookmarkCodec::kVersionKey[] = "version";
const char BookmarkCodec::kChecksumKey[] = "checksum";
const char BookmarkCodec::kChecksumSHA256Key[] = "checksum_sha256";
@@ -99,6 +100,7 @@ base::Value::Dict BookmarkCodec::Encode(
const BookmarkNode* bookmark_bar_node,
const BookmarkNode* other_folder_node,
const BookmarkNode* mobile_folder_node,
+ const BookmarkNode* tabs_folder_node,
std::string sync_metadata_str) {
ids_reassigned_ = false;
uuids_reassigned_ = false;
@@ -124,6 +126,8 @@ base::Value::Dict BookmarkCodec::Encode(
roots.Set(kBookmarkBarFolderNameKey, EncodeNode(bookmark_bar_node));
roots.Set(kOtherBookmarkFolderNameKey, EncodeNode(other_folder_node));
roots.Set(kMobileBookmarkFolderNameKey, EncodeNode(mobile_folder_node));
+ if (tabs_folder_node)
+ roots.Set(kTabsBookmarkFolderNameKey, EncodeNode(tabs_folder_node));
} else {
// No permanent node should have been provided.
CHECK(!other_folder_node);
@@ -148,6 +152,7 @@ bool BookmarkCodec::Decode(const base::Value::Dict& value,
BookmarkNode* bb_node,
BookmarkNode* other_folder_node,
BookmarkNode* mobile_folder_node,
+ BookmarkNode* tabs_folder_node,
int64_t* max_id,
std::string* sync_metadata_str) {
const int64_t max_already_assigned_id =
@@ -162,7 +167,8 @@ bool BookmarkCodec::Decode(const base::Value::Dict& value,
base::Uuid::ParseLowercase(kBookmarkBarNodeUuid),
base::Uuid::ParseLowercase(kOtherBookmarksNodeUuid),
base::Uuid::ParseLowercase(kMobileBookmarksNodeUuid),
- base::Uuid::ParseLowercase(kManagedNodeUuid)};
+ base::Uuid::ParseLowercase(kManagedNodeUuid),
+ base::Uuid::ParseLowercase(kTabsCollectionBookmarksNodeUuid)};
ids_reassigned_ = false;
uuids_reassigned_ = false;
ids_valid_ = true;
@@ -171,6 +177,7 @@ bool BookmarkCodec::Decode(const base::Value::Dict& value,
stored_sha256_checksum_.clear();
InitializeChecksum();
bool success = DecodeHelper(bb_node, other_folder_node, mobile_folder_node,
+ tabs_folder_node,
value, sync_metadata_str);
FinalizeChecksum();
@@ -180,7 +187,7 @@ bool BookmarkCodec::Decode(const base::Value::Dict& value,
if (!ids_valid_ || (computed_checksum_ != stored_checksum_) ||
(use_sha256 && computed_sha256_checksum_ != stored_sha256_checksum_)) {
maximum_id_ = max_already_assigned_id;
- ReassignIDs(bb_node, other_folder_node, mobile_folder_node);
+ ReassignIDs(bb_node, other_folder_node, mobile_folder_node, tabs_folder_node);
}
*max_id = maximum_id_ + 1;
return success;
@@ -239,6 +246,7 @@ base::Value::Dict BookmarkCodec::EncodeMetaInfo(
bool BookmarkCodec::DecodeHelper(BookmarkNode* bb_node,
BookmarkNode* other_folder_node,
BookmarkNode* mobile_folder_node,
+ BookmarkNode* tabs_folder_node,
const base::Value::Dict& value,
std::string* sync_metadata_str) {
std::optional<int> version = value.FindInt(kVersionKey);
@@ -284,6 +292,8 @@ bool BookmarkCodec::DecodeHelper(BookmarkNode* bb_node,
roots->FindDict(kOtherBookmarkFolderNameKey);
const base::Value::Dict* mobile_folder_value =
roots->FindDict(kMobileBookmarkFolderNameKey);
+ const base::Value::Dict* tabs_folder_value =
+ roots->FindDict(kTabsBookmarkFolderNameKey);
if (!bb_value || !other_folder_value || !mobile_folder_value)
return false;
@@ -291,6 +301,8 @@ bool BookmarkCodec::DecodeHelper(BookmarkNode* bb_node,
DecodeNode(*bb_value, nullptr, bb_node);
DecodeNode(*other_folder_value, nullptr, other_folder_node);
DecodeNode(*mobile_folder_value, nullptr, mobile_folder_node);
+ if (tabs_folder_value)
+ DecodeNode(*tabs_folder_value, nullptr, tabs_folder_node);
// Need to reset the title as the title is persisted and restored from
// the file.
@@ -499,12 +511,14 @@ void BookmarkCodec::DecodeMetaInfoHelper(
void BookmarkCodec::ReassignIDs(BookmarkNode* bb_node,
BookmarkNode* other_node,
- BookmarkNode* mobile_node) {
+ BookmarkNode* mobile_node,
+ BookmarkNode* tabs_folder_node) {
ids_.clear();
reassigned_ids_per_old_id_.clear();
ReassignIDsHelper(bb_node);
ReassignIDsHelper(other_node);
ReassignIDsHelper(mobile_node);
+ ReassignIDsHelper(tabs_folder_node);
ids_reassigned_ = true;
}
diff --git a/components/bookmarks/browser/bookmark_codec.h b/components/bookmarks/browser/bookmark_codec.h
--- a/components/bookmarks/browser/bookmark_codec.h
+++ b/components/bookmarks/browser/bookmark_codec.h
@@ -44,6 +44,7 @@ class BookmarkCodec {
const BookmarkNode* bookmark_bar_node,
const BookmarkNode* other_folder_node,
const BookmarkNode* mobile_folder_node,
+ const BookmarkNode* tabs_folder_node,
std::string sync_metadata_str);
// Decodes the previously encoded value to the specified nodes as well as
@@ -62,6 +63,7 @@ class BookmarkCodec {
BookmarkNode* bb_node,
BookmarkNode* other_folder_node,
BookmarkNode* mobile_folder_node,
+ BookmarkNode* tabs_folder_node,
int64_t* max_node_id,
std::string* sync_metadata_str);
@@ -100,6 +102,7 @@ class BookmarkCodec {
static const char kBookmarkBarFolderNameKey[];
static const char kOtherBookmarkFolderNameKey[];
static const char kMobileBookmarkFolderNameKey[];
+ static const char kTabsBookmarkFolderNameKey[];
static const char kVersionKey[];
static const char kChecksumKey[];
static const char kChecksumSHA256Key[];
@@ -133,6 +136,7 @@ class BookmarkCodec {
bool DecodeHelper(BookmarkNode* bb_node,
BookmarkNode* other_folder_node,
BookmarkNode* mobile_folder_node,
+ BookmarkNode* tabs_folder_node,
const base::Value::Dict& value,
std::string* sync_metadata_str);
@@ -143,7 +147,8 @@ class BookmarkCodec {
// Reassigns bookmark IDs for all nodes.
void ReassignIDs(BookmarkNode* bb_node,
BookmarkNode* other_node,
- BookmarkNode* mobile_node);
+ BookmarkNode* mobile_node,
+ BookmarkNode* tabs_folder_node);
// Helper to recursively reassign IDs.
void ReassignIDsHelper(BookmarkNode* node);
diff --git a/components/bookmarks/browser/bookmark_load_details.cc b/components/bookmarks/browser/bookmark_load_details.cc
--- a/components/bookmarks/browser/bookmark_load_details.cc
+++ b/components/bookmarks/browser/bookmark_load_details.cc
@@ -16,7 +16,7 @@ namespace {
// Number of top-level permanent folders excluding the managed node and account
// bookmarks.
-constexpr size_t kNumDefaultTopLevelPermanentFolders = 3u;
+constexpr size_t kNumDefaultTopLevelPermanentFolders = 4u;
void UpdateUserFolderStatsRecursively(const BookmarkNode& node,
bool top_level,
@@ -63,6 +63,9 @@ BookmarkLoadDetails::BookmarkLoadDetails()
mobile_folder_node_ = static_cast<BookmarkPermanentNode*>(
root_node_->Add(BookmarkPermanentNode::CreateMobileBookmarks(
/*id=*/0, /*is_account_node=*/false)));
+ tabs_collection_folder_node_ = static_cast<BookmarkPermanentNode*>(
+ root_node_->Add(BookmarkPermanentNode::CreateTabsCollectionBookmarks(
+ /*id=*/0, /*is_account_node=*/false)));
// Set the nodes' `date_added` to the same time so that there is no inherent
// hierarchy in terms of their added time between them. This is relevant for
@@ -119,6 +122,10 @@ void BookmarkLoadDetails::PopulateNodeIdsForLocalOrSyncablePermanentNodes() {
if (mobile_folder_node_->id() == 0) {
mobile_folder_node_->set_id(max_id_++);
}
+
+ if (tabs_collection_folder_node_->id() == 0) {
+ tabs_collection_folder_node_->set_id(max_id_++);
+ }
}
void BookmarkLoadDetails::AddManagedNode(
@@ -131,6 +138,7 @@ void BookmarkLoadDetails::AddManagedNode(
CHECK_NE(bb_node_->id(), 0);
CHECK_NE(other_folder_node_->id(), 0);
CHECK_NE(mobile_folder_node_->id(), 0);
+ CHECK_NE(tabs_collection_folder_node_->id(), 0);
has_managed_node_ = true;
root_node_->Add(std::move(managed_node));
@@ -138,8 +146,8 @@ void BookmarkLoadDetails::AddManagedNode(
void BookmarkLoadDetails::CreateIndices() {
local_or_syncable_uuid_index_.insert(root_node_.get());
- static_assert(kNumDefaultTopLevelPermanentFolders == 3u,
- "The code below assumes three permanent nodes");
+ static_assert(kNumDefaultTopLevelPermanentFolders == 4u,
+ "The code below assumes 4 permanent nodes");
for (const auto& child : root_node_->children()) {
if (child.get() == account_bb_node_ ||
child.get() == account_other_folder_node_ ||
@@ -158,6 +166,7 @@ void BookmarkLoadDetails::ResetPermanentNodePointers() {
bb_node_ = nullptr;
other_folder_node_ = nullptr;
mobile_folder_node_ = nullptr;
+ tabs_collection_folder_node_ = nullptr;
account_bb_node_ = nullptr;
account_other_folder_node_ = nullptr;
account_mobile_folder_node_ = nullptr;
diff --git a/components/bookmarks/browser/bookmark_load_details.h b/components/bookmarks/browser/bookmark_load_details.h
--- a/components/bookmarks/browser/bookmark_load_details.h
+++ b/components/bookmarks/browser/bookmark_load_details.h
@@ -41,6 +41,7 @@ class BookmarkLoadDetails {
BookmarkPermanentNode* bb_node() { return bb_node_; }
BookmarkPermanentNode* mobile_folder_node() { return mobile_folder_node_; }
BookmarkPermanentNode* other_folder_node() { return other_folder_node_; }
+ BookmarkPermanentNode* tabs_collection_folder_node() { return tabs_collection_folder_node_; }
// Account permanent nodes (null unless `AddAccountPermanentNodes()` is
// called).
@@ -156,6 +157,7 @@ class BookmarkLoadDetails {
raw_ptr<BookmarkPermanentNode> bb_node_;
raw_ptr<BookmarkPermanentNode> other_folder_node_;
raw_ptr<BookmarkPermanentNode> mobile_folder_node_;
+ raw_ptr<BookmarkPermanentNode> tabs_collection_folder_node_;
raw_ptr<BookmarkPermanentNode> account_bb_node_;
raw_ptr<BookmarkPermanentNode> account_other_folder_node_;
raw_ptr<BookmarkPermanentNode> account_mobile_folder_node_;
diff --git a/components/bookmarks/browser/bookmark_model.cc b/components/bookmarks/browser/bookmark_model.cc
--- a/components/bookmarks/browser/bookmark_model.cc
+++ b/components/bookmarks/browser/bookmark_model.cc
@@ -909,7 +909,7 @@ bool BookmarkModel::HasUserCreatedBookmarksOrFolders() const {
(account_bookmark_bar_node_ &&
!account_bookmark_bar_node_->children().empty()) ||
(account_other_node_ && !account_other_node_->children().empty()) ||
- (account_mobile_node_ && !account_mobile_node_->children().empty());
+ (account_mobile_node_ && !account_mobile_node_->children().empty() && tabs_collection_node_->children().empty());
}
bool BookmarkModel::IsBookmarked(const GURL& url) const {
@@ -1241,6 +1241,7 @@ void BookmarkModel::DoneLoading(std::unique_ptr<BookmarkLoadDetails> details) {
bookmark_bar_node_ = details->bb_node();
other_node_ = details->other_folder_node();
mobile_node_ = details->mobile_folder_node();
+ tabs_collection_node_ = details->tabs_collection_folder_node();
account_bookmark_bar_node_ = details->account_bb_node();
account_other_node_ = details->account_other_folder_node();
diff --git a/components/bookmarks/browser/bookmark_model.h b/components/bookmarks/browser/bookmark_model.h
--- a/components/bookmarks/browser/bookmark_model.h
+++ b/components/bookmarks/browser/bookmark_model.h
@@ -150,6 +150,12 @@ class BookmarkModel : public BookmarkUndoProvider,
// bookmarks in the account storage).
const BookmarkPermanentNode* account_mobile_node() const;
+ // Returns the 'mobile' node. This is NULL until loaded.
+ const BookmarkPermanentNode* tabs_collection_node() const {
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+ return tabs_collection_node_;
+ }
+
bool is_root_node(const BookmarkNode* node) const {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return node == root_;
@@ -628,6 +634,7 @@ class BookmarkModel : public BookmarkUndoProvider,
raw_ptr<BookmarkPermanentNode> account_bookmark_bar_node_ = nullptr;
raw_ptr<BookmarkPermanentNode> account_other_node_ = nullptr;
raw_ptr<BookmarkPermanentNode> account_mobile_node_ = nullptr;
+ raw_ptr<BookmarkPermanentNode> tabs_collection_node_ = nullptr;
// The maximum ID assigned to the bookmark nodes in the model.
int64_t next_node_id_ = 1;
diff --git a/components/bookmarks/browser/bookmark_node.cc b/components/bookmarks/browser/bookmark_node.cc
--- a/components/bookmarks/browser/bookmark_node.cc
+++ b/components/bookmarks/browser/bookmark_node.cc
@@ -161,6 +161,8 @@ bool BookmarkPermanentNode::IsTypeVisibleWhenEmpty(Type type) {
#endif
switch (type) {
+ case bookmarks::BookmarkNode::TABS_COLLECTION:
+ return !is_desktop;
case BookmarkNode::URL:
NOTREACHED();
case BookmarkNode::FOLDER:
@@ -213,6 +215,17 @@ BookmarkPermanentNode::CreateMobileBookmarks(int64_t id,
is_account_node));
}
+// static
+std::unique_ptr<BookmarkPermanentNode>
+BookmarkPermanentNode::CreateTabsCollectionBookmarks(int64_t id,
+ bool is_account_node) {
+ // base::WrapUnique() used because the constructor is private.
+ return base::WrapUnique(new BookmarkPermanentNode(
+ id, TABS_COLLECTION, base::Uuid::ParseLowercase(kTabsCollectionBookmarksNodeUuid),
+ l10n_util::GetStringUTF16(IDS_BOOKMARK_BAR_TABS_COLLECTION_FOLDER_NAME),
+ is_account_node));
+}
+
BookmarkPermanentNode::BookmarkPermanentNode(int64_t id,
Type type,
const base::Uuid& uuid,
diff --git a/components/bookmarks/browser/bookmark_node.h b/components/bookmarks/browser/bookmark_node.h
--- a/components/bookmarks/browser/bookmark_node.h
+++ b/components/bookmarks/browser/bookmark_node.h
@@ -35,6 +35,7 @@ class BookmarkNode : public ui::TreeNode<BookmarkNode>, public TitledUrlNode {
FOLDER,
BOOKMARK_BAR,
OTHER_NODE,
+ TABS_COLLECTION,
MOBILE
};
@@ -249,6 +250,9 @@ class BookmarkPermanentNode : public BookmarkNode {
static std::unique_ptr<BookmarkPermanentNode> CreateMobileBookmarks(
int64_t id,
bool is_account_node);
+ static std::unique_ptr<BookmarkPermanentNode> CreateTabsCollectionBookmarks(
+ int64_t id,
+ bool is_account_node);
// Returns whether the permanent node of type `type` should be visible even
// when it is empty (i.e. no children).
diff --git a/components/bookmarks/browser/bookmark_storage.cc b/components/bookmarks/browser/bookmark_storage.cc
--- a/components/bookmarks/browser/bookmark_storage.cc
+++ b/components/bookmarks/browser/bookmark_storage.cc
@@ -45,6 +45,7 @@ base::Value::Dict EncodeModelToDict(
case BookmarkStorage::kSelectLocalOrSyncableNodes:
return codec.Encode(
model->bookmark_bar_node(), model->other_node(), model->mobile_node(),
+ model->tabs_collection_node(),
model->client()->EncodeLocalOrSyncableBookmarkSyncMetadata());
case BookmarkStorage::kSelectAccountNodes:
// Either all permanent folders or none should exist.
@@ -61,6 +62,7 @@ base::Value::Dict EncodeModelToDict(
return codec.Encode(model->account_bookmark_bar_node(),
model->account_other_node(),
model->account_mobile_node(),
+ nullptr,
model->client()->EncodeAccountBookmarkSyncMetadata());
}
diff --git a/components/bookmarks/browser/bookmark_uuids.cc b/components/bookmarks/browser/bookmark_uuids.cc
--- a/components/bookmarks/browser/bookmark_uuids.cc
+++ b/components/bookmarks/browser/bookmark_uuids.cc
@@ -35,6 +35,9 @@ const char kManagedNodeUuid[] = "323123f4-9381-5aee-80e6-ea5fca2f7672";
// see https://crbug.com/1484372 for details.
const char kShoppingCollectionUuid[] = "89fc5b66-beb6-56c1-a99b-70635d7df201";
+const char kTabsCollectionBookmarksNodeUuid[] =
+ "00000000-0000-4000-a000-000000000006";
+
// This value is the result of exercising sync's function
// syncer::InferGuidForLegacyBookmark() with an empty input.
const char kBannedUuidDueToPastSyncBug[] =
diff --git a/components/bookmarks/browser/bookmark_uuids.h b/components/bookmarks/browser/bookmark_uuids.h
--- a/components/bookmarks/browser/bookmark_uuids.h
+++ b/components/bookmarks/browser/bookmark_uuids.h
@@ -14,6 +14,7 @@ extern const char kBookmarkBarNodeUuid[];
extern const char kOtherBookmarksNodeUuid[];
extern const char kMobileBookmarksNodeUuid[];
extern const char kManagedNodeUuid[];
+extern const char kTabsCollectionBookmarksNodeUuid[];
extern const char kShoppingCollectionUuid[];
// A bug in sync caused some problematic UUIDs to be produced.
diff --git a/components/bookmarks/browser/model_loader.cc b/components/bookmarks/browser/model_loader.cc
--- a/components/bookmarks/browser/model_loader.cc
+++ b/components/bookmarks/browser/model_loader.cc
@@ -74,6 +74,9 @@ std::unique_ptr<BookmarkLoadDetails> LoadBookmarks(
std::unique_ptr<BookmarkPermanentNode> account_mobile_folder_node =
BookmarkPermanentNode::CreateMobileBookmarks(
0, /*is_account_node=*/true);
+ std::unique_ptr<BookmarkPermanentNode> tabs_collection_folder_node =
+ BookmarkPermanentNode::CreateTabsCollectionBookmarks(
+ 0, /*is_account_node=*/true);
std::optional<base::Value::Dict> root_dict =
LoadFileToDict(account_file_path);
@@ -81,7 +84,8 @@ std::unique_ptr<BookmarkLoadDetails> LoadBookmarks(
if (root_dict.has_value() &&
codec.Decode(*root_dict, /*already_assigned_ids=*/{},
account_bb_node.get(), account_other_folder_node.get(),
- account_mobile_folder_node.get(), &max_node_id,
+ account_mobile_folder_node.get(),
+ tabs_collection_folder_node.get(), &max_node_id,
&sync_metadata_str)) {
ids_assigned_to_account_nodes = codec.release_assigned_ids();
@@ -118,7 +122,8 @@ std::unique_ptr<BookmarkLoadDetails> LoadBookmarks(
if (root_dict.has_value() &&
codec.Decode(*root_dict, std::move(ids_assigned_to_account_nodes),
details->bb_node(), details->other_folder_node(),
- details->mobile_folder_node(), &max_node_id,
+ details->mobile_folder_node(),
+ details->tabs_collection_folder_node(), &max_node_id,
&sync_metadata_str)) {
details->set_local_or_syncable_sync_metadata_str(
std::move(sync_metadata_str));
diff --git a/components/sync_bookmarks/bookmark_specifics_conversions.cc b/components/sync_bookmarks/bookmark_specifics_conversions.cc
--- a/components/sync_bookmarks/bookmark_specifics_conversions.cc
+++ b/components/sync_bookmarks/bookmark_specifics_conversions.cc
@@ -447,6 +447,7 @@ sync_pb::BookmarkSpecifics::Type GetProtoTypeFromBookmarkNode(
case bookmarks::BookmarkNode::BOOKMARK_BAR:
case bookmarks::BookmarkNode::OTHER_NODE:
case bookmarks::BookmarkNode::MOBILE:
+ case bookmarks::BookmarkNode::TABS_COLLECTION:
DCHECK(node->is_folder());
return sync_pb::BookmarkSpecifics::FOLDER;
}
--
@@ -1,128 +0,0 @@
From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Mon, 13 Jul 2020 00:37:06 +0200
Subject: Add menu item to view source
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
chrome/android/java/res/values/ids.xml | 1 +
.../chrome/browser/ChromeTabbedActivity.java | 2 ++
.../chrome/browser/app/ChromeActivity.java | 5 ++++
.../AppMenuPropertiesDelegateImpl.java | 24 +++++++++++++++++++
.../CustomTabAppMenuPropertiesDelegate.java | 3 +++
.../TabbedAppMenuPropertiesDelegate.java | 3 +++
.../strings/android_chrome_strings.grd | 4 ++++
7 files changed, 42 insertions(+)
diff --git a/chrome/android/java/res/values/ids.xml b/chrome/android/java/res/values/ids.xml
--- a/chrome/android/java/res/values/ids.xml
+++ b/chrome/android/java/res/values/ids.xml
@@ -133,6 +133,7 @@ found in the LICENSE file.
<item type="id" name="update_menu_id" />
<item type="id" name="new_tab_menu_id" />
<item type="id" name="new_incognito_tab_menu_id" />
+ <item type="id" name="view_source_id" />
<item type="id" name="add_to_group_menu_id" />
<item type="id" name="pin_tab_menu_id" />
<item type="id" name="unpin_tab_menu_id" />
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -3946,6 +3946,8 @@ public class ChromeTabbedActivity extends ChromeActivity {
NewTabPageUma.recordAction(NewTabPageUma.ACTION_OPENED_DOWNLOADS_MANAGER);
}
RecordUserAction.record("MobileMenuDownloadManager");
+ } else if (id == R.id.view_source_id) {
+ currentTab.getWebContents().getNavigationController().loadUrl(new LoadUrlParams("view-source:"+currentTab.getUrl().getSpec()));
} else if (id == R.id.open_recently_closed_tab) {
TabModel currentModel = mTabModelSelector.getCurrentModel();
if (!currentModel.isIncognito()) currentModel.openMostRecentlyClosedEntry();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
@@ -2697,6 +2697,11 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
return doOpenWebApk(currentTab);
}
+ if (id == R.id.view_source_id) {
+ currentTab.getWebContents().getNavigationController().loadUrl(new LoadUrlParams("view-source:"+currentTab.getUrl().getSpec()));
+ return true;
+ }
+
if (id == R.id.request_desktop_site_id || id == R.id.request_desktop_site_check_id) {
boolean usingDesktopUserAgent =
currentTab.getWebContents().getNavigationController().getUseDesktopUserAgent();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
@@ -989,6 +989,30 @@ public abstract class AppMenuPropertiesDelegateImpl implements AppMenuProperties
return false;
}
+ /**
+ * Updates the view source menu item's state.
+ *
+ * @param menu {@link Menu} for view source.
+ * @param currentTab Current tab being displayed.
+ */
+ protected void buildAddViewSourceItem(
+ MVCListAdapter.ModelList modelList,
+ @Nullable Tab currentTab) {
+ boolean visible = false;
+ if (currentTab != null) {
+ String url = currentTab.getUrl().getSpec();
+ visible = !url.isEmpty() && !url.startsWith("view-source:");
+ }
+ if (visible) {
+ modelList.add(new MVCListAdapter.ListItem(
+ AppMenuHandler.AppMenuItemType.STANDARD,
+ buildModelForStandardMenuItem(
+ R.id.view_source_id,
+ R.string.view_source,
+ shouldShowIconBeforeItem() ? R.drawable.ic_drive_document_24dp : 0)));
+ }
+ }
+
/**
* Updates the bookmark item's visibility.
*
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java
@@ -378,6 +378,9 @@ public class CustomTabAppMenuPropertiesDelegate extends AppMenuPropertiesDelegat
modelList.add(buildAddToHomescreenListItem(currentTab, false));
}
+ // Add view source item
+ buildAddViewSourceItem(modelList, currentTab);
+
// --- Request Desktop Site ---
if (requestDesktopSiteVisible) {
MVCListAdapter.ListItem rdsListItem =
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java
@@ -358,6 +358,9 @@ public class TabbedAppMenuPropertiesDelegate extends AppMenuPropertiesDelegateIm
modelList.add(buildAddToHomescreenListItem(currentTab, shouldShowIconBeforeItem()));
}
+ // Add view source item
+ buildAddViewSourceItem(modelList, currentTab);
+
// RDS
MVCListAdapter.ListItem rdsListItem =
maybeBuildRequestDesktopSiteListItem(
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -324,6 +324,10 @@ CHAR_LIMIT guidelines:
Collaboration
</message>
+ <message name="IDS_VIEW_SOURCE" desc="Title for the menu command to view the source of the current page. [CHAR-LIMIT=40]">
+ View source
+ </message>
+
<!-- Sign-in, sync and personalization preferences -->
<message name="IDS_PREFS_SECTION_ACCOUNT_AND_GOOGLE_SERVICES" desc="Title for the group of account-related entries and google services in Settings. [CHAR_LIMIT=32]">
You and Google
--
@@ -0,0 +1,266 @@
From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Wed, 11 Mar 2020 19:56:49 +0100
Subject: Add missing android_provider
---
third_party/android_provider/BUILD.gn | 14 ++
.../android/provider/MediaStoreUtils.java | 228 ++++++++++++++++++
2 files changed, 242 insertions(+)
create mode 100644 third_party/android_provider/BUILD.gn
create mode 100644 third_party/android_provider/java/src/org/chromium/third_party/android/provider/MediaStoreUtils.java
diff --git a/third_party/android_provider/BUILD.gn b/third_party/android_provider/BUILD.gn
new file mode 100644
--- /dev/null
+++ b/third_party/android_provider/BUILD.gn
@@ -0,0 +1,14 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/android/rules.gni")
+
+assert(is_android)
+
+android_library("android_provider_java") {
+ sources = [
+ "java/src/org/chromium/third_party/android/provider/MediaStoreUtils.java",
+ ]
+ deps = [ "//third_party/android_deps:androidx_annotation_annotation_java" ]
+}
diff --git a/third_party/android_provider/java/src/org/chromium/third_party/android/provider/MediaStoreUtils.java b/third_party/android_provider/java/src/org/chromium/third_party/android/provider/MediaStoreUtils.java
new file mode 100644
--- /dev/null
+++ b/third_party/android_provider/java/src/org/chromium/third_party/android/provider/MediaStoreUtils.java
@@ -0,0 +1,228 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package org.chromium.third_party.android.provider;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.net.Uri;
+import android.os.ParcelFileDescriptor;
+import android.provider.MediaStore;
+import android.provider.MediaStore.DownloadColumns;
+import android.provider.MediaStore.MediaColumns;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import java.io.FileNotFoundException;
+import java.io.OutputStream;
+import java.util.Objects;
+
+/**
+ * Utility class to contribute download to the public download collection using
+ * MediaStore API from Q.
+ */
+public class MediaStoreUtils {
+ private static final String TAG = "MediaStoreUtils";
+
+ /**
+ * Creates a new pending media item using the given parameters. Pending items
+ * are expected to have a short lifetime, and owners should either
+ * {@link PendingSession#publish()} or {@link PendingSession#abandon()} a
+ * pending item within a few hours after first creating it.
+ *
+ * @param context Application context.
+ * @param params Parameters used to configure the item.
+ * @return token which can be passed to {@link #openPending(Context, Uri)}
+ * to work with this pending item.
+ */
+ public static @NonNull Uri createPending(
+ @NonNull Context context, @NonNull PendingParams params) {
+ return context.getContentResolver().insert(params.mInsertUri, params.mInsertValues);
+ }
+
+ /**
+ * Opens a pending media item to make progress on it. You can open a pending
+ * item multiple times before finally calling either
+ * {@link PendingSession#publish()} or {@link PendingSession#abandon()}.
+ *
+ * @param uri token which was previously returned from
+ * {@link #createPending(Context, PendingParams)}.
+ * @return pending session that was opened.
+ */
+ public static @NonNull PendingSession openPending(@NonNull Context context, @NonNull Uri uri) {
+ return new PendingSession(context, uri);
+ }
+
+ /**
+ * Parameters that describe a pending media item.
+ */
+ public static class PendingParams {
+ final Uri mInsertUri;
+ final ContentValues mInsertValues;
+
+ /**
+ * Creates parameters that describe a pending media item.
+ *
+ * @param insertUri the {@code content://} Uri where this pending item
+ * should be inserted when finally published. For example, to
+ * publish an image, use
+ * {@link MediaStore.Images.Media#getContentUri(String)}.
+ * @param displayName Display name of the item.
+ * @param mimeType MIME type of the item.
+ */
+ public PendingParams(
+ @NonNull Uri insertUri, @NonNull String displayName, @NonNull String mimeType) {
+ mInsertUri = Objects.requireNonNull(insertUri);
+ final long now = System.currentTimeMillis() / 1000;
+ mInsertValues = new ContentValues();
+ mInsertValues.put(MediaColumns.DISPLAY_NAME, Objects.requireNonNull(displayName));
+ mInsertValues.put(MediaColumns.MIME_TYPE, Objects.requireNonNull(mimeType));
+ mInsertValues.put(MediaColumns.DATE_ADDED, now);
+ mInsertValues.put(MediaColumns.DATE_MODIFIED, now);
+ try {
+ setPendingContentValues(this.mInsertValues, true);
+ } catch (Exception e) {
+ Log.e(TAG, "Unable to set pending content values.", e);
+ }
+ }
+
+ /**
+ * Optionally sets the Uri from where the file has been downloaded. This is used
+ * for files being added to {@link Downloads} table.
+ *
+ * @see DownloadColumns#DOWNLOAD_URI
+ */
+ public void setDownloadUri(@Nullable Uri downloadUri) {
+ if (downloadUri == null) {
+ mInsertValues.remove(DownloadColumns.DOWNLOAD_URI);
+ } else {
+ mInsertValues.put(DownloadColumns.DOWNLOAD_URI, downloadUri.toString());
+ }
+ }
+
+ /**
+ * Optionally set the Uri indicating HTTP referer of the file. This is used for
+ * files being added to {@link Downloads} table.
+ *
+ * @see DownloadColumns#REFERER_URI
+ */
+ public void setRefererUri(@Nullable Uri refererUri) {
+ if (refererUri == null) {
+ mInsertValues.remove(DownloadColumns.REFERER_URI);
+ } else {
+ mInsertValues.put(DownloadColumns.REFERER_URI, refererUri.toString());
+ }
+ }
+
+ /**
+ * Sets the expiration time of the download.
+ *
+ * @time Epoch time in seconds.
+ */
+ public void setExpirationTime(long time) {
+ mInsertValues.put("date_expires", time);
+ }
+ }
+
+ /**
+ * Session actively working on a pending media item. Pending items are
+ * expected to have a short lifetime, and owners should either
+ * {@link PendingSession#publish()} or {@link PendingSession#abandon()} a
+ * pending item within a few hours after first creating it.
+ */
+ public static class PendingSession implements AutoCloseable {
+ private final Context mContext;
+ private final Uri mUri;
+
+ /**
+ * Create a new pending session item to be published.
+ * @param context Contexxt of the application.
+ * @param uri Token which was previously returned from
+ * {@link #createPending(Context, PendingParams)}.
+ */
+ PendingSession(Context context, Uri uri) {
+ mContext = Objects.requireNonNull(context);
+ mUri = Objects.requireNonNull(uri);
+ }
+
+ /**
+ * Open the underlying file representing this media item. When a media
+ * item is successfully completed, you should
+ * {@link ParcelFileDescriptor#close()} and then {@link #publish()} it.
+ *
+ * @return ParcelFileDescriptor to be written into.
+ */
+ public @NonNull ParcelFileDescriptor open() throws FileNotFoundException {
+ return mContext.getContentResolver().openFileDescriptor(mUri, "rw");
+ }
+
+ /**
+ * Open the underlying file representing this media item. When a media
+ * item is successfully completed, you should
+ * {@link OutputStream#close()} and then {@link #publish()} it.
+ *
+ * @return OutputStream to be written into.
+ */
+ public @NonNull OutputStream openOutputStream() throws FileNotFoundException {
+ return mContext.getContentResolver().openOutputStream(mUri);
+ }
+
+ /**
+ * When this media item is successfully completed, call this method to
+ * publish and make the final item visible to the user.
+ *
+ * @return the final {@code content://} Uri representing the newly
+ * published media.
+ */
+ public @NonNull Uri publish() {
+ try {
+ final ContentValues values = new ContentValues();
+ setPendingContentValues(values, false);
+ values.putNull("date_expires");
+ mContext.getContentResolver().update(mUri, values, null, null);
+ } catch (Exception e) {
+ Log.e(TAG, "Unable to publish pending session.", e);
+ }
+ return mUri;
+ }
+
+ /**
+ * When this media item has failed to be completed, call this method to
+ * destroy the pending item record and any data related to it.
+ */
+ public void abandon() {
+ mContext.getContentResolver().delete(mUri, null, null);
+ }
+
+ @Override
+ public void close() {
+ // No resources to close, but at least we can inform people that no
+ // progress is being actively made.
+ }
+ }
+
+ /**
+ * Helper method to set the ContentValues to pending or non-pending.
+ * @param values ContentValues to be set.
+ * @param isPending Whether the item is pending.
+ */
+ private static void setPendingContentValues(ContentValues values, boolean isPending)
+ throws Exception {
+ values.put(MediaColumns.IS_PENDING, isPending ? 1 : 0);
+ }
+}
--
2.17.1
@@ -0,0 +1,505 @@
From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Thu, 5 Dec 2019 22:41:25 +0100
Subject: Add option to configure the ad blocker filters URL
---
chrome/android/chrome_java_sources.gni | 2 +
.../java/res/layout/adblock_editor.xml | 65 +++++++++++++
chrome/android/java/res/values/values.xml | 2 +
.../java/res/xml/adblock_preferences.xml | 25 +++++
.../android/java/res/xml/main_preferences.xml | 5 +
.../browser/flags/FeatureUtilities.java | 10 ++
.../browser/settings/AdBlockEditor.java | 92 +++++++++++++++++++
.../browser/settings/AdBlockPreferences.java | 56 +++++++++++
chrome/app/generated_resources.grd | 10 ++
chrome/browser/android/feature_utilities.cc | 8 ++
chrome/browser/browser_process_impl.cc | 3 +-
.../net/system_network_context_manager.cc | 3 +
.../strings/android_chrome_strings.grd | 14 +++
chrome/common/pref_names.cc | 3 +
chrome/common/pref_names.h | 1 +
.../adblock_updater_service.cc | 6 +-
.../adblock_updater_service.h | 3 +-
17 files changed, 303 insertions(+), 5 deletions(-)
create mode 100644 chrome/android/java/res/layout/adblock_editor.xml
create mode 100644 chrome/android/java/res/xml/adblock_preferences.xml
create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/settings/AdBlockEditor.java
create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/settings/AdBlockPreferences.java
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -1296,6 +1296,8 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/photo_picker/DecodeVideoTask.java",
"java/src/org/chromium/chrome/browser/photo_picker/DecoderService.java",
"java/src/org/chromium/chrome/browser/photo_picker/DecoderServiceHost.java",
+ "java/src/org/chromium/chrome/browser/settings/AdBlockEditor.java",
+ "java/src/org/chromium/chrome/browser/settings/AdBlockPreferences.java",
"java/src/org/chromium/chrome/browser/photo_picker/FileEnumWorkerTask.java",
"java/src/org/chromium/chrome/browser/photo_picker/PhotoPickerDialog.java",
"java/src/org/chromium/chrome/browser/photo_picker/PhotoPickerToolbar.java",
diff --git a/chrome/android/java/res/layout/adblock_editor.xml b/chrome/android/java/res/layout/adblock_editor.xml
new file mode 100644
--- /dev/null
+++ b/chrome/android/java/res/layout/adblock_editor.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2015 The Chromium Authors. All rights reserved.
+ Use of this source code is governed by a BSD-style license that can be
+ found in the LICENSE file. -->
+
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" >
+
+ <ScrollView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:id="@+id/scroll_view"
+ android:fillViewport="true" >
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:focusableInTouchMode="true" >
+
+ <org.chromium.components.browser_ui.widget.text.ChromeTextInputLayout
+ android:id="@+id/adblock_url"
+ style="@style/PreferenceScreenLayout"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" >
+ <!-- TODO(crbug.com/900912): Fix and remove lint ignore -->
+ <EditText
+ tools:ignore="Autofill"
+ android:id="@+id/adblock_url_edit"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:inputType="textUri"
+ android:singleLine="true"
+ android:hint="@string/options_adblock_edit_label" />
+ </org.chromium.components.browser_ui.widget.text.ChromeTextInputLayout>
+
+ <Space style="@style/ButtonBarTopSpacer" />
+ <View style="@style/ButtonBarTopDivider" />
+
+ <LinearLayout style="@style/ButtonBar" >
+ <org.chromium.ui.widget.ButtonCompat
+ android:id="@+id/adblock_reset"
+ style="@style/ButtonBarButton"
+ android:text="@string/reset" />
+
+ <org.chromium.ui.widget.ButtonCompat
+ android:id="@+id/adblock_cancel"
+ style="@style/ButtonBarButton"
+ android:text="@string/cancel" />
+
+ <org.chromium.ui.widget.ButtonCompat
+ android:id="@+id/adblock_save"
+ style="@style/ButtonBarButton"
+ android:text="@string/save" />
+ </LinearLayout>
+ </LinearLayout>
+ </ScrollView>
+
+ <include layout="@layout/settings_action_bar_shadow"/>
+
+</FrameLayout>
diff --git a/chrome/android/java/res/values/values.xml b/chrome/android/java/res/values/values.xml
--- a/chrome/android/java/res/values/values.xml
+++ b/chrome/android/java/res/values/values.xml
@@ -69,6 +69,8 @@
<!-- Our manage space activity. Default pre-KitKat to be nothing. -->
<string name="manage_space_activity"></string>
+ <string name="adblock_help_url">https://www.bromite.org/custom-filters</string>
+
<!-- Value for scaleX to mirror drawables correctly for LTR / RTL layouts. -->
<integer name="automirror_scale_x_reverse">-1</integer>
diff --git a/chrome/android/java/res/xml/adblock_preferences.xml b/chrome/android/java/res/xml/adblock_preferences.xml
new file mode 100644
--- /dev/null
+++ b/chrome/android/java/res/xml/adblock_preferences.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2015 The Chromium Authors. All rights reserved.
+ Use of this source code is governed by a BSD-style license that can be
+ found in the LICENSE file. -->
+
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
+
+ <org.chromium.chrome.browser.settings.ChromeSwitchPreference
+ android:key="adblock_switch"
+ android:summaryOn="@string/text_on"
+ android:summaryOff="@string/text_off" />
+
+ <org.chromium.chrome.browser.settings.HyperlinkPreference
+ android:key="adblock_help"
+ android:title="@string/adblock_help"
+ app:url="@string/adblock_help_url" />
+
+ <Preference
+ android:key="adblock_edit"
+ android:title="@string/options_adblock_edit_label"
+ android:fragment="org.chromium.chrome.browser.settings.AdBlockEditor" />
+
+</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/main_preferences.xml b/chrome/android/java/res/xml/main_preferences.xml
--- a/chrome/android/java/res/xml/main_preferences.xml
+++ b/chrome/android/java/res/xml/main_preferences.xml
@@ -55,6 +55,11 @@
android:key="privacy"
android:order="12"
android:title="@string/prefs_privacy"/>
+ <Preference
+ android:fragment="org.chromium.chrome.browser.settings.AdBlockPreferences"
+ android:key="adblock"
+ android:order="13"
+ android:title="@string/prefs_adblock"/>
<Preference
android:fragment="org.chromium.chrome.browser.settings.accessibility.AccessibilitySettings"
android:key="accessibility"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/flags/FeatureUtilities.java b/chrome/android/java/src/org/chromium/chrome/browser/flags/FeatureUtilities.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/flags/FeatureUtilities.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/flags/FeatureUtilities.java
@@ -238,6 +238,14 @@ public class FeatureUtilities {
ChromeFeatureList.isEnabled(ChromeFeatureList.REACHED_CODE_PROFILER));
}
+ public static void setAdBlockFiltersURL(String url) {
+ FeatureUtilitiesJni.get().setAdBlockFiltersURL(url);
+ }
+
+ public static String getAdBlockFiltersURL() {
+ return FeatureUtilitiesJni.get().getAdBlockFiltersURL();
+ }
+
/**
* @return True if tab model merging for Android N+ is enabled.
*/
@@ -785,5 +793,7 @@ public class FeatureUtilities {
@NativeMethods
interface Natives {
boolean isNetworkServiceWarmUpEnabled();
+ void setAdBlockFiltersURL(String url);
+ String getAdBlockFiltersURL();
}
}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/AdBlockEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/AdBlockEditor.java
new file mode 100644
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/AdBlockEditor.java
@@ -0,0 +1,92 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.settings;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.EditText;
+
+import org.chromium.chrome.browser.settings.SettingsUtils;
+import org.chromium.chrome.browser.flags.FeatureUtilities;
+import org.chromium.chrome.R;
+import org.chromium.components.url_formatter.UrlFormatter;
+
+/**
+ * Provides the Java-UI for editing AdBlock preferences.
+ */
+public class AdBlockEditor extends Fragment implements TextWatcher {
+ private EditText mAdBlockFiltersUrlEdit;
+ private Button mSaveButton;
+ private Button mResetButton;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ getActivity().setTitle(R.string.options_adblock_edit_title);
+
+ View v = inflater.inflate(R.layout.adblock_editor, container, false);
+ View scrollView = v.findViewById(R.id.scroll_view);
+ scrollView.getViewTreeObserver().addOnScrollChangedListener(
+ SettingsUtils.getShowShadowOnScrollListener(v, v.findViewById(R.id.shadow)));
+ mAdBlockFiltersUrlEdit = (EditText) v.findViewById(R.id.adblock_url_edit);
+ mAdBlockFiltersUrlEdit.setText(FeatureUtilities.getAdBlockFiltersURL());
+ mAdBlockFiltersUrlEdit.addTextChangedListener(this);
+ mAdBlockFiltersUrlEdit.requestFocus();
+
+ initializeSaveCancelResetButtons(v);
+ return v;
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ mSaveButton.setEnabled(s.length() != 0);
+ mResetButton.setEnabled(true);
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ }
+
+ private void initializeSaveCancelResetButtons(View v) {
+ mResetButton = (Button) v.findViewById(R.id.adblock_reset);
+ mResetButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mAdBlockFiltersUrlEdit.setText(FeatureUtilities.getAdBlockFiltersURL());
+ getActivity().finish();
+ }
+ });
+
+ mSaveButton = (Button) v.findViewById(R.id.adblock_save);
+ mSaveButton.setEnabled(false);
+ mSaveButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ FeatureUtilities.setAdBlockFiltersURL(
+ UrlFormatter.fixupUrl(mAdBlockFiltersUrlEdit.getText().toString()));
+ getActivity().finish();
+ }
+ });
+
+ Button button = (Button) v.findViewById(R.id.adblock_cancel);
+ button.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ getActivity().finish();
+ }
+ });
+ }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/AdBlockPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/AdBlockPreferences.java
new file mode 100644
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/AdBlockPreferences.java
@@ -0,0 +1,56 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.settings;
+
+import android.os.Bundle;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceFragmentCompat;
+import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
+
+import org.chromium.chrome.browser.settings.website.WebsitePreferenceBridge;
+import org.chromium.components.content_settings.ContentSettingsType;
+import org.chromium.chrome.browser.settings.SettingsUtils;
+import org.chromium.chrome.browser.flags.FeatureUtilities;
+import androidx.annotation.VisibleForTesting;
+import org.chromium.chrome.R;
+
+/**
+ * Fragment that allows the user to configure AdBlock related preferences.
+ */
+public class AdBlockPreferences extends PreferenceFragmentCompat {
+ @VisibleForTesting
+ public static final String PREF_ADBLOCK_SWITCH = "adblock_switch";
+ private static final String PREF_ADBLOCK_EDIT = "adblock_edit";
+
+ private Preference mAdBlockEdit;
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ getActivity().setTitle(R.string.options_adblock_title);
+ SettingsUtils.addPreferencesFromResource(this, R.xml.adblock_preferences);
+
+ ChromeSwitchPreference mAdBlockSwitch =
+ (ChromeSwitchPreference) findPreference(PREF_ADBLOCK_SWITCH);
+ boolean isAdBlockEnabled = !WebsitePreferenceBridge.isCategoryEnabled(ContentSettingsType.ADS);
+ mAdBlockSwitch.setChecked(isAdBlockEnabled);
+ mAdBlockSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
+ WebsitePreferenceBridge.setCategoryEnabled(ContentSettingsType.ADS, !(boolean) newValue);
+ return true;
+ });
+
+ mAdBlockEdit = findPreference(PREF_ADBLOCK_EDIT);
+ updateCurrentAdBlockUrl();
+ }
+
+ private void updateCurrentAdBlockUrl() {
+ mAdBlockEdit.setSummary(FeatureUtilities.getAdBlockFiltersURL());
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ updateCurrentAdBlockUrl();
+ }
+}
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -9937,6 +9937,16 @@ Please help our engineers fix this problem. Tell us what happened right before y
Never show this again.
</message>
+ <!-- Ad Blocking preferences -->
+ <if expr="is_android">
+ <message name="IDS_OPTIONS_ADBLOCK_TITLE" desc="The title of the Ad Blocking option on Android" formatter_data="android_java">
+ Ad Blocking
+ </message>
+ <message name="IDS_OPTIONS_ADBLOCK_SUMMARY" desc="The title of the Ad Blocking summary on Android" formatter_data="android_java">
+ Configure Ad Blocking and filters URL
+ </message>
+ </if>
+
<!-- Ad Blocking UI strings. -->
<message name="IDS_ALWAYS_ALLOW_ADS" desc="Explanation associated with a toggle to allow ads after ads have been blocked on the page. To be used on pages where the ad blocking UI is governed by a persistent permissions-based whitelist.">
Always allow ads on this site
diff --git a/chrome/browser/android/feature_utilities.cc b/chrome/browser/android/feature_utilities.cc
--- a/chrome/browser/android/feature_utilities.cc
+++ b/chrome/browser/android/feature_utilities.cc
@@ -32,6 +32,14 @@ std::string GetReachedCodeProfilerTrialGroup() {
} // namespace android
} // namespace chrome
+static ScopedJavaLocalRef<jstring> JNI_FeatureUtilities_GetAdBlockFiltersURL(JNIEnv* env) {
+ return base::android::ConvertUTF8ToJavaString(env, g_browser_process->local_state()->GetString(prefs::kAdBlockFiltersURL));
+}
+
+static void JNI_FeatureUtilities_SetAdBlockFiltersURL(JNIEnv* env, const JavaParamRef<jstring>& url) {
+ g_browser_process->local_state()->SetString(prefs::kAdBlockFiltersURL, base::android::ConvertJavaStringToUTF8(env, url));
+}
+
static jboolean JNI_FeatureUtilities_IsNetworkServiceWarmUpEnabled(
JNIEnv* env) {
return content::IsOutOfProcessNetworkService() &&
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc
--- a/chrome/browser/browser_process_impl.cc
+++ b/chrome/browser/browser_process_impl.cc
@@ -1035,7 +1035,8 @@ BrowserProcessImpl::adblock_updater() {
adblock_updater_ = std::make_unique<adblock_updater::AdBlockUpdaterService>(
g_browser_process->system_network_context_manager()->GetSharedURLLoaderFactory(),
std::move(scheduler),
- g_browser_process->subresource_filter_ruleset_service());
+ g_browser_process->subresource_filter_ruleset_service(),
+ local_state()->GetString(prefs::kAdBlockFiltersURL));
return adblock_updater_.get();
}
diff --git a/chrome/browser/net/system_network_context_manager.cc b/chrome/browser/net/system_network_context_manager.cc
--- a/chrome/browser/net/system_network_context_manager.cc
+++ b/chrome/browser/net/system_network_context_manager.cc
@@ -358,6 +358,8 @@ SystemNetworkContextManager::SystemNetworkContextManager(
ssl_config_service_manager_(
SSLConfigServiceManager::CreateDefaultManager(local_state_)),
proxy_config_monitor_(local_state_) {
+ local_state_->SetDefaultPrefValue(prefs::kAdBlockFiltersURL,
+ base::Value("https://www.bromite.org/filters/filters.dat"));
#if !defined(OS_ANDROID)
// QuicAllowed was not part of Android policy.
const base::Value* value =
@@ -462,6 +464,7 @@ SystemNetworkContextManager::~SystemNetworkContextManager() {
// static
void SystemNetworkContextManager::RegisterPrefs(PrefRegistrySimple* registry) {
+ registry->RegisterStringPref(prefs::kAdBlockFiltersURL, std::string());
// Register the DnsClient and DoH preferences. The feature list has not been
// initialized yet, so setting the preference defaults here to reflect the
// corresponding features will only cause the preference defaults to reflect
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -801,6 +801,20 @@ Your Google account may have other forms of browsing history like searches and a
Captions
</message>
+ <!-- AdBlock settings -->
+ <message name="IDS_PREFS_ADBLOCK" desc="Title of the AdBlock Settings screen. [CHAR-LIMIT=32]">
+ AdBlock settings
+ </message>
+ <message name="IDS_OPTIONS_ADBLOCK_EDIT_TITLE" desc="The title of the screen that allows users to change the URL that is used to fetch the ad blocker filters.">
+ Edit filters URL
+ </message>
+ <message name="IDS_OPTIONS_ADBLOCK_EDIT_LABEL" desc="The label for the edit text field that allows the user to change the URL that is used to fetch the ad blocker filters.">
+ Filters URL
+ </message>
+ <message name="IDS_ADBLOCK_HELP" desc="The title of the hyperlink that allows users to visit the web page with instructions for custom ad blocker filters.">
+ Visit help page
+ </message>
+
<!-- Site settings -->
<message name="IDS_PREFS_SITE_SETTINGS" desc="Title of the Website Settings screen. [CHAR-LIMIT=32]">
Site settings
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -1998,6 +1998,9 @@ const char kAudioCaptureAllowed[] = "hardware.audio_capture_enabled";
// capture devices without prompt.
const char kAudioCaptureAllowedUrls[] = "hardware.audio_capture_allowed_urls";
+// Holds the URL to an indexed subresource filters file.
+const char kAdBlockFiltersURL[] = "adblock.filters_url";
+
// A pref holding the value of the policy used to explicitly allow or deny
// access to video capture devices. When enabled or not set, the user is
// prompted for device access. When disabled, access to video capture devices
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -30,6 +30,7 @@ extern const char kDownloadRestrictions[];
extern const char kForceEphemeralProfiles[];
extern const char kHomePageIsNewTabPage[];
extern const char kHomePage[];
+extern const char kAdBlockFiltersURL[];
extern const char kImportantSitesDialogHistory[];
#if defined(OS_WIN)
extern const char kLastProfileResetTimestamp[];
diff --git a/components/component_updater/adblock_updater_service.cc b/components/component_updater/adblock_updater_service.cc
--- a/components/component_updater/adblock_updater_service.cc
+++ b/components/component_updater/adblock_updater_service.cc
@@ -46,12 +46,12 @@ const int initial_check_delay = 5,
next_check_delay = 60*60*24*7, // 1 week
on_demand_check_delay = 60; // minimum 1 minute between each on-demand check
-AdBlockUpdaterService::AdBlockUpdaterService(scoped_refptr<network::SharedURLLoaderFactory> shared_url_network_factory, std::unique_ptr<component_updater::UpdateScheduler> scheduler, subresource_filter::RulesetService* ruleset_service)
+AdBlockUpdaterService::AdBlockUpdaterService(scoped_refptr<network::SharedURLLoaderFactory> shared_url_network_factory, std::unique_ptr<component_updater::UpdateScheduler> scheduler,
+ subresource_filter::RulesetService* ruleset_service, std::string filters_url)
: ruleset_service_(ruleset_service), shared_url_network_factory_(shared_url_network_factory), scheduler_(std::move(scheduler)) {
DCHECK(ruleset_service);
- //TODO: retrieve filters URL from config/prefs
- filters_url_ = "https://www.bromite.org/filters/filters.dat";
+ filters_url_ = filters_url;
}
AdBlockUpdaterService::~AdBlockUpdaterService() {
diff --git a/components/component_updater/adblock_updater_service.h b/components/component_updater/adblock_updater_service.h
--- a/components/component_updater/adblock_updater_service.h
+++ b/components/component_updater/adblock_updater_service.h
@@ -54,7 +54,8 @@ class Observer {
// All methods are safe to call ONLY from the browser's main thread.
class AdBlockUpdaterService {
public:
- AdBlockUpdaterService(scoped_refptr<network::SharedURLLoaderFactory> shared_url_network_factory, std::unique_ptr<component_updater::UpdateScheduler> scheduler, subresource_filter::RulesetService* ruleset_service);
+ AdBlockUpdaterService(scoped_refptr<network::SharedURLLoaderFactory> shared_url_network_factory, std::unique_ptr<component_updater::UpdateScheduler> scheduler,
+ subresource_filter::RulesetService* ruleset_service, std::string filters_url);
~AdBlockUpdaterService();
// Adds an observer for this class. An observer should not be added more
--
2.17.1
@@ -1,218 +0,0 @@
From: uazo <uazo@users.noreply.github.com>
Date: Mon, 21 Aug 2023 14:03:25 +0000
Subject: Add option to disable snapshots
License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
---
.../tab_management/TabGridViewBinder.java | 8 +++-
.../tasks/tab_management/TabProperties.java | 5 +++
.../java/res/xml/privacy_preferences.xml | 5 +++
.../chrome/browser/app/ChromeActivity.java | 4 +-
.../privacy/settings/PrivacySettings.java | 44 ++++++++++++++++++-
.../strings/android_chrome_strings.grd | 8 ++++
6 files changed, 71 insertions(+), 3 deletions(-)
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java
@@ -497,7 +497,12 @@ class TabGridViewBinder {
if (result != null) {
TabUtils.setDrawableAndUpdateImageMatrix(thumbnail, result, thumbnailSize);
} else {
- thumbnail.setImageDrawable(null);
+ TabFavicon tabFavicon = model.get(TabProperties.FAVICON);
+ if (tabFavicon != null) {
+ thumbnail.setScaleType(ImageView.ScaleType.CENTER);
+ thumbnail.setImageDrawable(
+ isSelected ? tabFavicon.getSelectedDrawable() : tabFavicon.getDefaultDrawable());
+ }
}
};
if (sThumbnailFetcherForTesting != null) {
@@ -535,6 +540,7 @@ class TabGridViewBinder {
*/
private static void setFavicon(
ImageView faviconView, PropertyModel model, @Nullable TabFavicon favicon) {
+ model.set(TabProperties.FAVICON, favicon);
if (favicon == null) {
faviconView.setImageDrawable(null);
return;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabProperties.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabProperties.java
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabProperties.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabProperties.java
@@ -130,6 +130,9 @@ public class TabProperties {
public static final WritableBooleanPropertyKey FAVICON_FETCHED =
new WritableBooleanPropertyKey();
+ public static final WritableObjectPropertyKey<TabListFaviconProvider.TabFavicon> FAVICON =
+ new WritableObjectPropertyKey<>();
+
/** Property for lazily fetching favicons when required by an item in a UI. */
public static final WritableObjectPropertyKey<TabListFaviconProvider.TabFaviconFetcher>
FAVICON_FETCHER = new WritableObjectPropertyKey<>();
@@ -224,6 +227,7 @@ public class TabProperties {
CARD_TYPE,
CONTENT_DESCRIPTION_TEXT_RESOLVER,
ACTION_BUTTON_DESCRIPTION_TEXT_RESOLVER,
+ FAVICON,
QUICK_DELETE_ANIMATION_STATUS,
TAB_GROUP_COLOR_VIEW_PROVIDER,
TAB_GROUP_CARD_COLOR,
@@ -264,6 +268,7 @@ public class TabProperties {
TAB_ACTION_BUTTON_DATA,
FAVICON_FETCHED,
FAVICON_FETCHER,
+ FAVICON,
IS_SELECTED,
TITLE,
HAS_NOTIFICATION_BUBBLE
diff --git a/chrome/android/java/res/xml/privacy_preferences.xml b/chrome/android/java/res/xml/privacy_preferences.xml
--- a/chrome/android/java/res/xml/privacy_preferences.xml
+++ b/chrome/android/java/res/xml/privacy_preferences.xml
@@ -73,6 +73,11 @@ found in the LICENSE file.
android:title="@string/open_external_links_incognito_title"
android:summary="@string/open_external_links_incognito_summary"
android:defaultValue="false" />
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
+ android:key="tabgrid_use_icons"
+ android:title="@string/tabgrid_use_icons_title"
+ android:summary="@string/tabgrid_use_icons_summary"
+ android:defaultValue="false" />
<Preference
android:key="preload_pages"
android:title="@string/preload_pages_title"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
@@ -152,6 +152,7 @@ import org.chromium.chrome.browser.preferences.ChromeSharedPreferences;
import org.chromium.chrome.browser.preferences.Pref;
import org.chromium.chrome.browser.price_tracking.PriceDropNotificationManagerFactory;
import org.chromium.chrome.browser.printing.TabPrinter;
+import org.chromium.chrome.browser.privacy.settings.PrivacySettings;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.profiles.ProfileManager;
import org.chromium.chrome.browser.profiles.ProfileManagerUtils;
@@ -658,7 +659,8 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
new TabContentManager(
this,
mBrowserControlsManagerSupplier.get(),
- /* snapshotsEnabled= */ true,
+ !TabUiFeatureUtilities.shouldUseListMode()
+ && !ContextUtils.getAppSharedPreferences().getBoolean(PrivacySettings.PREF_TABGRID_USE_ICONS, false),
tabModelSelector != null ? tabModelSelector::getTabById : null,
TabWindowManagerSingleton.getInstance()));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java
@@ -28,6 +28,7 @@ import org.chromium.base.ContextUtils;
import org.chromium.base.IntentUtils;
import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.metrics.RecordUserAction;
+import java.util.function.Supplier;
import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.base.supplier.ObservableSupplierImpl;
import org.chromium.build.annotations.NullMarked;
@@ -98,13 +99,27 @@ import org.chromium.chrome.browser.preferences.ChromeSharedPreferences;
import org.chromium.components.browser_ui.settings.ChromeSwitchPreference;
import org.chromium.components.browser_ui.settings.ManagedPreferenceDelegate;
+import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
+import org.chromium.chrome.browser.ui.messages.snackbar.INeedSnackbarManager;
+import org.chromium.chrome.browser.ui.messages.snackbar.Snackbar;
+import org.chromium.chrome.browser.lifetime.ApplicationLifetime;
+
import java.util.ArrayList;
import java.util.List;
/** Fragment to keep track of the all the privacy related preferences. */
@NullMarked
public class PrivacySettings extends ChromeBaseSettingsFragment
- implements Preference.OnPreferenceChangeListener {
+ implements Preference.OnPreferenceChangeListener, INeedSnackbarManager {
+
+ private Supplier<SnackbarManager> mSnackbarManagerSupplier;
+ private Snackbar mSnackbar;
+
+ @Override
+ public void setSnackbarManagerSupplier(Supplier<SnackbarManager> manager) {
+ mSnackbarManagerSupplier = manager;
+ }
+
private static final String PREF_CAN_MAKE_PAYMENT = "can_make_payment";
private static final String PREF_PRELOAD_PAGES = "preload_pages";
private static final String PREF_HTTPS_FIRST_MODE = "https_first_mode";
@@ -216,6 +231,21 @@ public class PrivacySettings extends ChromeBaseSettingsFragment
}
}
+ mSnackbar = Snackbar.make(getActivity().getString(R.string.ui_relaunch_notice),
+ new SnackbarManager.SnackbarController() {
+ @Override
+ public void onDismissNoAction(Object actionData) { }
+
+ @Override
+ public void onAction(Object actionData) {
+ ApplicationLifetime.terminate(true);
+ }
+ }, Snackbar.TYPE_NOTIFICATION, Snackbar.UMA_UNKNOWN)
+ .setDefaultLines(false)
+ .setAction(getActivity().getString(R.string.relaunch),
+ /*actionData*/null)
+ .setDuration(/*durationMs*/70000);
+
Preference privacyGuidePreference = findPreference(PREF_PRIVACY_GUIDE);
// Record the launch of PG from the S&P link-row entry point
privacyGuidePreference.setOnPreferenceClickListener(
@@ -441,6 +471,7 @@ public class PrivacySettings extends ChromeBaseSettingsFragment
public static final String PREF_ALLOW_CUSTOM_TAB_INTENTS = "allow_custom_tab_intents";
public static final String PREF_OPEN_EXTERNAL_LINKS_INCOGNITO = "open_external_links_incognito";
+ public static final String PREF_TABGRID_USE_ICONS = "tabgrid_use_icons";
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
@@ -487,6 +518,13 @@ public class PrivacySettings extends ChromeBaseSettingsFragment
SharedPreferences.Editor sharedPreferencesEditor = ContextUtils.getAppSharedPreferences().edit();
sharedPreferencesEditor.putBoolean(PREF_OPEN_EXTERNAL_LINKS_INCOGNITO, (boolean)newValue);
sharedPreferencesEditor.apply();
+ } else if (PREF_TABGRID_USE_ICONS.equals(key)) {
+ SharedPreferences.Editor sharedPreferencesEditor = ContextUtils.getAppSharedPreferences().edit();
+ sharedPreferencesEditor.putBoolean(PREF_TABGRID_USE_ICONS, (boolean)newValue);
+ sharedPreferencesEditor.apply();
+ if (!mSnackbarManagerSupplier.get().isShowing()) {
+ mSnackbarManagerSupplier.get().showSnackbar(mSnackbar);
+ }
}
return true;
}
@@ -537,6 +575,10 @@ public class PrivacySettings extends ChromeBaseSettingsFragment
: R.string.text_off);
}
+ Preference tabGridUseIcons =
+ (ChromeSwitchPreference) findPreference(PREF_TABGRID_USE_ICONS);
+ tabGridUseIcons.setOnPreferenceChangeListener(this);
+
Preference refererPolicyPref = findPreference(PREF_REFERER_POLICY);
refererPolicyPref.setSummary(
RefererSettingsFragment.getRefererSummaryString(getContext()));
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -6185,6 +6185,14 @@ To change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>delete the Chrome d
Your <ph name="FQDN">%1$s<ex>www.amazon.com</ex></ph> timer ran out. It'll start again tomorrow.
</message>
+ <!-- Tab Broup Disable Thumbnail -->
+ <message name="IDS_TABGRID_USE_ICONS_TITLE" desc="Text for 'Use icons in the tab grid' settings-privacy option.">
+ Use only icons in the tab grid
+ </message>
+ <message name="IDS_TABGRID_USE_ICONS_SUMMARY" desc="Summary text for 'Use icons in the tab grid' settings-privacy option.">
+ Disable saving snapshots to disk (even for incognito sessions)
+ </message>
+
<!-- Tab Group Tab Switcher strings -->
<message name="IDS_TAB_MANAGEMENT_MODULE_TITLE" desc="Text shown when the Tab Management module is referenced in install start, success, failure UI (e.g. in IDS_MODULE_INSTALL_START_TEXT, which will expand to 'Installing Tab management for Chrome…').">
Tab management
--
@@ -1,747 +0,0 @@
From: uazo <uazo@users.noreply.github.com>
Date: Sun, 5 May 2024 09:34:39 +0000
Subject: Add option to force tablet UI
License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
---
.../layout/custom_tabs_control_container.xml | 2 +-
.../java/res/layout/recent_tabs_page.xml | 2 +-
.../java/res/values-sw600dp/dimens.xml | 4 ++--
chrome/android/java/res/values/dimens.xml | 6 +++++-
.../browser/ChromeBaseAppCompatActivity.java | 3 +++
.../chrome/browser/WarmupManager.java | 5 ++++-
.../ChromeAccessibilitySettingsDelegate.java | 19 ++++++++++++++++++
.../chrome/browser/app/ChromeActivity.java | 4 +++-
.../overlays/strip/StripLayoutHelper.java | 10 ++++++++--
.../strip/StripLayoutHelperManager.java | 6 +++++-
.../scene_layer/TabStripSceneLayer.java | 8 ++++++++
.../init/ChromeBrowserInitializer.java | 2 ++
.../tabbed_mode/TabbedRootUiCoordinator.java | 4 +++-
.../chrome/browser/ui/RootUiCoordinator.java | 6 +++++-
chrome/browser/preferences/BUILD.gn | 1 +
.../preferences/ChromePreferenceKeys.java | 1 +
.../preferences/ChromeSharedPreferences.java | 12 +++++++++++
.../LegacyChromePreferenceKeys.java | 1 +
.../AppHeaderCoordinator.java | 2 ++
.../omnibox/LocationBarCoordinator.java | 2 +-
.../strings/android_chrome_strings.grd | 7 +++++++
.../java/res/layout/control_container.xml | 8 ++++----
.../java/res/layout/toolbar_tablet.xml | 2 +-
.../java/res/values-sw600dp/dimens.xml | 5 +++--
.../toolbar/java/res/values/dimens.xml | 6 ++++--
.../browser/toolbar/ControlContainer.java | 2 +-
.../toolbar/top/ToolbarControlContainer.java | 20 ++++++++++++++++++-
.../browser/toolbar/top/ToolbarLayout.java | 5 ++++-
.../tab_strip/HeightTransitionHandler.java | 2 ++
.../TabStripTransitionCoordinator.java | 6 +++++-
.../res/xml/accessibility_preferences.xml | 5 +++++
.../accessibility/AccessibilitySettings.java | 13 ++++++++++++
.../AccessibilitySettingsDelegate.java | 2 ++
.../chromium/ui/base/DeviceFormFactor.java | 14 +++++++++++++
34 files changed, 171 insertions(+), 26 deletions(-)
diff --git a/chrome/android/java/res/layout/custom_tabs_control_container.xml b/chrome/android/java/res/layout/custom_tabs_control_container.xml
--- a/chrome/android/java/res/layout/custom_tabs_control_container.xml
+++ b/chrome/android/java/res/layout/custom_tabs_control_container.xml
@@ -31,7 +31,7 @@ found in the LICENSE file.
android:id="@+id/find_toolbar_stub"
android:inflatedId="@+id/find_toolbar"
android:visibility="gone"
- android:layout_marginTop="@dimen/tab_strip_height"
+ android:layout_marginTop="@dimen/tab_strip_height_cromite"
android:layout_width="match_parent"
android:layout_height="@dimen/custom_tabs_control_container_height"
android:layout="@layout/find_toolbar" />
diff --git a/chrome/android/java/res/layout/recent_tabs_page.xml b/chrome/android/java/res/layout/recent_tabs_page.xml
--- a/chrome/android/java/res/layout/recent_tabs_page.xml
+++ b/chrome/android/java/res/layout/recent_tabs_page.xml
@@ -11,7 +11,7 @@ found in the LICENSE file.
android:id="@+id/history_navigation"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:paddingTop="@dimen/tab_strip_height" >
+ android:paddingTop="@dimen/tab_strip_height_cromite" >
<org.chromium.chrome.browser.ntp.NativePageRootFrameLayout
android:id="@+id/recent_tabs_root"
diff --git a/chrome/android/java/res/values-sw600dp/dimens.xml b/chrome/android/java/res/values-sw600dp/dimens.xml
--- a/chrome/android/java/res/values-sw600dp/dimens.xml
+++ b/chrome/android/java/res/values-sw600dp/dimens.xml
@@ -14,8 +14,8 @@ found in the LICENSE file.
<dimen name="compositor_tab_title_text_size">14sp</dimen>
<!-- Full Screen Dimensions -->
- <dimen name="control_container_height">96dp</dimen>
- <dimen name="custom_tabs_control_container_height">64dp</dimen>
+ <dimen name="control_container_height_cromite">96dp</dimen>
+ <dimen name="control_container_height_tabletui">96dp</dimen>
<!-- NTP dimensions -->
<dimen name="ntp_search_box_transition_start_offset">60dp</dimen>
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml
--- a/chrome/android/java/res/values/dimens.xml
+++ b/chrome/android/java/res/values/dimens.xml
@@ -119,9 +119,13 @@ found in the LICENSE file.
<dimen name="tab_modal_scrim_vertical_margin">16dp</dimen>
<!-- Should match toolbar_height_no_shadow -->
- <dimen name="control_container_height">@dimen/default_action_bar_height</dimen>
+ <dimen name="control_container_height_cromite">@dimen/default_action_bar_height</dimen>
+ <dimen name="control_container_height_tabletui">96dp</dimen>
<dimen name="custom_tabs_control_container_height">@dimen/default_action_bar_height</dimen>
+ <!-- The combined height of the tab strip and toolbar. -->
+ <dimen name="tab_strip_and_toolbar_height_cromite">56dp</dimen>
+
<!-- Find in Page dimensions -->
<dimen name="find_in_page_popup_width">375dp</dimen>
<dimen name="find_in_page_popup_height">64dp</dimen>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java
@@ -64,6 +64,7 @@ import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeController;
import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeControllerCreator;
import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeFieldTrialImpl;
import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeUtils;
+import org.chromium.chrome.browser.preferences.ChromeSharedPreferences;
import org.chromium.chrome.browser.ui.edge_to_edge.SimpleEdgeToEdgeController;
import org.chromium.components.browser_ui.styles.SemanticColorUtils;
import org.chromium.components.browser_ui.util.AutomotiveUtils;
@@ -145,6 +146,8 @@ public class ChromeBaseAppCompatActivity extends AppCompatActivity
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(newBase);
+ ChromeSharedPreferences.warmUp();
+
// Make sure the "chrome" split is loaded before checking if ClassLoaders are equal.
SplitChromeApplication.finishPreload(CHROME_SPLIT_NAME);
ClassLoader chromeModuleClassLoader = ChromeBaseAppCompatActivity.class.getClassLoader();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java b/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java
@@ -63,6 +63,7 @@ import org.chromium.chrome.browser.toolbar.ControlContainer;
import org.chromium.components.embedder_support.util.UrlConstants;
import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.LayoutInflaterUtils;
+import org.chromium.ui.base.DeviceFormFactor;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.display.DisplayUtil;
import org.chromium.url.GURL;
@@ -472,7 +473,9 @@ public class WarmupManager {
ControlContainer controlContainer = mainView.findViewById(R.id.control_container);
if (toolbarId != ActivityUtils.NO_RESOURCE_ID && controlContainer != null) {
- controlContainer.initWithToolbar(toolbarId);
+ controlContainer.initWithToolbar(toolbarId,
+ DeviceFormFactor.isForceTabletUI()
+ ? R.dimen.control_container_height_tabletui : 0);
}
return mainView;
} catch (InflateException e) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java
@@ -65,6 +65,25 @@ public class ChromeAccessibilitySettingsDelegate implements AccessibilitySetting
}
}
+ private static class ForceTabletUIDelegate implements BooleanPreferenceDelegate {
+ @Override
+ public boolean getValue() {
+ return ChromeSharedPreferences.getInstance().readBoolean(
+ ChromePreferenceKeys.FLAGS_FORCE_TABLET_UI_ENABLED, false);
+ }
+
+ @Override
+ public void setValue(boolean value) {
+ ChromeSharedPreferences.getInstance().writeBoolean(
+ ChromePreferenceKeys.FLAGS_FORCE_TABLET_UI_ENABLED, value);
+ }
+ }
+
+ @Override
+ public BooleanPreferenceDelegate getForceTabletUIDelegate() {
+ return new ForceTabletUIDelegate();
+ }
+
private final Profile mProfile;
/**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
@@ -808,7 +808,9 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
// Inflate the correct toolbar layout for the device.
int toolbarLayoutId = getToolbarLayoutId();
if (toolbarLayoutId != ActivityUtils.NO_RESOURCE_ID && controlContainer != null) {
- controlContainer.initWithToolbar(toolbarLayoutId);
+ controlContainer.initWithToolbar(toolbarLayoutId,
+ DeviceFormFactor.isForceTabletUI()
+ ? R.dimen.control_container_height_tabletui : 0);
}
onInitialLayoutInflationComplete();
}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java
@@ -132,6 +132,7 @@ import org.chromium.components.tab_group_sync.TabGroupSyncService;
import org.chromium.components.tab_group_sync.TriggerSource;
import org.chromium.components.tab_groups.TabGroupColorId;
import org.chromium.ui.accessibility.AccessibilityState;
+import org.chromium.ui.base.DeviceFormFactor;
import org.chromium.ui.base.LocalizationUtils;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.util.ColorUtils;
@@ -5039,8 +5040,13 @@ public class StripLayoutHelper
mCloseButtonMenu.setAnchorView(tabView);
// 3. Set the vertical offset to align the close button menu with bottom of the tab strip
int tabHeight = mManagerHost.getHeight();
- int verticalOffset =
- -(tabHeight - (int) mContext.getResources().getDimension(R.dimen.tab_strip_height));
+ int tab_strip_height =
+ (int) mContext.getResources().getDimension(R.dimen.tab_strip_height_cromite);
+ if (DeviceFormFactor.isForceTabletUI()) {
+ tab_strip_height =
+ (int) mContext.getResources().getDimension(R.dimen.tab_strip_height_tabletui);
+ }
+ int verticalOffset = -(tabHeight - tab_strip_height);
mCloseButtonMenu.setVerticalOffset(verticalOffset);
// 4. Set the horizontal offset to align the close button menu with the right side of the
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java
@@ -105,6 +105,7 @@ import org.chromium.components.browser_ui.desktop_windowing.DesktopWindowStateMa
import org.chromium.components.browser_ui.styles.SemanticColorUtils;
import org.chromium.components.browser_ui.widget.scrim.ScrimProperties;
import org.chromium.content_public.browser.LoadUrlParams;
+import org.chromium.ui.base.DeviceFormFactor;
import org.chromium.ui.base.LocalizationUtils;
import org.chromium.ui.base.PageTransition;
import org.chromium.ui.base.WindowAndroid;
@@ -498,7 +499,10 @@ public class StripLayoutHelperManager
mIsLayoutOptimizationsEnabled =
ToolbarFeatures.isTabStripWindowLayoutOptimizationEnabled(
/* isTablet= */ true, DisplayUtil.isContextInDefaultDisplay(mContext));
- mScrollableStripHeight = res.getDimension(R.dimen.tab_strip_height) / mDensity;
+ mScrollableStripHeight =
+ (DeviceFormFactor.isForceTabletUI()
+ ? res.getDimension(R.dimen.tab_strip_height_tabletui)
+ : res.getDimension(R.dimen.tab_strip_height_cromite)) / mDensity;
mHeight =
mIsLayoutOptimizationsEnabled
? toolbarManager.getTabStripHeightSupplier().get() / mDensity
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java
@@ -120,6 +120,14 @@ public class TabStripSceneLayer extends SceneOverlayLayer {
if (mNativePtr == 0) return;
final boolean visible = yOffset > -layoutHelper.getHeight();
+ if (DeviceFormFactor.isNonMultiDisplayContextOnTablet(ContextUtils.getApplicationContext())) {
+ TintedCompositorButton newTabButton = layoutHelper.getNewTabButton();
+ if (newTabButton.isVisible()) {
+ rightPaddingDp += newTabButton.getWidth() + layoutHelper.getNewTabBtnVisualOffset()
+ + StripLayoutGroupTitle.REORDER_BACKGROUND_PADDING_END;
+ }
+ }
+
// This will hide the tab strips if necessary.
TabStripSceneLayerJni.get()
.beginBuildingFrame(mNativePtr, visible, resourceManager, layerTitleCache);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
@@ -18,6 +18,7 @@ import org.chromium.base.task.TaskTraits;
import org.chromium.build.annotations.NullMarked;
import org.chromium.build.annotations.Nullable;
import org.chromium.chrome.browser.flags.ChromeSwitches;
+import org.chromium.chrome.browser.preferences.ChromeSharedPreferences;
import org.chromium.chrome.browser.profiles.ProfileManager;
import org.chromium.chrome.browser.signin.SigninCheckerProvider;
import org.chromium.components.background_task_scheduler.BackgroundTaskSchedulerFactory;
@@ -110,6 +111,7 @@ public class ChromeBrowserInitializer {
public void handlePreNativeStartupAndLoadLibraries(final BrowserParts parts) {
ThreadUtils.checkUiThread();
if (parts.isActivityFinishingOrDestroyed()) return;
+ ChromeSharedPreferences.warmUp();
ProcessInitializationHandler.getInstance().initializePreNative();
ProcessInitializationHandler.getInstance().initializePreNativeLibraryLoad();
try (TraceEvent e = TraceEvent.scoped("ChromeBrowserInitializer.preInflationStartup")) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
@@ -768,7 +768,9 @@ public class TabbedRootUiCoordinator extends RootUiCoordinator {
@Override
public int getControlContainerHeightResource() {
- return R.dimen.control_container_height;
+ if (DeviceFormFactor.isForceTabletUI())
+ return R.dimen.control_container_height_tabletui;
+ return R.dimen.control_container_height_cromite;
}
@Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java
@@ -110,6 +110,8 @@ import org.chromium.chrome.browser.paint_preview.DemoPaintPreview;
import org.chromium.chrome.browser.password_manager.ManagePasswordsReferrer;
import org.chromium.chrome.browser.password_manager.PasswordManagerLauncher;
import org.chromium.chrome.browser.pdf.PdfPage;
+import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
+import org.chromium.chrome.browser.preferences.ChromeSharedPreferences;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.quick_delete.QuickDeleteController;
import org.chromium.chrome.browser.quick_delete.QuickDeleteDelegateImpl;
@@ -1803,7 +1805,9 @@ public class RootUiCoordinator
if (!mSupportsFindInPageSupplier.getAsBoolean()) return;
int stubId = R.id.find_toolbar_stub;
- if (DeviceFormFactor.isNonMultiDisplayContextOnTablet(mActivity)) {
+ if (DeviceFormFactor.isNonMultiDisplayContextOnTablet(mActivity) &&
+ !ChromeSharedPreferences.getInstance().readBoolean(
+ ChromePreferenceKeys.FLAGS_FORCE_TABLET_UI_ENABLED, false)) {
stubId = R.id.find_toolbar_tablet_stub;
}
mFindToolbarManager =
diff --git a/chrome/browser/preferences/BUILD.gn b/chrome/browser/preferences/BUILD.gn
--- a/chrome/browser/preferences/BUILD.gn
+++ b/chrome/browser/preferences/BUILD.gn
@@ -25,6 +25,7 @@ android_library("java") {
"//components/cached_flags:java",
"//third_party/androidx:androidx_annotation_annotation_java",
"//third_party/jni_zero:jni_zero_java",
+ "//ui/android:ui_java",
]
srcjar_deps = [
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
--- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
+++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
@@ -337,6 +337,7 @@ public final class ChromePreferenceKeys {
/** Whether the app-specific history info text was already seen by users. */
public static final String HISTORY_APP_SPECIFIC_INFO_SEEN =
"Chrome.History.AppSpecificInfoSeen";
+ public static final String FLAGS_FORCE_TABLET_UI_ENABLED = "force_tablet_ui_enabled";
/** Keys used to save settings related to homepage. */
public static final String DEPRECATED_HOMEPAGE_CUSTOM_URI = "homepage_custom_uri";
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromeSharedPreferences.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromeSharedPreferences.java
--- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromeSharedPreferences.java
+++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromeSharedPreferences.java
@@ -14,6 +14,8 @@ import org.chromium.build.annotations.NullMarked;
import org.chromium.build.annotations.Nullable;
import org.chromium.build.annotations.OptimizeAsNonNull;
+import org.chromium.ui.base.DeviceFormFactor;
+
@JNINamespace("android::shared_preferences")
@NullMarked
public class ChromeSharedPreferences {
@@ -26,6 +28,16 @@ public class ChromeSharedPreferences {
LegacyChromePreferenceKeys.getPrefixesInUse())
: null);
+ static {
+ DeviceFormFactor.setForceTabletUI(
+ ChromeSharedPreferences.getInstance().readBoolean(
+ ChromePreferenceKeys.FLAGS_FORCE_TABLET_UI_ENABLED, false));
+ }
+
+ public static void warmUp() {
+ // intentionally empty
+ }
+
/**
* @return The //base SharedPreferencesManager singleton.
*/
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/LegacyChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/LegacyChromePreferenceKeys.java
--- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/LegacyChromePreferenceKeys.java
+++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/LegacyChromePreferenceKeys.java
@@ -56,6 +56,7 @@ public class LegacyChromePreferenceKeys {
ChromePreferenceKeys.FIRST_RUN_FLOW_COMPLETE,
ChromePreferenceKeys.FIRST_RUN_FLOW_SIGNIN_SETUP,
ChromePreferenceKeys.FIRST_RUN_LIGHTWEIGHT_FLOW_COMPLETE,
+ ChromePreferenceKeys.FLAGS_FORCE_TABLET_UI_ENABLED,
ChromePreferenceKeys.FIRST_RUN_SKIP_WELCOME_PAGE,
ChromePreferenceKeys.HISTORY_SHOW_HISTORY_INFO,
ChromePreferenceKeys.HOMEPAGE_ENABLED,
diff --git a/chrome/browser/ui/android/desktop_windowing/java/src/org/chromium/chrome/browser/ui/desktop_windowing/AppHeaderCoordinator.java b/chrome/browser/ui/android/desktop_windowing/java/src/org/chromium/chrome/browser/ui/desktop_windowing/AppHeaderCoordinator.java
--- a/chrome/browser/ui/android/desktop_windowing/java/src/org/chromium/chrome/browser/ui/desktop_windowing/AppHeaderCoordinator.java
+++ b/chrome/browser/ui/android/desktop_windowing/java/src/org/chromium/chrome/browser/ui/desktop_windowing/AppHeaderCoordinator.java
@@ -42,6 +42,7 @@ import org.chromium.components.browser_ui.desktop_windowing.DesktopWindowStateMa
import org.chromium.ui.display.DisplayUtil;
import org.chromium.ui.edge_to_edge.EdgeToEdgeStateProvider;
import org.chromium.ui.insets.CaptionBarInsetsRectProvider;
+import org.chromium.ui.base.DeviceFormFactor;
import org.chromium.ui.insets.InsetObserver;
import org.chromium.ui.insets.InsetObserver.WindowInsetsConsumer;
import org.chromium.ui.insets.InsetsRectProvider;
@@ -281,6 +282,7 @@ public class AppHeaderCoordinator
InsetsRectProvider insetsRectProvider,
@DesktopWindowHeuristicResult int currentResult,
boolean isOnExternalDisplay) {
+ if (DeviceFormFactor.isForceTabletUI()) return DesktopWindowHeuristicResult.IN_DESKTOP_WINDOW;
@DesktopWindowHeuristicResult int newResult;
Insets captionBarInset = insetsRectProvider.getCachedInset();
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java
@@ -869,7 +869,7 @@ public class LocationBarCoordinator
}
private boolean isTabletWindow() {
- return DeviceFormFactor.isWindowOnTablet(mWindowAndroid);
+ return DeviceFormFactor.isWindowOnTablet(mWindowAndroid) || isTabletLayout();
}
/* package */ LocationBarMediator getMediatorForTesting() {
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -1489,6 +1489,13 @@ Your Google account may have other forms of browsing history like searches and a
Privacy guide explanation closed
</message>
+ <message name="IDS_FORCE_TABLET_UI_SUMMARY" desc="Summary of the preference that allows the user to force chromium to use tablet UI.">
+ Open chromium in Tablet Mode
+ </message>
+ <message name="IDS_FORCE_TABLET_UI_TITLE" desc="Title of the preference that allows the user to update force tablet UI settings.">
+ Force Tablet Mode
+ </message>
+
<!-- Safety check -->
<message name="IDS_PREFS_SAFETY_CHECK" desc="Title of the Safety check element in settings, allowing the user to check multiple areas of browser safety. [CHAR_LIMIT=32]">
Safety check
diff --git a/chrome/browser/ui/android/toolbar/java/res/layout/control_container.xml b/chrome/browser/ui/android/toolbar/java/res/layout/control_container.xml
--- a/chrome/browser/ui/android/toolbar/java/res/layout/control_container.xml
+++ b/chrome/browser/ui/android/toolbar/java/res/layout/control_container.xml
@@ -9,7 +9,7 @@ found in the LICENSE file.
android:id="@+id/control_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:minHeight="@dimen/control_container_height">
+ android:minHeight="@dimen/control_container_height_cromite">
<view
class="org.chromium.chrome.browser.toolbar.top.ToolbarControlContainer$ToolbarViewResourceCoordinatorLayout"
@@ -20,7 +20,7 @@ found in the LICENSE file.
<ViewStub
android:id="@+id/toolbar_stub"
android:layout_width="match_parent"
- android:layout_marginTop="@dimen/tab_strip_height"
+ android:layout_marginTop="@dimen/tab_strip_height_cromite"
android:layout_marginBottom="@dimen/toolbar_hairline_height"
android:layout_height="@dimen/toolbar_height_no_shadow" />
@@ -29,13 +29,13 @@ found in the LICENSE file.
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_anchorGravity="bottom"
- />
+ android:layout_marginTop="@dimen/control_container_height_cromite" />
<ViewStub
android:id="@+id/find_toolbar_stub"
android:inflatedId="@+id/find_toolbar"
android:visibility="gone"
- android:layout_marginTop="@dimen/tab_strip_height"
+ android:layout_marginTop="@dimen/tab_strip_height_cromite"
android:layout_width="match_parent"
android:layout_height="@dimen/toolbar_height_no_shadow"
android:layout="@layout/find_toolbar" />
diff --git a/chrome/browser/ui/android/toolbar/java/res/layout/toolbar_tablet.xml b/chrome/browser/ui/android/toolbar/java/res/layout/toolbar_tablet.xml
--- a/chrome/browser/ui/android/toolbar/java/res/layout/toolbar_tablet.xml
+++ b/chrome/browser/ui/android/toolbar/java/res/layout/toolbar_tablet.xml
@@ -15,7 +15,7 @@ found in the LICENSE file.
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="@dimen/toolbar_height_no_shadow"
- android:layout_marginTop="@dimen/tab_strip_height"
+ android:layout_marginTop="@dimen/tab_strip_height_tabletui"
android:background="@macro/default_bg_color"
>
diff --git a/chrome/browser/ui/android/toolbar/java/res/values-sw600dp/dimens.xml b/chrome/browser/ui/android/toolbar/java/res/values-sw600dp/dimens.xml
--- a/chrome/browser/ui/android/toolbar/java/res/values-sw600dp/dimens.xml
+++ b/chrome/browser/ui/android/toolbar/java/res/values-sw600dp/dimens.xml
@@ -7,6 +7,7 @@ found in the LICENSE file.
<resources>
<!-- Tab Strip Dimensions -->
- <dimen name="tab_strip_height">40dp</dimen>
- <dimen name="tab_strip_reserved_top_padding">2dp</dimen>
+ <dimen name="tab_strip_height_cromite">40dp</dimen>
+ <dimen name="tab_strip_height_tabletui">40dp</dimen>
+ <dimen name="tab_strip_reserved_top_padding_cromite">2dp</dimen>
</resources>
diff --git a/chrome/browser/ui/android/toolbar/java/res/values/dimens.xml b/chrome/browser/ui/android/toolbar/java/res/values/dimens.xml
--- a/chrome/browser/ui/android/toolbar/java/res/values/dimens.xml
+++ b/chrome/browser/ui/android/toolbar/java/res/values/dimens.xml
@@ -10,8 +10,10 @@ found in the LICENSE file.
<dimen name="toolbar_tab_count_text_size_2_digit">9dp</dimen>
<!-- Tab Strip Dimensions -->
- <dimen name="tab_strip_height">0dp</dimen>
- <dimen name="tab_strip_reserved_top_padding">0dp</dimen>
+ <dimen name="tab_strip_height_cromite">0dp</dimen>
+ <dimen name="tab_strip_height_tabletui">40dp</dimen>
+ <dimen name="tab_strip_reserved_top_padding_cromite">0dp</dimen>
+ <dimen name="tab_strip_reserved_top_padding_tabletui">2dp</dimen>
<dimen name="ntp_search_box_height">64dp</dimen>
<dimen name="ntp_search_box_height_tall">72dp</dimen>
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ControlContainer.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ControlContainer.java
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ControlContainer.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ControlContainer.java
@@ -26,7 +26,7 @@ public interface ControlContainer {
*
* @param toolbarLayoutId The ID of the toolbar layout to use.
*/
- void initWithToolbar(int toolbarLayoutId);
+ void initWithToolbar(int toolbarLayoutId, int controlContainerHeightOverrideId);
/**
* @return The {@link ViewResourceAdapter} that exposes this {@link View} as a CC resource.
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarControlContainer.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarControlContainer.java
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarControlContainer.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarControlContainer.java
@@ -7,6 +7,7 @@ package org.chromium.chrome.browser.toolbar.top;
import static org.chromium.build.NullUtil.assumeNonNull;
import android.content.Context;
+import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.PorterDuff;
@@ -170,8 +171,25 @@ public class ToolbarControlContainer extends OptimizedFrameLayout
@Override
@Initializer
- public void initWithToolbar(int toolbarLayoutId) {
+ public void initWithToolbar(int toolbarLayoutId, int controlContainerHeightOverrideId) {
try (TraceEvent te = TraceEvent.scoped("ToolbarControlContainer.initWithToolbar")) {
+ if (controlContainerHeightOverrideId != 0) {
+ Resources res = getContext().getResources();
+ setMinimumHeight((int) res.getDimension(controlContainerHeightOverrideId));
+ int tab_strip_height =
+ (int) res.getDimension(R.dimen.tab_strip_height_tabletui);
+
+ View view = findViewById(R.id.toolbar_stub);
+ if (view != null)
+ ((MarginLayoutParams)view.getLayoutParams()).topMargin = tab_strip_height;
+
+ view = findViewById(R.id.toolbar_hairline);
+ if (view != null) view.setVisibility(View.GONE);
+
+ view = findViewById(R.id.find_toolbar_stub);
+ if (view != null)
+ ((MarginLayoutParams)view.getLayoutParams()).topMargin = tab_strip_height;
+ }
mToolbarContainer = findViewById(R.id.toolbar_container);
ViewStub toolbarStub = findViewById(R.id.toolbar_stub);
toolbarStub.setLayoutResource(toolbarLayoutId);
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java
@@ -64,6 +64,7 @@ import org.chromium.chrome.browser.util.BrowserUiUtils.ModuleTypeOnStartAndNtp;
import org.chromium.components.feature_engagement.Tracker;
import org.chromium.ui.base.ViewUtils;
import org.chromium.ui.util.MotionEventUtils;
+import org.chromium.ui.base.DeviceFormFactor;
import org.chromium.ui.util.TokenHolder;
import org.chromium.url.GURL;
@@ -581,7 +582,9 @@ public abstract class ToolbarLayout extends FrameLayout
* not have a tab strip.
*/
protected int getTabStripHeightFromResource() {
- return getResources().getDimensionPixelSize(R.dimen.tab_strip_height);
+ if (DeviceFormFactor.isForceTabletUI())
+ return getResources().getDimensionPixelSize(R.dimen.tab_strip_height_tabletui);
+ return getResources().getDimensionPixelSize(R.dimen.tab_strip_height_cromite);
}
/** Triggered when the content view for the specified tab has changed. */
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/HeightTransitionHandler.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/HeightTransitionHandler.java
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/HeightTransitionHandler.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/HeightTransitionHandler.java
@@ -30,6 +30,7 @@ import org.chromium.chrome.browser.toolbar.top.ToolbarLayout;
import org.chromium.chrome.browser.toolbar.top.tab_strip.TabStripTransitionCoordinator.TabStripHeightObserver;
import org.chromium.chrome.browser.toolbar.top.tab_strip.TabStripTransitionCoordinator.TabStripTransitionDelegate;
import org.chromium.ui.base.ViewUtils;
+import org.chromium.ui.base.DeviceFormFactor;
import org.chromium.ui.resources.dynamics.DynamicResourceReadyOnceCallback;
import org.chromium.ui.util.TokenHolder;
@@ -562,6 +563,7 @@ class HeightTransitionHandler {
if (TabStripTransitionCoordinator.sHeightTransitionThresholdForTesting != null) {
return TabStripTransitionCoordinator.sHeightTransitionThresholdForTesting;
}
+ if (DeviceFormFactor.isForceTabletUI()) return 0;
return TRANSITION_THRESHOLD_DP;
}
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/TabStripTransitionCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/TabStripTransitionCoordinator.java
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/TabStripTransitionCoordinator.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/TabStripTransitionCoordinator.java
@@ -29,6 +29,7 @@ import org.chromium.chrome.browser.ui.desktop_windowing.AppHeaderUtils;
import org.chromium.components.browser_ui.desktop_windowing.AppHeaderState;
import org.chromium.components.browser_ui.desktop_windowing.DesktopWindowStateManager;
import org.chromium.components.browser_ui.desktop_windowing.DesktopWindowStateManager.AppHeaderObserver;
+import org.chromium.ui.base.DeviceFormFactor;
/** Class used to manage tab strip visibility and height updates. */
@NullMarked
@@ -148,7 +149,10 @@ public class TabStripTransitionCoordinator implements ComponentCallbacks, AppHea
mTabStripReservedTopPadding =
controlContainerView()
.getResources()
- .getDimensionPixelSize(R.dimen.tab_strip_reserved_top_padding);
+ .getDimensionPixelSize(
+ DeviceFormFactor.isForceTabletUI()
+ ? R.dimen.tab_strip_reserved_top_padding_tabletui
+ : R.dimen.tab_strip_reserved_top_padding_cromite);
mOnLayoutChangedListener =
(view, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
diff --git a/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml b/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml
--- a/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml
+++ b/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml
@@ -36,6 +36,11 @@ found in the LICENSE file.
android:summary="@string/jump_start_omnibox_summary"
android:title="@string/jump_start_omnibox_title" />
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
+ android:key="force_tablet_ui"
+ android:summary="@string/force_tablet_ui_summary"
+ android:title="@string/force_tablet_ui_title" />
+
<Preference
android:key="captions"
android:title="@string/accessibility_captions_title"/>
diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java
--- a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java
+++ b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java
@@ -29,6 +29,7 @@ import org.chromium.content_public.browser.ContentFeatureList;
import org.chromium.content_public.browser.ContentFeatureMap;
import org.chromium.chrome.browser.settings.ChromeBaseSettingsFragment;
+import org.chromium.components.browser_ui.accessibility.AccessibilitySettingsDelegate.BooleanPreferenceDelegate;
/** Fragment to keep track of all the accessibility related preferences. */
@NullMarked
@@ -44,6 +45,9 @@ public class AccessibilitySettings extends ChromeBaseSettingsFragment
public static final String PREF_ZOOM_INFO = "zoom_info";
public static final String PREF_IMAGE_DESCRIPTIONS = "image_descriptions";
+ private BooleanPreferenceDelegate mForceTabletUIDelegate;
+ static final String PREF_FORCE_TABLET_UI = "force_tablet_ui";
+
private PageZoomPreference mPageZoomDefaultZoomPref;
private ChromeSwitchPreference mPageZoomIncludeOSAdjustment;
private ChromeSwitchPreference mPageZoomAlwaysShowPref;
@@ -117,6 +121,12 @@ public class AccessibilitySettings extends ChromeBaseSettingsFragment
mDelegate.getReaderAccessibilityDelegate().getValue());
readerForAccessibilityPref.setOnPreferenceChangeListener(this);
+ ChromeSwitchPreference forceTabletUiPref =
+ (ChromeSwitchPreference) findPreference(PREF_FORCE_TABLET_UI);
+ mForceTabletUIDelegate = mDelegate.getForceTabletUIDelegate();
+ forceTabletUiPref.setChecked(mForceTabletUIDelegate.getValue());
+ forceTabletUiPref.setOnPreferenceChangeListener(this);
+
Preference captions = findPreference(PREF_CAPTIONS);
captions.setOnPreferenceClickListener(
preference -> {
@@ -176,6 +186,9 @@ public class AccessibilitySettings extends ChromeBaseSettingsFragment
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (PREF_FORCE_ENABLE_ZOOM.equals(preference.getKey())) {
mDelegate.getForceEnableZoomAccessibilityDelegate().setValue((Boolean) newValue);
+ } else if (PREF_FORCE_TABLET_UI.equals(preference.getKey())) {
+ mForceTabletUIDelegate.setValue((Boolean) newValue);
+ mDelegate.requestRestart(getActivity());
} else if (PREF_READER_FOR_ACCESSIBILITY.equals(preference.getKey())) {
boolean readerModeEnabled = (Boolean) newValue;
mDelegate.getReaderAccessibilityDelegate().setValue(readerModeEnabled);
diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsDelegate.java b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsDelegate.java
--- a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsDelegate.java
+++ b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsDelegate.java
@@ -41,6 +41,8 @@ public interface AccessibilitySettingsDelegate {
*/
BrowserContextHandle getBrowserContextHandle();
+ BooleanPreferenceDelegate getForceTabletUIDelegate();
+
/**
* @return boolean value specifying if the Image Descriptions user setting should be shown.
*/
diff --git a/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java b/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java
--- a/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java
+++ b/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java
@@ -79,6 +79,14 @@ public class DeviceFormFactor {
/** See {@link #setIsTabletForTesting(boolean)}. */
private static @Nullable Boolean sIsTabletForTesting;
+ private static boolean mForceTabletUI = false;
+ public static void setForceTabletUI(boolean forceTabletUI) {
+ mForceTabletUI = forceTabletUI;
+ }
+ public static boolean isForceTabletUI() {
+ return mForceTabletUI;
+ }
+
/**
* Each activity could be on a different display, and this will just tell you whether the
* display associated with the application context is "tablet sized". Use {@link
@@ -87,6 +95,7 @@ public class DeviceFormFactor {
@CalledByNative
@Deprecated
public static boolean isTablet() {
+ if (mForceTabletUI) return true;
if (sIsTabletForTesting != null) {
return sIsTabletForTesting;
}
@@ -117,6 +126,7 @@ public class DeviceFormFactor {
* E.g. http://developer.samsung.com/samsung-dex/testing
*/
public static boolean isNonMultiDisplayContextOnTablet(Context context) {
+ if (mForceTabletUI) return true;
return detectScreenWidthBucket(context) >= SCREEN_BUCKET_TABLET;
}
@@ -151,6 +161,7 @@ public class DeviceFormFactor {
* @return The screen width bucket the device is in (see constants at the top of this class).
*/
private static int detectScreenWidthBucket(Context context) {
+ if (mForceTabletUI) return SCREEN_BUCKET_TABLET;
return context.getResources().getInteger(R.integer.min_screen_width_bucket);
}
@@ -158,6 +169,7 @@ public class DeviceFormFactor {
ThreadUtils.assertOnUiThread();
Context context = windowAndroid.getContext().get();
if (context == null) return 0;
+ if (mForceTabletUI) return SCREEN_BUCKET_TABLET;
return context.getResources().getInteger(R.integer.min_screen_width_bucket);
}
@@ -167,6 +179,7 @@ public class DeviceFormFactor {
*/
@UiThread
public static int getNonMultiDisplayMinimumTabletWidthPx(Context context) {
+ if (mForceTabletUI) return 0;
return getMinimumTabletWidthPx(DisplayAndroid.getNonMultiDisplay(context));
}
@@ -175,6 +188,7 @@ public class DeviceFormFactor {
* layout.
*/
public static int getMinimumTabletWidthPx(DisplayAndroid display) {
+ if (mForceTabletUI) return 0;
return DisplayUtil.dpToPx(display, DeviceFormFactor.MINIMUM_TABLET_WIDTH_DP);
}
}
--
@@ -2,119 +2,123 @@ From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Sat, 7 Sep 2019 15:07:42 +0200
Subject: Add option to not persist tabs across sessions
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
.../android/java/res/xml/privacy_preferences.xml | 5 +++++
.../chrome/browser/ChromeTabbedActivity.java | 5 ++++-
.../browser/privacy/settings/PrivacySettings.java | 15 ++++++++++++++-
.../ui/android/strings/android_chrome_strings.grd | 6 ++++++
4 files changed, 29 insertions(+), 2 deletions(-)
chrome/android/java/res/values/values.xml | 3 +++
chrome/android/java/res/xml/privacy_preferences.xml | 5 +++++
.../chrome/browser/ChromeTabbedActivity.java | 4 +++-
.../browser/settings/privacy/PrivacySettings.java | 12 ++++++++++++
.../ui/android/strings/android_chrome_strings.grd | 6 ++++++
5 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/chrome/android/java/res/values/values.xml b/chrome/android/java/res/values/values.xml
--- a/chrome/android/java/res/values/values.xml
+++ b/chrome/android/java/res/values/values.xml
@@ -63,6 +63,9 @@
<!-- TODO(peconn): Add help section. -->
<!-- <string name="help_context_suggestions">mobile_content_suggestions</string> -->
+ <string name="close_tabs_on_exit_title">Close tabs on exit</string>
+ <string name="close_tabs_on_exit_summary">Don\'t persist tabs between browsing sessions</string>
+
<!-- Our manage space activity. Default pre-KitKat to be nothing. -->
<string name="manage_space_activity"></string>
diff --git a/chrome/android/java/res/xml/privacy_preferences.xml b/chrome/android/java/res/xml/privacy_preferences.xml
--- a/chrome/android/java/res/xml/privacy_preferences.xml
+++ b/chrome/android/java/res/xml/privacy_preferences.xml
@@ -95,6 +95,11 @@ found in the LICENSE file.
android:title="@string/incognito_settings_title"
android:summary="@string/incognito_settings_summary"
android:fragment="org.chromium.chrome.browser.privacy.settings.IncognitoSettings"/>
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
@@ -34,6 +34,11 @@
android:title="@string/allow_custom_tab_intents_title"
android:summary="@string/allow_custom_tab_intents_summary"
android:defaultValue="false" />
+ <org.chromium.chrome.browser.settings.ChromeBaseCheckBoxPreference
+ android:key="close_tabs_on_exit"
+ android:title="@string/close_tabs_on_exit_title"
+ android:summary="@string/close_tabs_on_exit_summary"
+ android:defaultValue="false" />
<PreferenceCategory
android:key="services_category"
android:title="@string/services_category_title">
<Preference
android:key="clear_browsing_data"
android:title="@string/clear_browsing_data_title"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -47,6 +47,7 @@ import org.chromium.base.Callback;
import org.chromium.base.CallbackController;
import org.chromium.base.CallbackUtils;
import org.chromium.base.CommandLine;
+import org.chromium.base.ContextUtils;
import org.chromium.base.IntentUtils;
import org.chromium.base.Log;
import org.chromium.base.MemoryPressureListener;
@@ -2218,8 +2219,10 @@ public class ChromeTabbedActivity extends ChromeActivity {
@@ -1104,8 +1104,10 @@ public class ChromeTabbedActivity extends ChromeActivity {
boolean hadCipherData =
CipherLazyHolder.sCipherInstance.restoreFromBundle(getSavedInstanceState());
CipherFactory.getInstance().restoreFromBundle(getSavedInstanceState());
+ String PREF_CLOSE_TABS_ON_EXIT = "close_tabs_on_exit";
boolean noRestoreState =
- CommandLine.getInstance().hasSwitch(ChromeSwitches.NO_RESTORE_STATE);
+ CommandLine.getInstance().hasSwitch(ChromeSwitches.NO_RESTORE_STATE) ||
+ ContextUtils.getAppSharedPreferences().getBoolean(PREF_CLOSE_TABS_ON_EXIT, false);
boolean shouldShowNtpAsHomeSurfaceAtStartup = false;
final AtomicBoolean isActiveUrlNtp = new AtomicBoolean(false);
if (noRestoreState) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java
@@ -9,6 +9,7 @@ import static org.chromium.components.content_settings.PrefNames.COOKIE_CONTROLS
// Clear the state files because they are inconsistent and useless from now on.
mTabModelSelectorImpl.clearState();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacySettings.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacySettings.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacySettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacySettings.java
@@ -4,6 +4,7 @@
package org.chromium.chrome.browser.settings.privacy;
import android.content.Context;
import android.content.Intent;
+import android.content.SharedPreferences;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.SpannableString;
@@ -22,6 +23,7 @@ import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import android.support.graphics.drawable.VectorDrawableCompat;
import android.support.v7.preference.CheckBoxPreference;
@@ -13,6 +14,7 @@ import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import org.chromium.base.Callback;
+import org.chromium.base.ContextUtils;
import org.chromium.base.IntentUtils;
import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.metrics.RecordUserAction;
@@ -114,6 +116,8 @@ public class PrivacySettings extends ChromeBaseSettingsFragment
private final SharedPreferencesManager mSharedPreferencesManager =
ChromeSharedPreferences.getInstance();
import org.chromium.base.BuildInfo;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
@@ -36,6 +38,7 @@ public class PrivacySettings
private static final String PREF_SEARCH_SUGGESTIONS = "search_suggestions";
private static final String PREF_CAN_MAKE_PAYMENT = "can_make_payment";
private static final String PREF_NETWORK_PREDICTIONS = "preload_pages";
+ private static final String PREF_CLOSE_TABS_ON_EXIT = "close_tabs_on_exit";
+
private ManagedPreferenceDelegate mManagedPreferenceDelegate;
@VisibleForTesting static final String PREF_THIRD_PARTY_COOKIES = "third_party_cookies";
@VisibleForTesting static final String PREF_TRACKING_PROTECTION = "tracking_protection";
@@ -382,7 +386,11 @@ public class PrivacySettings extends ChromeBaseSettingsFragment
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String key = preference.getKey();
- if (PREF_CAN_MAKE_PAYMENT.equals(key)) {
+ if (PREF_CLOSE_TABS_ON_EXIT.equals(key)) {
private static final String PREF_DO_NOT_TRACK = "do_not_track";
private static final String PREF_CLEAR_BROWSING_DATA = "clear_browsing_data";
@@ -84,6 +87,10 @@ public class PrivacySettings
sharedPreferencesEditor.apply();
} else if (PREF_SEARCH_SUGGESTIONS.equals(key)) {
PrefServiceBridge.getInstance().setBoolean(Pref.SEARCH_SUGGEST_ENABLED, (boolean) newValue);
+ } else if (PREF_CLOSE_TABS_ON_EXIT.equals(key)) {
+ SharedPreferences.Editor sharedPreferencesEditor = ContextUtils.getAppSharedPreferences().edit();
+ sharedPreferencesEditor.putBoolean(PREF_CLOSE_TABS_ON_EXIT, (boolean)newValue);
+ sharedPreferencesEditor.apply();
+ } else if (PREF_CAN_MAKE_PAYMENT.equals(key)) {
UserPrefs.get(getProfile())
.setBoolean(Pref.CAN_MAKE_PAYMENT_ENABLED, (boolean) newValue);
} else if (PREF_HTTPS_FIRST_MODE_LEGACY.equals(key)) {
@@ -442,6 +450,11 @@ public class PrivacySettings extends ChromeBaseSettingsFragment
getContext(), getProfile()));
}
+ ChromeSwitchPreference closeTabsOnExitPref =
+ (ChromeSwitchPreference) findPreference(PREF_CLOSE_TABS_ON_EXIT);
return true;
@@ -128,6 +135,11 @@ public class PrivacySettings
? R.string.text_on
: R.string.text_off);
}
+
+ ChromeBaseCheckBoxPreference closeTabsOnExitPref =
+ (ChromeBaseCheckBoxPreference) findPreference(PREF_CLOSE_TABS_ON_EXIT);
+ closeTabsOnExitPref.setOnPreferenceChangeListener(this);
+ closeTabsOnExitPref.setManagedPreferenceDelegate(mManagedPreferenceDelegate);
+
Preference secureDnsPref = findPreference(PREF_SECURE_DNS);
if (secureDnsPref != null && secureDnsPref.isVisible()) {
secureDnsPref.setSummary(SecureDnsSettings.getSummary(getContext()));
}
private ManagedPreferenceDelegate createManagedPreferenceDelegate() {
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -2856,6 +2856,12 @@ To change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>delete the Chrome d
<message name="IDS_ACCESSIBILITY_TAB_SWITCHER_TITLE" desc="Accessibility label of the current window when Grid Tab Switcher is shown.">
All tabs
@@ -3618,6 +3618,12 @@ Only you can see what your camera is looking at. The site can't see your camera'
<message name="IDS_CONTEXTMENU_IMAGE_TITLE" desc="The title of a context menu tab when the item pressed contains more than one type. This indicates that all the actions are related to the image.">
IMAGE
</message>
+ <message name="IDS_CLOSE_TABS_ON_EXIT_TITLE" desc="Text for 'Close tabs on exit' settings-privacy option.">
+ Close all open tabs on exit
+ </message>
+ <message name="IDS_CLOSE_TABS_ON_EXIT_SUMMARY" desc="Summary text for 'Close tabs on exit' settings-privacy option.">
+ Don't persist tabs between browsing sessions. Caution: parameters in urls allow linking between different sessions.
+ Don't persist tabs between browsing sessions
+ </message>
<message name="IDS_TAB_LOADING_DEFAULT_TITLE" desc="The title of a tab when we are still waiting for either the URL or the real title. This generally shows when the page is first loading.">
Loading…
<message name="IDS_CONTEXTMENU_LINK_TITLE" desc="The title of a context menu tab when the item pressed contains more than one type. This indicates that all the actions are related to the link.">
LINK
</message>
--
--
2.17.1
@@ -1,294 +0,0 @@
From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Sat, 20 Nov 2021 15:36:54 +0000
Subject: Add option to use home page as NTP
And allow use about:blank as default homepage
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
.../tab_management/TabGridDialogMediator.java | 12 +++++++++++-
.../tasks/tab_management/TabGroupUiMediator.java | 8 +++++++-
.../java/res/xml/homepage_preferences.xml | 5 +++++
.../strip/TabGroupContextMenuCoordinator.java | 11 ++++++++++-
.../chrome/browser/homepage/HomepageManager.java | 16 ++++++++++++++++
.../homepage/settings/HomepageSettings.java | 12 ++++++++++++
.../chrome/browser/metrics/LaunchMetrics.java | 1 -
.../browser/tabmodel/ChromeTabCreator.java | 8 ++++++++
.../preferences/ChromePreferenceKeys.java | 1 +
.../preferences/LegacyChromePreferenceKeys.java | 1 +
.../android/strings/android_chrome_strings.grd | 3 +++
chrome/browser/ui/browser_ui_prefs.cc | 2 ++
chrome/common/pref_names.h | 4 ++++
13 files changed, 80 insertions(+), 4 deletions(-)
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java
@@ -100,6 +100,7 @@ import org.chromium.components.collaboration.messaging.PersistentNotificationTyp
import org.chromium.components.data_sharing.DataSharingService;
import org.chromium.components.data_sharing.GroupMember;
import org.chromium.components.data_sharing.member_role.MemberRole;
+import org.chromium.components.embedder_support.util.UrlConstants;
import org.chromium.components.tab_group_sync.EitherId.EitherGroupId;
import org.chromium.components.tab_group_sync.LocalTabGroupId;
import org.chromium.components.tab_group_sync.TabGroupSyncService;
@@ -120,6 +121,9 @@ import java.util.Objects;
import java.util.Set;
import java.util.function.Supplier;
+import org.chromium.chrome.browser.homepage.HomepageManager;
+import org.chromium.url.GURL;
+
/**
* A mediator for the TabGridDialog component, responsible for communicating with the components'
* coordinator as well as managing the business logic for dialog show/hide.
@@ -1033,9 +1037,15 @@ public class TabGridDialogMediator
UrlConstantResolver urlConstantResolver =
UrlConstantResolverFactory.getForProfile(profile);
+ String url = urlConstantResolver.getNtpUrl();
+ if (UrlConstants.NTP_URL.equals(url)
+ && HomepageManager.getInstance().getPrefNTPIsHomepageEnabled()) {
+ GURL gurl = HomepageManager.getInstance().getHomepageGurl();
+ url = gurl != null ? gurl.getSpec() : url;
+ }
TabGroupUtils.openUrlInGroup(
assumeNonNull(mCurrentTabGroupModelFilterSupplier.get()),
- urlConstantResolver.getNtpUrl(),
+ url,
tabsInGroup.get(tabsInGroup.size() - 1).getId(),
TabLaunchType.FROM_TAB_GROUP_UI);
RecordUserAction.record("MobileNewTabOpened." + mComponentName);
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator.java
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator.java
@@ -35,6 +35,7 @@ import org.chromium.chrome.browser.data_sharing.DataSharingServiceFactory;
import org.chromium.chrome.browser.data_sharing.ui.shared_image_tiles.SharedImageTilesConfig;
import org.chromium.chrome.browser.data_sharing.ui.shared_image_tiles.SharedImageTilesCoordinator;
import org.chromium.chrome.browser.layouts.LayoutStateProvider;
+import org.chromium.chrome.browser.homepage.HomepageManager;
import org.chromium.chrome.browser.layouts.LayoutStateProvider.LayoutStateObserver;
import org.chromium.chrome.browser.layouts.LayoutType;
import org.chromium.chrome.browser.profiles.Profile;
@@ -425,10 +426,15 @@ public class TabGroupUiMediator implements BackPressHandler {
UrlConstantResolverFactory.getForProfile(currentTabProfile);
Tab parentTabToAttach = relatedTabs.get(relatedTabs.size() - 1);
+ String url = urlConstantResolver.getNtpUrl();
+ if (HomepageManager.getInstance().getPrefNTPIsHomepageEnabled()) {
+ GURL gurl = HomepageManager.getInstance().getHomepageGurl();
+ url = gurl != null ? gurl.getSpec() : url;
+ }
mTabCreatorManager
.getTabCreator(currentTab.isIncognito())
.createNewTab(
- new LoadUrlParams(urlConstantResolver.getNtpUrl()),
+ new LoadUrlParams(url),
TabLaunchType.FROM_TAB_GROUP_UI,
parentTabToAttach);
RecordUserAction.record(
diff --git a/chrome/android/java/res/xml/homepage_preferences.xml b/chrome/android/java/res/xml/homepage_preferences.xml
--- a/chrome/android/java/res/xml/homepage_preferences.xml
+++ b/chrome/android/java/res/xml/homepage_preferences.xml
@@ -14,6 +14,11 @@ found in the LICENSE file.
android:summaryOn="@string/text_on"
android:summaryOff="@string/text_off" />
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
+ android:key="ntp_is_homepage_switch"
+ android:summaryOn="@string/options_ntp_is_homepage_label"
+ android:summaryOff="@string/options_ntp_is_homepage_label" />
+
<org.chromium.chrome.browser.homepage.settings.RadioButtonGroupHomepagePreference
android:key="homepage_radio_group"
android:selectable="false"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/TabGroupContextMenuCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/TabGroupContextMenuCoordinator.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/TabGroupContextMenuCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/TabGroupContextMenuCoordinator.java
@@ -84,6 +84,9 @@ import org.chromium.ui.widget.RectProvider;
import java.util.function.Supplier;
+import org.chromium.chrome.browser.homepage.HomepageManager;
+import org.chromium.url.GURL;
+
/**
* A coordinator for the context menu on the tab strip by long-pressing on the group titles. It is
* responsible for creating a list of menu items, setting up the menu and displaying the menu.
@@ -228,9 +231,15 @@ public class TabGroupContextMenuCoordinator extends TabGroupOverflowMenuCoordina
/* didCloseCallback= */ null);
RecordUserAction.record("MobileToolbarTabGroupMenu.DeleteGroup");
} else if (menuId == R.id.open_new_tab_in_group) {
+ String url = UrlConstants.NTP_URL;
+ if (UrlConstants.NTP_URL.equals(url)
+ && HomepageManager.getInstance().getPrefNTPIsHomepageEnabled()) {
+ GURL gurl = HomepageManager.getInstance().getHomepageGurl();
+ url = gurl != null ? gurl.getSpec() : url;
+ }
TabGroupUtils.openUrlInGroup(
tabGroupModelFilter,
- UrlConstants.NTP_URL,
+ url,
tabId,
TabLaunchType.FROM_TAB_GROUP_UI);
RecordUserAction.record("MobileToolbarTabGroupMenu.NewTabInGroup");
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/homepage/HomepageManager.java b/chrome/android/java/src/org/chromium/chrome/browser/homepage/HomepageManager.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/homepage/HomepageManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/homepage/HomepageManager.java
@@ -257,6 +257,22 @@ public class HomepageManager
notifyHomepageUpdated();
}
+ /**
+ * Returns the user preference for whether the New Tab Page is the homepage or not.
+ *
+ */
+ public boolean getPrefNTPIsHomepageEnabled() {
+ return mSharedPreferencesManager.readBoolean(ChromePreferenceKeys.HOMEPAGE_NTP_IS_HOMEPAGE, false);
+ }
+
+ /**
+ * Sets the user preference for whether the new tab page is the homepage or not.
+ */
+ public void setPrefNTPIsHomepageEnabled(boolean enabled) {
+ mSharedPreferencesManager.writeBoolean(ChromePreferenceKeys.HOMEPAGE_NTP_IS_HOMEPAGE, enabled);
+ notifyHomepageUpdated();
+ }
+
/**
* @return User specified homepage custom GURL.
*/
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/homepage/settings/HomepageSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/homepage/settings/HomepageSettings.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/homepage/settings/HomepageSettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/homepage/settings/HomepageSettings.java
@@ -26,6 +26,7 @@ import org.chromium.components.browser_ui.settings.SettingsUtils;
import org.chromium.components.embedder_support.util.UrlUtilities;
import org.chromium.components.url_formatter.UrlFormatter;
import org.chromium.url.GURL;
+import org.chromium.components.embedder_support.util.UrlConstants;
/** Fragment that allows the user to configure homepage related preferences. */
@NullMarked
@@ -35,6 +36,8 @@ public class HomepageSettings extends ChromeBaseSettingsFragment {
@VisibleForTesting
public static final String PREF_HOMEPAGE_RADIO_GROUP = "homepage_radio_group";
+ private static final String PREF_NTP_HOMEPAGE_SWITCH = "ntp_is_homepage_switch";
+
private HomepageManager mHomepageManager;
private RadioButtonGroupHomepagePreference mRadioButtons;
private final ObservableSupplierImpl<String> mPageTitle = new ObservableSupplierImpl<>();
@@ -102,6 +105,15 @@ public class HomepageSettings extends ChromeBaseSettingsFragment {
mRadioButtons.setOnHomepagePreferenceChangeListener(this::onRadioButtonGroupChanged);
mRadioButtons.setupPreferenceValues(createPreferenceValuesForRadioGroup());
+ ChromeSwitchPreference mNTPIsHomepageSwitch =
+ (ChromeSwitchPreference) findPreference(PREF_NTP_HOMEPAGE_SWITCH);
+ boolean isHomepageNTPEnabled = mHomepageManager.getPrefNTPIsHomepageEnabled();
+ mNTPIsHomepageSwitch.setChecked(isHomepageNTPEnabled);
+ mNTPIsHomepageSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
+ mHomepageManager.setPrefNTPIsHomepageEnabled((boolean) newValue);
+ return true;
+ });
+
RecordUserAction.record("Settings.Homepage.Opened");
}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/metrics/LaunchMetrics.java b/chrome/android/java/src/org/chromium/chrome/browser/metrics/LaunchMetrics.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/metrics/LaunchMetrics.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/metrics/LaunchMetrics.java
@@ -117,7 +117,6 @@ public class LaunchMetrics {
public static void recordHomePageLaunchMetrics(
boolean showHomeButton, boolean homepageIsNtp, GURL homepageGurl) {
if (homepageGurl.isEmpty()) {
- assert !showHomeButton : "Homepage should be disabled for an empty GURL";
}
LaunchMetricsJni.get()
.recordHomePageLaunchMetrics(showHomeButton, homepageIsNtp, homepageGurl);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java
@@ -27,6 +27,7 @@ import org.chromium.chrome.browser.app.tab_activity_glue.ReparentingTask;
import org.chromium.chrome.browser.compositor.CompositorViewHolder;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.multiwindow.MultiInstanceManager;
+import org.chromium.chrome.browser.homepage.HomepageManager;
import org.chromium.chrome.browser.prefetch.settings.PreloadPagesSettingsBridge;
import org.chromium.chrome.browser.prefetch.settings.PreloadPagesState;
import org.chromium.chrome.browser.profiles.Profile;
@@ -572,6 +573,13 @@ public class ChromeTabCreator extends TabCreator
*/
public @Nullable Tab launchUrl(
String url, @TabLaunchType int type, @Nullable Intent intent, long intentTimestamp) {
+ if (!mIncognito && url.equals(UrlConstants.NTP_URL)) {
+ if (HomepageManager.getInstance().getPrefNTPIsHomepageEnabled()) {
+ GURL gurl = HomepageManager.getInstance().getHomepageGurl();
+ url = gurl != null ? gurl.getSpec() : url;
+ }
+ }
+
LoadUrlParams loadUrlParams = new LoadUrlParams(url);
loadUrlParams.setIntentReceivedTimestamp(intentTimestamp);
return createNewTab(loadUrlParams, type, null, intent);
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
--- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
+++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
@@ -350,6 +350,7 @@ public final class ChromePreferenceKeys {
public static final String HOMEPAGE_USE_CHROME_NTP = "Chrome.Homepage.UseNTP";
public static final String HOMEPAGE_USE_DEFAULT_URI = "homepage_partner_enabled";
+ public static final String HOMEPAGE_NTP_IS_HOMEPAGE = "newtabpage_is_homepage";
/** Key used to save homepage location set by enterprise policy */
public static final String DEPRECATED_HOMEPAGE_LOCATION_POLICY =
"Chrome.Policy.HomepageLocation";
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/LegacyChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/LegacyChromePreferenceKeys.java
--- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/LegacyChromePreferenceKeys.java
+++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/LegacyChromePreferenceKeys.java
@@ -60,6 +60,7 @@ public class LegacyChromePreferenceKeys {
ChromePreferenceKeys.HISTORY_SHOW_HISTORY_INFO,
ChromePreferenceKeys.HOMEPAGE_ENABLED,
ChromePreferenceKeys.HOMEPAGE_USE_DEFAULT_URI,
+ ChromePreferenceKeys.HOMEPAGE_NTP_IS_HOMEPAGE,
ChromePreferenceKeys.INCOGNITO_SHORTCUT_ADDED,
ChromePreferenceKeys.LATEST_UNSUPPORTED_VERSION,
ChromePreferenceKeys.LOCALE_MANAGER_AUTO_SWITCH,
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -1330,6 +1330,9 @@ Your Google account may have other forms of browsing history like searches and a
<message name="IDS_CLEAR_BROWSING_DATA_TAB_PERIOD_HOUR" desc="The option to delete browsing data from the last hour.">
Last hour
</message>
+ <message name="IDS_OPTIONS_NTP_IS_HOMEPAGE_LABEL" desc="The label for switch that allows the user to toggle whether opening a new tab leads to the new tab page or the home page.">
+ Use for new tabs
+ </message>
<message name="IDS_CLEAR_BROWSING_DATA_TAB_PERIOD_24_HOURS" desc="The option to delete browsing data from the last 24 hours.">
Last 24 hours
</message>
diff --git a/chrome/browser/ui/browser_ui_prefs.cc b/chrome/browser/ui/browser_ui_prefs.cc
--- a/chrome/browser/ui/browser_ui_prefs.cc
+++ b/chrome/browser/ui/browser_ui_prefs.cc
@@ -119,6 +119,8 @@ void RegisterBrowserUserPrefs(user_prefs::PrefRegistrySyncable* registry) {
registry->RegisterBooleanPref(prefs::kPinSplitTabButton, false,
pref_registration_flags);
+ registry->RegisterBooleanPref(prefs::kNewTabPageIsHomePage, false,
+ PrefRegistry::NO_REGISTRATION_FLAGS);
registry->RegisterInt64Pref(prefs::kDefaultBrowserLastDeclined, 0);
registry->RegisterBooleanPref(prefs::kWebAppCreateOnDesktop, true);
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -1336,6 +1336,10 @@ inline constexpr char kSplitViewDragAndDropNudgeUsedCount[] =
// by enterprise policy.
inline constexpr char kGeminiSettings[] = "browser.gemini_settings";
+// A boolean specifying whether opening a new tab should open the Home page
+// instead of the New Tab page.
+inline constexpr char kNewTabPageIsHomePage[] = "newtabpage_is_homepage";
+
// Comma separated list of domain names (e.g. "google.com,school.edu").
// When this pref is set, the user will be able to access Google Apps
// only using an account that belongs to one of the domains from this pref.
--
-418
View File
@@ -1,418 +0,0 @@
From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Mon, 11 Dec 2017 22:42:11 +0100
Subject: Add search engine
Add a Google search engine that forces languages to English,
disable from all its searches RLZ and field experiments querystring parameters.
Add DuckDuckGo Lite
License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
---
.../search_engine_choice/default_favicon.png | Bin 0 -> 903 bytes
components/search_engines/BUILD.gn | 3 ++
components/search_engines/cromite/BUILD.gn | 12 ++++++
.../cromite/cromite_prepopulated_engines.json | 37 ++++++++++++++++++
.../search_engine_choice_utils.cc | 5 +--
.../search_engines/search_engine_type.h | 5 +++
.../template_url_prepopulate_data.cc | 21 +++++++++-
.../template_url_prepopulate_data.h | 9 -----
tools/json_to_struct/json_to_struct.gni | 9 +++++
tools/json_to_struct/json_to_struct.py | 26 ++++++++----
tools/json_to_struct/struct_generator.py | 10 +++--
tools/variations/fieldtrial_to_struct.py | 4 +-
12 files changed, 113 insertions(+), 28 deletions(-)
create mode 100644 components/resources/default_100_percent/search_engine_choice/default_favicon.png
create mode 100644 components/search_engines/cromite/BUILD.gn
create mode 100644 components/search_engines/cromite/cromite_prepopulated_engines.json
diff --git a/components/resources/default_100_percent/search_engine_choice/default_favicon.png b/components/resources/default_100_percent/search_engine_choice/default_favicon.png
new file mode 100644
index 0000000000000000000000000000000000000000..6533419f2d6b40f7735054dec62c51ddf1ee1201
GIT binary patch
literal 903
zcmV;219<$2P)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm0009{Nkl<Zc-rk*
zHI&>u5dJaD%uTpU6K1Ny)MmAo?2~ki?Li;rI(@haGcz+YGo$8ZtH|rstmUBf-W*z<
z`LqMyjQ;vbR=naxn4FxTa$SOo%Y^Yq3CiCp`IM5k@HhA$JOj`EJVrBqK*>90<Y$Z!
zD&E1~9|C4N=Y0}PoKKzZ=aBLV-UaWB-0*4BX4X}1up41G3JAO#bVTDWd3iku6Hh={
zlma?HmsR5(hfh(b^FD*}4@!0sS4zV2hPiHTHz{QUr=p@EW3ne<xuXf?=gfeJ_n_0B
z@lJY|QARx>G)Ly==Qj#^Pm*zg`6NIm=nm~RX-}Ss_k_usva+)JncnmH^XI=4jNih$
zlz0y|WF4^Se4bG8m@v`L_#mWg6DB6I3T(&-X<X(aWBDC2?f1MT|2uB(BxS%X1$a%k
z;1;{ldEPHo!pWN$|21g&X`3k)RVSdZ`1-to+dxbxpx11tSFj1eY4p>FfHecpOCzcg
zpNwb+@DsmO2`6iI0DN;)MGkB;0q{--kR#0r9={VIfOiJ&qgPlcQV0O=qNN%EZUkK2
zXVWfZ`h5{40I)Gg`DG2UD<uwqtRPHQ`3e=w!vhePgFgO88URJiY>`5mlRG3V0I)IO
z^!VFvHvp@&1;F!4TUc<Tw?P23{124aYG2{<#pZ1%U*J~{i~%4NJtI_HQU19p>56LN
z%3gt$n(-Z(idK@zIi#qli66~IxloAGzuNPP+NSLfTs{_pT7f^J06kI9KUZ>A$&#d(
z+ZUd3gy@cNAuWhQ3vePzWtVK-4H5_<h_y6oOLkRNRsEA)yhw>iqgo-eCg3jF08o2(
zV+xr@B`n6nQmpYnUx3CSsDwu5Yyvoe1poxnZ<>do)Aj_?EW-9wQ^cQO=(N_*SpEcF
zA!n{N_=ZMrDQ)uj`{u@re$c++TFQW?-c&%T<H_NEl62(&6TL7nfTD(I>Jej=5G2dk
zc*-y0$13Q-mVE%=HZZcm54P~5#qa<$Vkc|B{qUnj<Z#y}04P$B=OI-_I^4yL*CEaE
zjS0pJfK7T{VJFY4st5f9G(|wnQru>jUSTzPpE5qa;Lv>bM_w_-mwYy_S=Aoxnl--Y
d#;<tA>kFnu^?NN9uE_uZ002ovPDHLkV1m60sc!%P
literal 0
HcmV?d00001
diff --git a/components/search_engines/BUILD.gn b/components/search_engines/BUILD.gn
--- a/components/search_engines/BUILD.gn
+++ b/components/search_engines/BUILD.gn
@@ -72,6 +72,7 @@ static_library("search_engines") {
"//third_party/metrics_proto",
"//third_party/omnibox_proto",
"//third_party/search_engines_data:prepopulated_engines",
+ "cromite:cromite_prepopulated_engines",
]
deps = [
@@ -164,6 +165,7 @@ source_set("search_engine_utils") {
":search_engine_type",
"//components/google/core/common",
"//third_party/search_engines_data:prepopulated_engines",
+ "cromite:cromite_prepopulated_engines",
]
deps = [ "//url" ]
@@ -258,6 +260,7 @@ source_set("unit_tests") {
"//testing/gmock",
"//testing/gtest",
"//third_party/search_engines_data:prepopulated_engines",
+ "cromite:cromite_prepopulated_engines",
"//ui/base",
"//url",
]
diff --git a/components/search_engines/cromite/BUILD.gn b/components/search_engines/cromite/BUILD.gn
new file mode 100644
--- /dev/null
+++ b/components/search_engines/cromite/BUILD.gn
@@ -0,0 +1,12 @@
+import("//tools/json_to_struct/json_to_struct.gni")
+
+json_to_struct("cromite_prepopulated_engines") {
+ visibility = [ "//components/search_engines:*" ]
+
+ source = "cromite_prepopulated_engines.json"
+ schema_file = "//third_party/search_engines_data/prepopulated_engines_schema.json"
+ namespace = "TemplateURLPrepopulateData"
+ excludetype = true
+
+ deps = [ "//base" ]
+}
diff --git a/components/search_engines/cromite/cromite_prepopulated_engines.json b/components/search_engines/cromite/cromite_prepopulated_engines.json
new file mode 100644
--- /dev/null
+++ b/components/search_engines/cromite/cromite_prepopulated_engines.json
@@ -0,0 +1,37 @@
+{
+ "additionals_includes": {
+ "third_party/search_engines_data/resources/definitions/prepopulated_engines.h": ""
+ },
+ "elements": {
+ "duckduckgo_light": {
+ "name": "DuckDuckGo Light",
+ "keyword": "duckduckgo.com/lite",
+ "favicon_url": "https://duckduckgo.com/favicon.ico",
+ "search_url": "https://duckduckgo.com/lite/?q={searchTerms}",
+ "suggest_url": "https://duckduckgo.com/ac/?q={searchTerms}&type=list",
+ "type": "SEARCH_ENGINE_DUCKDUCKGOLIGHT",
+ "id": 12
+ },
+
+ "googleen": {
+ "name": "Google in English",
+ "keyword": "googleen",
+ "favicon_url": "https://www.google.com/favicon.ico",
+ "search_url": "{google:baseURL}search?q={searchTerms}&ie={inputEncoding}&hl=en",
+ "suggest_url": "{google:baseSuggestURL}search?client={google:suggestClient}&q={searchTerms}&hl=en",
+ "image_url": "{google:baseURL}searchbyimage/upload?hl=en",
+ "new_tab_url": "{google:baseURL}_/chrome/newtab?hl=en&ie={inputEncoding}",
+ "contextual_search_url": "{google:baseURL}_/contextualsearch?{google:contextualSearchVersion}{google:contextualSearchContextData}&hl=en",
+ "image_url_post_params": "encoded_image={google:imageThumbnail},image_url={google:imageURL},sbisrc={google:imageSearchSource},original_width={google:imageOriginalWidth},original_height={google:imageOriginalHeight}",
+ "alternate_urls": [
+ "{google:baseURL}?hl=en#q={searchTerms}",
+ "{google:baseURL}search?hl=en#q={searchTerms}",
+ "{google:baseURL}webhp?hl=en#q={searchTerms}",
+ "{google:baseURL}s?hl=en#q={searchTerms}",
+ "{google:baseURL}s?hl=en&q={searchTerms}"
+ ],
+ "type": "SEARCH_ENGINE_GOOGLE_EN",
+ "id": 13
+ }
+ }
+}
diff --git a/components/search_engines/search_engine_choice/search_engine_choice_utils.cc b/components/search_engines/search_engine_choice/search_engine_choice_utils.cc
--- a/components/search_engines/search_engine_choice/search_engine_choice_utils.cc
+++ b/components/search_engines/search_engine_choice/search_engine_choice_utils.cc
@@ -172,10 +172,7 @@ void RecordChoiceScreenDefaultSearchProviderType(
}
void RecordChoiceScreenSelectedIndex(int selected_engine_index) {
- base::UmaHistogramExactLinear(
- kSearchEngineChoiceScreenSelectedEngineIndexHistogram,
- selected_engine_index,
- TemplateURLPrepopulateData::kMaxEeaPrepopulatedEngines);
+ // do nothing in Cromite
}
void RecordChoiceScreenPositionsCountryMismatch(bool has_mismatch) {
diff --git a/components/search_engines/search_engine_type.h b/components/search_engines/search_engine_type.h
--- a/components/search_engines/search_engine_type.h
+++ b/components/search_engines/search_engine_type.h
@@ -98,11 +98,16 @@ enum SearchEngineType {
SEARCH_ENGINE_FREESPOKE = 78,
SEARCH_ENGINE_KAGI = 79,
SEARCH_ENGINE_STARTER_PACK_AI_MODE = 80,
+ SEARCH_ENGINE_GOOGLE_EN = 81,
+ SEARCH_ENGINE_DUCKDUCKGOLIGHT = 82,
SEARCH_ENGINE_MAX // Bounding value needed for UMA histogram macro.
};
// LINT.ThenChange(//tools/metrics/histograms/enums.xml:OmniboxSearchEngineType)
+static_assert(SEARCH_ENGINE_DUCKDUCKGOLIGHT == (SEARCH_ENGINE_MAX - 1),
+ "Please check this patch");
+
// Enum to record the type of search engine a user used in keyword mode. This
// should be kept aligned with the `OmniboxBuiltinEngineType` enum in enums.xml.
// Entries should not be renumbered and numeric values should never be reused.
diff --git a/components/search_engines/template_url_prepopulate_data.cc b/components/search_engines/template_url_prepopulate_data.cc
--- a/components/search_engines/template_url_prepopulate_data.cc
+++ b/components/search_engines/template_url_prepopulate_data.cc
@@ -28,6 +28,8 @@
#include "components/search_engines/template_url_data_util.h"
#include "third_party/search_engines_data/resources/definitions/prepopulated_engines.h"
+#include "components/search_engines/cromite/cromite_prepopulated_engines.h"
+
namespace TemplateURLPrepopulateData {
// Helpers --------------------------------------------------------------------
@@ -122,7 +124,7 @@ int GetDataVersion(PrefService* prefs) {
kCurrentDataVersion;
}
-std::vector<std::unique_ptr<TemplateURLData>> GetPrepopulatedEngines(
+std::vector<std::unique_ptr<TemplateURLData>> GetPrepopulatedEnginesChromium(
PrefService& prefs,
std::vector<const TemplateURLPrepopulateData::PrepopulatedEngine*>
regional_prepopulated_engines) {
@@ -138,6 +140,17 @@ std::vector<std::unique_ptr<TemplateURLData>> GetPrepopulatedEngines(
&PrepopulatedEngineToTemplateURLData);
}
+std::vector<std::unique_ptr<TemplateURLData>> GetPrepopulatedEngines(
+ PrefService& prefs,
+ std::vector<const TemplateURLPrepopulateData::PrepopulatedEngine*>
+ regional_prepopulated_engines) {
+ std::vector<std::unique_ptr<TemplateURLData>> t_urls =
+ GetPrepopulatedEnginesChromium(prefs, regional_prepopulated_engines);
+ t_urls.push_back(TemplateURLDataFromPrepopulatedEngine(googleen));
+ t_urls.push_back(TemplateURLDataFromPrepopulatedEngine(duckduckgo_light));
+ return t_urls;
+}
+
std::unique_ptr<TemplateURLData> GetPrepopulatedEngine(
PrefService& prefs,
std::vector<const TemplateURLPrepopulateData::PrepopulatedEngine*>
@@ -159,10 +172,14 @@ std::vector<std::unique_ptr<TemplateURLData>> GetLocalPrepopulatedEngines(
return std::vector<std::unique_ptr<TemplateURLData>>();
}
- return base::ToVector(regional_capabilities::GetPrepopulatedEngines(
+ std::vector<std::unique_ptr<TemplateURLData>> t_urls =
+ base::ToVector(regional_capabilities::GetPrepopulatedEngines(
country_id, prefs,
regional_capabilities::SearchEngineListType::kTopN),
&PrepopulatedEngineToTemplateURLData);
+ t_urls.push_back(TemplateURLDataFromPrepopulatedEngine(googleen));
+ t_urls.push_back(TemplateURLDataFromPrepopulatedEngine(duckduckgo_light));
+ return t_urls;
}
#endif
diff --git a/components/search_engines/template_url_prepopulate_data.h b/components/search_engines/template_url_prepopulate_data.h
--- a/components/search_engines/template_url_prepopulate_data.h
+++ b/components/search_engines/template_url_prepopulate_data.h
@@ -27,15 +27,6 @@ struct PrepopulatedEngine;
extern const int kMaxPrepopulatedEngineID;
-// The maximum number of prepopulated search engines that can be returned in
-// any of the EEA countries by `GetPrepopulatedEngines()`.
-//
-// Note: If this is increased, please also increase the declared variant count
-// for the `Search.ChoiceScreenShowedEngineAt.Index{Index}` histogram.
-// TODO(crbug.com/408932087): Investigate moving it to the file that actually
-// populates these, `//c/regional_capabilities/r*c*_util.cc`.
-inline constexpr size_t kMaxEeaPrepopulatedEngines = 8;
-
// The maximum number of prepopulated search engines that can be returned in
// in the rest of the world by `GetPrepopulatedEngines()`.
// TODO(crbug.com/408932087): Investigate deduping it with the constant
diff --git a/tools/json_to_struct/json_to_struct.gni b/tools/json_to_struct/json_to_struct.gni
--- a/tools/json_to_struct/json_to_struct.gni
+++ b/tools/json_to_struct/json_to_struct.gni
@@ -39,6 +39,11 @@ template("json_to_struct") {
action_name = target_name + "_action"
source_set_name = target_name
+ excludetype = false
+ if (defined(invoker.excludetype)) {
+ excludetype = invoker.excludetype
+ }
+
action(action_name) {
visibility = [ ":$source_set_name" ]
script = "//build/gn_run_binary.py"
@@ -63,6 +68,10 @@ template("json_to_struct") {
"--namespace=" + invoker.namespace,
"--schema=" + rebase_path(invoker.schema_file, root_build_dir),
]
+
+ if (excludetype) {
+ args += [ "--excludetype=yes" ]
+ }
}
source_set(source_set_name) {
diff --git a/tools/json_to_struct/json_to_struct.py b/tools/json_to_struct/json_to_struct.py
--- a/tools/json_to_struct/json_to_struct.py
+++ b/tools/json_to_struct/json_to_struct.py
@@ -103,7 +103,7 @@ def _GenerateHeaderGuard(h_filename):
return re.sub(u'^_*', '', result) + u'_' # Remove leading underscores.
-def _GenerateH(basepath, fileroot, head, namespace, schema, description):
+def _GenerateH(basepath, fileroot, head, namespace, schema, description, excludetype):
"""Generates the .h file containing the definition of the structure specified
by the schema.
@@ -147,11 +147,15 @@ def _GenerateH(basepath, fileroot, head, namespace, schema, description):
f.write(u'#include "%s"\n' % header)
f.write(u'\n')
+ for header in description.get(u'additionals_includes', []):
+ f.write(u'#include "%s"\n' % header)
+ f.write(u'\n')
+
if namespace:
f.write(u'namespace %s {\n' % namespace)
f.write(u'\n')
- f.write(struct_generator.GenerateStruct(
+ f.write(struct_generator.GenerateStruct(excludetype,
schema['type_name'], schema['schema']))
f.write(u'\n')
@@ -176,7 +180,7 @@ def _GenerateH(basepath, fileroot, head, namespace, schema, description):
f.write(u'#endif // %s\n' % header_guard)
-def _GenerateCC(basepath, fileroot, head, namespace, schema, description):
+def _GenerateCC(basepath, fileroot, head, namespace, schema, description, excludetype):
"""Generates the .cc file containing the static initializers for the
of the elements specified in the description.
@@ -211,7 +215,7 @@ def _GenerateCC(basepath, fileroot, head, namespace, schema, description):
f.write(element_generator.GenerateElements(schema['type_name'],
schema['schema'], description))
- if not aggregation.export_items:
+ if excludetype == False and not aggregation.export_items:
f.write('\n} // anonymous namespace \n\n')
aggregated = GenerateCCAggregation(schema['type_name'], aggregation)
@@ -298,7 +302,7 @@ def GenerateClass(basepath,
def GenerateStruct(basepath, output_root, namespace, schema, description,
- description_filename, schema_filename, year=None):
+ description_filename, schema_filename, excludetype, year):
"""Generates a C++ struct from a JSON description.
Args:
@@ -317,8 +321,8 @@ def GenerateStruct(basepath, output_root, namespace, schema, description,
"""
year = int(year) if year else datetime.now().year
head = HEAD % (year, schema_filename, description_filename)
- _GenerateH(basepath, output_root, head, namespace, schema, description)
- _GenerateCC(basepath, output_root, head, namespace, schema, description)
+ _GenerateH(basepath, output_root, head, namespace, schema, description, excludetype)
+ _GenerateCC(basepath, output_root, head, namespace, schema, description, excludetype)
if __name__ == '__main__':
parser = optparse.OptionParser(
@@ -333,11 +337,17 @@ if __name__ == '__main__':
parser.add_option('-s', '--schema', help='path to the schema file, '
'mandatory.')
parser.add_option('-o', '--output', help='output filename, ')
+ parser.add_option('-x', '--excludetype', help='exclude type generator, ')
(opts, args) = parser.parse_args()
if not opts.schema:
parser.error('You must specify a --schema.')
+ if not opts.excludetype:
+ opts.excludetype = False
+ else:
+ opts.excludetype = True
+
description_filename = os.path.normpath(args[0])
root, ext = os.path.splitext(description_filename)
shortroot = opts.output if opts.output else os.path.split(root)[1]
@@ -354,4 +364,4 @@ if __name__ == '__main__':
schema = _Load(opts.schema)
description = _Load(description_filename)
GenerateStruct(basepath, output_root, opts.namespace, schema, description,
- description_filename, opts.schema)
+ description_filename, opts.schema, opts.excludetype, datetime.now().year)
diff --git a/tools/json_to_struct/struct_generator.py b/tools/json_to_struct/struct_generator.py
--- a/tools/json_to_struct/struct_generator.py
+++ b/tools/json_to_struct/struct_generator.py
@@ -30,20 +30,24 @@ def GenerateField(field_info):
else:
raise RuntimeError('Unknown field type "%s"' % type)
-def GenerateStruct(type_name, schema):
+def GenerateStruct(excludetype, type_name, schema):
"""Generate a string defining a structure containing the fields specified in
the schema list.
"""
lines = []
+ if excludetype:
+ lines.append('struct %s;' % type_name)
+ return '\n'.join(lines) + '\n'
+
lines.append('struct %s {' % type_name)
for field_info in schema:
if field_info['type'] == 'struct':
- lines.insert(0, GenerateStruct(field_info['type_name'],
+ lines.insert(0, GenerateStruct(excludetype, field_info['type_name'],
field_info['fields']))
elif (field_info['type'] == 'array'
and field_info['contents']['type'] == 'struct'):
contents = field_info['contents']
- lines.insert(0, GenerateStruct(contents['type_name'],
+ lines.insert(0, GenerateStruct(excludetype, contents['type_name'],
contents['fields']))
lines.append(' ' + GenerateField(field_info) + ';')
lines.append('};')
diff --git a/tools/variations/fieldtrial_to_struct.py b/tools/variations/fieldtrial_to_struct.py
--- a/tools/variations/fieldtrial_to_struct.py
+++ b/tools/variations/fieldtrial_to_struct.py
@@ -235,14 +235,14 @@ def main(arguments):
json_to_struct.GenerateStruct(
basepath, output_root, opts.namespace, schema, description,
os.path.split(description_filename)[1], os.path.split(opts.schema)[1],
- opts.year)
+ False, opts.year)
# TODO(peilinwang) filter the schema by platform, form_factor, etc.
if opts.java:
json_to_struct.GenerateClass(basepath, output_root, opts.namespace, schema,
description,
os.path.split(description_filename)[1],
- os.path.split(opts.schema)[1], opts.year)
+ os.path.split(opts.schema)[1], False, opts.year)
if __name__ == '__main__':
--
File diff suppressed because it is too large Load Diff
@@ -1,336 +0,0 @@
From: uazo <uazo@users.noreply.github.com>
Date: Thu, 9 Oct 2025 09:11:01 +0000
Subject: Add setting to enable Credman for passkeys
Enables Credential Manager for passkey management on A14+ devices via a switch
in the settings. By default, the feature is disabled.
In other versions of Android, webauthn appears to be enabled on websites but
always returns a timeout error as per specifications.
Conditional immediate support is disabled.
License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
---
.../settings/PasswordSettings.java | 27 +++++++++++++++++
...etting-to-enable-Credman-for-passkeys.grdp | 12 ++++++++
.../webauthn/AuthenticatorImpl.java | 29 +++++++------------
.../components/webauthn/WebauthnFeatures.java | 2 ++
.../cred_man/CredManSupportProvider.java | 27 +++++------------
.../webauthn/android/webauthn_feature_map.cc | 1 +
components/webauthn/features.cc | 4 +++
components/webauthn/features.h | 3 ++
device/fido/features.cc | 2 ++
.../authentication_credentials_container.cc | 5 ++++
10 files changed, 75 insertions(+), 37 deletions(-)
create mode 100644 chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Add-setting-to-enable-Credman-for-passkeys.grdp
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettings.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettings.java
@@ -10,6 +10,7 @@ import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;
@@ -64,6 +65,10 @@ import org.chromium.chrome.browser.ui.messages.snackbar.INeedSnackbarManager;
import org.chromium.chrome.browser.ui.messages.snackbar.Snackbar;
import org.chromium.chrome.browser.lifetime.ApplicationLifetime;
+import org.chromium.chrome.browser.flags.CromiteNativeUtils;
+import org.chromium.components.webauthn.WebauthnFeatureMap;
+import org.chromium.components.webauthn.WebauthnFeatures;
+
/**
* The "Passwords" screen in Settings, which allows the user to enable or disable password saving,
* to view saved passwords (just the username and URL), and to delete saved passwords.
@@ -322,6 +327,7 @@ public class PasswordSettings extends ChromeBaseSettingsFragment
createSavePasswordsSwitch();
createAutoSignInCheckbox();
createEnableAndroidAutofillSwitch();
+ createCredManSwitch();
PasswordManagerHandlerProvider.getForProfile(getProfile())
.getPasswordManagerHandler()
@@ -673,6 +679,27 @@ public class PasswordSettings extends ChromeBaseSettingsFragment
getPrefService().getBoolean(Pref.CREDENTIALS_ENABLE_AUTOSIGNIN));
}
+ private void createCredManSwitch() {
+ ChromeSwitchPreference credManSwitch =
+ new ChromeSwitchPreference(getStyledContext(), null);
+ credManSwitch.setTitle(R.string.enable_android_credman_title);
+ credManSwitch.setOrder(0);
+ credManSwitch.setSummary(R.string.enable_android_credman_summary);
+ credManSwitch.setChecked(
+ WebauthnFeatureMap.getInstance().isEnabled(WebauthnFeatures.WEBAUTHN_ANDROID_PASSKEY));
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
+ credManSwitch.setSummary(R.string.enable_android_credman_disabled_summary);
+ credManSwitch.setEnabled(false);
+ }
+ credManSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
+ CromiteNativeUtils.setFlagEnabled("WebAuthenticationAndroidPasskey", (boolean)newValue);
+ if (!mSnackbarManagerSupplier.get().isShowing())
+ mSnackbarManagerSupplier.get().showSnackbar(mSnackbar);
+ return true;
+ });
+ getPreferenceScreen().addPreference(credManSwitch);
+ }
+
private void displayManageAccountLink() {
SyncService syncService = SyncServiceFactory.getForProfile(getProfile());
if (syncService == null || !syncService.isEngineInitialized()) {
diff --git a/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Add-setting-to-enable-Credman-for-passkeys.grdp b/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Add-setting-to-enable-Credman-for-passkeys.grdp
new file mode 100644
--- /dev/null
+++ b/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Add-setting-to-enable-Credman-for-passkeys.grdp
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_ENABLE_ANDROID_CREDMAN_TITLE" desc="" formatter_data="android_java">
+ Enable Android Credential Manager
+ </message>
+ <message name="IDS_ENABLE_ANDROID_CREDMAN_SUMMARY" desc="" formatter_data="android_java">
+ Enable support for Android Credential Manager
+ </message>
+ <message name="IDS_ENABLE_ANDROID_CREDMAN_DISABLED_SUMMARY" desc="" formatter_data="android_java">
+ Not supported on your device (require A14+)
+ </message>
+</grit-part>
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorImpl.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorImpl.java
--- a/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorImpl.java
+++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorImpl.java
@@ -34,6 +34,8 @@ import org.chromium.blink.mojom.PublicKeyCredentialReportOptions;
import org.chromium.blink.mojom.WebAuthnClientCapability;
import org.chromium.build.annotations.NullMarked;
import org.chromium.build.annotations.Nullable;
+import org.chromium.components.webauthn.CredManSupport;
+import org.chromium.components.webauthn.cred_man.CredManSupportProvider;
import org.chromium.components.ukm.UkmRecorder;
import org.chromium.content_public.browser.RenderFrameHost;
import org.chromium.content_public.browser.WebContents;
@@ -169,8 +171,7 @@ public final class AuthenticatorImpl implements Authenticator, AuthenticationCon
mIsPaymentRequest = options.isPaymentCredentialCreation;
mMakeCredentialCallback = callback;
mIsOperationPending = true;
- if (!GmsCoreUtils.isWebauthnSupported()
- || (!isChrome(mWebContents) && !GmsCoreUtils.isResultReceiverSupported())) {
+ if (CredManSupportProvider.getCredManSupport() == CredManSupport.DISABLED) {
recordOutcomeEvent(MakeCredentialOutcome.OTHER_FAILURE);
onError(AuthenticatorStatus.NOT_IMPLEMENTED);
return;
@@ -234,8 +235,7 @@ public final class AuthenticatorImpl implements Authenticator, AuthenticationCon
mIsConditionalRequest = options.mediation == Mediation.CONDITIONAL;
mIsImmediateRequest = options.mediation == Mediation.IMMEDIATE;
- if (!GmsCoreUtils.isWebauthnSupported()
- || (!isChrome(mWebContents) && !GmsCoreUtils.isResultReceiverSupported())
+ if (CredManSupportProvider.getCredManSupport() == CredManSupport.DISABLED
|| options.publicKey == null) {
recordOutcomeEvent(GetAssertionOutcome.OTHER_FAILURE);
onError(AuthenticatorStatus.NOT_IMPLEMENTED);
@@ -260,12 +260,11 @@ public final class AuthenticatorImpl implements Authenticator, AuthenticationCon
}
private boolean couldSupportConditionalMediation() {
- return GmsCoreUtils.isWebauthnSupported() && isChrome(mWebContents);
+ return isChrome(mWebContents);
}
private boolean couldSupportUvpaa() {
- return GmsCoreUtils.isWebauthnSupported()
- && (isChrome(mWebContents) || GmsCoreUtils.isResultReceiverSupported());
+ return isChrome(mWebContents);
}
@Override
@@ -339,26 +338,20 @@ public final class AuthenticatorImpl implements Authenticator, AuthenticationCon
capabilities.add(
createWebAuthnClientCapability(
AuthenticatorConstants.CAPABILITY_CONDITIONAL_GET,
- couldSupportConditionalMediation() && isUvpaa));
+ true));
capabilities.add(
createWebAuthnClientCapability(
AuthenticatorConstants.CAPABILITY_UVPAA,
- couldSupportUvpaa() && isUvpaa));
- boolean conditionalCreateEnabled =
- couldSupportConditionalMediation()
- && DeviceFeatureMap.isEnabled(
- DeviceFeatureList.WEBAUTHN_PASSKEY_UPGRADE);
+ true));
capabilities.add(
createWebAuthnClientCapability(
AuthenticatorConstants.CAPABILITY_CONDITIONAL_CREATE,
- isUvpaa && conditionalCreateEnabled));
+ DeviceFeatureMap.isEnabled(
+ DeviceFeatureList.WEBAUTHN_PASSKEY_UPGRADE)));
capabilities.add(
createWebAuthnClientCapability(
AuthenticatorConstants.CAPABILITY_IMMEDIATE_GET,
- DeviceFeatureMap.isEnabled(
- DeviceFeatureList
- .WEBAUTHN_IMMEDIATE_GET)
- && isUvpaa));
+ false));
callback.call(capabilities.toArray(new WebAuthnClientCapability[0]));
});
}
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/WebauthnFeatures.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/WebauthnFeatures.java
--- a/components/webauthn/android/java/src/org/chromium/components/webauthn/WebauthnFeatures.java
+++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/WebauthnFeatures.java
@@ -16,4 +16,6 @@ import org.chromium.build.annotations.NullMarked;
public abstract class WebauthnFeatures {
public static final String WEBAUTHN_ANDROID_PASSKEY_CACHE_MIGRATION =
"WebAuthenticationAndroidPasskeyCacheMigration";
+ public static final String WEBAUTHN_ANDROID_PASSKEY =
+ "WebAuthenticationAndroidPasskey";
}
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/cred_man/CredManSupportProvider.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/cred_man/CredManSupportProvider.java
--- a/components/webauthn/android/java/src/org/chromium/components/webauthn/cred_man/CredManSupportProvider.java
+++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/cred_man/CredManSupportProvider.java
@@ -19,9 +19,11 @@ import org.chromium.base.version_info.VersionInfo;
import org.chromium.build.annotations.NullMarked;
import org.chromium.build.annotations.Nullable;
import org.chromium.components.webauthn.CredManSupport;
-import org.chromium.components.webauthn.GmsCoreUtils;
import org.chromium.components.webauthn.WebauthnMode;
import org.chromium.components.webauthn.WebauthnModeProvider;
+import org.chromium.components.webauthn.WebauthnFeatureMap;
+import org.chromium.components.webauthn.WebauthnFeatures;
+import org.chromium.components.webauthn.WebauthnLogger;
@NullMarked
public class CredManSupportProvider {
@@ -57,12 +59,12 @@ public class CredManSupportProvider {
}
if (getAndroidVersion() < Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
sCredManSupport = CredManSupport.DISABLED;
- log(TAG, "Disabled because of Android version.");
+ WebauthnLogger.logError(TAG, "Disabled because of Android version.");
return sCredManSupport;
}
- if (notSkippedBecauseInTests() && hasOldGmsVersion()) {
+ if (!WebauthnFeatureMap.getInstance().isEnabled(WebauthnFeatures.WEBAUTHN_ANDROID_PASSKEY)) {
sCredManSupport = CredManSupport.DISABLED;
- log(TAG, "Disabled because of old GMS version.");
+ WebauthnLogger.logError(TAG, "Disabled because of user.");
return sCredManSupport;
}
if (notSkippedBecauseInTests()
@@ -70,14 +72,14 @@ public class CredManSupportProvider {
== null) {
sCredManSupport = CredManSupport.DISABLED;
recordCredManAvailability(/*available*/ false);
- log(TAG, "Disabled because CredentialManager is not available.");
+ WebauthnLogger.logError(TAG, "Disabled because CredentialManager is not available.");
return sCredManSupport;
}
recordCredManAvailability(/*available*/ true);
final CredManUiRecommender recommender =
ServiceLoaderUtil.maybeCreate(CredManUiRecommender.class);
- boolean customUiRecommended = recommender != null && recommender.recommendsCustomUi();
+ boolean customUiRecommended = true;
boolean gpmInCredMan =
sOverrideForcesGpm != null ? sOverrideForcesGpm : customUiRecommended;
boolean isChrome3pPwmMode =
@@ -116,13 +118,6 @@ public class CredManSupportProvider {
"WebAuthentication.Android.CredManAvailability", available);
}
- private static boolean hasOldGmsVersion() {
- assert sOverrideAndroidVersion == null : "Don't use in testing!";
- // The check works for unavailable and low GMS versions. `getGmsCoreVersion()` is -1 if the
- // GMS version can't be retrieved. Chrome assumes an insufficient GMS availability then.
- return GmsCoreUtils.getGmsCoreVersion() < getMinGmsVersionForCurrentChannel();
- }
-
private static int getAndroidVersion() {
return sOverrideAndroidVersion == null ? Build.VERSION.SDK_INT : sOverrideAndroidVersion;
}
@@ -130,10 +125,4 @@ public class CredManSupportProvider {
private static boolean notSkippedBecauseInTests() {
return sOverrideForcesGpm == null && sOverrideAndroidVersion == null;
}
-
- private static int getMinGmsVersionForCurrentChannel() {
- return (VersionInfo.isBetaBuild() || VersionInfo.isStableBuild())
- ? GMSCORE_MIN_VERSION_BETA_STABLE
- : GMSCORE_MIN_VERSION_CANARY_DEV;
- }
}
diff --git a/components/webauthn/android/webauthn_feature_map.cc b/components/webauthn/android/webauthn_feature_map.cc
--- a/components/webauthn/android/webauthn_feature_map.cc
+++ b/components/webauthn/android/webauthn_feature_map.cc
@@ -16,6 +16,7 @@ namespace {
// Array of features exposed through the Java WebauthnFeatureMap API.
const base::Feature* const kFeaturesExposedToJava[] = {
&kWebAuthnAndroidPasskeyCacheMigration,
+ &kWebAuthnAndroidPasskey,
};
// static
diff --git a/components/webauthn/features.cc b/components/webauthn/features.cc
--- a/components/webauthn/features.cc
+++ b/components/webauthn/features.cc
@@ -16,6 +16,10 @@ BASE_FEATURE(kWebAuthnAndroidPasskeyCacheMigration,
"WebAuthenticationAndroidPasskeyCacheMigration",
base::FEATURE_DISABLED_BY_DEFAULT);
+CROMITE_FEATURE(kWebAuthnAndroidPasskey,
+ "WebAuthenticationAndroidPasskey",
+ base::FEATURE_DISABLED_BY_DEFAULT);
+
#endif // BUILDFLAG(IS_ANDROID)
#if !BUILDFLAG(IS_ANDROID)
diff --git a/components/webauthn/features.h b/components/webauthn/features.h
--- a/components/webauthn/features.h
+++ b/components/webauthn/features.h
@@ -20,6 +20,9 @@ namespace webauthn::features {
COMPONENT_EXPORT(WEBAUTHN)
BASE_DECLARE_FEATURE(kWebAuthnAndroidPasskeyCacheMigration);
+COMPONENT_EXPORT(WEBAUTHN)
+BASE_DECLARE_FEATURE(kWebAuthnAndroidPasskey);
+
#endif // BUILDFLAG(IS_ANDROID)
#if !BUILDFLAG(IS_ANDROID)
diff --git a/device/fido/features.cc b/device/fido/features.cc
--- a/device/fido/features.cc
+++ b/device/fido/features.cc
@@ -154,6 +154,7 @@ BASE_FEATURE(kWebAuthnImmediateGet,
#else
base::FEATURE_ENABLED_BY_DEFAULT);
#endif // BUILDFLAG(IS_ANDROID)
+SET_CROMITE_FEATURE_DISABLED(kWebAuthnImmediateGet);
BASE_FEATURE_PARAM(int,
kWebAuthnImmediateMediationTimeoutMilliseconds,
@@ -166,6 +167,7 @@ BASE_FEATURE_PARAM(int,
BASE_FEATURE(kWebAuthnImmediateGetAutoselect,
"WebAuthenticationImmediateGetAutoselect",
base::FEATURE_ENABLED_BY_DEFAULT);
+SET_CROMITE_FEATURE_DISABLED(kWebAuthnImmediateGetAutoselect);
// Default enabled in M140. Remove in or after M143.
BASE_FEATURE(kWebAuthnLargeBlobForGPM,
diff --git a/third_party/blink/renderer/modules/credentialmanagement/authentication_credentials_container.cc b/third_party/blink/renderer/modules/credentialmanagement/authentication_credentials_container.cc
--- a/third_party/blink/renderer/modules/credentialmanagement/authentication_credentials_container.cc
+++ b/third_party/blink/renderer/modules/credentialmanagement/authentication_credentials_container.cc
@@ -1076,6 +1076,11 @@ DOMException* AuthenticatorStatusToDOMException(
const WebAuthnDOMExceptionDetailsPtr& dom_exception_details) {
DCHECK_EQ(status != AuthenticatorStatus::ERROR_WITH_DOM_EXCEPTION_DETAILS,
dom_exception_details.is_null());
+ if (status == AuthenticatorStatus::UNKNOWN_ERROR ||
+ status == AuthenticatorStatus::NOT_IMPLEMENTED) {
+ status = AuthenticatorStatus::NOT_ALLOWED_ERROR;
+ base::PlatformThread::Sleep(base::Milliseconds(base::RandInt(1000, 6000)));
+ }
switch (status) {
case AuthenticatorStatus::SUCCESS:
NOTREACHED();
--
@@ -1,586 +0,0 @@
From: uazo <uazo@users.noreply.github.com>
Date: Wed, 12 Apr 2023 08:22:00 +0000
Subject: Add setting to invert tap and long tap
Reverses single tap to long tap in android for accessibility reasons.
The feature can be activated from the accessibility settings.
Need: bromite-build-utils.patch
License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
---
.../AwContextMenuItemDelegate.java | 4 +++
chrome/android/java/res/values/ids.xml | 1 +
.../ChromeAccessibilitySettingsDelegate.java | 18 ++++++++++
.../contextmenu/ChromeContextMenuItem.java | 5 ++-
.../ChromeContextMenuPopulator.java | 5 +++
.../tab/TabContextMenuItemDelegate.java | 8 +++++
.../flags/android/chrome_feature_list.cc | 1 +
.../browser/flags/ChromeFeatureList.java | 5 +++
.../strings/android_chrome_strings.grd | 9 +++++
.../res/xml/accessibility_preferences.xml | 5 +++
.../accessibility/AccessibilitySettings.java | 12 +++++++
.../AccessibilitySettingsDelegate.java | 2 ++
.../contextmenu/ContextMenuItemDelegate.java | 3 ++
...Add-setting-to-invert-tap-and-long-tap.inc | 8 +++++
...Add-setting-to-invert-tap-and-long-tap.inc | 3 ++
...Add-setting-to-invert-tap-and-long-tap.inc | 1 +
.../renderer/core/html/html_anchor_element.cc | 36 +++++++++++++++----
.../renderer/core/html/html_anchor_element.h | 7 +++-
.../renderer/core/html/html_image_element.cc | 17 +++++++++
.../renderer/core/html/html_image_element.h | 2 ++
.../core/page/context_menu_controller.cc | 23 +++++++++---
.../core/page/context_menu_controller.h | 5 +--
22 files changed, 164 insertions(+), 16 deletions(-)
create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Add-setting-to-invert-tap-and-long-tap.inc
create mode 100644 cromite_flags/third_party/blink/common/features_cc/Add-setting-to-invert-tap-and-long-tap.inc
create mode 100644 cromite_flags/third_party/blink/common/features_h/Add-setting-to-invert-tap-and-long-tap.inc
diff --git a/android_webview/java/src/org/chromium/android_webview/contextmenu/AwContextMenuItemDelegate.java b/android_webview/java/src/org/chromium/android_webview/contextmenu/AwContextMenuItemDelegate.java
--- a/android_webview/java/src/org/chromium/android_webview/contextmenu/AwContextMenuItemDelegate.java
+++ b/android_webview/java/src/org/chromium/android_webview/contextmenu/AwContextMenuItemDelegate.java
@@ -11,6 +11,7 @@ import android.net.Uri;
import org.chromium.base.IntentUtils;
import org.chromium.build.annotations.NullMarked;
import org.chromium.components.embedder_support.contextmenu.ContextMenuItemDelegate;
+import org.chromium.content_public.common.Referrer;
import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.base.Clipboard;
import org.chromium.url.GURL;
@@ -52,6 +53,9 @@ public class AwContextMenuItemDelegate implements ContextMenuItemDelegate {
IntentUtils.safeStartActivity(mActivity, intent);
}
+ @Override
+ public void onOpenUrl(GURL url, Referrer referrer) { }
+
@Override
public GURL getPageUrl() {
return mWebContents.getVisibleUrl();
diff --git a/chrome/android/java/res/values/ids.xml b/chrome/android/java/res/values/ids.xml
--- a/chrome/android/java/res/values/ids.xml
+++ b/chrome/android/java/res/values/ids.xml
@@ -109,6 +109,7 @@ found in the LICENSE file.
<!-- Menu item IDs for FullscreenActivities -->
<item type="id" name="contextmenu_open_in_chrome" />
+ <item type="id" name="contextmenu_open_in_tab" />
<!-- Tags -->
<item type="id" name="highlight_color" />
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java
@@ -165,6 +165,24 @@ public class ChromeAccessibilitySettingsDelegate implements AccessibilitySetting
mSnackbarManagerSupplier.get().showSnackbar(mSnackbar);
}
+ private static class ShowAlwaysContextMenuOnLinksDelegate implements BooleanPreferenceDelegate {
+ @Override
+ public boolean getValue() {
+ return ChromeFeatureList.sShowAlwaysContextMenuOnLinks.isEnabled();
+ }
+
+ @Override
+ public void setValue(boolean value) {
+ CromiteNativeUtils.setFlagEnabled(ChromeFeatureList.SHOW_ALWAYS_CONTEXT_MENU_ON_LINKS,
+ "show-always-context-menu-on-links", value);
+ }
+ }
+
+ @Override
+ public BooleanPreferenceDelegate getShowAlwaysContextMenuOnLinksDelegate() {
+ return new ShowAlwaysContextMenuOnLinksDelegate();
+ }
+
@Override
public BrowserContextHandle getBrowserContextHandle() {
return mProfile;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuItem.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuItem.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuItem.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuItem.java
@@ -132,8 +132,9 @@ class ChromeContextMenuItem {
int PRINT_PAGE = 40;
// Developer Group
int INSPECT_ELEMENT = 41;
+ int FOLLOW_LINK = 42;
// ALWAYS UPDATE!
- int NUM_ENTRIES = 42;
+ int NUM_ENTRIES = 43;
}
/** Mapping from {@link Item} to the ID found in the ids.xml. */
@@ -180,6 +181,7 @@ class ChromeContextMenuItem {
R.id.contextmenu_share_page, // Item.SHARE_PAGE
R.id.contextmenu_print_page, // Item.PRINT_PAGE
R.id.contextmenu_inspect_element, // Item.INSPECT_ELEMENT
+ R.id.contextmenu_open_in_tab, // Item.OPEN_IN_NEW_CHROME_TAB
};
/** Mapping from {@link Item} to the ID of the string that describes the action of the item. */
@@ -226,6 +228,7 @@ class ChromeContextMenuItem {
R.string.contextmenu_share_page, // Item.SHARE_PAGE
R.string.contextmenu_print_page, // Item.PRINT_PAGE
R.string.contextmenu_inspect_element, // Item.INSPECT_ELEMENT
+ R.string.contextmenu_open_in_tab, // Item.OPEN_IN_NEW_CHROME_TAB
};
/**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java
@@ -452,6 +452,9 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
}
if (mParams.isAnchor()) {
ModelList linkGroup = new ModelList();
+ if (ChromeFeatureList.sShowAlwaysContextMenuOnLinks.isEnabled()) {
+ linkGroup.add(createListItem(Item.FOLLOW_LINK));
+ }
if (FirstRunStatus.getFirstRunFlowComplete()
&& !isEmptyUrl(mParams.getUrl())
&& UrlUtilities.isAcceptedScheme(mParams.getUrl())) {
@@ -1054,6 +1057,8 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
getProfile(),
false);
});
+ } else if (itemId == R.id.contextmenu_open_in_tab) {
+ mItemDelegate.onOpenUrl(mParams.getUrl(), mParams.getReferrer());
} else if (itemId == R.id.contextmenu_open_in_chrome) {
recordContextMenuSelection(ContextMenuUma.Action.OPEN_IN_CHROME);
mItemDelegate.onOpenInChrome(mParams.getUrl(), mParams.getPageUrl());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java
@@ -374,6 +374,14 @@ public class TabContextMenuItemDelegate implements ContextMenuItemDelegate {
mTab.loadUrl(loadUrlParams);
}
+ @Override
+ public void onOpenUrl(GURL url, Referrer referrer) {
+ LoadUrlParams loadUrlParams = new LoadUrlParams(url.getSpec());
+ loadUrlParams.setTransitionType(PageTransition.LINK);
+ loadUrlParams.setReferrer(referrer);
+ mTab.loadUrl(loadUrlParams);
+ }
+
/**
* Called when the {@code url} is of an image and should be opened in a new page.
*
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -433,6 +433,7 @@ const base::Feature* const kFeaturesExposedToJava[] = {
&kTabGroupParityBottomSheetAndroid,
&kTabModelInitFixes,
&kTabStorageSqlitePrototype,
+ &blink::features::kShowAlwaysContextMenuOnLinks,
&kTabStripAutoSelectOnCloseChange,
&kTabStripDensityChangeAndroid,
&kTabStripGroupDragDropAndroid,
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -507,6 +507,8 @@ public abstract class ChromeFeatureList {
"DisableToolbarSwipeUp";
public static final String MOVE_TOP_TOOLBAR_TO_BOTTOM =
"MoveTopToolbarToBottom";
+ public static final String SHOW_ALWAYS_CONTEXT_MENU_ON_LINKS =
+ "ShowAlwaysContextMenuOnLinks";
public static final String NEW_TAB_PAGE_CUSTOMIZATION_TOOLBAR_BUTTON =
"NewTabPageCustomizationToolbarButton";
public static final String NEW_TAB_PAGE_CUSTOMIZATION_V2 = "NewTabPageCustomizationV2";
@@ -1035,6 +1037,8 @@ public abstract class ChromeFeatureList {
newCachedFlag(DISABLE_TOOLBAR_SWIPE_UP, false);
public static final CachedFlag sMoveTopToolbarToBottom =
newCachedFlag(MOVE_TOP_TOOLBAR_TO_BOTTOM, false);
+ public static final CachedFlag sShowAlwaysContextMenuOnLinks =
+ newCachedFlag(SHOW_ALWAYS_CONTEXT_MENU_ON_LINKS, false);
public static final CachedFlag sPaintPreviewDemo = newCachedFlag(PAINT_PREVIEW_DEMO, false);
public static final CachedFlag sPostGetMyMemoryStateToBackground =
newCachedFlag(POST_GET_MEMORY_PRESSURE_TO_BACKGROUND, true);
@@ -1289,6 +1293,7 @@ public abstract class ChromeFeatureList {
sTopControlsRefactor,
sTouchToSearchCallout,
sTraceBinderIpc,
+ sShowAlwaysContextMenuOnLinks,
sUseActivityManagerForTabActivation,
sUseChimeAndroidSdk,
sUseInitialNetworkStateAtStartup,
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -1554,6 +1554,12 @@ Your Google account may have other forms of browsing history like searches and a
<message name="IDS_DISABLE_TOOLBAR_SWIPE_UP" desc="Summary of the preference that allows the user to disable toolbar swipeup.">
Disable toolbar swipe up
</message>
+ <message name="IDS_ALWAYS_SHOW_CONTEXTMENU_ON_LINKS_TITLE" desc="Title of the preference that open the context menu in links.">
+ Always open the context menu in the links
+ </message>
+ <message name="IDS_ALWAYS_SHOW_CONTEXTMENU_ON_LINKS_SUMMARY" desc="Summary of the preference that open the context menu in links.">
+ Allows the context menu to be opened with a tap and follow the link with long press
+ </message>
<!-- Safety check -->
<message name="IDS_PREFS_SAFETY_CHECK" desc="Title of the Safety check element in settings, allowing the user to check multiple areas of browser safety. [CHAR_LIMIT=32]">
@@ -3195,6 +3201,9 @@ To change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>delete the Chrome d
<message name="IDS_CONTEXTMENU_OPEN_IN_NEW_CHROME_TAB" desc="Context sensitive menu item to open the selected link in a new Chrome tab from Chrome Custom Tab. [CHAR_LIMIT=30]">
Open in new Chrome tab
</message>
+ <message name="IDS_CONTEXTMENU_OPEN_IN_TAB" desc="Context sensitive menu item to open the selected link in tab. [CHAR_LIMIT=30]">
+ Open in current tab
+ </message>
<message name="IDS_CONTEXTMENU_OPEN_IN_CHROME_INCOGNITO_TAB" desc="Context sensitive menu item to open the selected link in a Chrome Incognito tab from Chrome Custom Tab. [CHAR_LIMIT=30]">
Open in Incognito tab
</message>
diff --git a/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml b/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml
--- a/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml
+++ b/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml
@@ -26,6 +26,11 @@ found in the LICENSE file.
android:summary="@string/page_zoom_always_show_preference_summary"
android:title="@string/page_zoom_always_show_preference_title" />
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
+ android:key="always_show_contextmenu_on_links"
+ android:summary="@string/always_show_contextmenu_on_links_summary"
+ android:title="@string/always_show_contextmenu_on_links_title" />
+
<org.chromium.components.browser_ui.settings.ChromeSwitchPreference
android:key="force_enable_zoom"
android:summary="@string/force_enable_zoom_summary"
diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java
--- a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java
+++ b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java
@@ -53,6 +53,9 @@ public class AccessibilitySettings extends ChromeBaseSettingsFragment
private BooleanPreferenceDelegate mMoveTopToolbarToBottomDelegate;
private BooleanPreferenceDelegate mDisableToolbarSwipeUpDelegate;
+ static final String PREF_ALWAYS_SHOW_CONTEXTMENU_ON_LINKS = "always_show_contextmenu_on_links";
+ private BooleanPreferenceDelegate mShowAlwaysContextMenuOnLinksDelegate;
+
private PageZoomPreference mPageZoomDefaultZoomPref;
private ChromeSwitchPreference mPageZoomIncludeOSAdjustment;
private ChromeSwitchPreference mPageZoomAlwaysShowPref;
@@ -148,6 +151,12 @@ public class AccessibilitySettings extends ChromeBaseSettingsFragment
mDisableToolbarSwipeUpPref.setChecked(mDisableToolbarSwipeUpDelegate.getValue());
mDisableToolbarSwipeUpPref.setOnPreferenceChangeListener(this);
+ ChromeSwitchPreference mShowAlwaysContextMenuOnLinksPref =
+ (ChromeSwitchPreference) findPreference(PREF_ALWAYS_SHOW_CONTEXTMENU_ON_LINKS);
+ mShowAlwaysContextMenuOnLinksDelegate = mDelegate.getShowAlwaysContextMenuOnLinksDelegate();
+ mShowAlwaysContextMenuOnLinksPref.setChecked(mShowAlwaysContextMenuOnLinksDelegate.getValue());
+ mShowAlwaysContextMenuOnLinksPref.setOnPreferenceChangeListener(this);
+
Preference captions = findPreference(PREF_CAPTIONS);
captions.setOnPreferenceClickListener(
preference -> {
@@ -229,6 +238,9 @@ public class AccessibilitySettings extends ChromeBaseSettingsFragment
} else if (PREF_DISABLE_TOOLBAR_SWIPE_UP.equals(preference.getKey())) {
mDisableToolbarSwipeUpDelegate.setValue((Boolean) newValue);
mDelegate.requestRestart(getActivity());
+ } else if (PREF_ALWAYS_SHOW_CONTEXTMENU_ON_LINKS.equals(preference.getKey())) {
+ mShowAlwaysContextMenuOnLinksDelegate.setValue((Boolean) newValue);
+ mDelegate.requestRestart(getActivity());
} else if (PREF_PAGE_ZOOM_INCLUDE_OS_ADJUSTMENT.equals(preference.getKey())) {
// TODO(mschillaci): Implement the override behavior for OS level.
} else if (OmniboxFeatures.KEY_JUMP_START_OMNIBOX.equals(preference.getKey())) {
diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsDelegate.java b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsDelegate.java
--- a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsDelegate.java
+++ b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsDelegate.java
@@ -45,6 +45,8 @@ public interface AccessibilitySettingsDelegate {
BooleanPreferenceDelegate getMoveTopToolbarToBottomDelegate();
BooleanPreferenceDelegate getDisableToolbarSwipeUpDelegate();
+ BooleanPreferenceDelegate getShowAlwaysContextMenuOnLinksDelegate();
+
/**
* @return The BrowserContextHandle that should be used to read and update settings.
*/
diff --git a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/contextmenu/ContextMenuItemDelegate.java b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/contextmenu/ContextMenuItemDelegate.java
--- a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/contextmenu/ContextMenuItemDelegate.java
+++ b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/contextmenu/ContextMenuItemDelegate.java
@@ -10,6 +10,7 @@ import androidx.annotation.IntDef;
import org.chromium.build.annotations.NullMarked;
import org.chromium.content_public.browser.WebContents;
+import org.chromium.content_public.common.Referrer;
import org.chromium.url.GURL;
import java.lang.annotation.Retention;
@@ -150,6 +151,8 @@ public interface ContextMenuItemDelegate {
*/
GURL getPageUrl();
+ void onOpenUrl(GURL url, Referrer referrer);
+
/**
* Called when the current embedder app is not the default to handle a View Intent.
*
diff --git a/cromite_flags/chrome/browser/about_flags_cc/Add-setting-to-invert-tap-and-long-tap.inc b/cromite_flags/chrome/browser/about_flags_cc/Add-setting-to-invert-tap-and-long-tap.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/chrome/browser/about_flags_cc/Add-setting-to-invert-tap-and-long-tap.inc
@@ -0,0 +1,8 @@
+#ifdef FLAG_SECTION
+
+ {"show-always-context-menu-on-links",
+ "Always show contextmenu on links",
+ "Use accessibility settings to set it.", kOsAndroid,
+ FEATURE_VALUE_TYPE(blink::features::kShowAlwaysContextMenuOnLinks)},
+
+#endif
diff --git a/cromite_flags/third_party/blink/common/features_cc/Add-setting-to-invert-tap-and-long-tap.inc b/cromite_flags/third_party/blink/common/features_cc/Add-setting-to-invert-tap-and-long-tap.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/third_party/blink/common/features_cc/Add-setting-to-invert-tap-and-long-tap.inc
@@ -0,0 +1,3 @@
+CROMITE_FEATURE(kShowAlwaysContextMenuOnLinks,
+ "ShowAlwaysContextMenuOnLinks",
+ base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/cromite_flags/third_party/blink/common/features_h/Add-setting-to-invert-tap-and-long-tap.inc b/cromite_flags/third_party/blink/common/features_h/Add-setting-to-invert-tap-and-long-tap.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/third_party/blink/common/features_h/Add-setting-to-invert-tap-and-long-tap.inc
@@ -0,0 +1 @@
+BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kShowAlwaysContextMenuOnLinks);
diff --git a/third_party/blink/renderer/core/html/html_anchor_element.cc b/third_party/blink/renderer/core/html/html_anchor_element.cc
--- a/third_party/blink/renderer/core/html/html_anchor_element.cc
+++ b/third_party/blink/renderer/core/html/html_anchor_element.cc
@@ -67,6 +67,7 @@
#include "third_party/blink/renderer/core/loader/render_blocking_resource_manager.h"
#include "third_party/blink/renderer/core/navigation_api/navigation_api.h"
#include "third_party/blink/renderer/core/page/chrome_client.h"
+#include "third_party/blink/renderer/core/page/context_menu_controller.h"
#include "third_party/blink/renderer/core/page/page.h"
#include "third_party/blink/renderer/core/scroll/scroll_into_view_util.h"
#include "third_party/blink/renderer/core/speculation_rules/document_speculation_rules.h"
@@ -476,6 +477,17 @@ void HTMLAnchorElementBase::NavigateToHyperlink(
bool is_trusted,
base::TimeTicks platform_time_stamp,
KURL completed_url) {
+ UIEvent& event = *UIEvent::Create();
+ NavigateToHyperlink2(std::move(request), navigation_policy, is_trusted, platform_time_stamp,
+ std::move(completed_url), event, true);
+}
+
+void HTMLAnchorElementBase::NavigateToHyperlink2(ResourceRequest request,
+ NavigationPolicy navigation_policy,
+ bool is_trusted,
+ base::TimeTicks platform_time_stamp,
+ KURL completed_url,
+ Event& event, bool do_not_show_context_menu) {
LocalDOMWindow* window = GetDocument().domWindow();
if (!window) {
return;
@@ -566,6 +578,15 @@ void HTMLAnchorElementBase::NavigateToHyperlink(
frame_request.SetImpression(impression);
}
+ if (!do_not_show_context_menu &&
+ base::FeatureList::IsEnabled(features::kShowAlwaysContextMenuOnLinks)) {
+ if (Page* page = GetDocument().GetPage()) {
+ page->GetContextMenuController().HandleContextMenuEvent(
+ To<MouseEvent>(&event), /*do_not_show_context_menu*/true);
+ return;
+ }
+ }
+
Frame* target_frame =
frame->Tree().FindOrCreateFrameForNavigation(frame_request, target).frame;
@@ -601,7 +622,7 @@ bool HTMLAnchorElementBase::IsValidInterestInvoker(Element& target) const {
return IsLink();
}
-void HTMLAnchorElementBase::HandleClick(MouseEvent& event) {
+void HTMLAnchorElementBase::HandleClick(MouseEvent& event, bool do_not_show_context_menu) {
event.SetDefaultHandled();
LocalDOMWindow* window = GetDocument().domWindow();
@@ -659,13 +680,12 @@ void HTMLAnchorElementBase::HandleClick(MouseEvent& event) {
return;
}
- base::OnceClosure navigate_closure = blink::BindOnce(
- &HTMLAnchorElementBase::NavigateToHyperlink, WrapWeakPersistent(this),
- std::move(request), navigation_policy, event.isTrusted(),
- event.PlatformTimeStamp(), std::move(completed_url));
-
if (navigation_policy == kNavigationPolicyDownload ||
navigation_policy == kNavigationPolicyLinkPreview) {
+ base::OnceClosure navigate_closure = blink::BindOnce(
+ &HTMLAnchorElementBase::NavigateToHyperlink, WrapWeakPersistent(this),
+ std::move(request), navigation_policy, event.isTrusted(),
+ event.PlatformTimeStamp(), std::move(completed_url));
// We distinguish single/double click with some modifiers.
// See the comment of `EventHandler.delayed_navigation_task_handle_`.
auto task_handle = PostDelayedCancellableTask(
@@ -675,7 +695,9 @@ void HTMLAnchorElementBase::HandleClick(MouseEvent& event) {
frame->GetEventHandler().SetDelayedNavigationTaskHandle(
std::move(task_handle));
} else {
- std::move(navigate_closure).Run();
+ HTMLAnchorElementBase::NavigateToHyperlink2(std::move(request), navigation_policy,
+ event.isTrusted(), event.PlatformTimeStamp(), std::move(completed_url),
+ event, do_not_show_context_menu);
}
}
diff --git a/third_party/blink/renderer/core/html/html_anchor_element.h b/third_party/blink/renderer/core/html/html_anchor_element.h
--- a/third_party/blink/renderer/core/html/html_anchor_element.h
+++ b/third_party/blink/renderer/core/html/html_anchor_element.h
@@ -112,6 +112,7 @@ class CORE_EXPORT HTMLAnchorElementBase : public HTMLElement,
bool IsValidInterestInvoker(Element& target) const override;
void Trace(Visitor*) const override;
+ void HandleClick(MouseEvent&, bool do_not_show_context_menu = false);
protected:
HTMLAnchorElementBase(const QualifiedName& tag_name, Document&);
@@ -143,7 +144,11 @@ class CORE_EXPORT HTMLAnchorElementBase : public HTMLElement,
bool is_trusted,
base::TimeTicks platform_time_stamp,
KURL);
- void HandleClick(MouseEvent&);
+ void NavigateToHyperlink2(ResourceRequest,
+ NavigationPolicy,
+ bool is_trusted,
+ base::TimeTicks platform_time_stamp,
+ KURL, Event&, bool do_not_show_context_menu);
unsigned link_relations_ : 31;
mutable LinkHash cached_visited_link_hash_;
diff --git a/third_party/blink/renderer/core/html/html_image_element.cc b/third_party/blink/renderer/core/html/html_image_element.cc
--- a/third_party/blink/renderer/core/html/html_image_element.cc
+++ b/third_party/blink/renderer/core/html/html_image_element.cc
@@ -37,6 +37,7 @@
#include "third_party/blink/renderer/core/dom/events/event_dispatch_forbidden_scope.h"
#include "third_party/blink/renderer/core/dom/node_traversal.h"
#include "third_party/blink/renderer/core/dom/shadow_root.h"
+#include "third_party/blink/renderer/core/events/mouse_event.h"
#include "third_party/blink/renderer/core/frame/attribution_src_loader.h"
#include "third_party/blink/renderer/core/frame/deprecation/deprecation.h"
#include "third_party/blink/renderer/core/frame/local_dom_window.h"
@@ -65,6 +66,7 @@
#include "third_party/blink/renderer/core/media_type_names.h"
#include "third_party/blink/renderer/core/page/chrome_client.h"
#include "third_party/blink/renderer/core/page/page.h"
+#include "third_party/blink/renderer/core/page/context_menu_controller.h"
#include "third_party/blink/renderer/core/paint/timing/paint_timing.h"
#include "third_party/blink/renderer/core/probe/core_probes.h"
#include "third_party/blink/renderer/core/resize_observer/resize_observer_entry.h"
@@ -796,6 +798,21 @@ void HTMLImageElement::DidFinishLayout() {
}
}
+void HTMLImageElement::DefaultEventHandler(Event& event) {
+ if (base::FeatureList::IsEnabled(features::kShowAlwaysContextMenuOnLinks)) {
+ auto* mouse_event = DynamicTo<MouseEvent>(&event);
+ if (mouse_event && mouse_event->type() == event_type_names::kClick) {
+ if (Page* page = GetDocument().GetPage()) {
+ page->GetContextMenuController().HandleContextMenuEvent(
+ mouse_event, /*do_not_show_context_menu*/true);
+ return;
+ }
+ }
+ }
+
+ HTMLElement::DefaultEventHandler(event);
+}
+
bool HTMLImageElement::draggable() const {
// Image elements are draggable by default.
return !EqualIgnoringASCIICase(FastGetAttribute(html_names::kDraggableAttr),
diff --git a/third_party/blink/renderer/core/html/html_image_element.h b/third_party/blink/renderer/core/html/html_image_element.h
--- a/third_party/blink/renderer/core/html/html_image_element.h
+++ b/third_party/blink/renderer/core/html/html_image_element.h
@@ -216,6 +216,8 @@ class CORE_EXPORT HTMLImageElement
void DidAddUserAgentShadowRoot(ShadowRoot&) override;
void AdjustStyle(ComputedStyleBuilder&) override;
+ void DefaultEventHandler(Event&) override;
+
private:
bool AreAuthorShadowsAllowed() const override { return false; }
diff --git a/third_party/blink/renderer/core/page/context_menu_controller.cc b/third_party/blink/renderer/core/page/context_menu_controller.cc
--- a/third_party/blink/renderer/core/page/context_menu_controller.cc
+++ b/third_party/blink/renderer/core/page/context_menu_controller.cc
@@ -200,15 +200,17 @@ void ContextMenuController::DocumentDetached(Document* document) {
}
}
-void ContextMenuController::HandleContextMenuEvent(MouseEvent* mouse_event) {
- DCHECK(mouse_event->type() == event_type_names::kContextmenu);
+void ContextMenuController::HandleContextMenuEvent(MouseEvent* mouse_event, bool do_not_show_context_menu) {
+ if (!base::FeatureList::IsEnabled(features::kShowAlwaysContextMenuOnLinks)) {
+ DCHECK(mouse_event->type() == event_type_names::kContextmenu);
+ }
LocalFrame* frame =
mouse_event->RawTarget()->ToNode()->GetDocument().GetFrame();
PhysicalOffset location =
PhysicalOffset::FromPointFRound(mouse_event->AbsoluteLocation());
if (ShowContextMenu(frame, location, mouse_event->GetMenuSourceType(),
- mouse_event))
+ mouse_event, do_not_show_context_menu))
mouse_event->SetDefaultHandled();
}
@@ -433,7 +435,8 @@ bool ContextMenuController::ShouldShowContextMenuFromTouch(
bool ContextMenuController::ShowContextMenu(LocalFrame* frame,
const PhysicalOffset& point,
WebMenuSourceType source_type,
- const MouseEvent* mouse_event) {
+ const MouseEvent* mouse_event,
+ bool do_not_show_context_menu) {
// Displaying the context menu in this function is a big hack as we don't
// have context, i.e. whether this is being invoked via a script or in
// response to user input (Mouse event WM_RBUTTONDOWN,
@@ -456,6 +459,16 @@ bool ContextMenuController::ShowContextMenu(LocalFrame* frame,
if (!result.InnerNodeOrImageMapImage())
return false;
+ if (!do_not_show_context_menu &&
+ base::FeatureList::IsEnabled(features::kShowAlwaysContextMenuOnLinks)) {
+ if (auto* anchor_element = DynamicTo<HTMLAnchorElement>(result.URLElement())) {
+ MouseEvent& event = *MouseEvent::Create();
+ event.SetTarget(mouse_event->target());
+ anchor_element->HandleClick(event, /*do_not_show_context_menu*/true);
+ return true;
+ }
+ }
+
// Clear any previously set cached results if we are resetting the hit test
// result.
image_selection_cached_result_ = nullptr;
@@ -836,7 +849,7 @@ bool ContextMenuController::ShowContextMenu(LocalFrame* frame,
SetAutofillData(result.InnerNode(), data);
- if (from_touch && !ShouldShowContextMenuFromTouch(data))
+ if (!base::FeatureList::IsEnabled(features::kShowAlwaysContextMenuOnLinks) && from_touch && !ShouldShowContextMenuFromTouch(data))
return false;
WebLocalFrameImpl* selected_web_frame =
diff --git a/third_party/blink/renderer/core/page/context_menu_controller.h b/third_party/blink/renderer/core/page/context_menu_controller.h
--- a/third_party/blink/renderer/core/page/context_menu_controller.h
+++ b/third_party/blink/renderer/core/page/context_menu_controller.h
@@ -58,7 +58,7 @@ class CORE_EXPORT ContextMenuController final
void DocumentDetached(Document*);
- void HandleContextMenuEvent(MouseEvent*);
+ void HandleContextMenuEvent(MouseEvent*, bool do_not_show_context_menu = false);
void ShowContextMenuAtPoint(LocalFrame*,
float x,
float y,
@@ -125,7 +125,8 @@ class CORE_EXPORT ContextMenuController final
bool ShowContextMenu(LocalFrame*,
const PhysicalOffset&,
WebMenuSourceType,
- const MouseEvent* mouse_event = nullptr);
+ const MouseEvent* mouse_event = nullptr,
+ bool do_not_show_context_menu = false);
bool ShouldShowContextMenuFromTouch(const ContextMenuData&);
--
@@ -1,263 +0,0 @@
From: uazo <uazo@users.noreply.github.com>
Date: Mon, 2 May 2022 11:48:03 +0000
Subject: Add site engagement flag
Disabled by default.
Original License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
chrome/browser/about_flags.cc | 1 +
.../engagement/important_sites_util.cc | 9 +++++
.../browser/media/media_engagement_service.cc | 4 ++-
.../internal/tracker_impl.cc | 3 ++
.../public/feature_configurations.cc | 7 ++++
.../content/site_engagement_score.cc | 5 +++
components/site_engagement/core/BUILD.gn | 6 ++++
components/site_engagement/core/features.cc | 30 ++++++++++++++++
components/site_engagement/core/features.h | 34 +++++++++++++++++++
.../Add-site-engagement-flag.inc | 10 ++++++
10 files changed, 108 insertions(+), 1 deletion(-)
create mode 100644 components/site_engagement/core/features.cc
create mode 100644 components/site_engagement/core/features.h
create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Add-site-engagement-flag.inc
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -171,6 +171,7 @@
#include "components/sensitive_content/features.h"
#include "components/services/heap_profiling/public/cpp/switches.h"
#include "components/services/storage/public/cpp/buckets/bucket_info.h"
+#include "components/site_engagement/core/features.h"
#include "components/shared_highlighting/core/common/shared_highlighting_features.h"
#include "components/sharing_message/features.h"
#include "components/signin/core/browser/dice_account_reconcilor_delegate.h"
diff --git a/chrome/browser/engagement/important_sites_util.cc b/chrome/browser/engagement/important_sites_util.cc
--- a/chrome/browser/engagement/important_sites_util.cc
+++ b/chrome/browser/engagement/important_sites_util.cc
@@ -31,6 +31,7 @@
#include "components/prefs/scoped_user_pref_update.h"
#include "components/site_engagement/content/site_engagement_score.h"
#include "components/site_engagement/content/site_engagement_service.h"
+#include "components/site_engagement/core/features.h"
#include "components/site_engagement/core/mojom/site_engagement_details.mojom.h"
#include "components/webapps/browser/banners/app_banner_settings_helper.h"
#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
@@ -344,6 +345,10 @@ void ImportantSitesUtil::RegisterProfilePrefs(
// static
std::set<std::string> ImportantSitesUtil::GetInstalledRegisterableDomains(
Profile* profile) {
+ if (!base::FeatureList::IsEnabled(site_engagement::features::kSiteEngagement)) {
+ std::set<std::string> empty_list;
+ return empty_list;
+ }
std::set<GURL> installed_origins = GetOriginsWithInstalledWebApps(profile);
std::set<std::string> registerable_domains;
@@ -358,6 +363,10 @@ std::vector<ImportantDomainInfo>
ImportantSitesUtil::GetImportantRegisterableDomains(Profile* profile,
size_t max_results) {
SCOPED_UMA_HISTOGRAM_TIMER("Storage.ImportantSites.GenerationTime");
+ if (!base::FeatureList::IsEnabled(site_engagement::features::kSiteEngagement)) {
+ std::vector<ImportantDomainInfo> empty_list;
+ return empty_list;
+ }
std::map<std::string, ImportantDomainInfo> important_info;
std::map<GURL, double> engagement_map;
diff --git a/chrome/browser/media/media_engagement_service.cc b/chrome/browser/media/media_engagement_service.cc
--- a/chrome/browser/media/media_engagement_service.cc
+++ b/chrome/browser/media/media_engagement_service.cc
@@ -25,6 +25,7 @@
#include "components/history/core/browser/history_service.h"
#include "components/no_state_prefetch/browser/no_state_prefetch_contents.h"
#include "components/prefs/pref_service.h"
+#include "components/site_engagement/core/features.h"
#include "content/public/browser/web_contents.h"
#include "media/base/media_switches.h"
#include "url/origin.h"
@@ -54,7 +55,8 @@ enum class MediaEngagementClearReason {
// static
bool MediaEngagementService::IsEnabled() {
- return base::FeatureList::IsEnabled(media::kRecordMediaEngagementScores);
+ return base::FeatureList::IsEnabled(media::kRecordMediaEngagementScores)
+ && base::FeatureList::IsEnabled(site_engagement::features::kSiteEngagement);
}
// static
diff --git a/components/feature_engagement/internal/tracker_impl.cc b/components/feature_engagement/internal/tracker_impl.cc
--- a/components/feature_engagement/internal/tracker_impl.cc
+++ b/components/feature_engagement/internal/tracker_impl.cc
@@ -23,6 +23,7 @@
#include "base/task/single_thread_task_runner.h"
#include "base/time/clock.h"
#include "build/build_config.h"
+#include "components/site_engagement/core/features.h"
#include "components/feature_engagement/internal/availability_model_impl.h"
#include "components/feature_engagement/internal/blocked_iph_features.h"
#include "components/feature_engagement/internal/chrome_variations_configuration.h"
@@ -291,6 +292,8 @@ TrackerImpl::TrackerImpl(
TrackerImpl::~TrackerImpl() = default;
void TrackerImpl::NotifyEvent(const std::string& event) {
+ if (!base::FeatureList::IsEnabled(site_engagement::features::kSiteEngagement))
+ return;
GetEventModelWriter()->IncrementEvent(event, time_provider_->GetCurrentDay());
stats::RecordNotifyEvent(event, configuration_.get(),
event_model_provider_->IsReady());
diff --git a/components/feature_engagement/public/feature_configurations.cc b/components/feature_engagement/public/feature_configurations.cc
--- a/components/feature_engagement/public/feature_configurations.cc
+++ b/components/feature_engagement/public/feature_configurations.cc
@@ -6,6 +6,7 @@
#include "base/strings/string_util.h"
#include "build/build_config.h"
+#include "components/site_engagement/core/features.h"
#include "components/feature_engagement/public/configuration.h"
#include "components/feature_engagement/public/event_constants.h"
#include "components/feature_engagement/public/feature_constants.h"
@@ -113,6 +114,12 @@ std::optional<FeatureConfig> GetClientSideFeatureConfig(
}
#endif // BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
+ if (!base::FeatureList::IsEnabled(site_engagement::features::kSiteEngagement)) {
+ std::optional<FeatureConfig> config = FeatureConfig();
+ config->valid = false;
+ return config;
+ }
+
#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
BUILDFLAG(IS_CHROMEOS)
if (kIPHPasswordsManagementBubbleAfterSaveFeature.name == feature->name) {
diff --git a/components/site_engagement/content/site_engagement_score.cc b/components/site_engagement/content/site_engagement_score.cc
--- a/components/site_engagement/content/site_engagement_score.cc
+++ b/components/site_engagement/content/site_engagement_score.cc
@@ -19,6 +19,7 @@
#include "components/content_settings/core/common/content_settings.h"
#include "components/content_settings/core/common/content_settings_types.h"
#include "components/content_settings/core/common/content_settings_utils.h"
+#include "components/site_engagement/core/features.h"
#include "components/site_engagement/content/engagement_type.h"
#include "components/site_engagement/content/site_engagement_metrics.h"
#include "third_party/blink/public/mojom/site_engagement/site_engagement.mojom.h"
@@ -276,6 +277,10 @@ void SiteEngagementScore::Commit() {
if (!UpdateScoreDict(*score_dict_))
return;
+ if (!base::FeatureList::IsEnabled(features::kSiteEngagement)) {
+ score_dict_.reset();
+ return;
+ }
settings_map_->SetWebsiteSettingDefaultScope(
origin_, GURL(), ContentSettingsType::SITE_ENGAGEMENT,
base::Value(std::move(*score_dict_)));
diff --git a/components/site_engagement/core/BUILD.gn b/components/site_engagement/core/BUILD.gn
--- a/components/site_engagement/core/BUILD.gn
+++ b/components/site_engagement/core/BUILD.gn
@@ -4,8 +4,14 @@
static_library("core") {
sources = [
+ "features.cc",
+ "features.h",
"pref_names.cc",
"pref_names.h",
"site_engagement_score_provider.h",
]
+
+ deps = [
+ "//base",
+ ]
}
diff --git a/components/site_engagement/core/features.cc b/components/site_engagement/core/features.cc
new file mode 100644
--- /dev/null
+++ b/components/site_engagement/core/features.cc
@@ -0,0 +1,30 @@
+/*
+ This file is part of Bromite.
+
+ Bromite is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Bromite is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Bromite. If not, see <https://www.gnu.org/licenses/>.
+*/
+
+#include "components/site_engagement/core/features.h"
+
+#include "base/feature_list.h"
+
+namespace site_engagement {
+namespace features {
+
+CROMITE_FEATURE(kSiteEngagement,
+ "SiteEngagement",
+ base::FEATURE_DISABLED_BY_DEFAULT);
+
+} // namespace features
+} // namespace site_engagement
diff --git a/components/site_engagement/core/features.h b/components/site_engagement/core/features.h
new file mode 100644
--- /dev/null
+++ b/components/site_engagement/core/features.h
@@ -0,0 +1,34 @@
+/*
+ This file is part of Bromite.
+
+ Bromite is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Bromite is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Bromite. If not, see <https://www.gnu.org/licenses/>.
+*/
+
+#ifndef SITE_ENGAGEMENT_CORE_FEATURES_H_
+#define SITE_ENGAGEMENT_CORE_FEATURES_H_
+
+#include <string>
+
+#include "base/feature_list.h"
+
+namespace site_engagement {
+namespace features {
+
+// Enable site engagement
+BASE_DECLARE_FEATURE(kSiteEngagement);
+
+} // namespace features
+} // namespace site_engagement
+
+#endif // SITE_ENGAGEMENT_CORE_FEATURES_H_
diff --git a/cromite_flags/chrome/browser/about_flags_cc/Add-site-engagement-flag.inc b/cromite_flags/chrome/browser/about_flags_cc/Add-site-engagement-flag.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/chrome/browser/about_flags_cc/Add-site-engagement-flag.inc
@@ -0,0 +1,10 @@
+#ifdef FLAG_SECTION
+
+ {"site-engagement",
+ "Enable site engagement feature",
+ "Site Engagement Service provides information about how "
+ "engaged a user is with a origin; this affects which NTP "
+ "tiles are automatically created.", kOsAll,
+ FEATURE_VALUE_TYPE(site_engagement::features::kSiteEngagement)},
+
+#endif
--
@@ -0,0 +1,220 @@
From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Tue, 28 Aug 2018 23:27:23 +0200
Subject: Add site settings option for session-only cookies
---
chrome/android/java/res/values/values.xml | 3 ++
.../java/res/xml/website_preferences.xml | 7 +++++
.../website/SingleCategorySettings.java | 21 ++++++++++++-
.../preferences/pref_service_bridge.cc | 31 +++++++++++++++++++
.../preferences/PrefServiceBridge.java | 10 ++++++
.../strings/android_chrome_strings.grd | 6 ++++
6 files changed, 77 insertions(+), 1 deletion(-)
diff --git a/chrome/android/java/res/values/values.xml b/chrome/android/java/res/values/values.xml
--- a/chrome/android/java/res/values/values.xml
+++ b/chrome/android/java/res/values/values.xml
@@ -32,6 +32,9 @@
<integer name="reload_button_level_reload">0</integer>
<integer name="reload_button_level_stop">1</integer>
+ <string name="allow_cookies_session_only_title">Keep cookies only until you quit your browser</string>
+ <string name="allow_cookies_session_only_summary">When enabled, all cookies will be erased when the browsing session is over</string>
+
<!-- Help and Feedback
These constants should be in sync with the context names on go/mobilehelprecs.
If the context ID cannot be found, the default help page will be shown to the user.-->
diff --git a/chrome/android/java/res/xml/website_preferences.xml b/chrome/android/java/res/xml/website_preferences.xml
--- a/chrome/android/java/res/xml/website_preferences.xml
+++ b/chrome/android/java/res/xml/website_preferences.xml
@@ -32,6 +32,13 @@
android:title="@string/website_settings_category_notifications_quiet"
android:defaultValue="false"
android:persistent="false" />
+ <!-- A toggle for cookies to be saved only until session exit, only shown for the Cookies category. -->
+ <org.chromium.chrome.browser.settings.ChromeBaseCheckBoxPreference
+ android:key="cookies_session_only"
+ android:title="@string/allow_cookies_session_only_title"
+ android:summary="@string/allow_cookies_session_only_summary"
+ android:defaultValue="true"
+ android:persistent="false" />
<!-- A toggle for enabling vibration in notifications. -->
<org.chromium.chrome.browser.settings.ChromeBaseCheckBoxPreference
android:key="notifications_vibrate"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleCategorySettings.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleCategorySettings.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleCategorySettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleCategorySettings.java
@@ -130,6 +130,7 @@ public class SingleCategorySettings extends PreferenceFragmentCompat
// Keys for category-specific preferences (toggle, link, button etc.), dynamically shown.
public static final String THIRD_PARTY_COOKIES_TOGGLE_KEY = "third_party_cookies";
+ public static final String COOKIES_SESSION_ONLY_TOGGLE_KEY = "cookies_session_only";
public static final String NOTIFICATIONS_VIBRATE_TOGGLE_KEY = "notifications_vibrate";
public static final String NOTIFICATIONS_QUIET_UI_TOGGLE_KEY = "notifications_quiet_ui";
public static final String EXPLAIN_PROTECTED_MEDIA_KEY = "protected_content_learn_more";
@@ -478,6 +479,7 @@ public class SingleCategorySettings extends PreferenceFragmentCompat
if (type == SiteSettingsCategory.Type.COOKIES) {
updateThirdPartyCookiesCheckBox();
+ updateCookiesSessionOnlyCheckBox();
} else if (type == SiteSettingsCategory.Type.NOTIFICATIONS) {
updateNotificationsSecondaryControls();
}
@@ -516,6 +518,8 @@ public class SingleCategorySettings extends PreferenceFragmentCompat
int setting = (int) newValue;
WebsitePreferenceBridge.setContentSetting(mCategory.getContentSettingsType(), setting);
getInfoForOrigins();
+ } else if (COOKIES_SESSION_ONLY_TOGGLE_KEY.equals(preference.getKey())) {
+ PrefServiceBridge.getInstance().setCookiesSessionOnlyEnabled((boolean) newValue);
} else if (THIRD_PARTY_COOKIES_TOGGLE_KEY.equals(preference.getKey())) {
PrefServiceBridge.getInstance().setBoolean(
Pref.BLOCK_THIRD_PARTY_COOKIES, ((boolean) newValue));
@@ -829,6 +833,8 @@ public class SingleCategorySettings extends PreferenceFragmentCompat
TriStateSiteSettingsPreference triStateToggle =
(TriStateSiteSettingsPreference) screen.findPreference(TRI_STATE_TOGGLE_KEY);
Preference thirdPartyCookies = screen.findPreference(THIRD_PARTY_COOKIES_TOGGLE_KEY);
+ Preference cookiesSessionOnly = getPreferenceScreen().findPreference(
+ COOKIES_SESSION_ONLY_TOGGLE_KEY);
Preference notificationsVibrate = screen.findPreference(NOTIFICATIONS_VIBRATE_TOGGLE_KEY);
Preference notificationsQuietUi = screen.findPreference(NOTIFICATIONS_QUIET_UI_TOGGLE_KEY);
Preference explainProtectedMediaKey = screen.findPreference(EXPLAIN_PROTECTED_MEDIA_KEY);
@@ -861,6 +867,7 @@ public class SingleCategorySettings extends PreferenceFragmentCompat
if (hideSecondaryToggles) {
screen.removePreference(thirdPartyCookies);
+ screen.removePreference(cookiesSessionOnly);
screen.removePreference(notificationsVibrate);
screen.removePreference(notificationsQuietUi);
screen.removePreference(explainProtectedMediaKey);
@@ -872,12 +879,15 @@ public class SingleCategorySettings extends PreferenceFragmentCompat
return;
}
- // Configure/hide the third-party cookies toggle, as needed.
+ // Configure/hide the third-party cookies toggle and session-only cookie toggle, as needed.
if (mCategory.showSites(SiteSettingsCategory.Type.COOKIES)) {
thirdPartyCookies.setOnPreferenceChangeListener(this);
updateThirdPartyCookiesCheckBox();
+ cookiesSessionOnly.setOnPreferenceChangeListener(this);
+ updateCookiesSessionOnlyCheckBox();
} else {
screen.removePreference(thirdPartyCookies);
+ screen.removePreference(cookiesSessionOnly);
}
// Configure/hide the notifications secondary controls, as needed.
@@ -992,6 +1002,15 @@ public class SingleCategorySettings extends PreferenceFragmentCompat
}
}
+ private void updateCookiesSessionOnlyCheckBox() {
+ ChromeBaseCheckBoxPreference cookiesSessionOnlyPref = (ChromeBaseCheckBoxPreference)
+ getPreferenceScreen().findPreference(COOKIES_SESSION_ONLY_TOGGLE_KEY);
+ cookiesSessionOnlyPref.setChecked(
+ PrefServiceBridge.getInstance().isCookiesSessionOnlyEnabled());
+ cookiesSessionOnlyPref.setEnabled(WebsitePreferenceBridge.isCategoryEnabled(
+ ContentSettingsType.COOKIES));
+ }
+
private void updateThirdPartyCookiesCheckBox() {
ChromeBaseCheckBoxPreference thirdPartyCookiesPref =
(ChromeBaseCheckBoxPreference) getPreferenceScreen().findPreference(
diff --git a/chrome/browser/android/preferences/pref_service_bridge.cc b/chrome/browser/android/preferences/pref_service_bridge.cc
--- a/chrome/browser/android/preferences/pref_service_bridge.cc
+++ b/chrome/browser/android/preferences/pref_service_bridge.cc
@@ -13,10 +13,17 @@
#include "chrome/browser/android/preferences/prefs.h"
#include "chrome/browser/preferences/jni_headers/PrefServiceBridge_jni.h"
#include "chrome/browser/profiles/profile_manager.h"
+#include "components/content_settings/core/browser/host_content_settings_map.h"
+#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
+//#include "components/content_settings/core/common/content_settings_types.h"
#include "components/prefs/pref_service.h"
namespace {
+Profile* GetOriginalProfile() {
+ return ProfileManager::GetActiveUserProfile()->GetOriginalProfile();
+}
+
PrefService* GetPrefService() {
return ProfileManager::GetActiveUserProfile()
->GetOriginalProfile()
@@ -84,3 +91,27 @@ static jboolean JNI_PrefServiceBridge_IsManagedPreference(
return GetPrefService()->IsManagedPreference(
PrefServiceBridge::GetPrefNameExposedToJava(j_pref_index));
}
+static jboolean JNI_PrefServiceBridge_GetCookiesSessionOnlyEnabled(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& obj) {
+ HostContentSettingsMap* host_content_settings_map =
+ HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
+ auto value = host_content_settings_map->GetDefaultContentSetting(ContentSettingsType::COOKIES, nullptr);
+ auto enabled = CONTENT_SETTING_SESSION_ONLY == value;
+ LOG(INFO) << "GetCookiesSessionOnly := " << enabled << " (raw_value = " << value << ")";
+ return enabled;
+}
+
+static void JNI_PrefServiceBridge_SetCookiesSessionOnlyEnabled(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& obj,
+ jboolean enabled) {
+ HostContentSettingsMap* host_content_settings_map =
+ HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
+ LOG(INFO) << "SetCookiesSessionOnly -> " << (enabled ? "true" : "false") <<
+ "; false -> setting_allow: " << CONTENT_SETTING_ALLOW <<
+ "; true -> session_only: " << CONTENT_SETTING_SESSION_ONLY;
+ host_content_settings_map->SetDefaultContentSetting(
+ ContentSettingsType::COOKIES,
+ enabled ? CONTENT_SETTING_SESSION_ONLY : CONTENT_SETTING_ALLOW);
+}
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java
--- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java
+++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java
@@ -82,6 +82,13 @@ public class PrefServiceBridge {
PrefServiceBridgeJni.get().setString(preference, value);
}
+ public boolean isCookiesSessionOnlyEnabled() {
+ return PrefServiceBridgeJni.get().getCookiesSessionOnlyEnabled(PrefServiceBridge.this);
+ }
+ public void setCookiesSessionOnlyEnabled(boolean enabled) {
+ PrefServiceBridgeJni.get().setCookiesSessionOnlyEnabled(PrefServiceBridge.this, enabled);
+ }
+
/**
* @param preference The name of the preference.
* @return Whether the specified preference is managed.
@@ -97,6 +104,8 @@ public class PrefServiceBridge {
@NativeMethods
interface Natives {
+ boolean getCookiesSessionOnlyEnabled(PrefServiceBridge caller);
+ void setCookiesSessionOnlyEnabled(PrefServiceBridge caller, boolean enabled);
boolean getBoolean(int preference);
void setBoolean(int preference, boolean value);
int getInteger(int preference);
@@ -106,3 +115,4 @@ public class PrefServiceBridge {
boolean isManagedPreference(int preference);
}
}
+
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -814,6 +814,12 @@ Your Google account may have other forms of browsing history like searches and a
<message name="IDS_BLOCK_THIRD_PARTY_COOKIES_SUMMARY" desc="Summary text for Block Third Party Cookies preference">
Prevent third-party websites from saving and reading cookie data
</message>
+ <message name="IDS_ALLOW_COOKIES_SESSION_ONLY_TITLE" desc="Title for Allow Cookies Session Only preference">
+ Keep cookies only until you quit your browser
+ </message>
+ <message name="IDS_ALLOW_COOKIES_SESSION_ONLY_SUMMARY" desc="Summary text for Allow Session Only Cookies preference">
+ When enabled, all cookies will be erased when the browsing session is over
+ </message>
<message name="IDS_JAVASCRIPT_PERMISSION_TITLE" desc="Title of the permission to run javascript [CHAR-LIMIT=32]">
JavaScript
</message>
--
2.17.1
@@ -1,52 +0,0 @@
From: uazo <uazo@users.noreply.github.com>
Date: Mon, 17 May 2021 12:30:12 +0000
Subject: Add support for ISupportHelpAndFeedback
Original License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
.../chrome/browser/settings/SettingsActivity.java | 9 +++++++--
.../components/browser_ui/settings/SettingsUtils.java | 4 ++++
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java
@@ -63,6 +63,7 @@ import org.chromium.chrome.browser.ui.messages.snackbar.Snackbar;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetControllerFactory;
import org.chromium.components.browser_ui.bottomsheet.ManagedBottomSheetController;
+import org.chromium.components.browser_ui.settings.SettingsUtils;
import org.chromium.components.browser_ui.modaldialog.AppModalPresenter;
import org.chromium.components.browser_ui.settings.EmbeddableSettingsPage;
import org.chromium.components.browser_ui.settings.PreferenceUpdateObserver;
@@ -733,8 +734,12 @@ public class SettingsActivity extends ChromeBaseAppCompatActivity
finishCurrentSettings(mainFragment);
return true;
} else if (item.getItemId() == R.id.menu_id_general_help) {
- HelpAndFeedbackLauncherImpl.getForProfile(mProfile)
- .show(this, getString(R.string.help_context_settings), null);
+ if (mainFragment instanceof SettingsUtils.ISupportHelpAndFeedback) {
+ ((SettingsUtils.ISupportHelpAndFeedback)mainFragment).onHelpAndFeebackPressed();
+ } else {
+ HelpAndFeedbackLauncherImpl.getForProfile(mProfile)
+ .show(this, getString(R.string.help_context_settings), null);
+ }
return true;
}
return super.onOptionsItemSelected(item);
diff --git a/components/browser_ui/settings/android/java/src/org/chromium/components/browser_ui/settings/SettingsUtils.java b/components/browser_ui/settings/android/java/src/org/chromium/components/browser_ui/settings/SettingsUtils.java
--- a/components/browser_ui/settings/android/java/src/org/chromium/components/browser_ui/settings/SettingsUtils.java
+++ b/components/browser_ui/settings/android/java/src/org/chromium/components/browser_ui/settings/SettingsUtils.java
@@ -33,6 +33,10 @@ import java.util.ArrayList;
/** A helper class for Settings. */
@NullMarked
public class SettingsUtils {
+ public interface ISupportHelpAndFeedback {
+ void onHelpAndFeebackPressed();
+ }
+
/**
* A helper that is used to load preferences from XML resources without causing a
* StrictModeViolation. See http://crbug.com/692125.
--
@@ -1,99 +0,0 @@
From: uazo <uazo@users.noreply.github.com>
Date: Tue, 12 Apr 2022 15:58:01 +0000
Subject: Add support for writing URIs
Allows native-side URI file writing
Original License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
base/android/content_uri_utils.cc | 10 ++++++
base/android/content_uri_utils.h | 4 +++
.../org/chromium/base/ContentUriUtils.java | 33 +++++++++++++++++++
3 files changed, 47 insertions(+)
diff --git a/base/android/content_uri_utils.cc b/base/android/content_uri_utils.cc
--- a/base/android/content_uri_utils.cc
+++ b/base/android/content_uri_utils.cc
@@ -137,6 +137,16 @@ void JNI_ContentUriUtils_AddFileInfoToVector(JNIEnv* env,
Time::FromMillisecondsSinceUnixEpoch(last_modified));
}
+File OpenContentUriForWrite(const FilePath& content_uri) {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> j_uri =
+ ConvertUTF8ToJavaString(env, content_uri.value());
+ jint fd = Java_ContentUriUtils_openContentUriForWrite(env, j_uri);
+ if (fd < 0)
+ return File();
+ return File(fd);
+}
+
std::string GetContentUriMimeType(const FilePath& content_uri) {
JNIEnv* env = android::AttachCurrentThread();
return Java_ContentUriUtils_getMimeType(env, content_uri.value());
diff --git a/base/android/content_uri_utils.h b/base/android/content_uri_utils.h
--- a/base/android/content_uri_utils.h
+++ b/base/android/content_uri_utils.h
@@ -46,6 +46,10 @@ int ContentUriGetFd(
void ContentUriClose(
const base::android::JavaRef<jobject>& java_parcel_file_descriptor);
+// Opens a content URI for write and returns the file descriptor to the caller.
+// Returns -1 if the URI is invalid.
+BASE_EXPORT File OpenContentUriForWrite(const FilePath& content_uri);
+
// Returns true if file exists and results are populated, else returns false.
bool ContentUriGetFileInfo(const FilePath& content_uri,
FileEnumerator::FileInfo* results);
diff --git a/base/android/java/src/org/chromium/base/ContentUriUtils.java b/base/android/java/src/org/chromium/base/ContentUriUtils.java
--- a/base/android/java/src/org/chromium/base/ContentUriUtils.java
+++ b/base/android/java/src/org/chromium/base/ContentUriUtils.java
@@ -31,6 +31,9 @@ import org.chromium.build.annotations.Nullable;
import java.io.IOException;
import java.util.List;
+import android.system.Os;
+import android.content.ContentProviderClient;
+
/** This class provides methods to access content URI schemes. */
@JNINamespace("base")
@NullMarked
@@ -72,6 +75,36 @@ public abstract class ContentUriUtils {
StreamUtil.closeQuietly(parcelFileDescriptor);
}
+ @CalledByNative
+ public static int openContentUriForWrite(String uriString) {
+ try {
+ Uri uri = Uri.parse(uriString);
+ ContentResolver resolver = ContextUtils.getApplicationContext().getContentResolver();
+ ContentProviderClient client = resolver.acquireContentProviderClient(
+ uri.getAuthority());
+ ParcelFileDescriptor pfd = client.openFile(uri, "wt");
+ int fd = pfd.detachFd();
+ client.close();
+ return fd;
+ } catch (Exception e) {
+ Log.e(TAG, "Cannot open intermediate URI", e);
+ }
+ return -1;
+ }
+
+ public static String getFilePathFromContentUri(Uri uri) {
+ String path = null;
+ try {
+ ContentResolver resolver = ContextUtils.getApplicationContext().getContentResolver();
+ ParcelFileDescriptor pfd = resolver.openFileDescriptor(uri, "r");
+ path = Os.readlink("/proc/self/fd/" + pfd.getFd());
+ pfd.close();
+ } catch (Exception e) {
+ Log.e(TAG, "Cannot get file path from content URI", e);
+ }
+ return path;
+ }
+
/**
* Check whether a content URI exists.
*
--
@@ -0,0 +1,518 @@
From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Sat, 23 Nov 2019 10:55:16 +0100
Subject: Add user setting for DNS-over-HTTPS (DoH) custom URL
---
chrome/android/chrome_java_sources.gni | 2 +
chrome/android/java/res/layout/doh_editor.xml | 65 +++++++++++++
chrome/android/java/res/values/values.xml | 2 +
.../android/java/res/xml/doh_preferences.xml | 25 +++++
.../java/res/xml/privacy_preferences.xml | 5 +
.../browser/flags/FeatureUtilities.java | 24 +++++
.../chrome/browser/settings/DoHEditor.java | 92 +++++++++++++++++++
.../browser/settings/DoHPreferences.java | 54 +++++++++++
chrome/app/generated_resources.grd | 6 ++
chrome/browser/android/feature_utilities.cc | 23 +++++
.../net/system_network_context_manager.cc | 41 ++-------
.../strings/android_chrome_strings.grd | 11 +++
chrome/common/chrome_features.cc | 4 +-
13 files changed, 320 insertions(+), 34 deletions(-)
create mode 100644 chrome/android/java/res/layout/doh_editor.xml
create mode 100644 chrome/android/java/res/xml/doh_preferences.xml
create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/settings/DoHEditor.java
create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/settings/DoHPreferences.java
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -1335,6 +1335,8 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/searchwidget/SearchWidgetProvider.java",
"java/src/org/chromium/chrome/browser/send_tab_to_self/DevicePickerBottomSheetAdapter.java",
"java/src/org/chromium/chrome/browser/send_tab_to_self/DevicePickerBottomSheetContent.java",
+ "java/src/org/chromium/chrome/browser/settings/DoHEditor.java",
+ "java/src/org/chromium/chrome/browser/settings/DoHPreferences.java",
"java/src/org/chromium/chrome/browser/send_tab_to_self/NotificationManager.java",
"java/src/org/chromium/chrome/browser/send_tab_to_self/NotificationSharedPrefManager.java",
"java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfAndroidBridge.java",
diff --git a/chrome/android/java/res/layout/doh_editor.xml b/chrome/android/java/res/layout/doh_editor.xml
new file mode 100644
--- /dev/null
+++ b/chrome/android/java/res/layout/doh_editor.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2015 The Chromium Authors. All rights reserved.
+ Use of this source code is governed by a BSD-style license that can be
+ found in the LICENSE file. -->
+
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" >
+
+ <ScrollView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:id="@+id/scroll_view"
+ android:fillViewport="true" >
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:focusableInTouchMode="true" >
+
+ <org.chromium.components.browser_ui.widget.text.ChromeTextInputLayout
+ android:id="@+id/doh_url"
+ style="@style/PreferenceScreenLayout"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" >
+ <!-- TODO(crbug.com/900912): Fix and remove lint ignore -->
+ <EditText
+ tools:ignore="Autofill"
+ android:id="@+id/doh_url_edit"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:inputType="textUri"
+ android:singleLine="true"
+ android:hint="@string/options_doh_edit_label" />
+ </org.chromium.components.browser_ui.widget.text.ChromeTextInputLayout>
+
+ <Space style="@style/ButtonBarTopSpacer" />
+ <View style="@style/ButtonBarTopDivider" />
+
+ <LinearLayout style="@style/ButtonBar" >
+ <org.chromium.ui.widget.ButtonCompat
+ android:id="@+id/doh_reset"
+ style="@style/ButtonBarButton"
+ android:text="@string/reset" />
+
+ <org.chromium.ui.widget.ButtonCompat
+ android:id="@+id/doh_cancel"
+ style="@style/ButtonBarButton"
+ android:text="@string/cancel" />
+
+ <org.chromium.ui.widget.ButtonCompat
+ android:id="@+id/doh_save"
+ style="@style/ButtonBarButton"
+ android:text="@string/save" />
+ </LinearLayout>
+ </LinearLayout>
+ </ScrollView>
+
+ <include layout="@layout/settings_action_bar_shadow"/>
+
+</FrameLayout>
diff --git a/chrome/android/java/res/values/values.xml b/chrome/android/java/res/values/values.xml
--- a/chrome/android/java/res/values/values.xml
+++ b/chrome/android/java/res/values/values.xml
@@ -86,6 +86,8 @@
<integer name="download_infobar_bar_fill_in_delay">400</integer>
<integer name="download_infobar_bar_fill_out_delay">200</integer>
+ <string name="doh_help_url">https://www.bromite.org/doh</string>
+
<!-- Bottom navigation bar styling. -->
<bool name="window_light_navigation_bar">true</bool>
diff --git a/chrome/android/java/res/xml/doh_preferences.xml b/chrome/android/java/res/xml/doh_preferences.xml
new file mode 100644
--- /dev/null
+++ b/chrome/android/java/res/xml/doh_preferences.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2015 The Chromium Authors. All rights reserved.
+ Use of this source code is governed by a BSD-style license that can be
+ found in the LICENSE file. -->
+
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
+
+ <org.chromium.chrome.browser.settings.ChromeSwitchPreference
+ android:key="doh_switch"
+ android:summaryOn="@string/text_on"
+ android:summaryOff="@string/text_off" />
+
+ <org.chromium.chrome.browser.settings.HyperlinkPreference
+ android:key="doh_help"
+ android:title="@string/doh_help"
+ app:url="@string/doh_help_url" />
+
+ <Preference
+ android:key="doh_edit"
+ android:title="@string/options_doh_edit_label"
+ android:fragment="org.chromium.chrome.browser.settings.DoHEditor" />
+
+</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/privacy_preferences.xml b/chrome/android/java/res/xml/privacy_preferences.xml
--- a/chrome/android/java/res/xml/privacy_preferences.xml
+++ b/chrome/android/java/res/xml/privacy_preferences.xml
@@ -19,6 +19,11 @@
android:key="can_make_payment"
android:title="@string/can_make_payment_title"
android:summary="@string/settings_can_make_payment_toggle_label" />
+ <Preference
+ android:fragment="org.chromium.chrome.browser.settings.DoHPreferences"
+ android:key="doh"
+ android:title="@string/options_doh_title"
+ android:summary="@string/options_doh_summary" />
<org.chromium.chrome.browser.settings.ChromeBaseCheckBoxPreference
android:key="preload_pages"
android:title="@string/preload_pages_title"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/flags/FeatureUtilities.java b/chrome/android/java/src/org/chromium/chrome/browser/flags/FeatureUtilities.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/flags/FeatureUtilities.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/flags/FeatureUtilities.java
@@ -120,6 +120,26 @@ public class FeatureUtilities {
private static Boolean sEnabledTabThumbnailApsectRatioForTesting;
private static final String ALLOW_TO_REFETCH = "allow_to_refetch";
+ /**
+ * Records whether custom URL for DoH is enabled with native-side feature utilities.
+ * @param url Whether custom URL is enabled or not.
+ */
+ public static void setDoHEnabled(boolean enabled) {
+ FeatureUtilitiesJni.get().setDoHEnabled(enabled);
+ }
+
+ public static boolean getDoHEnabled() {
+ return FeatureUtilitiesJni.get().getDoHEnabled();
+ }
+
+ public static void setDoHTemplates(String t) {
+ FeatureUtilitiesJni.get().setDoHTemplates(t);
+ }
+
+ public static String getDoHTemplates() {
+ return FeatureUtilitiesJni.get().getDoHTemplates();
+ }
+
/**
* Checks if a cached feature flag is enabled.
*
@@ -792,6 +812,10 @@ public class FeatureUtilities {
@NativeMethods
interface Natives {
+ void setDoHEnabled(boolean enabled);
+ boolean getDoHEnabled();
+ void setDoHTemplates(String templates);
+ String getDoHTemplates();
boolean isNetworkServiceWarmUpEnabled();
void setAdBlockFiltersURL(String url);
String getAdBlockFiltersURL();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/DoHEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/DoHEditor.java
new file mode 100644
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/DoHEditor.java
@@ -0,0 +1,92 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.settings;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.EditText;
+
+import org.chromium.chrome.browser.settings.SettingsUtils;
+import org.chromium.chrome.browser.flags.FeatureUtilities;
+import org.chromium.chrome.R;
+import org.chromium.components.url_formatter.UrlFormatter;
+
+/**
+ * Provides the Java-UI for editing the DNS-over-HTTPS (DoH) preference.
+ */
+public class DoHEditor extends Fragment implements TextWatcher {
+ private EditText mDoHUrlEdit;
+ private Button mSaveButton;
+ private Button mResetButton;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ getActivity().setTitle(R.string.options_doh_edit_title);
+
+ View v = inflater.inflate(R.layout.doh_editor, container, false);
+ View scrollView = v.findViewById(R.id.scroll_view);
+ scrollView.getViewTreeObserver().addOnScrollChangedListener(
+ SettingsUtils.getShowShadowOnScrollListener(v, v.findViewById(R.id.shadow)));
+ mDoHUrlEdit = (EditText) v.findViewById(R.id.doh_url_edit);
+ mDoHUrlEdit.setText(FeatureUtilities.getDoHTemplates());
+ mDoHUrlEdit.addTextChangedListener(this);
+ mDoHUrlEdit.requestFocus();
+
+ initializeSaveCancelResetButtons(v);
+ return v;
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ mSaveButton.setEnabled(s.length() != 0);
+ mResetButton.setEnabled(true);
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ }
+
+ private void initializeSaveCancelResetButtons(View v) {
+ mResetButton = (Button) v.findViewById(R.id.doh_reset);
+ mResetButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mDoHUrlEdit.setText(FeatureUtilities.getDoHTemplates());
+ getActivity().finish();
+ }
+ });
+
+ mSaveButton = (Button) v.findViewById(R.id.doh_save);
+ mSaveButton.setEnabled(false);
+ mSaveButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ FeatureUtilities.setDoHTemplates(
+ mDoHUrlEdit.getText().toString());
+ getActivity().finish();
+ }
+ });
+
+ Button button = (Button) v.findViewById(R.id.doh_cancel);
+ button.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ getActivity().finish();
+ }
+ });
+ }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/DoHPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/DoHPreferences.java
new file mode 100644
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/DoHPreferences.java
@@ -0,0 +1,54 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.settings;
+
+import android.os.Bundle;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceFragmentCompat;
+import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
+
+import org.chromium.chrome.browser.settings.SettingsUtils;
+import org.chromium.chrome.browser.flags.FeatureUtilities;
+import androidx.annotation.VisibleForTesting;
+import org.chromium.chrome.R;
+
+/**
+ * Fragment that allows the user to configure DoH related preferences.
+ */
+public class DoHPreferences extends PreferenceFragmentCompat {
+ @VisibleForTesting
+ public static final String PREF_DOH_SWITCH = "doh_switch";
+ private static final String PREF_DOH_EDIT = "doh_edit";
+
+ private Preference mDoHEdit;
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ getActivity().setTitle(R.string.options_doh_title);
+ SettingsUtils.addPreferencesFromResource(this, R.xml.doh_preferences);
+
+ ChromeSwitchPreference mDoHSwitch =
+ (ChromeSwitchPreference) findPreference(PREF_DOH_SWITCH);
+ boolean isDoHEnabled = FeatureUtilities.getDoHEnabled();
+ mDoHSwitch.setChecked(isDoHEnabled);
+ mDoHSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
+ FeatureUtilities.setDoHEnabled((boolean) newValue);
+ return true;
+ });
+
+ mDoHEdit = findPreference(PREF_DOH_EDIT);
+ updateCurrentDoHUrl();
+ }
+
+ private void updateCurrentDoHUrl() {
+ mDoHEdit.setSummary(FeatureUtilities.getDoHTemplates());
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ updateCurrentDoHUrl();
+ }
+}
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -6848,6 +6848,12 @@ the Bookmarks menu.">
<message name="IDS_OPTIONS_HOMEPAGE_TITLE" desc="The title of the home page overlay on Android" formatter_data="android_java">
Home page
</message>
+ <message name="IDS_OPTIONS_DOH_TITLE" desc="The title of the DNS-over-HTTPS option on Android" formatter_data="android_java">
+ Secure DNS
+ </message>
+ <message name="IDS_OPTIONS_DOH_SUMMARY" desc="The title of the DNS-over-HTTPS summary on Android" formatter_data="android_java">
+ Configure DNS-over-HTTPS (DoH) secure DNS
+ </message>
</if>
<!-- Autofill dialog: field labels. -->
diff --git a/chrome/browser/android/feature_utilities.cc b/chrome/browser/android/feature_utilities.cc
--- a/chrome/browser/android/feature_utilities.cc
+++ b/chrome/browser/android/feature_utilities.cc
@@ -7,6 +7,9 @@
#include "chrome/android/chrome_jni_headers/FeatureUtilities_jni.h"
#include "base/android/jni_string.h"
+#include "chrome/browser/browser_process.h"
+#include "components/prefs/pref_service.h"
+#include "chrome/common/pref_names.h"
#include "content/public/common/content_features.h"
#include "content/public/common/network_service_util.h"
@@ -45,3 +48,23 @@ static jboolean JNI_FeatureUtilities_IsNetworkServiceWarmUpEnabled(
return content::IsOutOfProcessNetworkService() &&
base::FeatureList::IsEnabled(features::kWarmUpNetworkProcess);
}
+
+static jboolean JNI_FeatureUtilities_GetDoHEnabled(JNIEnv* env) {
+ std::string doh_mode = g_browser_process->local_state()->GetString(prefs::kDnsOverHttpsMode);
+ return ((doh_mode == "secure") || (doh_mode == "auto"));
+}
+
+static void JNI_FeatureUtilities_SetDoHEnabled(JNIEnv* env, jboolean enabled) {
+ if (enabled)
+ g_browser_process->local_state()->SetString(prefs::kDnsOverHttpsMode, "secure");
+ else
+ g_browser_process->local_state()->SetString(prefs::kDnsOverHttpsMode, "off");
+}
+
+static ScopedJavaLocalRef<jstring> JNI_FeatureUtilities_GetDoHTemplates(JNIEnv* env) {
+ return base::android::ConvertUTF8ToJavaString(env, g_browser_process->local_state()->GetString(prefs::kDnsOverHttpsTemplates));
+}
+
+static void JNI_FeatureUtilities_SetDoHTemplates(JNIEnv* env, const JavaParamRef<jstring>& templates) {
+ g_browser_process->local_state()->SetString(prefs::kDnsOverHttpsTemplates, base::android::ConvertJavaStringToUTF8(env, templates));
+}
diff --git a/chrome/browser/net/system_network_context_manager.cc b/chrome/browser/net/system_network_context_manager.cc
--- a/chrome/browser/net/system_network_context_manager.cc
+++ b/chrome/browser/net/system_network_context_manager.cc
@@ -379,40 +379,12 @@ SystemNetworkContextManager::SystemNetworkContextManager(
local_state_->SetDefaultPrefValue(prefs::kBuiltInDnsClientEnabled,
base::Value(ShouldEnableAsyncDns()));
std::string default_doh_mode = chrome_browser_net::kDnsOverHttpsModeOff;
- std::string default_doh_templates = "";
- if (base::FeatureList::IsEnabled(features::kDnsOverHttps)) {
- if (features::kDnsOverHttpsFallbackParam.Get()) {
- default_doh_mode = chrome_browser_net::kDnsOverHttpsModeAutomatic;
- } else {
- default_doh_mode = chrome_browser_net::kDnsOverHttpsModeSecure;
- }
- default_doh_templates = features::kDnsOverHttpsTemplatesParam.Get();
- }
+ std::string default_doh_templates = features::kDnsOverHttpsTemplatesParam.Get();
local_state_->SetDefaultPrefValue(prefs::kDnsOverHttpsMode,
base::Value(default_doh_mode));
local_state_->SetDefaultPrefValue(prefs::kDnsOverHttpsTemplates,
base::Value(default_doh_templates));
- // If the user has explicitly enabled or disabled the DoH experiment in
- // chrome://flags, store that choice in the user prefs so that it can be
- // persisted after the experiment ends. Also make sure to remove the stored
- // prefs value if the user has changed their chrome://flags selection to the
- // default.
- flags_ui::PrefServiceFlagsStorage flags_storage(local_state_);
- std::set<std::string> entries = flags_storage.GetFlags();
- if (entries.count("dns-over-https@1")) {
- // The user has "Enabled" selected.
- local_state_->SetString(prefs::kDnsOverHttpsMode,
- chrome_browser_net::kDnsOverHttpsModeAutomatic);
- } else if (entries.count("dns-over-https@2")) {
- // The user has "Disabled" selected.
- local_state_->SetString(prefs::kDnsOverHttpsMode,
- chrome_browser_net::kDnsOverHttpsModeOff);
- } else {
- // The user has "Default" selected.
- local_state_->ClearPref(prefs::kDnsOverHttpsMode);
- }
-
PrefChangeRegistrar::NamedChangeCallback dns_pref_callback =
base::BindRepeating(&OnStubResolverConfigChanged,
base::Unretained(local_state_));
@@ -548,9 +520,14 @@ void SystemNetworkContextManager::GetStubResolverConfig(
std::string doh_templates =
local_state->GetString(prefs::kDnsOverHttpsTemplates);
- std::string server_method;
- if (!doh_templates.empty() &&
- *secure_dns_mode != net::DnsConfig::SecureDnsMode::OFF) {
+ if (doh_templates.empty()) {
+ *secure_dns_mode = net::DnsConfig::SecureDnsMode::OFF;
+ doh_mode = chrome_browser_net::kDnsOverHttpsModeOff;
+ }
+
+ LOG(INFO) << "DoH templates: '" << doh_templates << "' with mode " << doh_mode;
+ if (*secure_dns_mode != net::DnsConfig::SecureDnsMode::OFF) {
+ std::string server_method;
for (const std::string& server_template :
SplitString(doh_templates, " ", base::TRIM_WHITESPACE,
base::SPLIT_WANT_NONEMPTY)) {
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -578,6 +578,17 @@ CHAR-LIMIT guidelines:
Chrome Passwords
</message>
+ <!-- DoH preferences -->
+ <message name="IDS_OPTIONS_DOH_EDIT_TITLE" desc="The title of the screen that allows users to change the URL that is used for DNS-over-HTTPS queries.">
+ Edit DoH template URLs
+ </message>
+ <message name="IDS_OPTIONS_DOH_EDIT_LABEL" desc="The label for the edit text field that allows the user to change the URL that is used for DNS-over-HTTPS queries.">
+ DoH template URLs
+ </message>
+ <message name="IDS_DOH_HELP" desc="The title of the hyperlink that allows users to visit the wiki page with instructions for DNS-over-HTTPS configuration.">
+ Visit help page
+ </message>
+
<!-- Homepage preferences -->
<message name="IDS_OPTIONS_HOMEPAGE_EDIT_TITLE" desc="The title of the screen that allows users to change the URL that opens when they tap on the home page button in the omnibox.">
Edit home page
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -293,12 +293,12 @@ const char kDisallowUnsafeHttpDownloadsParamName[] = "MimeTypeList";
// Enable DNS over HTTPS (DoH).
const base::Feature kDnsOverHttps{"DnsOverHttps",
- base::FEATURE_DISABLED_BY_DEFAULT};
+ base::FEATURE_ENABLED_BY_DEFAULT};
// Set whether fallback to insecure DNS is allowed by default. This setting may
// be overridden for individual transactions.
const base::FeatureParam<bool> kDnsOverHttpsFallbackParam{&kDnsOverHttps,
- "Fallback", true};
+ "Fallback", false};
// Supply one or more space-separated DoH server URI templates to use when this
// feature is enabled. If no templates are specified, then a hardcoded mapping
--
2.17.1
-286
View File
@@ -1,286 +0,0 @@
From: uazo <uazo@users.noreply.github.com>
Date: Tue, 3 May 2022 14:44:11 +0000
Subject: Add webGL site setting
Do not provide any device information when serving context creation errors.
Requires patch: Content-settings-infrastructure.patch
Original License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
.../impl/BromiteWebGLContentSetting.java | 93 +++++++++++++++++++
.../bromite_content_settings/webgl.grdp | 27 ++++++
.../bromite_content_settings/webgl.inc | 22 +++++
.../common/bromite_content_settings/WEBGL.inc | 1 +
.../execution_context/execution_context.cc | 7 ++
.../execution_context/execution_context.h | 2 +
.../webgl/webgl_rendering_context_base.cc | 32 +++----
.../webgl/webgl_rendering_context_base.h | 2 +
8 files changed, 167 insertions(+), 19 deletions(-)
create mode 100644 components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromiteWebGLContentSetting.java
create mode 100644 components/browser_ui/strings/bromite_content_settings/webgl.grdp
create mode 100644 components/content_settings/core/browser/bromite_content_settings/webgl.inc
create mode 100644 components/content_settings/core/common/bromite_content_settings/WEBGL.inc
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromiteWebGLContentSetting.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromiteWebGLContentSetting.java
new file mode 100644
--- /dev/null
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromiteWebGLContentSetting.java
@@ -0,0 +1,93 @@
+/*
+ This file is part of Bromite.
+
+ Bromite is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Bromite is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Bromite. If not, see <https://www.gnu.org/licenses/>.
+*/
+
+package org.chromium.components.browser_ui.site_settings.impl;
+
+import org.chromium.components.browser_ui.site_settings.R;
+
+import org.chromium.components.browser_ui.site_settings.BromiteCustomContentSetting;
+import org.chromium.components.browser_ui.site_settings.ContentSettingsResources;
+import org.chromium.components.browser_ui.site_settings.SiteSettingsCategory;
+import org.chromium.components.content_settings.ContentSetting;
+import org.chromium.components.content_settings.ContentSettingsType;
+import org.chromium.content_public.browser.BrowserContextHandle;
+
+import androidx.annotation.Nullable;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import java.util.ArrayList;
+
+public class BromiteWebGLContentSetting extends BromiteCustomContentSetting {
+ public BromiteWebGLContentSetting() {
+ super(/*contentSettingsType*/ ContentSettingsType.WEBGL,
+ /*defaultEnabledValue*/ ContentSetting.ALLOW,
+ /*defaultDisabledValue*/ ContentSetting.BLOCK,
+ /*allowException*/ true,
+ /*preferenceKey*/ "webgl",
+ /*profilePrefKey*/ "webgl");
+ }
+
+ @Override
+ public ContentSettingsResources.ResourceItem getResourceItem() {
+ return new ContentSettingsResources.ResourceItem(
+ /*icon*/ R.drawable.web_asset,
+ /*title*/ R.string.webgl_permission_title,
+ /*defaultEnabledValue*/ getDefaultEnabledValue(),
+ /*defaultDisabledValue*/ getDefaultDisabledValue(),
+ /*enabledSummary*/ R.string.website_settings_category_webgl_enabled,
+ /*disabledSummary*/ R.string.website_settings_category_webgl_disabled,
+ /*summaryOverrideForScreenReader*/ 0);
+ }
+
+ @Override
+ public int getCategorySummary(@Nullable @ContentSetting int value) {
+ switch (value) {
+ case ContentSetting.ALLOW:
+ return R.string.website_settings_category_webgl_enabled;
+ case ContentSetting.BLOCK:
+ return R.string.website_settings_category_webgl_disabled;
+ default:
+ return 0;
+ }
+ }
+
+ @Override
+ public int getCategoryDescription() {
+ return R.string.settings_site_settings_webgl_description;
+ }
+
+ @Override
+ public boolean requiresTriStateContentSetting() {
+ return false;
+ }
+
+ @Override
+ public boolean showOnlyDescriptions() {
+ return true;
+ }
+
+ @Override
+ public int getAddExceptionDialogMessage() {
+ return R.string.website_settings_category_webgl_enabled;
+ }
+
+ @Override
+ public @Nullable Boolean considerException(SiteSettingsCategory category, @ContentSetting int value) {
+ return value != ContentSetting.BLOCK;
+ }
+}
diff --git a/components/browser_ui/strings/bromite_content_settings/webgl.grdp b/components/browser_ui/strings/bromite_content_settings/webgl.grdp
new file mode 100644
--- /dev/null
+++ b/components/browser_ui/strings/bromite_content_settings/webgl.grdp
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_SITE_SETTINGS_TYPE_WEBGL" desc="The label used for webgl site settings controls." formatter_data="android_java">
+ Webgl
+ </message>
+ <message name="IDS_SETTINGS_SITE_SETTINGS_WEBGL_DESCRIPTION" desc="Description of the webgl content setting." formatter_data="android_java">
+ Enable Webgl, a JavaScript API for rendering high-performance interactive 3D and 2D graphics
+ </message>
+ <message name="IDS_SITE_SETTINGS_TYPE_WEBGL_MID_SENTENCE" desc="The label used for webgl site settings controls when used mid-sentence." formatter_data="android_java">
+ webgl
+ </message>
+ <message name="IDS_WEBGL_PERMISSION_TITLE" desc="Title of the permission to use webgl [CHAR-LIMIT=32]" formatter_data="android_java">
+ Webgl
+ </message>
+ <message name="IDS_WEBSITE_SETTINGS_CATEGORY_WEBGL_ENABLED" desc="Summary text explaining that webgl is full enabled." formatter_data="android_java">
+ Enabled
+ </message>
+ <message name="IDS_WEBSITE_SETTINGS_CATEGORY_WEBGL_DISABLED" desc="Summary text explaining that webgl is full disabled." formatter_data="android_java">
+ Disabled
+ </message>
+ <message name="IDS_SETTINGS_SITE_SETTINGS_WEBGL_ALLOWED_EXCEPTIONS" desc="Label for the allowed exceptions site list of the webgl setting.">
+ Allowed to use webgl
+ </message>
+ <message name="IDS_SETTINGS_SITE_SETTINGS_WEBGL_BLOCKED_EXCEPTIONS" desc="Label for the blocked exceptions site list of the webgl setting.">
+ Not allowed to use webgl
+ </message>
+</grit-part>
diff --git a/components/content_settings/core/browser/bromite_content_settings/webgl.inc b/components/content_settings/core/browser/bromite_content_settings/webgl.inc
new file mode 100644
--- /dev/null
+++ b/components/content_settings/core/browser/bromite_content_settings/webgl.inc
@@ -0,0 +1,22 @@
+ Register(ContentSettingsType::WEBGL, "webgl", CONTENT_SETTING_BLOCK,
+ WebsiteSettingsInfo::SYNCABLE,
+ /*allowlisted_schemes=*/{},
+ /*valid_settings=*/{CONTENT_SETTING_ALLOW,
+ CONTENT_SETTING_BLOCK},
+ WebsiteSettingsInfo::TOP_ORIGIN_ONLY_SCOPE,
+ WebsiteSettingsRegistry::ALL_PLATFORMS,
+ ContentSettingsInfo::INHERIT_IN_INCOGNITO,
+ PermissionSettingsInfo::EXCEPTIONS_ON_SECURE_AND_INSECURE_ORIGINS);
+
+ content_settings::WebsiteSettingsRegistry::GetInstance()
+ ->GetMutable(ContentSettingsType::WEBGL)
+ ->set_show_into_info_page()
+ .set_desktop_ui()
+ .set_is_renderer_content_setting()
+ .set_title_ui(IDS_SITE_SETTINGS_TYPE_WEBGL)
+ .set_description_ui(IDS_SETTINGS_SITE_SETTINGS_WEBGL_DESCRIPTION)
+ .set_allowed_ui(IDS_WEBSITE_SETTINGS_CATEGORY_WEBGL_ENABLED)
+ .set_blocked_ui(IDS_WEBSITE_SETTINGS_CATEGORY_WEBGL_DISABLED)
+ .set_allowed_exceptions_ui(IDS_SETTINGS_SITE_SETTINGS_WEBGL_ALLOWED_EXCEPTIONS)
+ .set_blocked_exceptions_ui(IDS_SETTINGS_SITE_SETTINGS_WEBGL_BLOCKED_EXCEPTIONS)
+ .set_mid_sentence_ui(IDS_SITE_SETTINGS_TYPE_WEBGL);
diff --git a/components/content_settings/core/common/bromite_content_settings/WEBGL.inc b/components/content_settings/core/common/bromite_content_settings/WEBGL.inc
new file mode 100644
--- /dev/null
+++ b/components/content_settings/core/common/bromite_content_settings/WEBGL.inc
@@ -0,0 +1 @@
+ WEBGL,
diff --git a/third_party/blink/renderer/core/execution_context/execution_context.cc b/third_party/blink/renderer/core/execution_context/execution_context.cc
--- a/third_party/blink/renderer/core/execution_context/execution_context.cc
+++ b/third_party/blink/renderer/core/execution_context/execution_context.cc
@@ -86,6 +86,13 @@ blink::WebContentSettingsClient* GetContentSettingsClientFor(
return settings;
}
+bool AllowWebgl(ExecutionContext* context) {
+ blink::WebContentSettingsClient* settings = GetContentSettingsClientFor(context);
+ if (settings)
+ return settings->AllowContentSetting(ContentSettingsType::WEBGL, false);
+ return false;
+}
+
ExecutionContext::ExecutionContext(v8::Isolate* isolate,
Agent* agent,
bool is_window)
diff --git a/third_party/blink/renderer/core/execution_context/execution_context.h b/third_party/blink/renderer/core/execution_context/execution_context.h
--- a/third_party/blink/renderer/core/execution_context/execution_context.h
+++ b/third_party/blink/renderer/core/execution_context/execution_context.h
@@ -115,6 +115,8 @@ enum ReasonForCallingCanExecuteScripts {
enum ReferrerPolicySource { kPolicySourceHttpHeader, kPolicySourceMetaTag };
+CORE_EXPORT bool AllowWebgl(ExecutionContext* context);
+
// An environment in which script can execute. This class exposes the common
// properties of script execution environments on the web (i.e, common between
// script executing in a window and script executing in a worker), such as:
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
--- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
+++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
@@ -346,6 +346,13 @@ void WebGLRenderingContextBase::InitializeWebGLContextLimits(
}
}
+bool WebGLRenderingContextBase::AllowWebglForHost(blink::CanvasRenderingContextHost* host) {
+ if (!host)
+ return false;
+ blink::ExecutionContext* context = host->GetTopExecutionContext();
+ return blink::AllowWebgl(context);
+}
+
unsigned WebGLRenderingContextBase::CurrentMaxGLContexts() {
base::AutoLock locker(WebGLContextLimitLock());
DCHECK(webgl_context_limits_initialized_);
@@ -616,25 +623,6 @@ static String ExtractWebGLContextCreationError(
const Platform::WebGLContextInfo& info) {
StringBuilder builder;
builder.Append("Could not create a WebGL context");
- FormatWebGLStatusString(
- "VENDOR",
- info.vendor_id ? String::Format("0x%04x", info.vendor_id) : "0xffff",
- builder);
- FormatWebGLStatusString(
- "DEVICE",
- info.device_id ? String::Format("0x%04x", info.device_id) : "0xffff",
- builder);
- FormatWebGLStatusString("GL_VENDOR", info.vendor_info, builder);
- FormatWebGLStatusString("GL_RENDERER", info.renderer_info, builder);
- FormatWebGLStatusString("GL_VERSION", info.driver_version, builder);
- FormatWebGLStatusString("Sandboxed", info.sandboxed ? "yes" : "no", builder);
- FormatWebGLStatusString("Optimus", info.optimus ? "yes" : "no", builder);
- FormatWebGLStatusString("AMD switchable", info.amd_switchable ? "yes" : "no",
- builder);
- FormatWebGLStatusString(
- "Reset notification strategy",
- String::Format("0x%04x", info.reset_notification_strategy).Utf8().c_str(),
- builder);
FormatWebGLStatusString("ErrorMessage", info.error_message.Utf8().c_str(),
builder);
builder.Append('.');
@@ -695,6 +683,12 @@ WebGLRenderingContextBase::CreateWebGraphicsContext3DProvider(
const CanvasContextCreationAttributesCore& attributes,
Platform::WebGLContextType context_type,
Platform::WebGLContextInfo* context_info) {
+ if (!AllowWebglForHost(host)) {
+ host->HostDispatchEvent(WebGLContextEvent::Create(
+ event_type_names::kWebglcontextcreationerror,
+ "disabled by site settings policy."));
+ return nullptr;
+ }
if ((context_type == Platform::kWebGL1ContextType &&
!host->IsWebGL1Enabled()) ||
(context_type == Platform::kWebGL2ContextType &&
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h
--- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h
+++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h
@@ -1959,6 +1959,8 @@ class MODULES_EXPORT WebGLRenderingContextBase
DOMArrayBufferView* pixels,
int64_t offset);
+ static bool AllowWebglForHost(blink::CanvasRenderingContextHost* host);
+
void RecordANGLEImplementation();
private:
--
@@ -1,266 +0,0 @@
From: uazo <uazo@users.noreply.github.com>
Date: Fri, 6 May 2022 14:27:17 +0000
Subject: Add webRTC site settings
Requires patch: Content-settings-infrastructure.patch
Original License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
.../impl/BromiteWebRTCContentSetting.java | 94 +++++++++++++++++++
.../bromite_content_settings/webrtc.grdp | 27 ++++++
.../bromite_content_settings/webrtc.inc | 22 +++++
.../bromite_content_settings/WEBRTC.inc | 1 +
.../peer_connection_dependency_factory.cc | 6 ++
.../peerconnection/rtc_rtp_receiver.cc | 11 +++
.../modules/peerconnection/rtc_rtp_sender.cc | 11 +++
7 files changed, 172 insertions(+)
create mode 100644 components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromiteWebRTCContentSetting.java
create mode 100644 components/browser_ui/strings/bromite_content_settings/webrtc.grdp
create mode 100644 components/content_settings/core/browser/bromite_content_settings/webrtc.inc
create mode 100644 components/content_settings/core/common/bromite_content_settings/WEBRTC.inc
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromiteWebRTCContentSetting.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromiteWebRTCContentSetting.java
new file mode 100644
--- /dev/null
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromiteWebRTCContentSetting.java
@@ -0,0 +1,94 @@
+/*
+ This file is part of Bromite.
+
+ Bromite is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Bromite is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Bromite. If not, see <https://www.gnu.org/licenses/>.
+*/
+
+package org.chromium.components.browser_ui.site_settings.impl;
+
+import org.chromium.components.browser_ui.site_settings.R;
+
+import org.chromium.components.browser_ui.site_settings.BromiteCustomContentSetting;
+import org.chromium.components.browser_ui.site_settings.ContentSettingsResources;
+import org.chromium.components.browser_ui.site_settings.SiteSettingsCategory;
+import org.chromium.components.content_settings.ContentSetting;
+import org.chromium.components.content_settings.ContentSettingsType;
+import org.chromium.content_public.browser.BrowserContextHandle;
+
+import androidx.annotation.Nullable;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import java.util.ArrayList;
+
+public class BromiteWebRTCContentSetting extends BromiteCustomContentSetting {
+ public BromiteWebRTCContentSetting() {
+ super(/*contentSettingsType*/ ContentSettingsType.WEBRTC,
+ /*defaultEnabledValue*/ ContentSetting.ALLOW,
+ /*defaultDisabledValue*/ ContentSetting.BLOCK,
+ /*allowException*/ true,
+ /*preferenceKey*/ "webrtc",
+ /*profilePrefKey*/ "webrtc");
+ }
+
+ @Override
+ public ContentSettingsResources.ResourceItem getResourceItem() {
+ return new ContentSettingsResources.ResourceItem(
+ /*icon*/ R.drawable.web_asset,
+ /*title*/ R.string.webrtc_permission_title,
+ /*defaultEnabledValue*/ getDefaultEnabledValue(),
+ /*defaultDisabledValue*/ getDefaultDisabledValue(),
+ /*enabledSummary*/ R.string.website_settings_category_webrtc_enabled,
+ /*disabledSummary*/ R.string.website_settings_category_webrtc_disabled,
+ /*summaryOverrideForScreenReader*/ 0);
+ }
+
+ @Override
+ public int getCategorySummary(@Nullable @ContentSetting int value) {
+ switch (value) {
+ case ContentSetting.ALLOW:
+ return R.string.website_settings_category_webrtc_enabled;
+ case ContentSetting.BLOCK:
+ return R.string.website_settings_category_webrtc_disabled;
+ default:
+ // this will cause a runtime exception
+ return 0;
+ }
+ }
+
+ @Override
+ public int getCategoryDescription() {
+ return R.string.settings_site_settings_webrtc_description;
+ }
+
+ @Override
+ public boolean requiresTriStateContentSetting() {
+ return false;
+ }
+
+ @Override
+ public boolean showOnlyDescriptions() {
+ return true;
+ }
+
+ @Override
+ public int getAddExceptionDialogMessage() {
+ return R.string.website_settings_category_webrtc_enabled;
+ }
+
+ @Override
+ public @Nullable Boolean considerException(SiteSettingsCategory category, @ContentSetting int value) {
+ return value != ContentSetting.BLOCK;
+ }
+}
diff --git a/components/browser_ui/strings/bromite_content_settings/webrtc.grdp b/components/browser_ui/strings/bromite_content_settings/webrtc.grdp
new file mode 100644
--- /dev/null
+++ b/components/browser_ui/strings/bromite_content_settings/webrtc.grdp
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_SITE_SETTINGS_TYPE_WEBRTC" desc="The label used for webrtc site settings controls." formatter_data="android_java">
+ WebRTC
+ </message>
+ <message name="IDS_SITE_SETTINGS_TYPE_WEBRTC_MID_SENTENCE" desc="The label used for webrtc site settings controls when used mid-sentence." formatter_data="android_java">
+ webRTC
+ </message>
+ <message name="IDS_SETTINGS_SITE_SETTINGS_WEBRTC_DESCRIPTION" desc="Description of the WebRTC content setting." formatter_data="android_java">
+ Enable WebRTC, a JavaScript API for real-time communication and direct peer-to-peer communication
+ </message>
+ <message name="IDS_WEBRTC_PERMISSION_TITLE" desc="Title of the permission to use webrtc [CHAR-LIMIT=32]" formatter_data="android_java">
+ WebRTC
+ </message>
+ <message name="IDS_WEBSITE_SETTINGS_CATEGORY_WEBRTC_ENABLED" desc="Summary text explaining that webrtc is full enabled." formatter_data="android_java">
+ Enabled
+ </message>
+ <message name="IDS_WEBSITE_SETTINGS_CATEGORY_WEBRTC_DISABLED" desc="Summary text explaining that webrtc is full disabled." formatter_data="android_java">
+ Disabled
+ </message>
+ <message name="IDS_SETTINGS_SITE_SETTINGS_WEBRTC_ALLOWED_EXCEPTIONS" desc="Label for the allowed exceptions site list of the WebRTC setting.">
+ Allowed to use WebRTC
+ </message>
+ <message name="IDS_SETTINGS_SITE_SETTINGS_WEBRTC_BLOCKED_EXCEPTIONS" desc="Label for the blocked exceptions site list of the WebRTC setting.">
+ Not allowed to use WebRTC
+ </message>
+</grit-part>
diff --git a/components/content_settings/core/browser/bromite_content_settings/webrtc.inc b/components/content_settings/core/browser/bromite_content_settings/webrtc.inc
new file mode 100644
--- /dev/null
+++ b/components/content_settings/core/browser/bromite_content_settings/webrtc.inc
@@ -0,0 +1,22 @@
+ Register(ContentSettingsType::WEBRTC, "webrtc", CONTENT_SETTING_BLOCK,
+ WebsiteSettingsInfo::SYNCABLE,
+ /*allowlisted_schemes=*/{},
+ /*valid_settings=*/{CONTENT_SETTING_ALLOW,
+ CONTENT_SETTING_BLOCK},
+ WebsiteSettingsInfo::TOP_ORIGIN_ONLY_SCOPE,
+ WebsiteSettingsRegistry::ALL_PLATFORMS,
+ ContentSettingsInfo::INHERIT_IN_INCOGNITO,
+ PermissionSettingsInfo::EXCEPTIONS_ON_SECURE_AND_INSECURE_ORIGINS);
+
+ content_settings::WebsiteSettingsRegistry::GetInstance()
+ ->GetMutable(ContentSettingsType::WEBRTC)
+ ->set_show_into_info_page()
+ .set_desktop_ui()
+ .set_is_renderer_content_setting()
+ .set_title_ui(IDS_SITE_SETTINGS_TYPE_WEBRTC)
+ .set_description_ui(IDS_SETTINGS_SITE_SETTINGS_WEBRTC_DESCRIPTION)
+ .set_allowed_ui(IDS_WEBSITE_SETTINGS_CATEGORY_WEBRTC_ENABLED)
+ .set_blocked_ui(IDS_WEBSITE_SETTINGS_CATEGORY_WEBRTC_DISABLED)
+ .set_allowed_exceptions_ui(IDS_SETTINGS_SITE_SETTINGS_WEBRTC_ALLOWED_EXCEPTIONS)
+ .set_blocked_exceptions_ui(IDS_SETTINGS_SITE_SETTINGS_WEBRTC_BLOCKED_EXCEPTIONS)
+ .set_mid_sentence_ui(IDS_SITE_SETTINGS_TYPE_WEBRTC_MID_SENTENCE);
diff --git a/components/content_settings/core/common/bromite_content_settings/WEBRTC.inc b/components/content_settings/core/common/bromite_content_settings/WEBRTC.inc
new file mode 100644
--- /dev/null
+++ b/components/content_settings/core/common/bromite_content_settings/WEBRTC.inc
@@ -0,0 +1 @@
+ WEBRTC,
diff --git a/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc b/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc
--- a/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc
+++ b/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc
@@ -47,6 +47,7 @@
#include "third_party/blink/public/platform/modules/webrtc/webrtc_logging.h"
#include "third_party/blink/public/platform/platform.h"
#include "third_party/blink/public/platform/task_type.h"
+#include "third_party/blink/public/platform/web_content_settings_client.h"
#include "third_party/blink/public/platform/web_url.h"
#include "third_party/blink/public/web/modules/mediastream/media_stream_video_source.h"
#include "third_party/blink/public/web/web_document.h"
@@ -989,6 +990,11 @@ PeerConnectionDependencyFactory::CreatePortAllocator(
// |request_multiple_routes|. Whether local IP addresses could be
// collected depends on if mic/camera permission is granted for this
// origin.
+ blink::WebContentSettingsClient* settings = web_frame->GetContentSettingsClient();
+ if (settings && settings->AllowContentSetting(ContentSettingsType::WEBRTC, false)) {
+ webrtc_ip_handling_policy = mojom::blink::WebRtcIpHandlingPolicy::kDefault;
+ }
+
switch (webrtc_ip_handling_policy) {
// TODO(guoweis): specify the flag of disabling local candidate
// collection when webrtc is updated.
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.cc b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.cc
--- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.cc
@@ -16,6 +16,9 @@
#include "third_party/blink/public/common/privacy_budget/identifiable_surface.h"
#include "third_party/blink/public/common/privacy_budget/identifiable_token_builder.h"
#include "third_party/blink/public/platform/modules/webrtc/webrtc_logging.h"
+#include "third_party/blink/public/platform/web_content_settings_client.h"
+#include "third_party/blink/public/web/web_local_frame.h"
+#include "third_party/blink/renderer/core/frame/local_dom_window.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_insertable_streams.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_rtcp_parameters.h"
@@ -279,6 +282,14 @@ RTCRtpCapabilities* RTCRtpReceiver::getCapabilities(ScriptState* state,
if (kind != "audio" && kind != "video")
return nullptr;
+ LocalDOMWindow* window = To<LocalDOMWindow>(ExecutionContext::From(state));
+ auto* web_frame =
+ static_cast<WebLocalFrame*>(WebFrame::FromCoreFrame(window->GetFrame()));
+ blink::WebContentSettingsClient* settings = web_frame->GetContentSettingsClient();
+ if (settings && !settings->AllowContentSetting(ContentSettingsType::WEBRTC, false)) {
+ return nullptr;
+ }
+
RTCRtpCapabilities* capabilities = RTCRtpCapabilities::Create();
capabilities->setCodecs(HeapVector<Member<RTCRtpCodecCapability>>());
capabilities->setHeaderExtensions(
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.cc b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.cc
--- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.cc
@@ -21,6 +21,9 @@
#include "third_party/blink/public/common/privacy_budget/identifiable_surface.h"
#include "third_party/blink/public/common/privacy_budget/identifiable_token_builder.h"
#include "third_party/blink/public/platform/modules/webrtc/webrtc_logging.h"
+#include "third_party/blink/public/platform/web_content_settings_client.h"
+#include "third_party/blink/public/web/web_local_frame.h"
+#include "third_party/blink/renderer/core/frame/local_dom_window.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_encoding_options.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_insertable_streams.h"
@@ -1031,6 +1034,14 @@ RTCRtpCapabilities* RTCRtpSender::getCapabilities(ScriptState* state,
if (kind != "audio" && kind != "video")
return nullptr;
+ LocalDOMWindow* window = To<LocalDOMWindow>(ExecutionContext::From(state));
+ auto* web_frame =
+ static_cast<WebLocalFrame*>(WebFrame::FromCoreFrame(window->GetFrame()));
+ blink::WebContentSettingsClient* settings = web_frame->GetContentSettingsClient();
+ if (settings && !settings->AllowContentSetting(ContentSettingsType::WEBRTC, false)) {
+ return nullptr;
+ }
+
RTCRtpCapabilities* capabilities = RTCRtpCapabilities::Create();
capabilities->setCodecs(HeapVector<Member<RTCRtpCodecCapability>>());
capabilities->setHeaderExtensions(
--
@@ -1,50 +0,0 @@
From: uazo <uazo@users.noreply.github.com>
Date: Mon, 7 Aug 2023 11:02:18 +0000
Subject: Allow DocumentPiP if PopupsAndRedirects are active
Allow documentPiP api use only with content setting popup allowed
and disables the possibility of verifying the activation of PIP
in the device with document.pictureInPictureEnabled
License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
---
.../chromium/chrome/browser/media/PictureInPicture.java | 1 +
.../picture_in_picture_controller_impl.cc | 7 +++++++
2 files changed, 8 insertions(+)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPicture.java b/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPicture.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPicture.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPicture.java
@@ -29,6 +29,7 @@ public abstract class PictureInPicture {
* @return boolean true if Picture-In-Picture is enabled, otherwise false.
*/
public static boolean isEnabled(Context context) {
+ if ((true)) return true;
// Some versions of Android crash when the activity enters Picture-in-Picture
// immediately after it exits Picture-in-Picture. See b/143784148
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
diff --git a/third_party/blink/renderer/modules/document_picture_in_picture/picture_in_picture_controller_impl.cc b/third_party/blink/renderer/modules/document_picture_in_picture/picture_in_picture_controller_impl.cc
--- a/third_party/blink/renderer/modules/document_picture_in_picture/picture_in_picture_controller_impl.cc
+++ b/third_party/blink/renderer/modules/document_picture_in_picture/picture_in_picture_controller_impl.cc
@@ -31,6 +31,7 @@
#include "third_party/blink/renderer/core/layout/layout_video.h"
#include "third_party/blink/renderer/modules/document_picture_in_picture/document_picture_in_picture.h"
#include "third_party/blink/renderer/modules/document_picture_in_picture/document_picture_in_picture_event.h"
+#include "third_party/blink/renderer/core/loader/document_loader.h"
#include "third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_event.h"
#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
@@ -386,6 +387,12 @@ void PictureInPictureControllerImpl::CreateDocumentPictureInPictureWindow(
return;
}
+ if (!opener.GetFrame()->Loader().GetDocumentLoader()->GetContentSettings()->allow_popup) {
+ resolver->RejectWithDOMException(DOMExceptionCode::kNotAllowedError,
+ "Document PiP requires user popup permission");
+ return;
+ }
+
WebPictureInPictureWindowOptions web_options;
web_options.width = options->width();
web_options.height = options->height();
--
@@ -1,560 +0,0 @@
From: Zoraver Kang <Zoraver@users.noreply.github.com>
Date: Fri, 22 May 2020 22:43:27 -0400
Subject: Allow building without enable_reporting
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
chrome/browser/net/chrome_report_sender.cc | 1 +
.../browser/devtools/protocol/network_handler.cc | 2 ++
.../cross_origin_embedder_policy_reporter.cc | 7 +++++--
.../browser/network/reporting_service_proxy.cc | 3 +++
.../renderer_host/render_frame_host_impl.cc | 6 ------
.../coop/cross_origin_opener_policy_reporter.cc | 16 +++++++---------
.../dip/document_isolation_policy_reporter.cc | 3 +++
.../web_package/signed_exchange_reporter.cc | 2 ++
...content_switch_dependent_feature_overrides.cc | 1 +
.../Allow-building-without-enable_reporting.inc | 2 ++
net/reporting/reporting_header_parser.cc | 1 +
net/reporting/reporting_service.cc | 6 ++++++
services/network/network_context.h | 6 +++---
services/network/public/cpp/parsed_headers.cc | 1 +
services/network/public/mojom/BUILD.gn | 1 -
.../network/public/mojom/network_context.mojom | 3 +++
.../core/frame/csp/content_security_policy.cc | 3 +++
.../blink/renderer/core/frame/local_frame.cc | 3 +++
.../blink/renderer/core/frame/local_frame.h | 3 +++
.../renderer/core/frame/reporting_context.cc | 9 +++++++++
.../renderer/core/frame/reporting_context.h | 7 +++++--
.../renderer/core/frame/reporting_observer.cc | 3 +--
22 files changed, 64 insertions(+), 25 deletions(-)
create mode 100644 cromite_flags/services/network/public/cpp/features_cc/Allow-building-without-enable_reporting.inc
diff --git a/chrome/browser/net/chrome_report_sender.cc b/chrome/browser/net/chrome_report_sender.cc
--- a/chrome/browser/net/chrome_report_sender.cc
+++ b/chrome/browser/net/chrome_report_sender.cc
@@ -85,6 +85,7 @@ void SendReport(
const std::string& report,
base::OnceClosure success_callback,
ErrorCallback error_callback) {
+ if ((true)) return;
auto resource_request = std::make_unique<network::ResourceRequest>();
resource_request->url = report_uri;
resource_request->method = "POST";
diff --git a/content/browser/devtools/protocol/network_handler.cc b/content/browser/devtools/protocol/network_handler.cc
--- a/content/browser/devtools/protocol/network_handler.cc
+++ b/content/browser/devtools/protocol/network_handler.cc
@@ -1520,6 +1520,7 @@ String BuildReportStatus(const net::ReportingReport::Status status) {
}
}
+#if BUILDFLAG(ENABLE_REPORTING)
std::vector<GURL> ComputeReportingURLs(RenderFrameHostImpl* frame_host) {
std::vector<GURL> urls;
frame_host->ForEachRenderFrameHostImplWithAction(
@@ -1533,6 +1534,7 @@ std::vector<GURL> ComputeReportingURLs(RenderFrameHostImpl* frame_host) {
});
return urls;
}
+#endif // BUILDFLAG(ENABLE_REPORTING)
} // namespace
diff --git a/content/browser/network/cross_origin_embedder_policy_reporter.cc b/content/browser/network/cross_origin_embedder_policy_reporter.cc
--- a/content/browser/network/cross_origin_embedder_policy_reporter.cc
+++ b/content/browser/network/cross_origin_embedder_policy_reporter.cc
@@ -4,6 +4,7 @@
#include "content/browser/network/cross_origin_embedder_policy_reporter.h"
+#include "net/base/features.h"
#include <string_view>
#include "base/values.h"
@@ -96,8 +97,6 @@ void CrossOriginEmbedderPolicyReporter::Clone(
void CrossOriginEmbedderPolicyReporter::QueueAndNotify(
std::initializer_list<std::pair<std::string_view, std::string_view>> body,
bool report_only) {
- const std::optional<std::string>& endpoint =
- report_only ? report_only_endpoint_ : endpoint_;
const char* const disposition = report_only ? "reporting" : "enforce";
if (observer_) {
std::vector<blink::mojom::ReportBodyElementPtr> list;
@@ -112,6 +111,9 @@ void CrossOriginEmbedderPolicyReporter::QueueAndNotify(
observer_->Notify(blink::mojom::Report::New(
kType, context_url_, blink::mojom::ReportBody::New(std::move(list))));
}
+#if BUILDFLAG(ENABLE_REPORTING)
+ const std::optional<std::string>& endpoint =
+ report_only ? report_only_endpoint_ : endpoint_;
if (endpoint) {
base::Value::Dict body_to_pass;
for (const auto& pair : body) {
@@ -125,6 +127,7 @@ void CrossOriginEmbedderPolicyReporter::QueueAndNotify(
network_anonymization_key_, std::move(body_to_pass));
}
}
+#endif
}
} // namespace content
diff --git a/content/browser/network/reporting_service_proxy.cc b/content/browser/network/reporting_service_proxy.cc
--- a/content/browser/network/reporting_service_proxy.cc
+++ b/content/browser/network/reporting_service_proxy.cc
@@ -11,6 +11,7 @@
#include "base/memory/ref_counted.h"
#include "base/unguessable_token.h"
#include "base/values.h"
+#include "net/base/features.h"
#include "content/browser/service_worker/service_worker_host.h"
#include "content/browser/worker_host/dedicated_worker_host.h"
#include "content/browser/worker_host/shared_worker_host.h"
@@ -240,12 +241,14 @@ class ReportingServiceProxyImpl : public blink::mojom::ReportingServiceProxy {
const std::string& group,
const std::string& type,
base::Value::Dict body) {
+#if BUILDFLAG(ENABLE_REPORTING)
auto* rph = RenderProcessHost::FromID(render_process_id_);
if (!rph)
return;
rph->GetStoragePartition()->GetNetworkContext()->QueueReport(
type, group, url, reporting_source_, network_anonymization_key_,
std::move(body));
+#endif
}
const int render_process_id_;
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -16264,12 +16264,6 @@ void RenderFrameHostImpl::MaybeGenerateCrashReport(
}
}
}
-
- // Send the crash report to the Reporting API.
- GetProcess()->GetStoragePartition()->GetNetworkContext()->QueueReport(
- /*type=*/"crash", crash_reporting_group_, last_committed_url_,
- GetReportingSource(), isolation_info_.network_anonymization_key(),
- std::move(body));
}
void RenderFrameHostImpl::UpdateOrDisableCompositorMetricRecorder() const {
diff --git a/content/browser/security/coop/cross_origin_opener_policy_reporter.cc b/content/browser/security/coop/cross_origin_opener_policy_reporter.cc
--- a/content/browser/security/coop/cross_origin_opener_policy_reporter.cc
+++ b/content/browser/security/coop/cross_origin_opener_policy_reporter.cc
@@ -18,25 +18,17 @@
#include "services/network/public/mojom/network_context.mojom.h"
#include "services/network/public/mojom/source_location.mojom.h"
#include "url/origin.h"
+#include "build/build_config.h"
namespace content {
namespace {
// Report attribute names (camelCase):
-constexpr char kColumnNumber[] = "columnNumber";
constexpr char kDisposition[] = "disposition";
-constexpr char kEffectivePolicy[] = "effectivePolicy";
-constexpr char kInitialPopupURL[] = "initialPopupURL";
-constexpr char kLineNumber[] = "lineNumber";
constexpr char kNextURL[] = "nextResponseURL";
-constexpr char kOpeneeURL[] = "openeeURL";
-constexpr char kOpenerURL[] = "openerURL";
-constexpr char kOtherDocumentURL[] = "otherDocumentURL";
constexpr char kPreviousURL[] = "previousResponseURL";
-constexpr char kProperty[] = "property";
constexpr char kReferrer[] = "referrer";
-constexpr char kSourceFile[] = "sourceFile";
constexpr char kType[] = "type";
// Report attribute values:
@@ -45,6 +37,7 @@ constexpr char kDispositionReporting[] = "reporting";
constexpr char kTypeFromResponse[] = "navigation-from-response";
constexpr char kTypeToResponse[] = "navigation-to-response";
+#if BUILDFLAG(ENABLE_REPORTING)
std::string ToString(network::mojom::CrossOriginOpenerPolicyValue coop_value) {
switch (coop_value) {
case network::mojom::CrossOriginOpenerPolicyValue::kUnsafeNone:
@@ -59,6 +52,7 @@ std::string ToString(network::mojom::CrossOriginOpenerPolicyValue coop_value) {
return "noopener-allow-popups";
}
}
+#endif
FrameTreeNode* TopLevelOpener(FrameTreeNode* frame) {
FrameTreeNode* opener =
@@ -230,6 +224,7 @@ void CrossOriginOpenerPolicyReporter::QueueAccessReport(
network::mojom::SourceLocationPtr source_location,
const std::string& reported_window_url,
const std::string& initial_popup_url) const {
+#if BUILDFLAG(ENABLE_REPORTING)
// Cross-Origin-Opener-Policy-Report-Only is not required to provide
// endpoints.
if (!coop_.report_only_reporting_endpoint)
@@ -277,12 +272,14 @@ void CrossOriginOpenerPolicyReporter::QueueAccessReport(
storage_partition_->GetNetworkContext()->QueueReport(
"coop", endpoint, context_url_, reporting_source_,
network_anonymization_key_, std::move(body));
+#endif
}
void CrossOriginOpenerPolicyReporter::QueueNavigationReport(
base::Value::Dict body,
const std::string& endpoint,
bool is_report_only) {
+#if BUILDFLAG(ENABLE_REPORTING)
body.Set(kDisposition,
is_report_only ? kDispositionReporting : kDispositionEnforce);
body.Set(kEffectivePolicy,
@@ -290,6 +287,7 @@ void CrossOriginOpenerPolicyReporter::QueueNavigationReport(
storage_partition_->GetNetworkContext()->QueueReport(
"coop", endpoint, context_url_, reporting_source_,
network_anonymization_key_, std::move(body));
+#endif
}
} // namespace content
diff --git a/content/browser/security/dip/document_isolation_policy_reporter.cc b/content/browser/security/dip/document_isolation_policy_reporter.cc
--- a/content/browser/security/dip/document_isolation_policy_reporter.cc
+++ b/content/browser/security/dip/document_isolation_policy_reporter.cc
@@ -7,6 +7,7 @@
#include <string_view>
#include "base/values.h"
+#include "net/net_buildflags.h"
#include "content/public/browser/storage_partition.h"
#include "services/network/public/cpp/request_destination.h"
#include "services/network/public/mojom/network_context.mojom.h"
@@ -94,11 +95,13 @@ void DocumentIsolationPolicyReporter::QueueAndNotify(
}
body_to_pass.Set("disposition", disposition);
+#if BUILDFLAG(ENABLE_REPORTING)
if (auto* storage_partition = storage_partition_.get()) {
storage_partition->GetNetworkContext()->QueueReport(
kType, *endpoint, context_url_, reporting_source_,
network_anonymization_key_, std::move(body_to_pass));
}
+#endif
}
}
diff --git a/content/browser/web_package/signed_exchange_reporter.cc b/content/browser/web_package/signed_exchange_reporter.cc
--- a/content/browser/web_package/signed_exchange_reporter.cc
+++ b/content/browser/web_package/signed_exchange_reporter.cc
@@ -127,6 +127,7 @@ void ReportResult(
FrameTreeNodeId frame_tree_node_id,
network::mojom::SignedExchangeReportPtr report,
const net::NetworkAnonymizationKey& network_anonymization_key) {
+#if BUILDFLAG(ENABLE_REPORTING)
FrameTreeNode* frame_tree_node =
FrameTreeNode::GloballyFindByID(frame_tree_node_id);
if (!frame_tree_node)
@@ -141,6 +142,7 @@ void ReportResult(
DCHECK(partition);
partition->GetNetworkContext()->QueueSignedExchangeReport(
std::move(report), network_anonymization_key);
+#endif
}
} // namespace
diff --git a/content/public/common/content_switch_dependent_feature_overrides.cc b/content/public/common/content_switch_dependent_feature_overrides.cc
--- a/content/public/common/content_switch_dependent_feature_overrides.cc
+++ b/content/public/common/content_switch_dependent_feature_overrides.cc
@@ -9,6 +9,7 @@
#include "content/public/common/content_features.h"
#include "content/public/common/content_switches.h"
#include "net/base/features.h"
+#include "net/net_buildflags.h"
#include "services/network/public/cpp/features.h"
#include "services/network/public/cpp/network_switches.h"
#include "third_party/blink/public/common/features.h"
diff --git a/cromite_flags/services/network/public/cpp/features_cc/Allow-building-without-enable_reporting.inc b/cromite_flags/services/network/public/cpp/features_cc/Allow-building-without-enable_reporting.inc
new file mode 100644
--- /dev/null
+++ b/cromite_flags/services/network/public/cpp/features_cc/Allow-building-without-enable_reporting.inc
@@ -0,0 +1,2 @@
+SET_CROMITE_FEATURE_DISABLED(kNetworkErrorLogging);
+SET_CROMITE_FEATURE_DISABLED(kReporting);
diff --git a/net/reporting/reporting_header_parser.cc b/net/reporting/reporting_header_parser.cc
--- a/net/reporting/reporting_header_parser.cc
+++ b/net/reporting/reporting_header_parser.cc
@@ -344,6 +344,7 @@ void ReportingHeaderParser::ProcessParsedReportingEndpointsHeader(
const NetworkAnonymizationKey& network_anonymization_key,
const url::Origin& origin,
base::flat_map<std::string, std::string> header) {
+ CHECK(false);
DCHECK(GURL::SchemeIsCryptographic(origin.scheme()));
DCHECK(!reporting_source.is_empty());
DCHECK(network_anonymization_key.IsEmpty() ||
diff --git a/net/reporting/reporting_service.cc b/net/reporting/reporting_service.cc
--- a/net/reporting/reporting_service.cc
+++ b/net/reporting/reporting_service.cc
@@ -236,6 +236,12 @@ class ReportingServiceImpl : public ReportingService {
int depth,
base::TimeTicks queued_ticks,
ReportingTargetType target_type) {
+#if BUILDFLAG(ENABLE_REPORTING)
+ if ((true))
+ return;
+#else
+#error Attempting to build with enable_reporting
+#endif
DCHECK(initialized_);
context_->cache()->AddReport(
reporting_source, network_anonymization_key, sanitized_url, user_agent,
diff --git a/services/network/network_context.h b/services/network/network_context.h
--- a/services/network/network_context.h
+++ b/services/network/network_context.h
@@ -506,14 +506,14 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkContext
const GURL& url,
const std::optional<base::UnguessableToken>& reporting_source,
const net::NetworkAnonymizationKey& network_anonymization_key,
- base::Value::Dict body) override;
+ base::Value::Dict body);
void QueueEnterpriseReport(const std::string& type,
const std::string& group,
const GURL& url,
- base::Value::Dict body) override;
+ base::Value::Dict body);
void QueueSignedExchangeReport(
mojom::SignedExchangeReportPtr report,
- const net::NetworkAnonymizationKey& network_anonymization_key) override;
+ const net::NetworkAnonymizationKey& network_anonymization_key);
void AddDomainReliabilityContextForTesting(
const url::Origin& origin,
const GURL& upload_url,
diff --git a/services/network/public/cpp/parsed_headers.cc b/services/network/public/cpp/parsed_headers.cc
--- a/services/network/public/cpp/parsed_headers.cc
+++ b/services/network/public/cpp/parsed_headers.cc
@@ -133,6 +133,7 @@ mojom::ParsedHeadersPtr PopulateParsedHeaders(
}
#if BUILDFLAG(ENABLE_REPORTING)
+#error Attempting to build with enable_reporting
if (std::optional<std::string> reporting_endpoints =
headers->GetNormalizedHeader("Reporting-Endpoints")) {
parsed_headers->reporting_endpoints =
diff --git a/services/network/public/mojom/BUILD.gn b/services/network/public/mojom/BUILD.gn
--- a/services/network/public/mojom/BUILD.gn
+++ b/services/network/public/mojom/BUILD.gn
@@ -1793,7 +1793,6 @@ mojom("mojom") {
export_define_blink = "BLINK_PLATFORM_IMPLEMENTATION=1"
export_header_blink = "third_party/blink/public/platform/web_common.h"
if (enable_reporting) {
- enabled_features += [ "enable_reporting" ]
}
}
diff --git a/services/network/public/mojom/network_context.mojom b/services/network/public/mojom/network_context.mojom
--- a/services/network/public/mojom/network_context.mojom
+++ b/services/network/public/mojom/network_context.mojom
@@ -1303,6 +1303,7 @@ interface NetworkContext {
// provided `network_anonymization_key`.
//
// Spec: https://w3c.github.io/reporting/#concept-reports
+ [EnableIf=enable_reporting]
QueueReport(string type,
string group,
url.mojom.Url url,
@@ -1310,6 +1311,7 @@ interface NetworkContext {
NetworkAnonymizationKey network_anonymization_key,
mojo_base.mojom.DictionaryValue body);
+ [EnableIf=enable_reporting]
QueueEnterpriseReport(string type,
string group,
url.mojom.Url url,
@@ -1320,6 +1322,7 @@ interface NetworkContext {
// Note that this queued report will never be delivered if no reporting
// endpoint matching is registered for with the provided
// `network_anonymization_key`.
+ [EnableIf=enable_reporting]
QueueSignedExchangeReport(SignedExchangeReport report,
NetworkAnonymizationKey network_anonymization_key);
diff --git a/third_party/blink/renderer/core/frame/csp/content_security_policy.cc b/third_party/blink/renderer/core/frame/csp/content_security_policy.cc
--- a/third_party/blink/renderer/core/frame/csp/content_security_policy.cc
+++ b/third_party/blink/renderer/core/frame/csp/content_security_policy.cc
@@ -31,6 +31,7 @@
#include <set>
#include <utility>
+#include "net/net_buildflags.h"
#include "base/containers/contains.h"
#include "base/debug/dump_without_crashing.h"
#include "base/feature_list.h"
@@ -1355,6 +1356,7 @@ void ContentSecurityPolicy::ReportViolation(
ShouldBypassContentSecurityPolicy(KURL(violation_data->sourceFile()))) {
return;
}
+#if BUILDFLAG(ENABLE_REPORTING)
PostViolationReport(violation_data, context_frame, report_endpoints,
use_reporting_api);
@@ -1362,6 +1364,7 @@ void ContentSecurityPolicy::ReportViolation(
// `context_frame` (i.e. we're not processing 'frame-ancestors').
if (delegate_ && !context_frame)
delegate_->DispatchViolationEvent(*violation_data, element);
+#endif
AuditsIssue audits_issue = AuditsIssue::CreateContentSecurityPolicyIssue(
*violation_data, header_type == ContentSecurityPolicyType::kReport,
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc
--- a/third_party/blink/renderer/core/frame/local_frame.cc
+++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -48,6 +48,7 @@
#include "build/build_config.h"
#include "mojo/public/cpp/bindings/self_owned_receiver.h"
#include "mojo/public/cpp/system/message_pipe.h"
+#include "net/net_buildflags.h"
#include "services/network/public/cpp/features.h"
#include "services/network/public/mojom/content_security_policy.mojom-blink.h"
#include "services/network/public/mojom/source_location.mojom-blink.h"
@@ -2851,9 +2852,11 @@ DocumentResourceCoordinator* LocalFrame::GetDocumentResourceCoordinator() {
return CHECK_DEREF(GetDocument()).GetResourceCoordinator();
}
+#if BUILDFLAG(ENABLE_REPORTING)
mojom::blink::ReportingServiceProxy* LocalFrame::GetReportingService() {
return mojo_handler_->ReportingService();
}
+#endif
mojom::blink::DevicePostureProvider* LocalFrame::GetDevicePostureProvider() {
return mojo_handler_->DevicePostureProvider();
diff --git a/third_party/blink/renderer/core/frame/local_frame.h b/third_party/blink/renderer/core/frame/local_frame.h
--- a/third_party/blink/renderer/core/frame/local_frame.h
+++ b/third_party/blink/renderer/core/frame/local_frame.h
@@ -37,6 +37,7 @@
#include "base/time/time.h"
#include "base/unguessable_token.h"
#include "build/build_config.h"
+#include "net/net_buildflags.h"
#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "net/storage_access_api/status.h"
@@ -668,7 +669,9 @@ class CORE_EXPORT LocalFrame final
return client_hints_preferences_;
}
+#if BUILDFLAG(ENABLE_REPORTING)
mojom::blink::ReportingServiceProxy* GetReportingService();
+#endif
mojom::blink::DevicePostureProvider* GetDevicePostureProvider();
// Returns the frame host ptr. The interface returned is backed by an
diff --git a/third_party/blink/renderer/core/frame/reporting_context.cc b/third_party/blink/renderer/core/frame/reporting_context.cc
--- a/third_party/blink/renderer/core/frame/reporting_context.cc
+++ b/third_party/blink/renderer/core/frame/reporting_context.cc
@@ -4,6 +4,7 @@
#include "third_party/blink/renderer/core/frame/reporting_context.h"
+#include "net/net_buildflags.h"
#include "third_party/blink/public/platform/browser_interface_broker_proxy.h"
#include "third_party/blink/public/platform/platform.h"
#include "third_party/blink/public/platform/task_type.h"
@@ -59,7 +60,9 @@ const char ReportingContext::kSupplementName[] = "ReportingContext";
ReportingContext::ReportingContext(ExecutionContext& context)
: Supplement<ExecutionContext>(context),
execution_context_(context),
+#if BUILDFLAG(ENABLE_REPORTING)
reporting_service_(&context),
+#endif
receivers_(this, &context) {}
// static
@@ -126,7 +129,9 @@ void ReportingContext::Trace(Visitor* visitor) const {
visitor->Trace(observers_);
visitor->Trace(report_buffer_);
visitor->Trace(execution_context_);
+#if BUILDFLAG(ENABLE_REPORTING)
visitor->Trace(reporting_service_);
+#endif
visitor->Trace(receivers_);
Supplement<ExecutionContext>::Trace(visitor);
}
@@ -149,6 +154,7 @@ void ReportingContext::CountReport(Report* report) {
UseCounter::Count(execution_context_, feature);
}
+#if BUILDFLAG(ENABLE_REPORTING)
const HeapMojoRemote<mojom::blink::ReportingServiceProxy>&
ReportingContext::GetReportingService() const {
if (!reporting_service_.is_bound()) {
@@ -158,6 +164,7 @@ ReportingContext::GetReportingService() const {
}
return reporting_service_;
}
+#endif
void ReportingContext::NotifyInternal(Report* report) {
if (!ShouldReportBeVisibleToObservers(report)) {
@@ -184,6 +191,7 @@ void ReportingContext::NotifyInternal(Report* report) {
void ReportingContext::SendToReportingAPI(Report* report,
const String& endpoint) const {
+#if BUILDFLAG(ENABLE_REPORTING)
const String& type = report->type();
if (!(type == ReportType::kCSPViolation || type == ReportType::kCSPHash ||
type == ReportType::kDeprecation ||
@@ -263,6 +271,7 @@ void ReportingContext::SendToReportingAPI(Report* report,
url, endpoint, body->featureId(), body->disposition(), body->message(),
body->sourceFile(), line_number, column_number);
}
+#endif
}
} // namespace blink
diff --git a/third_party/blink/renderer/core/frame/reporting_context.h b/third_party/blink/renderer/core/frame/reporting_context.h
--- a/third_party/blink/renderer/core/frame/reporting_context.h
+++ b/third_party/blink/renderer/core/frame/reporting_context.h
@@ -5,6 +5,7 @@
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_REPORTING_CONTEXT_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_REPORTING_CONTEXT_H_
+#include "net/net_buildflags.h"
#include "third_party/blink/public/mojom/frame/reporting_observer.mojom-blink.h"
#include "third_party/blink/public/mojom/reporting/reporting.mojom-blink.h"
#include "third_party/blink/renderer/core/core_export.h"
@@ -56,10 +57,10 @@ class CORE_EXPORT ReportingContext : public GarbageCollected<ReportingContext>,
private:
// Counts the use of a report type via UseCounter.
void CountReport(Report*);
-
+#if BUILDFLAG(ENABLE_REPORTING)
const HeapMojoRemote<mojom::blink::ReportingServiceProxy>&
GetReportingService() const;
-
+#endif
void NotifyInternal(Report* report);
// Send |report| via the Reporting API to |endpoint|.
void SendToReportingAPI(Report* report, const String& endpoint) const;
@@ -71,8 +72,10 @@ class CORE_EXPORT ReportingContext : public GarbageCollected<ReportingContext>,
// This is declared mutable so that the service endpoint can be cached by
// const methods.
+#if BUILDFLAG(ENABLE_REPORTING)
mutable HeapMojoRemote<mojom::blink::ReportingServiceProxy>
reporting_service_;
+#endif
// There might be up to two ReportingObservers stored here: one that is called
// from the CrossOriginEmbedderPolicyReporter and one that is called from the
diff --git a/third_party/blink/renderer/core/frame/reporting_observer.cc b/third_party/blink/renderer/core/frame/reporting_observer.cc
--- a/third_party/blink/renderer/core/frame/reporting_observer.cc
+++ b/third_party/blink/renderer/core/frame/reporting_observer.cc
@@ -61,8 +61,7 @@ void ReportingObserver::QueueReport(Report* report) {
}
bool ReportingObserver::ObservedType(const String& type) {
- return !options_->hasTypesNonNull() || options_->typesNonNull().empty() ||
- options_->typesNonNull().Find(type) != kNotFound;
+ return false;
}
bool ReportingObserver::Buffered() {
--
@@ -0,0 +1,119 @@
From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Thu, 19 Dec 2019 22:52:53 +0100
Subject: Allow building without feed support
---
.../start_surface/StartSurfaceCoordinator.java | 5 -----
.../start_surface/StartSurfaceMediator.java | 17 -----------------
chrome/android/feed/feed_java_sources.gni | 2 --
.../browser/native_page/NativePageFactory.java | 7 -------
components/feed/feed_feature_list.cc | 2 +-
5 files changed, 1 insertion(+), 32 deletions(-)
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
--- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
+++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
@@ -214,11 +214,6 @@ public class StartSurfaceCoordinator implements StartSurface {
mBottomBarCoordinator = new BottomBarCoordinator(
mActivity, mActivity.getCompositorViewHolder(), mPropertyModel);
}
-
- mExploreSurfaceCoordinator = new ExploreSurfaceCoordinator(mActivity,
- mSurfaceMode == SurfaceMode.SINGLE_PANE ? mTasksSurface.getBodyViewContainer()
- : mActivity.getCompositorViewHolder(),
- mPropertyModel, mSurfaceMode == SurfaceMode.SINGLE_PANE);
}
private TabSwitcher.Controller initializeSecondaryTasksSurface() {
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
--- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
+++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
@@ -415,15 +415,6 @@ class StartSurfaceMediator
assert (isShownState(shownState));
setOverviewState(shownState);
- // Make sure FeedSurfaceCoordinator is built before the explore surface is showing by
- // default.
- if (mPropertyModel.get(IS_EXPLORE_SURFACE_VISIBLE)
- && mPropertyModel.get(FEED_SURFACE_COORDINATOR) == null
- && !mActivityStateChecker.isFinishingOrDestroyed()) {
- mPropertyModel.set(FEED_SURFACE_COORDINATOR,
- mFeedSurfaceCreator.createFeedSurfaceCoordinator(
- mNightModeStateProvider.isInNightMode()));
- }
mTabModelSelector.addObserver(mTabModelSelectorObserver);
if (mFullScreenListener != null) {
@@ -536,14 +527,6 @@ class StartSurfaceMediator
private void setExploreSurfaceVisibility(boolean isVisible) {
if (isVisible == mPropertyModel.get(IS_EXPLORE_SURFACE_VISIBLE)) return;
- if (isVisible && mPropertyModel.get(IS_SHOWING_OVERVIEW)
- && mPropertyModel.get(FEED_SURFACE_COORDINATOR) == null
- && !mActivityStateChecker.isFinishingOrDestroyed()) {
- mPropertyModel.set(FEED_SURFACE_COORDINATOR,
- mFeedSurfaceCreator.createFeedSurfaceCoordinator(
- mNightModeStateProvider.isInNightMode()));
- }
-
mPropertyModel.set(IS_EXPLORE_SURFACE_VISIBLE, isVisible);
if (mOverviewModeState == OverviewModeState.SHOWN_TABSWITCHER_TWO_PANES) {
diff --git a/chrome/android/feed/feed_java_sources.gni b/chrome/android/feed/feed_java_sources.gni
--- a/chrome/android/feed/feed_java_sources.gni
+++ b/chrome/android/feed/feed_java_sources.gni
@@ -35,7 +35,6 @@ if (enable_feed_in_chrome) {
"//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedLifecycleBridge.java",
"//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedLoggingBridge.java",
"//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNetworkBridge.java",
- "//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java",
"//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedOfflineBridge.java",
"//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedOfflineIndicator.java",
"//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeFactory.java",
@@ -736,7 +735,6 @@ if (enable_feed_in_chrome) {
feed_deps = []
feed_java_sources = [
"//chrome/android/feed/dummy/java/src/org/chromium/chrome/browser/feed/FeedAppLifecycle.java",
- "//chrome/android/feed/dummy/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java",
"//chrome/android/feed/dummy/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeFactory.java",
"//chrome/android/feed/dummy/java/src/org/chromium/chrome/browser/feed/FeedRefreshTask.java",
"//chrome/android/feed/dummy/java/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinator.java",
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageFactory.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageFactory.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageFactory.java
@@ -17,7 +17,6 @@ import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.bookmarks.BookmarkPage;
import org.chromium.chrome.browser.download.DownloadPage;
import org.chromium.chrome.browser.explore_sites.ExploreSitesPage;
-import org.chromium.chrome.browser.feed.FeedNewTabPage;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
import org.chromium.chrome.browser.history.HistoryPage;
@@ -57,12 +56,6 @@ public class NativePageFactory {
activity, new TabShim(tab, activity.getFullscreenManager()));
}
- if (ChromeFeatureList.isEnabled(ChromeFeatureList.INTEREST_FEED_CONTENT_SUGGESTIONS)) {
- return new FeedNewTabPage(activity,
- new TabShim(tab, activity.getFullscreenManager()), tabModelSelector,
- activityTabProvider, activityLifecycleDispatcher, (TabImpl) tab);
- }
-
return new NewTabPage(activity, new TabShim(tab, activity.getFullscreenManager()),
tabModelSelector, activityTabProvider, activityLifecycleDispatcher,
(TabImpl) tab);
diff --git a/components/feed/feed_feature_list.cc b/components/feed/feed_feature_list.cc
--- a/components/feed/feed_feature_list.cc
+++ b/components/feed/feed_feature_list.cc
@@ -7,7 +7,7 @@
namespace feed {
const base::Feature kInterestFeedContentSuggestions{
- "InterestFeedContentSuggestions", base::FEATURE_ENABLED_BY_DEFAULT};
+ "InterestFeedContentSuggestions", base::FEATURE_DISABLED_BY_DEFAULT};
const base::FeatureParam<std::string> kDisableTriggerTypes{
&kInterestFeedContentSuggestions, "disable_trigger_types", ""};
--
2.17.1
@@ -1,247 +0,0 @@
From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Mon, 21 Feb 2022 01:24:11 +0100
Subject: Allow building without supervised users
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
chrome/android/BUILD.gn | 1 -
.../chrome/browser/feedback/ChromeFeedbackCollector.java | 1 -
chrome/browser/feedback/android/BUILD.gn | 2 --
chrome/browser/prefs/chrome_pref_service_factory.cc | 2 +-
chrome/browser/profiles/profile_attributes_entry.cc | 2 +-
chrome/browser/profiles/profile_impl.cc | 5 +----
chrome/browser/profiles/profile_manager.cc | 7 -------
.../supervised_user/supervised_user_browser_utils.cc | 1 +
chrome/browser/ui/webui/managed_ui_handler.cc | 4 ----
.../browser/ui/webui/management/management_ui_handler.cc | 4 ----
.../core/browser/supervised_user_pref_store.cc | 1 +
.../core/browser/supervised_user_preferences.cc | 6 +++++-
.../core/browser/supervised_user_service.cc | 1 +
components/supervised_user/core/common/features.cc | 2 +-
extensions/browser/api/management/management_api.cc | 1 +
15 files changed, 13 insertions(+), 27 deletions(-)
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -826,7 +826,6 @@ if (_is_default_toolchain) {
"//components/offline_pages/core:offline_page_model_enums_java",
"//components/sharing_message:sharing_dialog_type_generated_enum",
"//components/sharing_message:sharing_send_message_result_generated_enum",
- "//components/supervised_user/core/browser:supervised_user_utils_enum_javagen",
]
# From java_sources.gni.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollector.java b/chrome/android/java/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollector.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollector.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollector.java
@@ -95,7 +95,6 @@ public class ChromeFeedbackCollector extends FeedbackCollector<ChromeFeedbackCol
// FamilyInfoFeedbackSource relies on IdentityManager which is not available for the
// incognito profile.
if (!initParams.profile.isOffTheRecord()) {
- sources.add(new FamilyInfoFeedbackSource(initParams.profile));
}
return sources;
diff --git a/chrome/browser/feedback/android/BUILD.gn b/chrome/browser/feedback/android/BUILD.gn
--- a/chrome/browser/feedback/android/BUILD.gn
+++ b/chrome/browser/feedback/android/BUILD.gn
@@ -8,7 +8,6 @@ import("//third_party/jni_zero/jni_zero.gni")
generate_jni("jni_headers") {
sources = [
- "java/src/org/chromium/chrome/browser/feedback/FamilyInfoFeedbackSource.java",
"java/src/org/chromium/chrome/browser/feedback/ProcessIdFeedbackSource.java",
"java/src/org/chromium/chrome/browser/feedback/SystemInfoFeedbackSource.java",
]
@@ -56,7 +55,6 @@ android_library("java") {
"java/src/org/chromium/chrome/browser/feedback/AsyncFeedbackSourceAdapter.java",
"java/src/org/chromium/chrome/browser/feedback/DeviceInfoFeedbackSource.java",
"java/src/org/chromium/chrome/browser/feedback/FallbackHelpAndFeedbackLauncherDelegate.java",
- "java/src/org/chromium/chrome/browser/feedback/FamilyInfoFeedbackSource.java",
"java/src/org/chromium/chrome/browser/feedback/FeedbackContextFeedbackSource.java",
"java/src/org/chromium/chrome/browser/feedback/HelpAndFeedbackLauncher.java",
"java/src/org/chromium/chrome/browser/feedback/HelpAndFeedbackLauncherDelegate.java",
diff --git a/chrome/browser/prefs/chrome_pref_service_factory.cc b/chrome/browser/prefs/chrome_pref_service_factory.cc
--- a/chrome/browser/prefs/chrome_pref_service_factory.cc
+++ b/chrome/browser/prefs/chrome_pref_service_factory.cc
@@ -327,7 +327,7 @@ void PrepareFactory(
policy::BrowserPolicyConnector* policy_connector) {
factory->SetManagedPolicies(policy_service, policy_connector);
factory->SetRecommendedPolicies(policy_service, policy_connector);
- if (supervised_user_settings) {
+ if (((false)) && supervised_user_settings) {
// supervised_user_prefs handles the case when content_filters_service is
// nullptr. It's simply not subscribing to empty service's notifications.
scoped_refptr<PrefStore> supervised_user_prefs =
diff --git a/chrome/browser/profiles/profile_attributes_entry.cc b/chrome/browser/profiles/profile_attributes_entry.cc
--- a/chrome/browser/profiles/profile_attributes_entry.cc
+++ b/chrome/browser/profiles/profile_attributes_entry.cc
@@ -476,7 +476,7 @@ bool ProfileAttributesEntry::IsSigninRequired() const {
}
std::string ProfileAttributesEntry::GetSupervisedUserId() const {
- return GetString(kSupervisedUserId);
+ return "";
}
bool ProfileAttributesEntry::IsEphemeral() const {
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc
--- a/chrome/browser/profiles/profile_impl.cc
+++ b/chrome/browser/profiles/profile_impl.cc
@@ -683,10 +683,6 @@ void ProfileImpl::DoFinalInit(CreateMode create_mode) {
prefs->SetTime(prefs::kProfileCreationTime, path_creation_time_);
pref_change_registrar_.Init(prefs);
- pref_change_registrar_.Add(
- prefs::kSupervisedUserId,
- base::BindRepeating(&ProfileImpl::UpdateSupervisedUserIdInStorage,
- base::Unretained(this)));
// Changes in the profile avatar.
pref_change_registrar_.Add(
@@ -1632,6 +1628,7 @@ GURL ProfileImpl::GetHomePage() {
}
void ProfileImpl::UpdateSupervisedUserIdInStorage() {
+ if ((true)) return;
ProfileManager* profile_manager = g_browser_process->profile_manager();
ProfileAttributesEntry* entry = profile_manager->GetProfileAttributesStorage()
.GetProfileAttributesWithPath(GetPath());
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc
--- a/chrome/browser/profiles/profile_manager.cc
+++ b/chrome/browser/profiles/profile_manager.cc
@@ -1191,10 +1191,6 @@ void ProfileManager::InitProfileUserPrefs(Profile* profile) {
profile->GetPrefs()->SetString(prefs::kProfileName, profile_name);
}
- if (!profile->GetPrefs()->HasPrefPath(prefs::kSupervisedUserId)) {
- profile->GetPrefs()->SetString(prefs::kSupervisedUserId,
- supervised_user_id);
- }
}
void ProfileManager::RegisterTestingProfile(std::unique_ptr<Profile> profile,
@@ -1956,9 +1952,6 @@ void ProfileManager::AddProfileToStorage(Profile* profile) {
init_params.icon_index =
profile->GetPrefs()->GetInteger(prefs::kProfileAvatarIndex);
- init_params.supervised_user_id =
- profile->GetPrefs()->GetString(prefs::kSupervisedUserId);
-
#if BUILDFLAG(IS_CHROMEOS)
user_manager::User* user =
ash::ProfileHelper::Get()->GetUserByProfile(profile);
diff --git a/chrome/browser/supervised_user/supervised_user_browser_utils.cc b/chrome/browser/supervised_user/supervised_user_browser_utils.cc
--- a/chrome/browser/supervised_user/supervised_user_browser_utils.cc
+++ b/chrome/browser/supervised_user/supervised_user_browser_utils.cc
@@ -99,6 +99,7 @@ bool SupervisedUserCanSkipExtensionParentApprovals(const Profile* profile) {
}
bool AreExtensionsPermissionsEnabled(Profile* profile) {
+ if ((true)) return false;
#if BUILDFLAG(ENABLE_EXTENSIONS_CORE)
return profile->IsChild();
#else
diff --git a/chrome/browser/ui/webui/managed_ui_handler.cc b/chrome/browser/ui/webui/managed_ui_handler.cc
--- a/chrome/browser/ui/webui/managed_ui_handler.cc
+++ b/chrome/browser/ui/webui/managed_ui_handler.cc
@@ -89,10 +89,6 @@ void ManagedUIHandler::AddObservers() {
auto domain = static_cast<policy::PolicyDomain>(i);
policy_service->AddObserver(domain, this);
}
-
- pref_registrar_.Add(prefs::kSupervisedUserId,
- base::BindRepeating(&ManagedUIHandler::NotifyIfChanged,
- base::Unretained(this)));
}
void ManagedUIHandler::RemoveObservers() {
diff --git a/chrome/browser/ui/webui/management/management_ui_handler.cc b/chrome/browser/ui/webui/management/management_ui_handler.cc
--- a/chrome/browser/ui/webui/management/management_ui_handler.cc
+++ b/chrome/browser/ui/webui/management/management_ui_handler.cc
@@ -623,10 +623,6 @@ bool ManagementUIHandler::managed() const {
void ManagementUIHandler::RegisterPrefChange(
PrefChangeRegistrar& pref_registrar) {
- pref_registrar_.Add(
- prefs::kSupervisedUserId,
- base::BindRepeating(&ManagementUIHandler::UpdateManagedState,
- base::Unretained(this)));
}
void ManagementUIHandler::UpdateManagedState() {
diff --git a/components/supervised_user/core/browser/supervised_user_pref_store.cc b/components/supervised_user/core/browser/supervised_user_pref_store.cc
--- a/components/supervised_user/core/browser/supervised_user_pref_store.cc
+++ b/components/supervised_user/core/browser/supervised_user_pref_store.cc
@@ -172,6 +172,7 @@ void SupervisedUserPrefStore::OnNewContentFiltersStateAvailable(
void SupervisedUserPrefStore::OnNewSettingsAvailable(
const base::Value::Dict& settings) {
+ if ((true)) return;
std::unique_ptr<PrefValueMap> old_prefs = std::move(prefs_);
prefs_ = std::make_unique<PrefValueMap>();
if (!settings.empty()) {
diff --git a/components/supervised_user/core/browser/supervised_user_preferences.cc b/components/supervised_user/core/browser/supervised_user_preferences.cc
--- a/components/supervised_user/core/browser/supervised_user_preferences.cc
+++ b/components/supervised_user/core/browser/supervised_user_preferences.cc
@@ -160,6 +160,10 @@ void RegisterProfilePrefs(PrefRegistrySimple* registry) {
}
void EnableParentalControls(PrefService& pref_service) {
+ if ((true)) {
+ DisableParentalControls(pref_service);
+ return;
+ }
pref_service.SetString(prefs::kSupervisedUserId,
supervised_user::kChildAccountSUID);
#if BUILDFLAG(IS_CHROMEOS)
@@ -187,7 +191,7 @@ bool IsSafeSitesEnabled(const PrefService& pref_service) {
}
bool IsSubjectToParentalControls(const PrefService& pref_service) {
- return pref_service.GetString(prefs::kSupervisedUserId) == kChildAccountSUID;
+ return false;
}
bool IsGoogleSafeSearchEnforced(const PrefService& pref_service) {
diff --git a/components/supervised_user/core/browser/supervised_user_service.cc b/components/supervised_user/core/browser/supervised_user_service.cc
--- a/components/supervised_user/core/browser/supervised_user_service.cc
+++ b/components/supervised_user/core/browser/supervised_user_service.cc
@@ -248,6 +248,7 @@ SupervisedUserService::SupervisedUserService(
}
void SupervisedUserService::SetSettingsServiceActive(bool active) {
+ active = false;
settings_service_->SetActive(active);
// Trigger a sync reconfig to enable/disable the right SU data types.
diff --git a/components/supervised_user/core/common/features.cc b/components/supervised_user/core/common/features.cc
--- a/components/supervised_user/core/common/features.cc
+++ b/components/supervised_user/core/common/features.cc
@@ -30,7 +30,6 @@ BASE_FEATURE(kAllowSubframeLocalWebApprovals,
#else
base::FEATURE_DISABLED_BY_DEFAULT);
#endif
-
#if BUILDFLAG(IS_IOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
BUILDFLAG(IS_WIN)
const int kLocalWebApprovalBottomSheetLoadTimeoutDefaultValueMs = 5000;
@@ -151,4 +150,5 @@ bool ClassifyUrlWithoutCredentialsForLocalSupervision() {
#endif
+SET_CROMITE_FEATURE_DISABLED(kLocalWebApprovals);
} // namespace supervised_user
diff --git a/extensions/browser/api/management/management_api.cc b/extensions/browser/api/management/management_api.cc
--- a/extensions/browser/api/management/management_api.cc
+++ b/extensions/browser/api/management/management_api.cc
@@ -324,6 +324,7 @@ void AddExtensionInfo(const Extension* source_extension,
}
bool PlatformSupportsApprovalFlowForExtensions() {
+ if ((true)) return false;
#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
BUILDFLAG(IS_WIN)
return true;
--
@@ -2,16 +2,15 @@ From: AlexeyBarabash <alexey@brave.com>
Date: Thu, 2 Nov 2017 18:21:16 +0200
Subject: Allow playing audio in background
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
.../renderer/platform/media/web_media_player_impl.cc | 11 ++++++++++-
.../renderer/platform/media/web_media_player_impl.h | 3 +++
media/blink/webmediaplayer_impl.cc | 12 +++++++++++-
media/blink/webmediaplayer_impl.h | 2 ++
2 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/third_party/blink/renderer/platform/media/web_media_player_impl.cc b/third_party/blink/renderer/platform/media/web_media_player_impl.cc
--- a/third_party/blink/renderer/platform/media/web_media_player_impl.cc
+++ b/third_party/blink/renderer/platform/media/web_media_player_impl.cc
@@ -1309,6 +1309,12 @@ bool WebMediaPlayerImpl::HasAudio() const {
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc
--- a/media/blink/webmediaplayer_impl.cc
+++ b/media/blink/webmediaplayer_impl.cc
@@ -977,6 +977,12 @@ bool WebMediaPlayerImpl::HasAudio() const {
return pipeline_metadata_.has_audio;
}
@@ -22,31 +21,33 @@ diff --git a/third_party/blink/renderer/platform/media/web_media_player_impl.cc
+}
+
void WebMediaPlayerImpl::EnabledAudioTracksChanged(
std::optional<WebMediaPlayer::TrackId> enabled_track_id) {
const blink::WebVector<blink::WebMediaPlayer::TrackId>& enabledTrackIds) {
DCHECK(main_task_runner_->BelongsToCurrentThread());
@@ -3645,7 +3651,10 @@ bool WebMediaPlayerImpl::ShouldPausePlaybackWhenHidden() const {
const bool preserve_audio = HasUnmutedAudio() || audio_source_provider_->IsAudioBeingCaptured();
@@ -3351,7 +3357,11 @@ bool WebMediaPlayerImpl::ShouldPausePlaybackWhenHidden() const {
// Audio only stream is allowed to play when in background.
- if (!HasVideo() && preserve_audio)
// TODO: We should check IsBackgroundOptimizationCandidate here. But we need
// to move the logic of checking video frames out of that function.
- if (!HasVideo())
+
+ //pipeline_metadata_.has_video is true for MediaPlayerRenderer,
+ //see media/base/pipeline_metadata.h. This is a workaround to allow audio
+ //streams be played in background.
+ if (!HasVideoNonEmptySize() && preserve_audio)
+ if (!HasVideoNonEmptySize())
return false;
// Video PiP is the only exception when background video playback is disabled.
diff --git a/third_party/blink/renderer/platform/media/web_media_player_impl.h b/third_party/blink/renderer/platform/media/web_media_player_impl.h
--- a/third_party/blink/renderer/platform/media/web_media_player_impl.h
+++ b/third_party/blink/renderer/platform/media/web_media_player_impl.h
@@ -212,6 +212,9 @@ class PLATFORM_EXPORT WebMediaPlayerImpl
if (!is_background_video_playback_enabled_)
diff --git a/media/blink/webmediaplayer_impl.h b/media/blink/webmediaplayer_impl.h
--- a/media/blink/webmediaplayer_impl.h
+++ b/media/blink/webmediaplayer_impl.h
@@ -149,6 +149,8 @@ class MEDIA_BLINK_EXPORT WebMediaPlayerImpl
// True if the loaded media has a playable video/audio track.
bool HasVideo() const override;
bool HasAudio() const override;
+ // True is has video and it's frame size is not zero
+ bool HasVideoNonEmptySize() const;
+
void EnabledAudioTracksChanged(
std::optional<WebMediaPlayer::TrackId> enabled_track_id) override;
void SelectedVideoTrackChanged(
--
const blink::WebVector<blink::WebMediaPlayer::TrackId>& enabledTrackIds)
--
2.17.1
@@ -0,0 +1,24 @@
From: xsmile <xsmile@users.noreply.github.com>
Date: Thu, 11 Oct 2018 21:29:35 +0200
Subject: Allow website sign-in without account sign-in
Disable prefs::kSigninAllowedOnNextStartup by default. The setting can be found in chrome://settings
---
chrome/browser/signin/account_consistency_mode_manager.cc | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/chrome/browser/signin/account_consistency_mode_manager.cc b/chrome/browser/signin/account_consistency_mode_manager.cc
--- a/chrome/browser/signin/account_consistency_mode_manager.cc
+++ b/chrome/browser/signin/account_consistency_mode_manager.cc
@@ -134,7 +134,7 @@ void AccountConsistencyModeManager::RegisterProfilePrefs(
registry->RegisterBooleanPref(prefs::kAccountConsistencyMirrorRequired,
false);
#endif
- registry->RegisterBooleanPref(prefs::kSigninAllowedOnNextStartup, true);
+ registry->RegisterBooleanPref(prefs::kSigninAllowedOnNextStartup, false);
}
// static
--
2.17.1
@@ -1,32 +0,0 @@
From: uazo <uazo@users.noreply.github.com>
Date: Mon, 13 Nov 2023 14:26:00 +0000
Subject: Always allow inspect fallback
Always enable 'inspect fallback' in 'chrome://inspect/#devices'
License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
---
chrome/browser/resources/inspect/inspect.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/chrome/browser/resources/inspect/inspect.js b/chrome/browser/resources/inspect/inspect.js
--- a/chrome/browser/resources/inspect/inspect.js
+++ b/chrome/browser/resources/inspect/inspect.js
@@ -45,6 +45,7 @@ if ('browser-inspector' in queryParamsObject) {
})();
function isVersionNewerThanHost(version) {
+ if ((true)) return true;
if (!HOST_CHROME_VERSION) {
return false;
}
@@ -590,7 +591,7 @@ function formatValue(data, property) {
function addFavicon(row, data) {
const favicon = document.createElement('img');
if (data['faviconUrl']) {
- favicon.src = data['faviconUrl'];
+ //favicon.src = data['faviconUrl'];
}
const propertiesBox = row.querySelector('.properties-box');
propertiesBox.insertBefore(favicon, propertiesBox.firstChild);
--
@@ -0,0 +1,37 @@
From: samartnik <artem@brave.com>
Date: Thu, 14 Dec 2017 16:19:50 +0200
Subject: Always allow partner customisation
---
.../PartnerBrowserCustomizations.java | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations.java b/chrome/android/java/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations.java
@@ -244,14 +244,14 @@ public class PartnerBrowserCustomizations {
@Override
protected Void doInBackground() {
try {
- boolean systemOrPreStable =
- (context.getApplicationInfo().flags & ApplicationInfo.FLAG_SYSTEM) == 1
- || !ChromeVersionInfo.isStableBuild();
- if (!systemOrPreStable) {
- // Only allow partner customization if this browser is a system package, or
- // is in pre-stable channels.
- return null;
- }
+ //boolean systemOrPreStable =
+ // (context.getApplicationInfo().flags & ApplicationInfo.FLAG_SYSTEM) == 1
+ // || !ChromeVersionInfo.isStableBuild();
+ //if (!systemOrPreStable) {
+ // // Only allow partner customization if this browser is a system package, or
+ // // is in pre-stable channels.
+ // return null;
+ //}
if (isCancelled()) return null;
refreshIncognitoModeDisabled();
--
2.17.1
@@ -1,45 +0,0 @@
From: uazo <uazo@users.noreply.github.com>
Date: Wed, 28 Dec 2022 07:19:58 +0000
Subject: Always open browser controls in new tab
License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
---
.../chrome/browser/tab/TabContextMenuItemDelegate.java | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java
@@ -23,6 +23,7 @@ import org.chromium.base.PackageManagerUtils;
import org.chromium.base.metrics.RecordUserAction;
import org.chromium.build.annotations.NullMarked;
import org.chromium.build.annotations.Nullable;
+import org.chromium.cc.input.BrowserControlsState;
import org.chromium.chrome.browser.DefaultBrowserInfo;
import org.chromium.chrome.browser.IntentHandler;
import org.chromium.chrome.browser.bookmarks.BookmarkManagerOpenerImpl;
@@ -42,6 +43,7 @@ import org.chromium.chrome.browser.preferences.Pref;
import org.chromium.chrome.browser.price_tracking.PriceDropNotificationManagerFactory;
import org.chromium.chrome.browser.printing.TabPrinter;
import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.tab.TabBrowserControlsConstraintsHelper;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.document.ChromeAsyncTabLauncher;
import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
@@ -308,6 +310,7 @@ public class TabContextMenuItemDelegate implements ContextMenuItemDelegate {
@Nullable Referrer referrer,
boolean navigateToTab,
@Nullable AdditionalNavigationParams additionalNavigationParams) {
+ TabBrowserControlsConstraintsHelper.get(mTab).update(BrowserControlsState.SHOWN, true);
RecordUserAction.record("MobileNewTabOpened");
RecordUserAction.record("LinkOpenedInNewTab");
LoadUrlParams loadUrlParams = new LoadUrlParams(url.getSpec());
@@ -328,6 +331,7 @@ public class TabContextMenuItemDelegate implements ContextMenuItemDelegate {
* @param url The URL to open.
*/
public void onOpenInNewTabInGroup(GURL url, @Nullable Referrer referrer) {
+ TabBrowserControlsConstraintsHelper.get(mTab).update(BrowserControlsState.SHOWN, true);
RecordUserAction.record("MobileNewTabOpened");
RecordUserAction.record("LinkOpenedInNewTab");
LoadUrlParams loadUrlParams = new LoadUrlParams(url.getSpec());
--
@@ -0,0 +1,38 @@
From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Tue, 5 Jun 2018 13:46:40 +0200
Subject: Always respect async dns flag (regardless of SDK version)
Do not read experiment value for cronet async DNS configuration
---
chrome/browser/net/system_network_context_manager.cc | 2 +-
components/cronet/url_request_context_config.cc | 3 ++-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/chrome/browser/net/system_network_context_manager.cc b/chrome/browser/net/system_network_context_manager.cc
--- a/chrome/browser/net/system_network_context_manager.cc
+++ b/chrome/browser/net/system_network_context_manager.cc
@@ -196,7 +196,7 @@ void OnAuthPrefsChanged(PrefService* local_state,
// Android this includes checking the Android version in the field trial.
bool ShouldEnableAsyncDns() {
bool feature_can_be_enabled = true;
-#if defined(OS_ANDROID)
+#if 0
int min_sdk =
base::GetFieldTrialParamByFeatureAsInt(features::kAsyncDns, "min_sdk", 0);
if (base::android::BuildInfo::GetInstance()->sdk_int() < min_sdk)
diff --git a/components/cronet/url_request_context_config.cc b/components/cronet/url_request_context_config.cc
--- a/components/cronet/url_request_context_config.cc
+++ b/components/cronet/url_request_context_config.cc
@@ -540,7 +540,8 @@ void URLRequestContextConfig::ParseAndSetExperimentalOptions(
effective_experimental_options->Remove(it.key(), nullptr);
continue;
}
- async_dns_args->GetBoolean(kAsyncDnsEnable, &async_dns_enable);
+ bool ignored;
+ async_dns_args->GetBoolean(kAsyncDnsEnable, &ignored);
} else if (it.key() == kStaleDnsFieldTrialName) {
const base::DictionaryValue* stale_dns_args = nullptr;
if (!it.value().GetAsDictionary(&stale_dns_args)) {
--
2.17.1
@@ -0,0 +1,131 @@
From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Sat, 28 Dec 2019 10:23:04 +0100
Subject: Always show site settings for cookies, javascript and ads
Avoid displaying info about intrusive ads
---
.../website/SingleWebsiteSettings.java | 46 +++++++++----------
.../browser/settings/website/Website.java | 20 ++++++++
2 files changed, 42 insertions(+), 24 deletions(-)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleWebsiteSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleWebsiteSettings.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleWebsiteSettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleWebsiteSettings.java
@@ -72,6 +72,7 @@ public class SingleWebsiteSettings extends PreferenceFragmentCompat
// Buttons:
public static final String PREF_RESET_SITE = "reset_site_button";
+ public static final String TAG = "SingleWebsitePreferences";
// Website permissions (if adding new, see hasPermissionsPreferences and resetSite below)
// All permissions from the permissions preference category must be listed here.
private static final String[] PERMISSION_PREFERENCE_KEYS = {
@@ -349,7 +350,24 @@ public class SingleWebsiteSettings extends PreferenceFragmentCompat
} else if (i == ContentSettingException.Type.SOUND) {
setUpSoundPreference(preference);
} else {
- setUpListPreference(preference, mSite.getContentSettingPermission(i));
+ // some Bromite-specific overrides for the defaults
+ @ContentSettingValues
+ @Nullable
+ Integer permission = mSite.getContentSettingPermission(i);
+ // initialize cookie and javascript with the category global defaults
+ if (permission == null) {
+ if (i == ContentSettingException.Type.COOKIE)
+ permission = WebsitePreferenceBridge.isCategoryEnabled(
+ ContentSettingsType.COOKIES)
+ ? ContentSettingValues.ALLOW
+ : ContentSettingValues.BLOCK;
+ else if (i == ContentSettingException.Type.JAVASCRIPT)
+ permission = WebsitePreferenceBridge.isCategoryEnabled(
+ ContentSettingsType.JAVASCRIPT)
+ ? ContentSettingValues.ALLOW
+ : ContentSettingValues.BLOCK;
+ }
+ setUpListPreference(preference, permission);
}
return;
}
@@ -646,17 +664,8 @@ public class SingleWebsiteSettings extends PreferenceFragmentCompat
}
private void setUpAdsInformationalBanner() {
- // Add the informational banner which shows at the top of the UI if ad blocking is
- // activated on this site.
- boolean adBlockingActivated = SiteSettingsCategory.adsCategoryEnabled()
- && WebsitePreferenceBridge.getAdBlockingActivated(mSite.getAddress().getOrigin())
- && findPreference(PERMISSION_PREFERENCE_KEYS[ContentSettingException.Type.ADS])
- != null;
-
- if (!adBlockingActivated) {
- removePreferenceSafely(PREF_INTRUSIVE_ADS_INFO);
- removePreferenceSafely(PREF_INTRUSIVE_ADS_INFO_DIVIDER);
- }
+ removePreferenceSafely(PREF_INTRUSIVE_ADS_INFO);
+ removePreferenceSafely(PREF_INTRUSIVE_ADS_INFO_DIVIDER);
}
private SiteSettingsCategory getWarningCategory() {
@@ -733,6 +742,7 @@ public class SingleWebsiteSettings extends PreferenceFragmentCompat
// TODO(crbug.com/735110): Figure out if this is the correct thing to do - here we are
// effectively treating non-ALLOW values as BLOCK.
int index = (value == ContentSettingValues.ALLOW ? 0 : 1);
+
listPreference.setValueIndex(index);
listPreference.setOnPreferenceChangeListener(this);
listPreference.setSummary("%s");
@@ -802,22 +812,10 @@ public class SingleWebsiteSettings extends PreferenceFragmentCompat
setUpListPreference(preference, null);
return;
}
- // If the ad blocker is activated, then this site will have ads blocked unless there is an
- // explicit permission disallowing the blocking.
- boolean activated =
- WebsitePreferenceBridge.getAdBlockingActivated(mSite.getAddress().getOrigin());
@ContentSettingValues
@Nullable
Integer permission = mSite.getContentSettingPermission(ContentSettingException.Type.ADS);
- // If |permission| is null, there is no explicit (non-default) permission set for this site.
- // If the site is not considered a candidate for blocking, do the standard thing and remove
- // the preference.
- if (permission == null && !activated) {
- setUpListPreference(preference, null);
- return;
- }
-
// However, if the blocking is activated, we still want to show the permission, even if it
// is in the default state.
if (permission == null) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/Website.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/Website.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/Website.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/Website.java
@@ -197,6 +197,26 @@ public class Website implements Serializable {
new ContentSettingException(ContentSettingsType.ADS,
getAddress().getOrigin(), ContentSettingValues.BLOCK, "");
}
+ } else if (type == ContentSettingException.Type.COOKIE) {
+ // It is possible to set the permission without having an existing exception,
+ // because we can show the ALLOW state even when this permission is set to the
+ // default. In that case, just set an exception now to ALLOW to enable changing the
+ // permission.
+ if (mContentSettingException[type] == null) {
+ mContentSettingException[type] =
+ new ContentSettingException(ContentSettingsType.COOKIES,
+ getAddress().getOrigin(), ContentSettingValues.ALLOW, "");
+ }
+ } else if (type == ContentSettingException.Type.JAVASCRIPT) {
+ // It is possible to set the permission without having an existing exception,
+ // because we can show the ALLOW state even when this permission is set to the
+ // default. In that case, just set an exception now to ALLOW to enable changing the
+ // permission.
+ if (mContentSettingException[type] == null) {
+ mContentSettingException[type] =
+ new ContentSettingException(ContentSettingsType.JAVASCRIPT,
+ getAddress().getOrigin(), ContentSettingValues.ALLOW, "");
+ }
} else if (type == ContentSettingException.Type.SOUND) {
// It is possible to set the permission without having an existing exception,
// because we always show the sound permission in Site Settings.
--
2.17.1
@@ -3,94 +3,23 @@ Date: Wed, 27 Jun 2018 11:02:38 +0200
Subject: Always use new tab page for default home page
Ignore any partner-provided home page.
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
---
.../org/chromium/chrome/browser/homepage/HomepageManager.java | 4 ----
.../chrome/browser/new_tab_url/DseNewTabUrlManager.java | 2 +-
.../partnerbookmarks/PartnerBookmarksProviderIterator.java | 1 +
.../partnercustomizations/PartnerBrowserCustomizations.java | 2 +-
.../org/chromium/components/search_engines/TemplateUrl.java | 1 +
.../search_engines/android/template_url_service_android.cc | 1 +
.../always-use-new-tab-page-for-default-home-page.inc | 1 +
7 files changed, 6 insertions(+), 6 deletions(-)
create mode 100755 cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/always-use-new-tab-page-for-default-home-page.inc
.../chrome/browser/partnercustomizations/HomepageManager.java | 3 ---
1 file changed, 3 deletions(-)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/homepage/HomepageManager.java b/chrome/android/java/src/org/chromium/chrome/browser/homepage/HomepageManager.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/homepage/HomepageManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/homepage/HomepageManager.java
@@ -159,10 +159,6 @@ public class HomepageManager
* tab page if the homepage button is force enabled via flag.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/partnercustomizations/HomepageManager.java b/chrome/android/java/src/org/chromium/chrome/browser/partnercustomizations/HomepageManager.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/partnercustomizations/HomepageManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/partnercustomizations/HomepageManager.java
@@ -141,9 +141,6 @@ public class HomepageManager implements HomepagePolicyManager.HomepagePolicyStat
* if the homepage button is force enabled via flag.
*/
public GURL getDefaultHomepageGurl() {
- if (PartnerBrowserCustomizations.getInstance().isHomepageProviderAvailableAndEnabled()) {
- return assumeNonNull(PartnerBrowserCustomizations.getInstance().getHomePageUrl());
private static String getDefaultHomepageUri() {
- if (PartnerBrowserCustomizations.isHomepageProviderAvailableAndEnabled()) {
- return PartnerBrowserCustomizations.getHomePageUrl();
- }
-
String homepagePartnerDefaultGurlSerialized =
ChromeSharedPreferences.getInstance()
.readString(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/new_tab_url/DseNewTabUrlManager.java b/chrome/android/java/src/org/chromium/chrome/browser/new_tab_url/DseNewTabUrlManager.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/new_tab_url/DseNewTabUrlManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/new_tab_url/DseNewTabUrlManager.java
@@ -59,7 +59,7 @@ public class DseNewTabUrlManager {
/** Returns whether the feature NewTabSearchEngineUrlAndroid is enabled. */
public static boolean isNewTabSearchEngineUrlAndroidEnabled() {
- return true;
+ return false;
return UrlConstants.NTP_NON_NATIVE_URL;
}
/**
diff --git a/chrome/browser/partnerbookmarks/android/java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksProviderIterator.java b/chrome/browser/partnerbookmarks/android/java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksProviderIterator.java
--- a/chrome/browser/partnerbookmarks/android/java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksProviderIterator.java
+++ b/chrome/browser/partnerbookmarks/android/java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksProviderIterator.java
@@ -70,6 +70,7 @@ public class PartnerBookmarksProviderIterator implements PartnerBookmark.Bookmar
new AsyncTask<@Nullable Cursor>() {
@Override
protected @Nullable Cursor doInBackground() {
+ if ((true)) return null;
try {
return ContextUtils.getApplicationContext()
.getContentResolver()
diff --git a/chrome/browser/partnercustomizations/java/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations.java b/chrome/browser/partnercustomizations/java/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations.java
--- a/chrome/browser/partnercustomizations/java/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations.java
+++ b/chrome/browser/partnercustomizations/java/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations.java
@@ -213,7 +213,7 @@ public class PartnerBrowserCustomizations {
& ApplicationInfo.FLAG_SYSTEM)
== 1
|| !VersionInfo.isStableBuild();
- if (!systemOrPreStable) {
+ if ((true)) {
// Only allow partner customization if this browser is a system
// package, or is in pre-stable channels.
return null;
diff --git a/components/search_engines/android/java/src/org/chromium/components/search_engines/TemplateUrl.java b/components/search_engines/android/java/src/org/chromium/components/search_engines/TemplateUrl.java
--- a/components/search_engines/android/java/src/org/chromium/components/search_engines/TemplateUrl.java
+++ b/components/search_engines/android/java/src/org/chromium/components/search_engines/TemplateUrl.java
@@ -88,6 +88,7 @@ public class TemplateUrl {
* prepopulated_engines.json.
*/
public String getNewTabURL() {
+ if ((true)) return null;
return TemplateUrlJni.get().getNewTabURL(mTemplateUrlPtr);
}
diff --git a/components/search_engines/android/template_url_service_android.cc b/components/search_engines/android/template_url_service_android.cc
--- a/components/search_engines/android/template_url_service_android.cc
+++ b/components/search_engines/android/template_url_service_android.cc
@@ -400,6 +400,7 @@ jboolean TemplateUrlServiceAndroid::SetPlayAPISearchEngine(
jimage_translate_source_language_param_key,
const base::android::JavaParamRef<jstring>&
jimage_translate_target_language_param_key) {
+ if ((true)) return false;
// The function is scheduled to run only when the service is loaded, see
// `TemplateUrlService#runWhenLoaded()`.
CHECK(template_url_service_->loaded());
diff --git a/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/always-use-new-tab-page-for-default-home-page.inc b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/always-use-new-tab-page-for-default-home-page.inc
new file mode 100755
--- /dev/null
+++ b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/always-use-new-tab-page-for-default-home-page.inc
@@ -0,0 +1 @@
+SET_CROMITE_FEATURE_DISABLED(kPartnerCustomizationsUma);
--
--
2.17.1

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