Compare commits
42
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
97ffe2b779 | ||
|
|
a38b47280d | ||
|
|
e0e30eda51 | ||
|
|
b78a5bdafe | ||
|
|
9484a27256 | ||
|
|
9011196bae | ||
|
|
7204ed9bf7 | ||
|
|
9c7592a4a6 | ||
|
|
601be8fbb3 | ||
|
|
6f2d3fc50e | ||
|
|
d2324589c3 | ||
|
|
afd28067c1 | ||
|
|
a47f939a7d | ||
|
|
339a4b70c0 | ||
|
|
af541a77c3 | ||
|
|
e1dcf7a478 | ||
|
|
062e6a0d27 | ||
|
|
172d3b361e | ||
|
|
029c891e1b | ||
|
|
f19eedc9e4 | ||
|
|
0c31cd222c | ||
|
|
585bb059a9 | ||
|
|
527fe50f9f | ||
|
|
19d55cbafe | ||
|
|
20e1016fdd | ||
|
|
b34aa8105c | ||
|
|
5551c6070c | ||
|
|
d9b7ffa145 | ||
|
|
285944dcab | ||
|
|
9113b2fca2 | ||
|
|
fa891eeb82 | ||
|
|
d757d6c066 | ||
|
|
784770e386 | ||
|
|
e0550c0591 | ||
|
|
93cd060c77 | ||
|
|
6b2d290129 | ||
|
|
4dc6db7bcf | ||
|
|
a5f6339d5e | ||
|
|
8b1f11683f | ||
|
|
fff5958814 | ||
|
|
1899895fae | ||
|
|
2d1539e968 |
@@ -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 -}}
|
||||
@@ -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
|
||||
@@ -1,5 +0,0 @@
|
||||
[*.{yaml,sh,gn_args}]
|
||||
tab_width = 2
|
||||
indent_size = 2
|
||||
end_of_line = crlf
|
||||
indent_style = space
|
||||
@@ -1,2 +0,0 @@
|
||||
*.zip binary
|
||||
*.pdf binary
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -1,154 +1,141 @@
|
||||
name: Check git apply
|
||||
permissions:
|
||||
#permissions:
|
||||
# actions: none
|
||||
# checks: none
|
||||
# contents: write
|
||||
# contents: none
|
||||
# deployments: none
|
||||
# issues: none
|
||||
# packages: none
|
||||
pull-requests: write
|
||||
# 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'
|
||||
description: 'uazo/bromite TAG or COMMIT'
|
||||
required: true
|
||||
default: ''
|
||||
|
||||
env:
|
||||
RTAG: ${{ github.event.inputs.rtag }}
|
||||
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
|
||||
|
||||
|
||||
git clone https://github.com/uazo/bromite-buildtools
|
||||
|
||||
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{})
|
||||
BRANCH=$(curl https://github.com/uazo/bromite/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{})
|
||||
BRANCH=$(curl https://github.com/uazo/bromite/branch_commits/$RTAG a | ./pup -p li.branch:first-child a text{})
|
||||
fi
|
||||
if [ -z "${BRANCH}" ]; then
|
||||
echo "Can not recover the base commit"
|
||||
echo "Impossible to recover the base commit"
|
||||
exit 1
|
||||
fi
|
||||
echo "BRANCH=$BRANCH" >> $GITHUB_ENV
|
||||
|
||||
- name: Checkout 'uazo/cromite' ${{ env.BRANCH }}
|
||||
- name: Checkout 'uazo/bromite' ${{ env.BRANCH }}
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: 'uazo/cromite'
|
||||
repository: 'uazo/bromite'
|
||||
ref: ${{ github.event.inputs.rtag }}
|
||||
path: 'cromite'
|
||||
path: 'bromite'
|
||||
fetch-depth: 1
|
||||
|
||||
- name: Check chromium version
|
||||
run: |
|
||||
export HOME=$GITHUB_WORKSPACE
|
||||
VERSION=$(cat ~/cromite/build/RELEASE)
|
||||
VERSION=$(cat bromite/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
|
||||
./bin/SuperPatchUtils bromite $RTAG 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
|
||||
cd ../..
|
||||
|
||||
- name: Apply patches ${{ github.event.inputs.rtag }}
|
||||
run: |
|
||||
export HOME=$GITHUB_WORKSPACE
|
||||
export HOME=$(pwd)
|
||||
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
|
||||
|
||||
bash ~/bromite-buildtools/apply-all-patch.sh || exit 1
|
||||
|
||||
rm -rf ~/bromite/build/patches-new/
|
||||
rm ~/bromite/build/bromite_patches_list_new.txt
|
||||
|
||||
- name: Export patches
|
||||
run: |
|
||||
export HOME=$GITHUB_WORKSPACE
|
||||
cd ~/chromium/src
|
||||
|
||||
bash ~/cromite/tools/export-all-patch.sh
|
||||
|
||||
cd ~/cromite
|
||||
export HOME=$(pwd)
|
||||
|
||||
cd ~/chromium/src
|
||||
bash ~/bromite-buildtools/export-all-patch.sh
|
||||
|
||||
cd ~/bromite
|
||||
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
|
||||
cd bromite
|
||||
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
|
||||
uses: peter-evans/create-pull-request@dcd5fd746d53dd8de555c0f10bca6c35628be47a #v3.12.0
|
||||
if: env.CHANGES == '1'
|
||||
with:
|
||||
token: ${{ secrets.CROMITE_PULLS }}
|
||||
path: cromite
|
||||
path: bromite
|
||||
base: ${{ env.BRANCH }}
|
||||
#push-to-fork: uazo/cromite
|
||||
#push-to-fork: uazo/bromite
|
||||
add-paths: |
|
||||
build/patches/*.patch
|
||||
commit-message: '[AUTO] Patches auto-rebase'
|
||||
title: '[AUTO] Patches auto-rebase for ${{ env.BRANCH }} branch'
|
||||
commit-message: 'AUTOMATED - git apply results'
|
||||
title: Git apply result for ${{ env.BRANCH }} branch
|
||||
body: ${{ env.MESSAGE }}
|
||||
delete-branch: true
|
||||
branch-suffix: short-commit-hash
|
||||
|
||||
@@ -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
|
||||
@@ -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/
|
||||
|
||||
@@ -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::"
|
||||
@@ -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."
|
||||
@@ -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
|
||||
@@ -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
|
||||
+2
-1
@@ -2,5 +2,6 @@
|
||||
# This .gitignore file was automatically created by Microsoft(R) Visual Studio.
|
||||
################################################################################
|
||||
|
||||
*.sqlite
|
||||
/.vs/ProjectSettings.json
|
||||
/.vs
|
||||
/temp
|
||||
|
||||
@@ -1,674 +0,0 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
||||
@@ -1,202 +0,0 @@
|
||||
<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>
|
||||
|
||||
[](https://github.com/uazo/cromite/actions/workflows/build_cromite.yaml)
|
||||
|
||||
# Cromite (a Bromite fork) - Take back your browser
|
||||
|
||||
<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>
|
||||
|
||||
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.
|
||||
|
||||
Cromite is available for Android arm64-v8a, arm32-v7a and x86_64, Android 10 and above, Windows and Linux 64bit.
|
||||
|
||||
# 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
|
||||
|
||||
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.
|
||||
|
||||
# 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)
|
||||
|
||||
# Releases
|
||||
|
||||
All built versions are available as [releases](https://github.com/uazo/cromite/releases).
|
||||
|
||||
Cromite is currently built for ARM, ARM64, Android x86, Windows x64 and Linux.
|
||||
|
||||
The following files will be present for each release:
|
||||
|
||||
#### 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)
|
||||
|
||||
#### 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`
|
||||
|
||||
```
|
||||
[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
|
||||
```
|
||||
|
||||
### 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:
|
||||
```
|
||||
abi <abi/4.0>,
|
||||
include <tunables/global>
|
||||
|
||||
profile cromite /home/user/cromite/chrome-lin/chrome flags=(unconfined) {
|
||||
userns,
|
||||
|
||||
include if exists <local/chrome>
|
||||
}
|
||||
```
|
||||
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.
|
||||
|
||||
# Contributing
|
||||
|
||||
Please submit issues following the issue template; beware that GitHub does not display the templates from mobile.
|
||||
|
||||
Patches are welcome and accepted if they match the project goals.
|
||||
|
||||
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.
|
||||
|
||||
For any usage or development discussion please use GitHub Discussions: https://github.com/uazo/cromite/discussions
|
||||
|
||||
# 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
|
||||
|
||||
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
|
||||
|
||||
# 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.
|
||||
@@ -1 +0,0 @@
|
||||
142.0.7444.60
|
||||
@@ -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
|
||||
Binary file not shown.
Binary file not shown.
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -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" }
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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 +0,0 @@
|
||||
zz-patch-list.txt
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
--
|
||||
@@ -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
|
||||
--
|
||||
@@ -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);
|
||||
--
|
||||
@@ -1,438 +0,0 @@
|
||||
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
|
||||
|
||||
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
|
||||
+ 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"
|
||||
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 {
|
||||
*/
|
||||
public static boolean isCustomTabIntent(Intent intent) {
|
||||
if (intent == null) return 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 (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));
|
||||
}
|
||||
|
||||
+ 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);
|
||||
+ } 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();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -436,6 +477,16 @@ public class PrivacySettings extends ChromeBaseSettingsFragment
|
||||
UserPrefs.get(getProfile()).getBoolean(Pref.CAN_MAKE_PAYMENT_ENABLED));
|
||||
}
|
||||
|
||||
+ allowCustomTabIntentsPref =
|
||||
+ (ChromeSwitchPreference) 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);
|
||||
|
||||
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
|
||||
--
|
||||
@@ -1,121 +0,0 @@
|
||||
From: Serg <serg.zhukovsky@gmail.com>
|
||||
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(+)
|
||||
|
||||
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" />
|
||||
|
||||
<!-- 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");
|
||||
+ } 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())
|
||||
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;
|
||||
|
||||
/**
|
||||
* 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)));
|
||||
}
|
||||
|
||||
private Runnable buildUpdateStateChangedObserver() {
|
||||
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
|
||||
</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>
|
||||
--
|
||||
@@ -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);
|
||||
--
|
||||
@@ -1,126 +0,0 @@
|
||||
From: csagan5 <32685696+csagan5@users.noreply.github.com>
|
||||
Date: Sun, 8 Jul 2018 22:42:04 +0200
|
||||
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
|
||||
---
|
||||
.../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
|
||||
|
||||
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
|
||||
@@ -8,4 +8,7 @@
|
||||
|
||||
namespace features {
|
||||
|
||||
+const char kMaxConnectionsPerHostChoiceDefault[] = "6",
|
||||
+ kMaxConnectionsPerHostChoice15[] = "15";
|
||||
+
|
||||
} // namespace features
|
||||
diff --git a/components/network_session_configurator/common/network_features.h b/components/network_session_configurator/common/network_features.h
|
||||
--- a/components/network_session_configurator/common/network_features.h
|
||||
+++ b/components/network_session_configurator/common/network_features.h
|
||||
@@ -10,6 +10,10 @@
|
||||
|
||||
namespace features {
|
||||
|
||||
+NETWORK_SESSION_CONFIGURATOR_EXPORT extern const char kMaxConnectionsPerHostChoiceDefault[],
|
||||
+ kMaxConnectionsPerHostChoice6[],
|
||||
+ kMaxConnectionsPerHostChoice15[];
|
||||
+
|
||||
} // namespace features
|
||||
|
||||
#endif // COMPONENTS_NETWORK_SESSION_CONFIGURATOR_COMMON_NETWORK_FEATURES_H_
|
||||
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,
|
||||
// Enables the QUIC protocol. This is a temporary testing flag.
|
||||
NETWORK_SWITCH(kEnableQuic, "enable-quic")
|
||||
|
||||
+// Allows specifying a higher number of maximum connections per host
|
||||
+// (15 instead of 6, mirroring the value Mozilla uses).
|
||||
+NETWORK_SWITCH(kMaxConnectionsPerHost, "max-connections-per-host")
|
||||
+
|
||||
// Ignores certificate-related errors.
|
||||
NETWORK_SWITCH(kIgnoreCertificateErrors, "ignore-certificate-errors")
|
||||
|
||||
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") {
|
||||
"//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
|
||||
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"
|
||||
#include "net/socket/client_socket_pool.h"
|
||||
#include "net/socket/connect_job.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"
|
||||
@@ -187,6 +191,19 @@ void ClientSocketPoolManager::set_max_sockets_per_pool(
|
||||
int ClientSocketPoolManager::max_sockets_per_group(
|
||||
HttpNetworkSession::SocketPoolType pool_type) {
|
||||
DCHECK_LT(pool_type, HttpNetworkSession::NUM_SOCKET_POOL_TYPES);
|
||||
+
|
||||
+ if (pool_type == HttpNetworkSession::NORMAL_SOCKET_POOL) {
|
||||
+ int maxConnectionsPerHost = 0;
|
||||
+ auto value = base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(switches::kMaxConnectionsPerHost);
|
||||
+ if (!value.empty() && !base::StringToInt(value, &maxConnectionsPerHost)) {
|
||||
+ LOG(DFATAL) << "--" << switches::kMaxConnectionsPerHost << " only accepts integers as arguments (\"" << value << "\" is invalid)";
|
||||
+ }
|
||||
+ if (maxConnectionsPerHost != 0) {
|
||||
+ return maxConnectionsPerHost;
|
||||
+ }
|
||||
+ // fallthrough for default value
|
||||
+ }
|
||||
+
|
||||
return g_max_sockets_per_group[pool_type];
|
||||
}
|
||||
|
||||
--
|
||||
@@ -1,39 +0,0 @@
|
||||
From: csagan5 <32685696+csagan5@users.noreply.github.com>
|
||||
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
|
||||
|
||||
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)
|
||||
+
|
||||
+ {"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,
|
||||
+ FEATURE_VALUE_TYPE(media::kResumeBackgroundVideo)},
|
||||
+
|
||||
+#endif // BUILDFLAG(IS_ANDROID)
|
||||
+
|
||||
+#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);
|
||||
--
|
||||
@@ -1,81 +0,0 @@
|
||||
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
|
||||
|
||||
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
|
||||
+
|
||||
+ {"ipv6-probing",
|
||||
+ "Enable IPv6 probing.",
|
||||
+ "Send IPv6 probes to a RIPE DNS address to verify IPv6 connectivity.", kOsAll,
|
||||
+ FEATURE_VALUE_TYPE(net::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",
|
||||
+ "//components/network_session_configurator/common",
|
||||
"//net/http:transport_security_state_generated_files",
|
||||
"//third_party/simdutf",
|
||||
]
|
||||
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"
|
||||
#include "net/socket/client_socket_factory.h"
|
||||
#include "net/url_request/url_request_context.h"
|
||||
@@ -1493,6 +1494,13 @@ int HostResolverManager::StartIPv6ReachabilityCheck(
|
||||
return OK;
|
||||
}
|
||||
|
||||
+ if (!base::FeatureList::IsEnabled(net::features::kIPv6Probing)) {
|
||||
+ probing_ipv6_ = false;
|
||||
+ last_ipv6_probe_result_ = false;
|
||||
+ last_ipv6_probe_time_ = base::TimeTicks();
|
||||
+ return OK;
|
||||
+ }
|
||||
+
|
||||
if (probing_ipv6_) {
|
||||
ipv6_request_callbacks_.push_back(std::move(callback));
|
||||
return ERR_IO_PENDING;
|
||||
--
|
||||
@@ -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: {
|
||||
--
|
||||
@@ -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
|
||||
--
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
--
|
||||
@@ -1,120 +0,0 @@
|
||||
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(-)
|
||||
|
||||
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
|
||||
+ 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">
|
||||
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 {
|
||||
boolean hadCipherData =
|
||||
CipherLazyHolder.sCipherInstance.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
|
||||
|
||||
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 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();
|
||||
|
||||
+ 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)) {
|
||||
+ 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);
|
||||
+ closeTabsOnExitPref.setOnPreferenceChangeListener(this);
|
||||
+ closeTabsOnExitPref.setManagedPreferenceDelegate(mManagedPreferenceDelegate);
|
||||
+
|
||||
Preference secureDnsPref = findPreference(PREF_SECURE_DNS);
|
||||
if (secureDnsPref != null && secureDnsPref.isVisible()) {
|
||||
secureDnsPref.setSummary(SecureDnsSettings.getSummary(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
|
||||
@@ -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
|
||||
</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.
|
||||
+ </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>
|
||||
--
|
||||
@@ -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.
|
||||
--
|
||||
@@ -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
|
||||
--
|
||||
@@ -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.
|
||||
*
|
||||
--
|
||||
@@ -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() {
|
||||
--
|
||||
@@ -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;
|
||||
--
|
||||
@@ -1,52 +0,0 @@
|
||||
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 +++
|
||||
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 {
|
||||
return pipeline_metadata_.has_audio;
|
||||
}
|
||||
|
||||
+bool WebMediaPlayerImpl::HasVideoNonEmptySize() const {
|
||||
+ DCHECK(main_task_runner_->BelongsToCurrentThread());
|
||||
+
|
||||
+ return pipeline_metadata_.has_video && pipeline_metadata_.natural_size.width() != 0 && pipeline_metadata_.natural_size.height() != 0;
|
||||
+}
|
||||
+
|
||||
void WebMediaPlayerImpl::EnabledAudioTracksChanged(
|
||||
std::optional<WebMediaPlayer::TrackId> enabled_track_id) {
|
||||
DCHECK(main_task_runner_->BelongsToCurrentThread());
|
||||
@@ -3645,7 +3651,10 @@ bool WebMediaPlayerImpl::ShouldPausePlaybackWhenHidden() const {
|
||||
|
||||
const bool preserve_audio = HasUnmutedAudio() || audio_source_provider_->IsAudioBeingCaptured();
|
||||
// Audio only stream is allowed to play when in background.
|
||||
- if (!HasVideo() && preserve_audio)
|
||||
+ //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)
|
||||
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
|
||||
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(
|
||||
--
|
||||
@@ -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);
|
||||
--
|
||||
@@ -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());
|
||||
--
|
||||
@@ -1,96 +0,0 @@
|
||||
From: csagan5 <32685696+csagan5@users.noreply.github.com>
|
||||
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
|
||||
|
||||
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.
|
||||
*/
|
||||
public GURL getDefaultHomepageGurl() {
|
||||
- if (PartnerBrowserCustomizations.getInstance().isHomepageProviderAvailableAndEnabled()) {
|
||||
- return assumeNonNull(PartnerBrowserCustomizations.getInstance().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;
|
||||
}
|
||||
|
||||
/**
|
||||
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);
|
||||
--
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,86 +0,0 @@
|
||||
From: uazo <uazo@users.noreply.github.com>
|
||||
Date: Wed, 22 May 2024 07:41:34 +0000
|
||||
Subject: Android Toolbar Scroll Ablation setting
|
||||
|
||||
Adds a setting for blocking the toolbar hiding
|
||||
|
||||
need: Add-cromite-flags-support.patch
|
||||
License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
|
||||
---
|
||||
...rowserStateBrowserControlsVisibilityDelegate.java | 4 +++-
|
||||
.../Toolbar-Scroll-Ablation-flag.grdp | 9 +++++++++
|
||||
.../java/res/xml/accessibility_preferences.xml | 6 ++++++
|
||||
.../about_flags_cc/Toolbar-Scroll-Ablation-flag.inc | 12 ++++++++++++
|
||||
4 files changed, 30 insertions(+), 1 deletion(-)
|
||||
create mode 100644 chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Toolbar-Scroll-Ablation-flag.grdp
|
||||
create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Toolbar-Scroll-Ablation-flag.inc
|
||||
|
||||
diff --git a/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate.java b/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate.java
|
||||
--- a/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate.java
|
||||
+++ b/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate.java
|
||||
@@ -41,6 +41,7 @@ public class BrowserStateBrowserControlsVisibilityDelegate extends BrowserContro
|
||||
private final Supplier<Boolean> mPersistentFullscreenMode;
|
||||
|
||||
private long mCurrentShowingStartTime;
|
||||
+ private int temporaryToken;
|
||||
|
||||
/**
|
||||
* Constructs a BrowserControlsVisibilityDelegate designed to deal with overrides driven by
|
||||
@@ -66,7 +67,8 @@ public class BrowserStateBrowserControlsVisibilityDelegate extends BrowserContro
|
||||
long currentShowingTime = SystemClock.uptimeMillis() - mCurrentShowingStartTime;
|
||||
if (currentShowingTime >= MINIMUM_SHOW_DURATION_MS) return;
|
||||
|
||||
- final int temporaryToken = mTokenHolder.acquireToken();
|
||||
+ mTokenHolder.releaseToken(temporaryToken);
|
||||
+ temporaryToken = mTokenHolder.acquireToken();
|
||||
mHandler.postDelayed(
|
||||
() -> mTokenHolder.releaseToken(temporaryToken),
|
||||
MINIMUM_SHOW_DURATION_MS - currentShowingTime);
|
||||
diff --git a/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Toolbar-Scroll-Ablation-flag.grdp b/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Toolbar-Scroll-Ablation-flag.grdp
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Toolbar-Scroll-Ablation-flag.grdp
|
||||
@@ -0,0 +1,9 @@
|
||||
+<?xml version="1.0" encoding="utf-8"?>
|
||||
+<grit-part>
|
||||
+ <message name="IDS_LOCK_TOOLBAR_TITLE" desc="Text for 'Always show toolbar' settings option.">
|
||||
+ Always show toolbar
|
||||
+ </message>
|
||||
+ <message name="IDS_LOCK_TOOLBAR_SUMMARY" desc="Summary text for 'Always show toolbar' settings option.">
|
||||
+ Blocks the toolbar's hiding
|
||||
+ </message>
|
||||
+</grit-part>
|
||||
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
|
||||
@@ -74,6 +74,12 @@ found in the LICENSE file.
|
||||
android:key="disable_toolbar_swipeup"
|
||||
android:title="@string/disable_toolbar_swipe_up" />
|
||||
|
||||
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
|
||||
+ android:title="@string/lock_toolbar_title"
|
||||
+ android:summary="@string/lock_toolbar_summary"
|
||||
+ app:featureName="android-toolbar-scroll-ablation"
|
||||
+ app:needRestart="true" />
|
||||
+
|
||||
<PreferenceCategory
|
||||
android:key="customize_selecton_popup_section"
|
||||
android:title="@string/customize_selecton_popup_title" />
|
||||
diff --git a/cromite_flags/chrome/browser/about_flags_cc/Toolbar-Scroll-Ablation-flag.inc b/cromite_flags/chrome/browser/about_flags_cc/Toolbar-Scroll-Ablation-flag.inc
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/cromite_flags/chrome/browser/about_flags_cc/Toolbar-Scroll-Ablation-flag.inc
|
||||
@@ -0,0 +1,12 @@
|
||||
+#if BUILDFLAG(IS_ANDROID)
|
||||
+
|
||||
+#ifdef FLAG_SECTION
|
||||
+
|
||||
+ {"android-toolbar-scroll-ablation",
|
||||
+ "Android Toolbar Scroll Ablation",
|
||||
+ "Always shows the toolbar", kOsAndroid,
|
||||
+ FEATURE_VALUE_TYPE(chrome::android::kAndroidToolbarScrollAblation)},
|
||||
+
|
||||
+#endif
|
||||
+
|
||||
+#endif
|
||||
--
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,807 +0,0 @@
|
||||
From: uazo <uazo@users.noreply.github.com>
|
||||
Date: Tue, 18 Jun 2024 15:31:12 +0000
|
||||
Subject: Ask to restart on connection change
|
||||
|
||||
Experimental use of the OfflineDetector to identify network change, disabled by default.
|
||||
If it is active, when the network change is detected by the android API,
|
||||
the user is warned and asked to restart the browser.
|
||||
Technically, blink's freeze mode is exploited, which allows javascript
|
||||
execution and network calls to be blocked.
|
||||
A preventive shutdown of all service workers is carried out, to inhibit the sending
|
||||
of messages over the new ip, since the service workers have access
|
||||
to the background fetch api.
|
||||
The freeze and resume event of javascript is deliberately left, since the
|
||||
page could deduct it in any case. In any case during the execution of
|
||||
the javascript events, the page can only access the FetchLater api,
|
||||
which is disabled by another patch.
|
||||
The patch also changes the standard behaviour of the browser, allowing visible pages to freeze.
|
||||
This could lead to the failure of some DCHECKS related to the handling of UI messages at unfreeze,
|
||||
but since the goal is a reboot, this should not be the case.
|
||||
|
||||
License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
|
||||
---
|
||||
.../java/res/xml/homepage_preferences.xml | 6 +
|
||||
.../ConnectivityDetector.java | 1 -
|
||||
.../indicator/OfflineDetector.java | 111 +++++++++++++++++-
|
||||
.../OfflineIndicatorControllerV2.java | 15 ++-
|
||||
.../tabbed_mode/TabbedRootUiCoordinator.java | 5 +-
|
||||
.../tabmodel/TabModelSelectorBase.java | 7 ++
|
||||
.../sAskForRestartOnConnectionChange.java | 32 +++++
|
||||
.../browser/tabmodel/TabModelSelector.java | 2 +
|
||||
.../browser/tabmodel/TabModelUtils.java | 18 +++
|
||||
.../browser/tabwindow/TabWindowManager.java | 2 +
|
||||
.../tabwindow/TabWindowManagerImpl.java | 10 ++
|
||||
.../Ask-for-restart-on-connection-change.grdp | 15 +++
|
||||
.../java/res/layout/floating_snackbar.xml | 10 ++
|
||||
.../android/java/res/layout/snackbar.xml | 10 ++
|
||||
.../ui/messages/snackbar/Snackbar.java | 16 +++
|
||||
.../ui/messages/snackbar/SnackbarManager.java | 6 +
|
||||
.../ui/messages/snackbar/SnackbarView.java | 13 +-
|
||||
.../web_contents/web_contents_android.cc | 16 +++
|
||||
.../web_contents/web_contents_android.h | 1 +
|
||||
.../browser/web_contents/web_contents_impl.cc | 2 +
|
||||
.../browser/webcontents/WebContentsImpl.java | 8 ++
|
||||
.../content_public/browser/WebContents.java | 2 +
|
||||
.../browser/test/mock/MockWebContents.java | 3 +
|
||||
.../Ask-for-restart-on-connection-change.inc | 13 ++
|
||||
.../Ask-for-restart-on-connection-change.inc | 3 +
|
||||
.../Ask-for-restart-on-connection-change.inc | 1 +
|
||||
.../blink/renderer/core/dom/document.cc | 1 +
|
||||
.../blink/renderer/core/frame/local_frame.cc | 2 +
|
||||
.../main_thread/frame_scheduler_impl.cc | 2 +
|
||||
.../main_thread/page_scheduler_impl.cc | 9 +-
|
||||
30 files changed, 332 insertions(+), 10 deletions(-)
|
||||
create mode 100644 chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/cromite/sAskForRestartOnConnectionChange.java
|
||||
create mode 100644 chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Ask-for-restart-on-connection-change.grdp
|
||||
create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Ask-for-restart-on-connection-change.inc
|
||||
create mode 100644 cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Ask-for-restart-on-connection-change.inc
|
||||
create mode 100644 cromite_flags/chrome/browser/flags/android/chrome_feature_list_h/Ask-for-restart-on-connection-change.inc
|
||||
|
||||
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
|
||||
@@ -25,6 +25,12 @@ found in the LICENSE file.
|
||||
app:featureName="enable-show-ntp-at-startup"
|
||||
app:needRestart="true" />
|
||||
|
||||
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
|
||||
+ android:title="@string/ask_to_restart_on_connection_change_title"
|
||||
+ android:summary="@string/ask_to_restart_on_connection_change_summary"
|
||||
+ app:featureName="ask-for-restart-on-connection-change"
|
||||
+ app:needRestart="true" />
|
||||
+
|
||||
<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/net/connectivitydetector/ConnectivityDetector.java b/chrome/android/java/src/org/chromium/chrome/browser/net/connectivitydetector/ConnectivityDetector.java
|
||||
--- a/chrome/android/java/src/org/chromium/chrome/browser/net/connectivitydetector/ConnectivityDetector.java
|
||||
+++ b/chrome/android/java/src/org/chromium/chrome/browser/net/connectivitydetector/ConnectivityDetector.java
|
||||
@@ -470,7 +470,6 @@ public class ConnectivityDetector implements NetworkChangeNotifier.ConnectionTyp
|
||||
@VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
|
||||
public void setConnectionState(@ConnectionState int connectionState) {
|
||||
Log.i(TAG, "setConnectionState connectionState=" + connectionState);
|
||||
- if (mConnectionState == connectionState) return;
|
||||
mConnectionState = connectionState;
|
||||
if (mObserver != null) mObserver.onConnectionStateChanged(mConnectionState);
|
||||
}
|
||||
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineDetector.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineDetector.java
|
||||
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineDetector.java
|
||||
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineDetector.java
|
||||
@@ -22,10 +22,31 @@ import org.chromium.build.annotations.Nullable;
|
||||
import org.chromium.chrome.browser.flags.ChromeFeatureList;
|
||||
import org.chromium.chrome.browser.net.connectivitydetector.ConnectivityDetector;
|
||||
import org.chromium.chrome.browser.net.connectivitydetector.ConnectivityDetector.ConnectionState;
|
||||
-import org.chromium.chrome.browser.net.connectivitydetector.ConnectivityDetector;
|
||||
-import org.chromium.chrome.browser.net.connectivitydetector.ConnectivityDetector.ConnectionState;
|
||||
import org.chromium.components.variations.VariationsAssociatedData;
|
||||
|
||||
+import android.app.Activity;
|
||||
+import org.chromium.base.supplier.ObservableSupplier;
|
||||
+import org.chromium.url.GURL;
|
||||
+import org.chromium.chrome.R;
|
||||
+import org.chromium.chrome.browser.app.tabwindow.TabWindowManagerSingleton;
|
||||
+import org.chromium.chrome.browser.layouts.LayoutManager;
|
||||
+import org.chromium.chrome.browser.compositor.layouts.Layout;
|
||||
+import org.chromium.chrome.browser.compositor.layouts.LayoutManagerImpl;
|
||||
+import org.chromium.chrome.browser.compositor.layouts.SceneChangeObserver;
|
||||
+import org.chromium.chrome.browser.flags.cromite.sAskForRestartOnConnectionChange;
|
||||
+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.hub.HubLayout;
|
||||
+import org.chromium.chrome.browser.tab.Tab;
|
||||
+import org.chromium.chrome.browser.tabmodel.TabModelUtils;
|
||||
+import org.chromium.chrome.browser.tabmodel.TabModelSelector;
|
||||
+import org.chromium.chrome.browser.tabwindow.TabWindowManager;
|
||||
+import org.chromium.chrome.browser.lifetime.ApplicationLifetime;
|
||||
+import org.chromium.content_public.browser.WebContentsObserver;
|
||||
+import org.chromium.content_public.browser.WebContents;
|
||||
+import org.chromium.net.NetworkChangeNotifier;
|
||||
+
|
||||
import java.util.function.Supplier;
|
||||
|
||||
/**
|
||||
@@ -34,7 +55,8 @@ import java.util.function.Supplier;
|
||||
*/
|
||||
@NullMarked
|
||||
class OfflineDetector
|
||||
- implements ConnectivityDetector.Observer, ApplicationStatus.ApplicationStateListener {
|
||||
+ implements ConnectivityDetector.Observer, ApplicationStatus.ApplicationStateListener,
|
||||
+ SnackbarManager.SnackbarController, SceneChangeObserver {
|
||||
// If the connection is online, then we report that immediately via |mIsOfflineCallback|.
|
||||
// |STATUS_INDICATOR_WAIT_ON_OFFLINE_DURATION_MS| and
|
||||
// |mStatusIndicatorWaitOnSwitchOnlineToOfflineDurationMs| control the duration before
|
||||
@@ -120,6 +142,11 @@ class OfflineDetector
|
||||
|
||||
private static final String TAG = "OfflineDetector";
|
||||
|
||||
+ private long mLastNetworkId = 0;
|
||||
+ private ObservableSupplier<TabModelSelector> mTabModelSelectorSupplier;
|
||||
+ private ObservableSupplier<LayoutManager> mLayoutManager;
|
||||
+ private Supplier<SnackbarManager> mSnackbarManagerSupplier;
|
||||
+
|
||||
/**
|
||||
* Constructs the offline indicator.
|
||||
* @param isOfflineCallback The {@link Callback} is invoked when the connectivity status is
|
||||
@@ -131,7 +158,13 @@ class OfflineDetector
|
||||
OfflineDetector(
|
||||
Callback<Boolean> isOfflineCallback,
|
||||
Callback<Boolean> isForegroundCallback,
|
||||
- Context context) {
|
||||
+ Context context,
|
||||
+ ObservableSupplier<TabModelSelector> tabModelSelectorSupplier,
|
||||
+ ObservableSupplier<LayoutManager> layoutManager,
|
||||
+ Supplier<SnackbarManager> snackbarManagerSupplier) {
|
||||
+ mTabModelSelectorSupplier = tabModelSelectorSupplier;
|
||||
+ mSnackbarManagerSupplier = snackbarManagerSupplier;
|
||||
+ mLayoutManager = layoutManager;
|
||||
mIsOfflineCallback = isOfflineCallback;
|
||||
mIsForegroundCallback = isForegroundCallback;
|
||||
mContext = context;
|
||||
@@ -235,6 +268,75 @@ class OfflineDetector
|
||||
updateState();
|
||||
}
|
||||
|
||||
+ private void checkLastNetworkId() {
|
||||
+ if (!sAskForRestartOnConnectionChange.getInstance().isEnabled())
|
||||
+ return;
|
||||
+
|
||||
+ long currentNetworkId = NetworkChangeNotifier.getInstance().getCurrentDefaultNetId();
|
||||
+ Log.i(TAG, "onConnectionTypeChanged: currentNetworkId=" + currentNetworkId);
|
||||
+
|
||||
+ if (currentNetworkId != -1 && mLastNetworkId != 0
|
||||
+ && mLastNetworkId != currentNetworkId) {
|
||||
+ // close snackbar with scene change
|
||||
+ LayoutManagerImpl layoutManager = (LayoutManagerImpl)mLayoutManager.get();
|
||||
+ if (layoutManager != null) layoutManager.addSceneChangeObserver(this);
|
||||
+
|
||||
+ // close snackbar with reload
|
||||
+ Tab currentTab = TabModelUtils.getCurrentTab(mTabModelSelectorSupplier.get().getCurrentModel());
|
||||
+ if (currentTab != null) {
|
||||
+ WebContents webContents = currentTab.getWebContents();
|
||||
+ SnackbarManager.SnackbarController controller = this;
|
||||
+ if (webContents != null) {
|
||||
+ new WebContentsObserver(webContents) {
|
||||
+ @Override
|
||||
+ public void didStartLoading(GURL url) {
|
||||
+ observe(null);
|
||||
+ SnackbarManager snackbarManager = mSnackbarManagerSupplier.get();
|
||||
+ snackbarManager.dismissSnackbars(controller);
|
||||
+ }
|
||||
+ };
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ // freeze all pages
|
||||
+ TabWindowManagerSingleton.getInstance().setPagesFrozen(true);
|
||||
+
|
||||
+ // show snackbar
|
||||
+ Snackbar snackbar = Snackbar.make(
|
||||
+ mContext.getString(R.string.ask_to_restart_on_connection_change_restart),
|
||||
+ /* snackbarController */ this, Snackbar.TYPE_PERSISTENT, Snackbar.UMA_UNKNOWN)
|
||||
+ .setDefaultLines(false)
|
||||
+ .setAction(mContext.getString(R.string.relaunch), /*actionData*/0)
|
||||
+ .setDismissAction(mContext.getString(R.string.ask_to_restart_on_connection_change_close_notification), /*actionData*/1);
|
||||
+ SnackbarManager snackbarManager = mSnackbarManagerSupplier.get();
|
||||
+ if (!snackbarManager.isShowing())
|
||||
+ snackbarManager.showSnackbar(snackbar);
|
||||
+ }
|
||||
+ mLastNetworkId = currentNetworkId;
|
||||
+ }
|
||||
+
|
||||
+ // SnackbarManager.SnackbarController
|
||||
+ @Override
|
||||
+ public void onDismissNoAction(Object actionData) {
|
||||
+ ((LayoutManagerImpl)mLayoutManager.get()).removeSceneChangeObserver(this);
|
||||
+ TabWindowManagerSingleton.getInstance().setPagesFrozen(false);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void onAction(Object actionData) {
|
||||
+ if ((int)actionData == 0)
|
||||
+ ApplicationLifetime.terminate(true);
|
||||
+ }
|
||||
+
|
||||
+ // TabWindowManager.Observer
|
||||
+ @Override
|
||||
+ public void onSceneChange(Layout layout) {
|
||||
+ if (!(layout instanceof HubLayout)) {
|
||||
+ SnackbarManager snackbarManager = mSnackbarManagerSupplier.get();
|
||||
+ snackbarManager.dismissSnackbars(this);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
private void logToAdbConsoleNow(String prefix) {
|
||||
Log.i(
|
||||
TAG,
|
||||
@@ -321,6 +423,7 @@ class OfflineDetector
|
||||
** Calls |mUpdateOfflineStatusIndicatorDelayedRunnable| to update the connection state.
|
||||
*/
|
||||
private void updateState() {
|
||||
+ checkLastNetworkId();
|
||||
mHandler.removeCallbacks(mUpdateOfflineStatusIndicatorDelayedRunnable);
|
||||
|
||||
// Do not update state while the app is in background.
|
||||
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerV2.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerV2.java
|
||||
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerV2.java
|
||||
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerV2.java
|
||||
@@ -31,6 +31,11 @@ import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
+import org.chromium.base.supplier.ObservableSupplierImpl;
|
||||
+import org.chromium.chrome.browser.layouts.LayoutManager;
|
||||
+import org.chromium.chrome.browser.tabmodel.TabModelSelector;
|
||||
+import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
|
||||
+
|
||||
/**
|
||||
* Class that controls visibility and content of {@link StatusIndicatorCoordinator} to relay
|
||||
* connectivity information.
|
||||
@@ -104,7 +109,10 @@ public class OfflineIndicatorControllerV2 {
|
||||
Context context,
|
||||
StatusIndicatorCoordinator statusIndicator,
|
||||
ObservableSupplier<Boolean> isUrlBarFocusedSupplier,
|
||||
- Supplier<Boolean> canAnimateNativeBrowserControls) {
|
||||
+ Supplier<Boolean> canAnimateNativeBrowserControls,
|
||||
+ ObservableSupplier<TabModelSelector> tabModelSelectorSupplier,
|
||||
+ ObservableSupplierImpl<LayoutManager> layoutManager,
|
||||
+ Supplier<SnackbarManager> snackbarManagerSupplier) {
|
||||
// If "force online connection state" switch is set, the offline indicator should never
|
||||
// show.
|
||||
assert !CommandLine.getInstance()
|
||||
@@ -130,7 +138,10 @@ public class OfflineIndicatorControllerV2 {
|
||||
new OfflineDetector(
|
||||
(Boolean offline) -> onConnectionStateChanged(offline),
|
||||
(Boolean isForeground) -> onApplicationStateChanged(isForeground),
|
||||
- mContext);
|
||||
+ mContext,
|
||||
+ tabModelSelectorSupplier,
|
||||
+ layoutManager,
|
||||
+ snackbarManagerSupplier);
|
||||
}
|
||||
|
||||
// Initializes the application state.
|
||||
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
|
||||
@@ -1465,7 +1465,10 @@ public class TabbedRootUiCoordinator extends RootUiCoordinator {
|
||||
mActivity,
|
||||
mStatusIndicatorCoordinator,
|
||||
isUrlBarFocusedSupplier,
|
||||
- mCanAnimateBrowserControls);
|
||||
+ mCanAnimateBrowserControls,
|
||||
+ mTabModelSelectorSupplier,
|
||||
+ mLayoutManagerSupplier,
|
||||
+ mSnackbarManagerSupplier);
|
||||
}
|
||||
|
||||
if (mToolbarManager.getOmniboxStub() != null) {
|
||||
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorBase.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorBase.java
|
||||
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorBase.java
|
||||
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorBase.java
|
||||
@@ -199,6 +199,13 @@ public abstract class TabModelSelectorBase
|
||||
return null;
|
||||
}
|
||||
|
||||
+ @Override
|
||||
+ public void setPagesFrozen(boolean frozen) {
|
||||
+ for (int i = 0; i < getModels().size(); i++) {
|
||||
+ TabModelUtils.setPagesFrozen(mTabModels.get(i), frozen);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
@Override
|
||||
public TabModel getCurrentModel() {
|
||||
if (mTabModelInternals.size() == 0) return EmptyTabModel.getInstance(false);
|
||||
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/cromite/sAskForRestartOnConnectionChange.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/cromite/sAskForRestartOnConnectionChange.java
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/cromite/sAskForRestartOnConnectionChange.java
|
||||
@@ -0,0 +1,32 @@
|
||||
+/*
|
||||
+ 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 sAskForRestartOnConnectionChange {
|
||||
+ private static final CachedFlag sInstance =
|
||||
+ new CachedFlag(ChromeFeatureMap.getInstance(), "AskForRestartOnConnectionChange", false);
|
||||
+
|
||||
+ private sAskForRestartOnConnectionChange() {}
|
||||
+
|
||||
+ public static CachedFlag getInstance() {
|
||||
+ return sInstance;
|
||||
+ }
|
||||
+}
|
||||
diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelector.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelector.java
|
||||
--- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelector.java
|
||||
+++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelector.java
|
||||
@@ -149,6 +149,8 @@ public interface TabModelSelector {
|
||||
/** Get total pinned tab count across all tab models */
|
||||
int getTotalPinnedTabCount();
|
||||
|
||||
+ void setPagesFrozen(boolean frozen);
|
||||
+
|
||||
/**
|
||||
* Search all TabModels for a tab with the specified id.
|
||||
*
|
||||
diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelUtils.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelUtils.java
|
||||
--- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelUtils.java
|
||||
+++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelUtils.java
|
||||
@@ -15,6 +15,7 @@ import org.chromium.build.annotations.Nullable;
|
||||
import org.chromium.chrome.browser.tab.Tab;
|
||||
import org.chromium.chrome.browser.tab.TabSelectionType;
|
||||
import org.chromium.content_public.browser.WebContents;
|
||||
+import org.chromium.content_public.browser.Visibility;
|
||||
import org.chromium.ui.base.WindowAndroid;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -22,6 +23,9 @@ import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.function.Supplier;
|
||||
+import java.util.Collections;
|
||||
+import java.util.stream.IntStream;
|
||||
+import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* A set of convenience methods used for interacting with {@link TabList}s and {@link TabModel}s.
|
||||
@@ -54,6 +58,20 @@ public class TabModelUtils {
|
||||
return TabModel.INVALID_TAB_INDEX;
|
||||
}
|
||||
|
||||
+ public static void setPagesFrozen(TabList model, boolean frozen) {
|
||||
+ List<Integer> loop = IntStream.range(0, model.getCount())
|
||||
+ .boxed()
|
||||
+ .collect(Collectors.toList());
|
||||
+ Collections.shuffle(loop);
|
||||
+ loop.forEach(tabId -> {
|
||||
+ Tab tab = model.getTabAt(tabId);
|
||||
+ WebContents webContents = tab.getWebContents();
|
||||
+ if (webContents != null) {
|
||||
+ webContents.setPageFrozen(frozen);
|
||||
+ }
|
||||
+ });
|
||||
+ }
|
||||
+
|
||||
/**
|
||||
* Find the {@link Tab} index whose URL matches the specified URL.
|
||||
*
|
||||
diff --git a/chrome/browser/tabwindow/android/java/src/org/chromium/chrome/browser/tabwindow/TabWindowManager.java b/chrome/browser/tabwindow/android/java/src/org/chromium/chrome/browser/tabwindow/TabWindowManager.java
|
||||
--- a/chrome/browser/tabwindow/android/java/src/org/chromium/chrome/browser/tabwindow/TabWindowManager.java
|
||||
+++ b/chrome/browser/tabwindow/android/java/src/org/chromium/chrome/browser/tabwindow/TabWindowManager.java
|
||||
@@ -135,6 +135,8 @@ public interface TabWindowManager {
|
||||
/** Returns the total number of incognito tabs across all tab model selectors. */
|
||||
int getIncognitoTabCount();
|
||||
|
||||
+ void setPagesFrozen(boolean frozen);
|
||||
+
|
||||
/**
|
||||
* @param tab The tab to look for in each model.
|
||||
* @return The TabModel containing the given Tab or null if one doesn't exist.
|
||||
diff --git a/chrome/browser/tabwindow/internal/android/java/src/org/chromium/chrome/browser/tabwindow/TabWindowManagerImpl.java b/chrome/browser/tabwindow/internal/android/java/src/org/chromium/chrome/browser/tabwindow/TabWindowManagerImpl.java
|
||||
--- a/chrome/browser/tabwindow/internal/android/java/src/org/chromium/chrome/browser/tabwindow/TabWindowManagerImpl.java
|
||||
+++ b/chrome/browser/tabwindow/internal/android/java/src/org/chromium/chrome/browser/tabwindow/TabWindowManagerImpl.java
|
||||
@@ -551,6 +551,16 @@ public class TabWindowManagerImpl implements TabWindowManager {
|
||||
return tabGroupModelFilter.getTabsInGroup(tabGroupId);
|
||||
}
|
||||
|
||||
+ @Override
|
||||
+ public void setPagesFrozen(boolean frozen) {
|
||||
+ for (int i : mWindowIdToSelectors.keySet()) {
|
||||
+ TabModelSelector selector = mWindowIdToSelectors.get(i);
|
||||
+ if (selector != null) {
|
||||
+ selector.setPagesFrozen(frozen);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
@Override
|
||||
public @Nullable TabModelSelector getTabModelSelectorById(@WindowId int windowId) {
|
||||
return mWindowIdToSelectors.get(windowId);
|
||||
diff --git a/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Ask-for-restart-on-connection-change.grdp b/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Ask-for-restart-on-connection-change.grdp
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Ask-for-restart-on-connection-change.grdp
|
||||
@@ -0,0 +1,15 @@
|
||||
+<?xml version="1.0" encoding="utf-8"?>
|
||||
+<grit-part>
|
||||
+ <message name="IDS_ASK_TO_RESTART_ON_CONNECTION_CHANGE_TITLE" desc="Text for 'Ask to restart on connection change' settings option.">
|
||||
+ Ask to restart on connection change
|
||||
+ </message>
|
||||
+ <message name="IDS_ASK_TO_RESTART_ON_CONNECTION_CHANGE_SUMMARY" desc="Summary text for 'Ask to restart on connection change' settings option.">
|
||||
+ If the IP of the connection changes, access to the network is blocked and a browser restart is requested
|
||||
+ </message>
|
||||
+ <message name="IDS_ASK_TO_RESTART_ON_CONNECTION_CHANGE_RESTART" desc="">
|
||||
+ Connection to internet has changed, execution is paused. Restart Cromite?
|
||||
+ </message>
|
||||
+ <message name="IDS_ASK_TO_RESTART_ON_CONNECTION_CHANGE_CLOSE_NOTIFICATION" desc="">
|
||||
+ Not now
|
||||
+ </message>
|
||||
+</grit-part>
|
||||
diff --git a/chrome/browser/ui/messages/android/java/res/layout/floating_snackbar.xml b/chrome/browser/ui/messages/android/java/res/layout/floating_snackbar.xml
|
||||
--- a/chrome/browser/ui/messages/android/java/res/layout/floating_snackbar.xml
|
||||
+++ b/chrome/browser/ui/messages/android/java/res/layout/floating_snackbar.xml
|
||||
@@ -50,5 +50,15 @@ found in the LICENSE file.
|
||||
android:paddingEnd="@dimen/snackbar_button_padding"
|
||||
android:paddingStart="@dimen/snackbar_button_padding"
|
||||
style="@style/TextButton" />
|
||||
+
|
||||
+ <org.chromium.ui.widget.ButtonCompat
|
||||
+ android:id="@+id/snackbar_dismiss"
|
||||
+ android:layout_width="wrap_content"
|
||||
+ android:layout_height="wrap_content"
|
||||
+ android:layout_gravity="center_vertical"
|
||||
+ android:paddingEnd="24dp"
|
||||
+ android:paddingStart="24dp"
|
||||
+ android:visibility="gone"
|
||||
+ style="@style/TextButton" />
|
||||
</LinearLayout>
|
||||
|
||||
diff --git a/chrome/browser/ui/messages/android/java/res/layout/snackbar.xml b/chrome/browser/ui/messages/android/java/res/layout/snackbar.xml
|
||||
--- a/chrome/browser/ui/messages/android/java/res/layout/snackbar.xml
|
||||
+++ b/chrome/browser/ui/messages/android/java/res/layout/snackbar.xml
|
||||
@@ -82,5 +82,15 @@ found in the LICENSE file.
|
||||
android:paddingEnd="@dimen/snackbar_button_padding"
|
||||
android:paddingStart="@dimen/snackbar_button_padding"
|
||||
style="@style/TextButton" />
|
||||
+
|
||||
+ <org.chromium.ui.widget.ButtonCompat
|
||||
+ android:id="@+id/snackbar_dismiss"
|
||||
+ android:layout_width="wrap_content"
|
||||
+ android:layout_height="wrap_content"
|
||||
+ android:layout_gravity="center_vertical"
|
||||
+ android:paddingEnd="24dp"
|
||||
+ android:paddingStart="24dp"
|
||||
+ android:visibility="gone"
|
||||
+ style="@style/TextButton" />
|
||||
</LinearLayout>
|
||||
</RelativeLayout>
|
||||
diff --git a/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/Snackbar.java b/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/Snackbar.java
|
||||
--- a/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/Snackbar.java
|
||||
+++ b/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/Snackbar.java
|
||||
@@ -136,6 +136,8 @@ public class Snackbar {
|
||||
private @Nullable String mTemplateText;
|
||||
private @Nullable String mActionText;
|
||||
private @Nullable Object mActionData;
|
||||
+ private String mDismissActionText;
|
||||
+ private Object mDismissActionData;
|
||||
private int mBackgroundColor;
|
||||
private int mTextApperanceResId;
|
||||
private boolean mDefaultLines = true;
|
||||
@@ -242,6 +244,20 @@ public class Snackbar {
|
||||
return this;
|
||||
}
|
||||
|
||||
+ public Snackbar setDismissAction(String actionText, Object actionData) {
|
||||
+ mDismissActionText = actionText;
|
||||
+ mDismissActionData = actionData;
|
||||
+ return this;
|
||||
+ }
|
||||
+
|
||||
+ public String getDismissActionText() {
|
||||
+ return mDismissActionText;
|
||||
+ }
|
||||
+
|
||||
+ Object getDismissActionData() {
|
||||
+ return mDismissActionData;
|
||||
+ }
|
||||
+
|
||||
/**
|
||||
* Sets the text appearance for the snackbar. If 0, the snackbar will use default text
|
||||
* appearance.
|
||||
diff --git a/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager.java b/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager.java
|
||||
--- a/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager.java
|
||||
+++ b/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarManager.java
|
||||
@@ -327,6 +327,12 @@ public class SnackbarManager
|
||||
new SnackbarView(
|
||||
mActivity,
|
||||
this,
|
||||
+ new View.OnClickListener() {
|
||||
+ @Override
|
||||
+ public void onClick(View v) {
|
||||
+ dismissSnackbars(currentSnackbar.getController());
|
||||
+ }
|
||||
+ },
|
||||
currentSnackbar,
|
||||
mOriginalParentView,
|
||||
mWindowAndroid,
|
||||
diff --git a/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarView.java b/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarView.java
|
||||
--- a/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarView.java
|
||||
+++ b/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarView.java
|
||||
@@ -56,6 +56,7 @@ public class SnackbarView implements InsetObserver.WindowInsetObserver {
|
||||
protected final ViewGroup mSnackbarView;
|
||||
protected final TemplatePreservingTextView mMessageView;
|
||||
private final TextView mActionButtonView;
|
||||
+ private final TextView mDismissButtonView;
|
||||
private final ImageView mProfileImageView;
|
||||
private final int mAnimationDuration;
|
||||
private final boolean mIsTablet;
|
||||
@@ -102,11 +103,12 @@ public class SnackbarView implements InsetObserver.WindowInsetObserver {
|
||||
public SnackbarView(
|
||||
Activity activity,
|
||||
OnClickListener listener,
|
||||
+ OnClickListener dismissListener,
|
||||
Snackbar snackbar,
|
||||
ViewGroup parentView,
|
||||
@Nullable WindowAndroid windowAndroid,
|
||||
boolean isTablet) {
|
||||
- this(activity, listener, snackbar, parentView, windowAndroid, null, isTablet);
|
||||
+ this(activity, listener, dismissListener, snackbar, parentView, windowAndroid, null, isTablet);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -125,6 +127,7 @@ public class SnackbarView implements InsetObserver.WindowInsetObserver {
|
||||
public SnackbarView(
|
||||
Activity activity,
|
||||
OnClickListener listener,
|
||||
+ OnClickListener dismissListener,
|
||||
Snackbar snackbar,
|
||||
ViewGroup parentView,
|
||||
@Nullable WindowAndroid windowAndroid,
|
||||
@@ -155,6 +158,8 @@ public class SnackbarView implements InsetObserver.WindowInsetObserver {
|
||||
(TemplatePreservingTextView) mContainerView.findViewById(R.id.snackbar_message);
|
||||
mActionButtonView = (TextView) mContainerView.findViewById(R.id.snackbar_button);
|
||||
mActionButtonView.setOnClickListener(listener);
|
||||
+ mDismissButtonView = (TextView) mContainerView.findViewById(R.id.snackbar_dismiss);
|
||||
+ mDismissButtonView.setOnClickListener(dismissListener);
|
||||
mProfileImageView = (ImageView) mContainerView.findViewById(R.id.snackbar_profile_image);
|
||||
mEdgeToEdgeSupplier = edgeToEdgeSupplier;
|
||||
if (SnackbarManager.isFloatingSnackbarEnabled()) {
|
||||
@@ -429,6 +434,12 @@ public class SnackbarView implements InsetObserver.WindowInsetObserver {
|
||||
mActionButtonView.setVisibility(View.VISIBLE);
|
||||
mActionButtonView.setContentDescription(snackbar.getActionText());
|
||||
setViewText(mActionButtonView, snackbar.getActionText(), animate);
|
||||
+ String dismissActionText = snackbar.getDismissActionText();
|
||||
+ if (dismissActionText != null) {
|
||||
+ mDismissButtonView.setVisibility(View.VISIBLE);
|
||||
+ mDismissButtonView.setContentDescription(dismissActionText);
|
||||
+ setViewText(mDismissButtonView, dismissActionText, animate);
|
||||
+ }
|
||||
// Set the end margin on the message view to 0 when there is action text.
|
||||
if (mMessageView.getLayoutParams() instanceof LayoutParams) {
|
||||
LayoutParams lp = (LayoutParams) mMessageView.getLayoutParams();
|
||||
diff --git a/content/browser/web_contents/web_contents_android.cc b/content/browser/web_contents/web_contents_android.cc
|
||||
--- a/content/browser/web_contents/web_contents_android.cc
|
||||
+++ b/content/browser/web_contents/web_contents_android.cc
|
||||
@@ -903,6 +903,22 @@ void WebContentsAndroid::SetFocus(JNIEnv* env, jboolean focused) {
|
||||
view->SetFocus(focused);
|
||||
}
|
||||
|
||||
+void WebContentsAndroid::SetPageFrozen(JNIEnv* env, jboolean frozen) {
|
||||
+ // shutdown service workers
|
||||
+ BrowserContext* browser_context =
|
||||
+ web_contents_->GetBrowserContext();
|
||||
+ browser_context->ForEachLoadedStoragePartition(
|
||||
+ [](StoragePartition* partition) {
|
||||
+ scoped_refptr<ServiceWorkerContextWrapper> context =
|
||||
+ static_cast<ServiceWorkerContextWrapper*>(
|
||||
+ partition->GetServiceWorkerContext());
|
||||
+ context->Shutdown();
|
||||
+ });
|
||||
+
|
||||
+ SuspendAllMediaPlayers(env);
|
||||
+ web_contents_->SetPageFrozen(frozen);
|
||||
+}
|
||||
+
|
||||
bool WebContentsAndroid::IsBeingDestroyed(JNIEnv* env) {
|
||||
return web_contents_->IsBeingDestroyed();
|
||||
}
|
||||
diff --git a/content/browser/web_contents/web_contents_android.h b/content/browser/web_contents/web_contents_android.h
|
||||
--- a/content/browser/web_contents/web_contents_android.h
|
||||
+++ b/content/browser/web_contents/web_contents_android.h
|
||||
@@ -196,6 +196,7 @@ class CONTENT_EXPORT WebContentsAndroid {
|
||||
|
||||
void OnScaleFactorChanged(JNIEnv* env);
|
||||
void SetFocus(JNIEnv* env, jboolean focused);
|
||||
+ void SetPageFrozen(JNIEnv* env, jboolean frozen);
|
||||
bool IsBeingDestroyed(JNIEnv* env);
|
||||
|
||||
void SetDisplayCutoutSafeArea(JNIEnv* env,
|
||||
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
|
||||
--- a/content/browser/web_contents/web_contents_impl.cc
|
||||
+++ b/content/browser/web_contents/web_contents_impl.cc
|
||||
@@ -4094,8 +4094,10 @@ void WebContentsImpl::Stop() {
|
||||
void WebContentsImpl::SetPageFrozen(bool frozen) {
|
||||
TRACE_EVENT1("content", "WebContentsImpl::SetPageFrozen", "frozen", frozen);
|
||||
|
||||
+#if !BUILDFLAG(IS_ANDROID)
|
||||
// A visible page is never frozen.
|
||||
DCHECK_NE(Visibility::VISIBLE, GetVisibility());
|
||||
+#endif
|
||||
|
||||
primary_frame_tree_.ForEachRenderViewHost(
|
||||
[&frozen](RenderViewHostImpl* rvh) { rvh->SetIsFrozen(frozen); });
|
||||
diff --git a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java
|
||||
--- a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java
|
||||
+++ b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java
|
||||
@@ -1134,6 +1134,12 @@ public class WebContentsImpl
|
||||
WebContentsImplJni.get().setFocus(mNativeWebContentsAndroid, hasFocus);
|
||||
}
|
||||
|
||||
+ @Override
|
||||
+ public void setPageFrozen(boolean frozen) {
|
||||
+ if (mNativeWebContentsAndroid == 0) return;
|
||||
+ WebContentsImplJni.get().setPageFrozen(mNativeWebContentsAndroid, frozen);
|
||||
+ }
|
||||
+
|
||||
@Override
|
||||
public void setDisplayCutoutSafeArea(Rect insets) {
|
||||
if (mNativeWebContentsAndroid == 0) return;
|
||||
@@ -1463,6 +1469,8 @@ public class WebContentsImpl
|
||||
|
||||
void setFocus(long nativeWebContentsAndroid, boolean focused);
|
||||
|
||||
+ void setPageFrozen(long nativeWebContentsAndroid, boolean frozen);
|
||||
+
|
||||
void setDisplayCutoutSafeArea(
|
||||
long nativeWebContentsAndroid, int top, int left, int bottom, int right);
|
||||
|
||||
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java b/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java
|
||||
--- a/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java
|
||||
+++ b/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java
|
||||
@@ -288,6 +288,8 @@ public interface WebContents extends Parcelable {
|
||||
*/
|
||||
void setFocus(boolean hasFocus);
|
||||
|
||||
+ void setPageFrozen(boolean frozen);
|
||||
+
|
||||
/**
|
||||
* @return true if the renderer is in fullscreen mode.
|
||||
*/
|
||||
diff --git a/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/mock/MockWebContents.java b/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/mock/MockWebContents.java
|
||||
--- a/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/mock/MockWebContents.java
|
||||
+++ b/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/mock/MockWebContents.java
|
||||
@@ -188,6 +188,9 @@ public class MockWebContents implements WebContents, WebContentsObserver.Observa
|
||||
@Override
|
||||
public void setFocus(boolean hasFocus) {}
|
||||
|
||||
+ @Override
|
||||
+ public void setPageFrozen(boolean frozen) {}
|
||||
+
|
||||
@Override
|
||||
public boolean isFullscreenForCurrentTab() {
|
||||
return false;
|
||||
diff --git a/cromite_flags/chrome/browser/about_flags_cc/Ask-for-restart-on-connection-change.inc b/cromite_flags/chrome/browser/about_flags_cc/Ask-for-restart-on-connection-change.inc
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/cromite_flags/chrome/browser/about_flags_cc/Ask-for-restart-on-connection-change.inc
|
||||
@@ -0,0 +1,13 @@
|
||||
+#ifdef FLAG_SECTION
|
||||
+
|
||||
+#if BUILDFLAG(IS_ANDROID)
|
||||
+
|
||||
+ {"ask-for-restart-on-connection-change",
|
||||
+ "Restart on connection change",
|
||||
+ "Asks the user whether to restart the browser when the connection changes.",
|
||||
+ kOsAndroid,
|
||||
+ FEATURE_VALUE_TYPE(chrome::android::kAskForRestartOnConnectionChange)},
|
||||
+
|
||||
+#endif
|
||||
+
|
||||
+#endif
|
||||
diff --git a/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Ask-for-restart-on-connection-change.inc b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Ask-for-restart-on-connection-change.inc
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Ask-for-restart-on-connection-change.inc
|
||||
@@ -0,0 +1,3 @@
|
||||
+CROMITE_FEATURE(kAskForRestartOnConnectionChange,
|
||||
+ "AskForRestartOnConnectionChange",
|
||||
+ base::FEATURE_ENABLED_BY_DEFAULT);
|
||||
diff --git a/cromite_flags/chrome/browser/flags/android/chrome_feature_list_h/Ask-for-restart-on-connection-change.inc b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_h/Ask-for-restart-on-connection-change.inc
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_h/Ask-for-restart-on-connection-change.inc
|
||||
@@ -0,0 +1 @@
|
||||
+BASE_DECLARE_FEATURE(kAskForRestartOnConnectionChange);
|
||||
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
|
||||
--- a/third_party/blink/renderer/core/dom/document.cc
|
||||
+++ b/third_party/blink/renderer/core/dom/document.cc
|
||||
@@ -4654,6 +4654,7 @@ void Document::DispatchUnloadEvents(UnloadEventTimingInfo* unload_timing_info) {
|
||||
}
|
||||
|
||||
void Document::DispatchFreezeEvent() {
|
||||
+ DLOG(INFO) << "---Document::DispatchFreezeEvent";
|
||||
SetFreezingInProgress(true);
|
||||
DispatchEvent(*Event::Create(event_type_names::kFreeze));
|
||||
SetFreezingInProgress(false);
|
||||
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
|
||||
@@ -3303,6 +3303,7 @@ void LocalFrame::DidFreeze() {
|
||||
LoaderFreezeMode freeze_mode = GetLoaderFreezeMode();
|
||||
GetDocument()->Fetcher()->SetDefersLoading(freeze_mode);
|
||||
Loader().SetDefersLoading(freeze_mode);
|
||||
+ DLOG(INFO) << "---LocalFrame::DidFreeze end " << (int)freeze_mode;
|
||||
}
|
||||
|
||||
void LocalFrame::DidResume() {
|
||||
@@ -3317,6 +3318,7 @@ void LocalFrame::DidResume() {
|
||||
GetDocument()->Fetcher()->SetDefersLoading(LoaderFreezeMode::kNone);
|
||||
Loader().SetDefersLoading(LoaderFreezeMode::kNone);
|
||||
|
||||
+ DLOG(INFO) << "---LocalFrame::DidResume";
|
||||
GetDocument()->DispatchEvent(*Event::Create(event_type_names::kResume));
|
||||
// TODO(fmeawad): Move the following logic to the page once we have a
|
||||
// PageResourceCoordinator in Blink
|
||||
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc
|
||||
--- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc
|
||||
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc
|
||||
@@ -1033,7 +1033,9 @@ SchedulingLifecycleState FrameSchedulerImpl::CalculateLifecycleState(
|
||||
if (!parent_page_scheduler_)
|
||||
return SchedulingLifecycleState::kNotThrottled;
|
||||
if (parent_page_scheduler_->IsFrozen()) {
|
||||
+#if !BUILDFLAG(IS_ANDROID)
|
||||
DCHECK(!parent_page_scheduler_->IsPageVisible());
|
||||
+#endif
|
||||
return SchedulingLifecycleState::kStopped;
|
||||
}
|
||||
if (subresource_loading_paused_ && type == ObserverType::kLoader)
|
||||
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc
|
||||
--- a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc
|
||||
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc
|
||||
@@ -237,10 +237,12 @@ void PageSchedulerImpl::SetPageFrozen(bool frozen) {
|
||||
// it is desirable to reject the page freeze to prevent the scheduler from
|
||||
// being put in a bad state. See https://crbug.com/873214 for context of how
|
||||
// this can happen on the browser side.
|
||||
+#if !BUILDFLAG(IS_ANDROID)
|
||||
if (frozen && IsPageVisible()) {
|
||||
DCHECK(false);
|
||||
return;
|
||||
}
|
||||
+#endif
|
||||
PolicyUpdater policy_updater;
|
||||
SetPageFrozenImpl(frozen, policy_updater);
|
||||
}
|
||||
@@ -816,7 +818,12 @@ bool PageSchedulerImpl::IsBackgrounded() const {
|
||||
// expire immediately when a page is backgrounded, which is undesirable in
|
||||
// headless mode. To prevent that, a page is never considerer backgrounded
|
||||
// when virtual time is enabled.
|
||||
- return !IsPageVisible() && !IsAudioPlaying() &&
|
||||
+#if BUILDFLAG(IS_ANDROID)
|
||||
+ bool page_visible = true;
|
||||
+#else
|
||||
+ bool page_visible = IsPageVisible();
|
||||
+#endif
|
||||
+ return !page_visible && !IsAudioPlaying() &&
|
||||
!main_thread_scheduler_->IsVirtualTimeEnabled();
|
||||
}
|
||||
|
||||
--
|
||||
@@ -1,233 +0,0 @@
|
||||
From: csagan5 <32685696+csagan5@users.noreply.github.com>
|
||||
Date: Sun, 25 Mar 2018 21:49:37 +0200
|
||||
Subject: AudioBuffer, AnalyserNode: fp mitigations
|
||||
|
||||
Truncate base latency precision to two digits
|
||||
|
||||
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
|
||||
---
|
||||
.../AudioBuffer-AnalyserNode-fp-mitigations.inc | 8 ++++++++
|
||||
.../AudioBuffer-AnalyserNode-fp-mitigations.inc | 3 +++
|
||||
.../AudioBuffer-AnalyserNode-fp-mitigations.inc | 1 +
|
||||
.../renderer/modules/webaudio/audio_buffer.cc | 14 ++++++++++++++
|
||||
.../blink/renderer/modules/webaudio/audio_buffer.h | 2 ++
|
||||
.../renderer/modules/webaudio/audio_context.cc | 5 ++++-
|
||||
.../modules/webaudio/base_audio_context.cc | 12 ++++++++++++
|
||||
.../renderer/modules/webaudio/base_audio_context.h | 2 ++
|
||||
.../modules/webaudio/offline_audio_context.cc | 1 +
|
||||
.../renderer/modules/webaudio/realtime_analyser.cc | 13 ++++++++++---
|
||||
.../platform/runtime_enabled_features.json5 | 5 ++---
|
||||
11 files changed, 59 insertions(+), 7 deletions(-)
|
||||
create mode 100644 cromite_flags/chrome/browser/about_flags_cc/AudioBuffer-AnalyserNode-fp-mitigations.inc
|
||||
create mode 100644 cromite_flags/third_party/blink/common/features_cc/AudioBuffer-AnalyserNode-fp-mitigations.inc
|
||||
create mode 100644 cromite_flags/third_party/blink/common/features_h/AudioBuffer-AnalyserNode-fp-mitigations.inc
|
||||
|
||||
diff --git a/cromite_flags/chrome/browser/about_flags_cc/AudioBuffer-AnalyserNode-fp-mitigations.inc b/cromite_flags/chrome/browser/about_flags_cc/AudioBuffer-AnalyserNode-fp-mitigations.inc
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/cromite_flags/chrome/browser/about_flags_cc/AudioBuffer-AnalyserNode-fp-mitigations.inc
|
||||
@@ -0,0 +1,8 @@
|
||||
+#ifdef FLAG_SECTION
|
||||
+
|
||||
+ {"fingerprinting-audio-context-data-noise",
|
||||
+ "Enable Audio Context fingerprint deception",
|
||||
+ "Scale the output values of rendered data with a randomly selected factor.", kOsAll,
|
||||
+ FEATURE_VALUE_TYPE(blink::features::kAudioContextShuffleEnabled)},
|
||||
+
|
||||
+#endif
|
||||
diff --git a/cromite_flags/third_party/blink/common/features_cc/AudioBuffer-AnalyserNode-fp-mitigations.inc b/cromite_flags/third_party/blink/common/features_cc/AudioBuffer-AnalyserNode-fp-mitigations.inc
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/cromite_flags/third_party/blink/common/features_cc/AudioBuffer-AnalyserNode-fp-mitigations.inc
|
||||
@@ -0,0 +1,3 @@
|
||||
+CROMITE_FEATURE(kAudioContextShuffleEnabled,
|
||||
+ "AudioContextShuffleEnabled",
|
||||
+ base::FEATURE_ENABLED_BY_DEFAULT);
|
||||
diff --git a/cromite_flags/third_party/blink/common/features_h/AudioBuffer-AnalyserNode-fp-mitigations.inc b/cromite_flags/third_party/blink/common/features_h/AudioBuffer-AnalyserNode-fp-mitigations.inc
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/cromite_flags/third_party/blink/common/features_h/AudioBuffer-AnalyserNode-fp-mitigations.inc
|
||||
@@ -0,0 +1 @@
|
||||
+BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kAudioContextShuffleEnabled);
|
||||
diff --git a/third_party/blink/renderer/modules/webaudio/audio_buffer.cc b/third_party/blink/renderer/modules/webaudio/audio_buffer.cc
|
||||
--- a/third_party/blink/renderer/modules/webaudio/audio_buffer.cc
|
||||
+++ b/third_party/blink/renderer/modules/webaudio/audio_buffer.cc
|
||||
@@ -200,6 +200,20 @@ AudioBuffer::AudioBuffer(AudioBus* bus)
|
||||
}
|
||||
}
|
||||
|
||||
+void AudioBuffer::ShuffleAudioData() {
|
||||
+ for (unsigned i = 0; i < channels_.size(); ++i) {
|
||||
+ if (NotShared<DOMFloat32Array> array = getChannelData(i)) {
|
||||
+ size_t len = array->length();
|
||||
+ if (len > 0) {
|
||||
+ base::span<float> destination = array->AsSpan();
|
||||
+ for (unsigned j = 0; j < len; ++j) {
|
||||
+ destination[j] = BaseAudioContext::ShuffleAudioData(destination[j], j);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
NotShared<DOMFloat32Array> AudioBuffer::getChannelData(
|
||||
unsigned channel_index,
|
||||
ExceptionState& exception_state) {
|
||||
diff --git a/third_party/blink/renderer/modules/webaudio/audio_buffer.h b/third_party/blink/renderer/modules/webaudio/audio_buffer.h
|
||||
--- a/third_party/blink/renderer/modules/webaudio/audio_buffer.h
|
||||
+++ b/third_party/blink/renderer/modules/webaudio/audio_buffer.h
|
||||
@@ -116,6 +116,8 @@ class MODULES_EXPORT AudioBuffer final : public ScriptWrappable {
|
||||
|
||||
std::unique_ptr<SharedAudioBuffer> CreateSharedAudioBuffer();
|
||||
|
||||
+ void ShuffleAudioData();
|
||||
+
|
||||
private:
|
||||
static DOMFloat32Array* CreateFloat32ArrayOrNull(
|
||||
uint32_t length,
|
||||
diff --git a/third_party/blink/renderer/modules/webaudio/audio_context.cc b/third_party/blink/renderer/modules/webaudio/audio_context.cc
|
||||
--- a/third_party/blink/renderer/modules/webaudio/audio_context.cc
|
||||
+++ b/third_party/blink/renderer/modules/webaudio/audio_context.cc
|
||||
@@ -17,6 +17,7 @@
|
||||
#include "third_party/blink/public/common/features.h"
|
||||
#include "third_party/blink/public/common/mediastream/media_devices.h"
|
||||
#include "third_party/blink/public/platform/browser_interface_broker_proxy.h"
|
||||
+#include "third_party/blink/public/common/features.h"
|
||||
#include "third_party/blink/public/platform/modules/webrtc/webrtc_logging.h"
|
||||
#include "third_party/blink/public/platform/web_audio_latency_hint.h"
|
||||
#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
|
||||
@@ -850,7 +851,9 @@ double AudioContext::baseLatency() const {
|
||||
DCHECK_CALLED_ON_VALID_SEQUENCE(main_thread_sequence_checker_);
|
||||
DCHECK(destination());
|
||||
|
||||
- return base_latency_;
|
||||
+ // remove precision past two decimal digits
|
||||
+ int l = base_latency_ * 100;
|
||||
+ return double(l)/100;
|
||||
}
|
||||
|
||||
double AudioContext::outputLatency() const {
|
||||
diff --git a/third_party/blink/renderer/modules/webaudio/base_audio_context.cc b/third_party/blink/renderer/modules/webaudio/base_audio_context.cc
|
||||
--- a/third_party/blink/renderer/modules/webaudio/base_audio_context.cc
|
||||
+++ b/third_party/blink/renderer/modules/webaudio/base_audio_context.cc
|
||||
@@ -29,6 +29,7 @@
|
||||
|
||||
#include "base/metrics/histogram_functions.h"
|
||||
#include "build/build_config.h"
|
||||
+#include "third_party/blink/public/common/features.h"
|
||||
#include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h"
|
||||
#include "third_party/blink/public/mojom/frame/lifecycle.mojom-shared.h"
|
||||
#include "third_party/blink/public/platform/platform.h"
|
||||
@@ -774,6 +775,17 @@ LocalDOMWindow* BaseAudioContext::GetWindow() const {
|
||||
return To<LocalDOMWindow>(GetExecutionContext());
|
||||
}
|
||||
|
||||
+/*static*/
|
||||
+float BaseAudioContext::ShuffleAudioData(float data, unsigned index) {
|
||||
+ if (base::FeatureList::IsEnabled(features::kAudioContextShuffleEnabled)) {
|
||||
+ float rnd = 1.0f +
|
||||
+ (base::RandDouble() / 10000.0) *
|
||||
+ (base::RandInt(0,10) > 5 ? 1.f : -1.f);
|
||||
+ return data * rnd;
|
||||
+ }
|
||||
+ return data;
|
||||
+}
|
||||
+
|
||||
void BaseAudioContext::NotifySourceNodeStartedProcessing(AudioNode* node) {
|
||||
DCHECK(IsMainThread());
|
||||
DeferredTaskHandler::GraphAutoLocker locker(this);
|
||||
diff --git a/third_party/blink/renderer/modules/webaudio/base_audio_context.h b/third_party/blink/renderer/modules/webaudio/base_audio_context.h
|
||||
--- a/third_party/blink/renderer/modules/webaudio/base_audio_context.h
|
||||
+++ b/third_party/blink/renderer/modules/webaudio/base_audio_context.h
|
||||
@@ -327,6 +327,8 @@ class MODULES_EXPORT BaseAudioContext
|
||||
// if the execution context does not exist.
|
||||
bool CheckExecutionContextAndThrowIfNecessary(ExceptionState&);
|
||||
|
||||
+ static float ShuffleAudioData(float data, unsigned index);
|
||||
+
|
||||
protected:
|
||||
enum class ContextType { kRealtimeContext, kOfflineContext };
|
||||
|
||||
diff --git a/third_party/blink/renderer/modules/webaudio/offline_audio_context.cc b/third_party/blink/renderer/modules/webaudio/offline_audio_context.cc
|
||||
--- a/third_party/blink/renderer/modules/webaudio/offline_audio_context.cc
|
||||
+++ b/third_party/blink/renderer/modules/webaudio/offline_audio_context.cc
|
||||
@@ -374,6 +374,7 @@ void OfflineAudioContext::FireCompletionEvent() {
|
||||
if (!rendered_buffer) {
|
||||
return;
|
||||
}
|
||||
+ rendered_buffer->ShuffleAudioData();
|
||||
|
||||
// Call the offline rendering completion event listener and resolve the
|
||||
// promise too.
|
||||
diff --git a/third_party/blink/renderer/modules/webaudio/realtime_analyser.cc b/third_party/blink/renderer/modules/webaudio/realtime_analyser.cc
|
||||
--- a/third_party/blink/renderer/modules/webaudio/realtime_analyser.cc
|
||||
+++ b/third_party/blink/renderer/modules/webaudio/realtime_analyser.cc
|
||||
@@ -32,6 +32,7 @@
|
||||
#include <complex>
|
||||
|
||||
#include "base/compiler_specific.h"
|
||||
+#include "third_party/blink/renderer/modules/webaudio/base_audio_context.h"
|
||||
#include "third_party/blink/renderer/platform/audio/audio_bus.h"
|
||||
#include "third_party/blink/renderer/platform/audio/audio_utilities.h"
|
||||
#include "third_party/blink/renderer/platform/audio/vector_math.h"
|
||||
@@ -117,7 +118,8 @@ void RealtimeAnalyser::GetFloatFrequencyData(DOMFloat32Array* destination_array,
|
||||
for (unsigned i = 0; i < len; ++i) {
|
||||
const float linear_value = UNSAFE_TODO(source[i]);
|
||||
const double db_mag = audio_utilities::LinearToDecibels(linear_value);
|
||||
- UNSAFE_TODO(destination[i]) = static_cast<float>(db_mag);
|
||||
+ auto v = static_cast<float>(db_mag);
|
||||
+ UNSAFE_TODO(destination[i]) = BaseAudioContext::ShuffleAudioData(v, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -155,9 +157,11 @@ void RealtimeAnalyser::GetByteFrequencyData(DOMUint8Array* destination_array,
|
||||
|
||||
// The range m_minDecibels to m_maxDecibels will be scaled to byte values
|
||||
// from 0 to UCHAR_MAX.
|
||||
- const double scaled_value =
|
||||
+ double scaled_value =
|
||||
UCHAR_MAX * (db_mag - min_decibels) * range_scale_factor;
|
||||
|
||||
+ scaled_value = BaseAudioContext::ShuffleAudioData(scaled_value, i);
|
||||
+
|
||||
// Clip to valid range.
|
||||
UNSAFE_TODO(destination[i]) =
|
||||
static_cast<unsigned char>(ClampTo(scaled_value, 0, UCHAR_MAX));
|
||||
@@ -188,6 +192,7 @@ void RealtimeAnalyser::GetFloatTimeDomainData(
|
||||
input_buffer[(i + write_index - fft_size + kInputBufferSize) %
|
||||
kInputBufferSize]);
|
||||
|
||||
+ value = BaseAudioContext::ShuffleAudioData(value, i);
|
||||
UNSAFE_TODO(destination[i]) = value;
|
||||
}
|
||||
}
|
||||
@@ -211,10 +216,12 @@ void RealtimeAnalyser::GetByteTimeDomainData(DOMUint8Array* destination_array) {
|
||||
|
||||
for (unsigned i = 0; i < len; ++i) {
|
||||
// Buffer access is protected due to modulo operation.
|
||||
- const float value = UNSAFE_TODO(
|
||||
+ float value = UNSAFE_TODO(
|
||||
input_buffer[(i + write_index - fft_size + kInputBufferSize) %
|
||||
kInputBufferSize]);
|
||||
|
||||
+ value = BaseAudioContext::ShuffleAudioData(value, i);
|
||||
+
|
||||
// Scale from nominal -1 -> +1 to unsigned byte.
|
||||
const double scaled_value = 128 * (value + 1);
|
||||
|
||||
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
|
||||
@@ -608,9 +608,8 @@
|
||||
{
|
||||
// AudioContext.playoutStats interface.
|
||||
// https://chromestatus.com/feature/5172818344148992
|
||||
- name: "AudioContextPlayoutStats",
|
||||
- origin_trial_feature_name: "AudioContextPlayoutStats",
|
||||
- status: "experimental",
|
||||
+ name: "AudioContextPlayoutStats", // keep AudioContextPlayoutStats
|
||||
+ status: "experimental", // experimental
|
||||
},
|
||||
{
|
||||
name: "AudioContextSetSinkId",
|
||||
--
|
||||
@@ -1,66 +0,0 @@
|
||||
From: csagan5 <32685696+csagan5@users.noreply.github.com>
|
||||
Date: Thu, 22 Mar 2018 22:11:57 +0100
|
||||
Subject: Battery API: return nothing
|
||||
|
||||
Include @thestinger's fix for correct charging/unknown values
|
||||
|
||||
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
|
||||
---
|
||||
.../modules/battery/battery_manager.cc | 26 +++----------------
|
||||
1 file changed, 4 insertions(+), 22 deletions(-)
|
||||
|
||||
diff --git a/third_party/blink/renderer/modules/battery/battery_manager.cc b/third_party/blink/renderer/modules/battery/battery_manager.cc
|
||||
--- a/third_party/blink/renderer/modules/battery/battery_manager.cc
|
||||
+++ b/third_party/blink/renderer/modules/battery/battery_manager.cc
|
||||
@@ -80,46 +80,28 @@ ScriptPromise<BatteryManager> BatteryManager::StartRequest(
|
||||
}
|
||||
|
||||
bool BatteryManager::charging() {
|
||||
- return battery_status_.Charging();
|
||||
+ return true;
|
||||
}
|
||||
|
||||
double BatteryManager::chargingTime() {
|
||||
- return battery_status_.charging_time().InSecondsF();
|
||||
+ return 0.0;
|
||||
}
|
||||
|
||||
double BatteryManager::dischargingTime() {
|
||||
- return battery_status_.discharging_time().InSecondsF();
|
||||
+ return std::numeric_limits<double>::infinity();
|
||||
}
|
||||
|
||||
double BatteryManager::level() {
|
||||
- return battery_status_.Level();
|
||||
+ return 1.0;
|
||||
}
|
||||
|
||||
void BatteryManager::DidUpdateData() {
|
||||
DCHECK(battery_property_);
|
||||
|
||||
- BatteryStatus old_status = battery_status_;
|
||||
- battery_status_ = *battery_dispatcher_->LatestData();
|
||||
-
|
||||
if (battery_property_->GetState() == BatteryProperty::kPending) {
|
||||
battery_property_->Resolve(this);
|
||||
return;
|
||||
}
|
||||
-
|
||||
- DCHECK(GetExecutionContext());
|
||||
- if (GetExecutionContext()->IsContextPaused() ||
|
||||
- GetExecutionContext()->IsContextDestroyed()) {
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- if (battery_status_.Charging() != old_status.Charging())
|
||||
- DispatchEvent(*Event::Create(event_type_names::kChargingchange));
|
||||
- if (battery_status_.charging_time() != old_status.charging_time())
|
||||
- DispatchEvent(*Event::Create(event_type_names::kChargingtimechange));
|
||||
- if (battery_status_.discharging_time() != old_status.discharging_time())
|
||||
- DispatchEvent(*Event::Create(event_type_names::kDischargingtimechange));
|
||||
- if (battery_status_.Level() != old_status.Level())
|
||||
- DispatchEvent(*Event::Create(event_type_names::kLevelchange));
|
||||
}
|
||||
|
||||
void BatteryManager::RegisterWithDispatcher() {
|
||||
--
|
||||
@@ -1,17 +0,0 @@
|
||||
From: Your Name <you@example.com>
|
||||
Date: Tue, 31 Oct 2023 16:16:08 +0000
|
||||
Subject: Block Intents While Locked
|
||||
|
||||
see https://source.chromium.org/chromium/chromium/src/+/c5b50f4c2d42e7b808fd3e6fb3545cdb3f4d82c9
|
||||
---
|
||||
.../chrome_feature_list_cc/Block-Intents-While-Locked.inc | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
create mode 100644 cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Block-Intents-While-Locked.inc
|
||||
|
||||
diff --git a/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Block-Intents-While-Locked.inc b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Block-Intents-While-Locked.inc
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Block-Intents-While-Locked.inc
|
||||
@@ -0,0 +1 @@
|
||||
+SET_CROMITE_FEATURE_ENABLED(kBlockIntentsWhileLocked);
|
||||
--
|
||||
@@ -1,274 +0,0 @@
|
||||
From: csagan5 <32685696+csagan5@users.noreply.github.com>
|
||||
Date: Tue, 28 Jul 2020 12:28:58 +0200
|
||||
Subject: Block gateway attacks via websockets
|
||||
|
||||
This approach is not comprehensive, see also:
|
||||
* https://bugs.chromium.org/p/chromium/issues/detail?id=590714
|
||||
|
||||
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
|
||||
---
|
||||
.../execution_context/execution_context.h | 1 +
|
||||
.../renderer/core/loader/base_fetch_context.h | 1 +
|
||||
.../core/loader/frame_fetch_context.cc | 20 ++++++++++++
|
||||
.../core/loader/frame_fetch_context.h | 1 +
|
||||
.../core/loader/worker_fetch_context.cc | 21 +++++++++++++
|
||||
.../core/loader/worker_fetch_context.h | 1 +
|
||||
.../core/workers/installed_scripts_manager.cc | 2 +-
|
||||
.../background_fetch_manager.cc | 31 +++++++++++++++++++
|
||||
.../websockets/websocket_channel_impl.cc | 5 +++
|
||||
.../modules/websockets/websocket_common.cc | 30 ++++++++++++++++++
|
||||
.../modules/websockets/websocket_common.h | 4 +++
|
||||
11 files changed, 116 insertions(+), 1 deletion(-)
|
||||
|
||||
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
|
||||
@@ -398,6 +398,7 @@ class CORE_EXPORT ExecutionContext : public Supplementable<ExecutionContext>,
|
||||
void SetAddressSpace(network::mojom::blink::IPAddressSpace ip_address_space);
|
||||
|
||||
HeapObserverList<ContextLifecycleObserver>& ContextLifecycleObserverSet();
|
||||
+ String addressSpaceForBindings() const;
|
||||
unsigned ContextLifecycleStateObserverCountForTesting() const;
|
||||
|
||||
// Implementation of WindowOrWorkerGlobalScope.crossOriginIsolated.
|
||||
diff --git a/third_party/blink/renderer/core/loader/base_fetch_context.h b/third_party/blink/renderer/core/loader/base_fetch_context.h
|
||||
--- a/third_party/blink/renderer/core/loader/base_fetch_context.h
|
||||
+++ b/third_party/blink/renderer/core/loader/base_fetch_context.h
|
||||
@@ -86,6 +86,7 @@ class CORE_EXPORT BaseFetchContext : public FetchContext {
|
||||
|
||||
virtual SubresourceFilter* GetSubresourceFilter() const = 0;
|
||||
virtual bool ShouldBlockWebSocketByMixedContentCheck(const KURL&) const = 0;
|
||||
+ virtual bool ShouldBlockGateWayAttacks(network::mojom::IPAddressSpace requestor_space, const KURL&) const = 0;
|
||||
virtual std::unique_ptr<WebSocketHandshakeThrottle>
|
||||
CreateWebSocketHandshakeThrottle() = 0;
|
||||
|
||||
diff --git a/third_party/blink/renderer/core/loader/frame_fetch_context.cc b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
|
||||
--- a/third_party/blink/renderer/core/loader/frame_fetch_context.cc
|
||||
+++ b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
|
||||
@@ -1120,6 +1120,26 @@ bool FrameFetchContext::ShouldBlockRequestByInspector(const KURL& url) const {
|
||||
return should_block_request;
|
||||
}
|
||||
|
||||
+bool FrameFetchContext::ShouldBlockGateWayAttacks(network::mojom::IPAddressSpace requestor_space, const KURL& request_url) const {
|
||||
+ // TODO(mkwst): This only checks explicit IP addresses. We'll have to move
|
||||
+ // all this up to //net and //content in order to have any real impact on
|
||||
+ // gateway attacks. That turns out to be a TON of work (crbug.com/378566).
|
||||
+ if (requestor_space == network::mojom::IPAddressSpace::kUnknown)
|
||||
+ requestor_space = network::mojom::IPAddressSpace::kPublic;
|
||||
+ network::mojom::IPAddressSpace target_space =
|
||||
+ network::mojom::IPAddressSpace::kPublic;
|
||||
+ if (network_utils::IsReservedIPAddress(request_url.Host()))
|
||||
+ target_space = network::mojom::IPAddressSpace::kLocal;
|
||||
+ if (SecurityOrigin::Create(request_url)->IsLocalhost())
|
||||
+ target_space = network::mojom::IPAddressSpace::kLocal;
|
||||
+
|
||||
+ bool is_external_request = requestor_space > target_space;
|
||||
+ if (is_external_request)
|
||||
+ return true;
|
||||
+
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
void FrameFetchContext::DispatchDidBlockRequest(
|
||||
const ResourceRequest& resource_request,
|
||||
const ResourceLoaderOptions& options,
|
||||
diff --git a/third_party/blink/renderer/core/loader/frame_fetch_context.h b/third_party/blink/renderer/core/loader/frame_fetch_context.h
|
||||
--- a/third_party/blink/renderer/core/loader/frame_fetch_context.h
|
||||
+++ b/third_party/blink/renderer/core/loader/frame_fetch_context.h
|
||||
@@ -191,6 +191,7 @@ class CORE_EXPORT FrameFetchContext final : public BaseFetchContext,
|
||||
bool ShouldBlockWebSocketByMixedContentCheck(const KURL&) const override;
|
||||
std::unique_ptr<WebSocketHandshakeThrottle> CreateWebSocketHandshakeThrottle()
|
||||
override;
|
||||
+ bool ShouldBlockGateWayAttacks(network::mojom::IPAddressSpace requestor_space, const KURL&) const override;
|
||||
bool ShouldBlockFetchByMixedContentCheck(
|
||||
mojom::blink::RequestContextType request_context,
|
||||
network::mojom::blink::IPAddressSpace target_address_space,
|
||||
diff --git a/third_party/blink/renderer/core/loader/worker_fetch_context.cc b/third_party/blink/renderer/core/loader/worker_fetch_context.cc
|
||||
--- a/third_party/blink/renderer/core/loader/worker_fetch_context.cc
|
||||
+++ b/third_party/blink/renderer/core/loader/worker_fetch_context.cc
|
||||
@@ -25,6 +25,7 @@
|
||||
#include "third_party/blink/renderer/platform/loader/fetch/url_loader/url_loader_factory.h"
|
||||
#include "third_party/blink/renderer/platform/loader/fetch/worker_resource_timing_notifier.h"
|
||||
#include "third_party/blink/renderer/platform/network/network_state_notifier.h"
|
||||
+#include "third_party/blink/renderer/platform/network/network_utils.h"
|
||||
#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
|
||||
#include "third_party/blink/renderer/platform/scheduler/public/virtual_time_controller.h"
|
||||
#include "third_party/blink/renderer/platform/supplementable.h"
|
||||
@@ -90,6 +91,26 @@ bool WorkerFetchContext::ShouldBlockRequestByInspector(const KURL& url) const {
|
||||
return should_block_request;
|
||||
}
|
||||
|
||||
+bool WorkerFetchContext::ShouldBlockGateWayAttacks(network::mojom::IPAddressSpace requestor_space, const KURL& request_url) const {
|
||||
+ // TODO(mkwst): This only checks explicit IP addresses. We'll have to move
|
||||
+ // all this up to //net and //content in order to have any real impact on
|
||||
+ // gateway attacks. That turns out to be a TON of work (crbug.com/378566).
|
||||
+ if (requestor_space == network::mojom::IPAddressSpace::kUnknown)
|
||||
+ requestor_space = network::mojom::IPAddressSpace::kPublic;
|
||||
+ network::mojom::IPAddressSpace target_space =
|
||||
+ network::mojom::IPAddressSpace::kPublic;
|
||||
+ if (network_utils::IsReservedIPAddress(request_url.Host()))
|
||||
+ target_space = network::mojom::IPAddressSpace::kLocal;
|
||||
+ if (SecurityOrigin::Create(request_url)->IsLocalhost())
|
||||
+ target_space = network::mojom::IPAddressSpace::kLocal;
|
||||
+
|
||||
+ bool is_external_request = requestor_space > target_space;
|
||||
+ if (is_external_request)
|
||||
+ return true;
|
||||
+
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
void WorkerFetchContext::DispatchDidBlockRequest(
|
||||
const ResourceRequest& resource_request,
|
||||
const ResourceLoaderOptions& options,
|
||||
diff --git a/third_party/blink/renderer/core/loader/worker_fetch_context.h b/third_party/blink/renderer/core/loader/worker_fetch_context.h
|
||||
--- a/third_party/blink/renderer/core/loader/worker_fetch_context.h
|
||||
+++ b/third_party/blink/renderer/core/loader/worker_fetch_context.h
|
||||
@@ -62,6 +62,7 @@ class WorkerFetchContext final : public BaseFetchContext {
|
||||
bool ShouldBlockWebSocketByMixedContentCheck(const KURL&) const override;
|
||||
std::unique_ptr<WebSocketHandshakeThrottle> CreateWebSocketHandshakeThrottle()
|
||||
override;
|
||||
+ bool ShouldBlockGateWayAttacks(network::mojom::IPAddressSpace requestor_space, const KURL&) const override;
|
||||
bool ShouldBlockFetchByMixedContentCheck(
|
||||
mojom::blink::RequestContextType request_context,
|
||||
network::mojom::blink::IPAddressSpace target_address_space,
|
||||
diff --git a/third_party/blink/renderer/core/workers/installed_scripts_manager.cc b/third_party/blink/renderer/core/workers/installed_scripts_manager.cc
|
||||
--- a/third_party/blink/renderer/core/workers/installed_scripts_manager.cc
|
||||
+++ b/third_party/blink/renderer/core/workers/installed_scripts_manager.cc
|
||||
@@ -35,7 +35,7 @@ InstalledScriptsManager::ScriptData::ScriptData(
|
||||
if (network_utils::IsReservedIPAddress(script_url_.Host()))
|
||||
response_address_space_ = network::mojom::IPAddressSpace::kLocal;
|
||||
if (SecurityOrigin::Create(script_url_)->IsLocalhost())
|
||||
- response_address_space_ = network::mojom::IPAddressSpace::kLoopback;
|
||||
+ response_address_space_ = network::mojom::IPAddressSpace::kLocal;
|
||||
}
|
||||
|
||||
ContentSecurityPolicyResponseHeaders
|
||||
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_manager.cc b/third_party/blink/renderer/modules/background_fetch/background_fetch_manager.cc
|
||||
--- a/third_party/blink/renderer/modules/background_fetch/background_fetch_manager.cc
|
||||
+++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_manager.cc
|
||||
@@ -104,6 +104,30 @@ bool ShouldBlockDanglingMarkup(const KURL& request_url) {
|
||||
request_url.ProtocolIsInHTTPFamily();
|
||||
}
|
||||
|
||||
+bool ShouldBlockGateWayAttacks(ExecutionContext* execution_context,
|
||||
+ const KURL& request_url) {
|
||||
+ network::mojom::IPAddressSpace requestor_space =
|
||||
+ execution_context->AddressSpace();
|
||||
+ if (requestor_space == network::mojom::IPAddressSpace::kUnknown)
|
||||
+ requestor_space = network::mojom::IPAddressSpace::kPublic;
|
||||
+
|
||||
+ // TODO(mkwst): This only checks explicit IP addresses. We'll have to move
|
||||
+ // all this up to //net and //content in order to have any real impact on
|
||||
+ // gateway attacks. That turns out to be a TON of work (crbug.com/378566).
|
||||
+ network::mojom::IPAddressSpace target_space =
|
||||
+ network::mojom::IPAddressSpace::kPublic;
|
||||
+ if (network_utils::IsReservedIPAddress(request_url.Host()))
|
||||
+ target_space = network::mojom::IPAddressSpace::kLocal;
|
||||
+ if (SecurityOrigin::Create(request_url)->IsLocalhost())
|
||||
+ target_space = network::mojom::IPAddressSpace::kLocal;
|
||||
+
|
||||
+ bool is_external_request = requestor_space > target_space;
|
||||
+ if (is_external_request)
|
||||
+ return true;
|
||||
+
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
scoped_refptr<BlobDataHandle> ExtractBlobHandle(
|
||||
Request* request,
|
||||
ExceptionState& exception_state) {
|
||||
@@ -191,6 +215,13 @@ ScriptPromise<BackgroundFetchRegistration> BackgroundFetchManager::fetch(
|
||||
exception_state);
|
||||
}
|
||||
|
||||
+ if (ShouldBlockGateWayAttacks(execution_context, request_url)) {
|
||||
+ return RejectWithTypeError(script_state, request_url,
|
||||
+ "Requestor IP address space doesn't match the "
|
||||
+ "target address space.",
|
||||
+ exception_state);
|
||||
+ }
|
||||
+
|
||||
if (ShouldBlockPort(request_url)) {
|
||||
return RejectWithTypeError(script_state, request_url,
|
||||
"that port is not allowed", exception_state);
|
||||
diff --git a/third_party/blink/renderer/modules/websockets/websocket_channel_impl.cc b/third_party/blink/renderer/modules/websockets/websocket_channel_impl.cc
|
||||
--- a/third_party/blink/renderer/modules/websockets/websocket_channel_impl.cc
|
||||
+++ b/third_party/blink/renderer/modules/websockets/websocket_channel_impl.cc
|
||||
@@ -288,6 +288,11 @@ bool WebSocketChannelImpl::Connect(const KURL& url, const String& protocol) {
|
||||
return false;
|
||||
}
|
||||
|
||||
+ if (GetBaseFetchContext()->ShouldBlockGateWayAttacks(execution_context_->AddressSpace(), url)) {
|
||||
+ has_initiated_opening_handshake_ = false;
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
if (auto* scheduler = execution_context_->GetScheduler()) {
|
||||
// Two features are registered here:
|
||||
// - `kWebSocket`: a non-sticky feature that will disable BFCache for any
|
||||
diff --git a/third_party/blink/renderer/modules/websockets/websocket_common.cc b/third_party/blink/renderer/modules/websockets/websocket_common.cc
|
||||
--- a/third_party/blink/renderer/modules/websockets/websocket_common.cc
|
||||
+++ b/third_party/blink/renderer/modules/websockets/websocket_common.cc
|
||||
@@ -139,9 +139,39 @@ WebSocketCommon::ConnectResult WebSocketCommon::Connect(
|
||||
return ConnectResult::kException;
|
||||
}
|
||||
|
||||
+ network::mojom::IPAddressSpace requestor_space =
|
||||
+ execution_context->AddressSpace();
|
||||
+ if (ShouldBlockGateWayAttacks(requestor_space, url_)) {
|
||||
+ state_ = kClosed;
|
||||
+ exception_state.ThrowSecurityError(
|
||||
+ "Access to address of '" + url_.Host() +
|
||||
+ "' is not allowed from current address space.");
|
||||
+ return ConnectResult::kException;
|
||||
+ }
|
||||
+
|
||||
return ConnectResult::kSuccess;
|
||||
}
|
||||
|
||||
+bool WebSocketCommon::ShouldBlockGateWayAttacks(network::mojom::IPAddressSpace requestor_space, const KURL& request_url) const {
|
||||
+ // TODO(mkwst): This only checks explicit IP addresses. We'll have to move
|
||||
+ // all this up to //net and //content in order to have any real impact on
|
||||
+ // gateway attacks. That turns out to be a TON of work (crbug.com/378566).
|
||||
+ if (requestor_space == network::mojom::IPAddressSpace::kUnknown)
|
||||
+ requestor_space = network::mojom::IPAddressSpace::kPublic;
|
||||
+ network::mojom::IPAddressSpace target_space =
|
||||
+ network::mojom::IPAddressSpace::kPublic;
|
||||
+ if (network_utils::IsReservedIPAddress(request_url.Host()))
|
||||
+ target_space = network::mojom::IPAddressSpace::kLocal;
|
||||
+ if (SecurityOrigin::Create(request_url)->IsLocalhost())
|
||||
+ target_space = network::mojom::IPAddressSpace::kLocal;
|
||||
+
|
||||
+ bool is_external_request = requestor_space > target_space;
|
||||
+ if (is_external_request)
|
||||
+ return true;
|
||||
+
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
void WebSocketCommon::CloseInternal(std::optional<uint16_t> code,
|
||||
const String& reason,
|
||||
WebSocketChannel* channel,
|
||||
diff --git a/third_party/blink/renderer/modules/websockets/websocket_common.h b/third_party/blink/renderer/modules/websockets/websocket_common.h
|
||||
--- a/third_party/blink/renderer/modules/websockets/websocket_common.h
|
||||
+++ b/third_party/blink/renderer/modules/websockets/websocket_common.h
|
||||
@@ -11,6 +11,8 @@
|
||||
|
||||
#include <optional>
|
||||
|
||||
+#include "services/network/public/mojom/ip_address_space.mojom.h"
|
||||
+#include "third_party/blink/renderer/platform/network/network_utils.h"
|
||||
#include "third_party/blink/renderer/modules/modules_export.h"
|
||||
#include "third_party/blink/renderer/platform/weborigin/kurl.h"
|
||||
#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
|
||||
@@ -58,6 +60,8 @@ class MODULES_EXPORT WebSocketCommon {
|
||||
void SetState(State state) { state_ = state; }
|
||||
const KURL& Url() const { return url_; }
|
||||
|
||||
+ bool ShouldBlockGateWayAttacks(network::mojom::IPAddressSpace requestor_space, const KURL& url) const;
|
||||
+
|
||||
// The following methods are public for testing.
|
||||
|
||||
// Returns true if |protocol| is a valid WebSocket subprotocol name.
|
||||
--
|
||||
@@ -1,147 +0,0 @@
|
||||
From: uazo <uazo@users.noreply.github.com>
|
||||
Date: Sat, 21 Sep 2024 14:36:25 +0000
|
||||
Subject: Block leakage of urls in sandbox iframes
|
||||
|
||||
Preventing url base fallback leakage in cross orgin sandbox iframe.
|
||||
Addition of the ""block-url-leakage-sandbox-iframe" flag disabled by default.
|
||||
DO NOT ACTIVATE: the patch is a wip
|
||||
The aim is to understand whether it is possible to disable the
|
||||
leakage of certain information in sandbox iframes
|
||||
|
||||
License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
|
||||
---
|
||||
.../browser/renderer_host/render_frame_host_impl.cc | 12 +++++++++++-
|
||||
.../Block-url-leakage-sandbox-iframe.inc | 8 ++++++++
|
||||
.../Block-url-leakage-sandbox-iframe.inc | 3 +++
|
||||
.../features_h/Block-url-leakage-sandbox-iframe.inc | 1 +
|
||||
third_party/blink/renderer/core/frame/location.cc | 13 +++++++++++++
|
||||
.../blink/renderer/core/loader/document_loader.cc | 12 ++++++++++++
|
||||
.../blink/renderer/core/loader/document_loader.h | 2 +-
|
||||
7 files changed, 49 insertions(+), 2 deletions(-)
|
||||
create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Block-url-leakage-sandbox-iframe.inc
|
||||
create mode 100644 cromite_flags/third_party/blink/common/features_cc/Block-url-leakage-sandbox-iframe.inc
|
||||
create mode 100644 cromite_flags/third_party/blink/common/features_h/Block-url-leakage-sandbox-iframe.inc
|
||||
|
||||
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
|
||||
@@ -5151,7 +5151,17 @@ void RenderFrameHostImpl::SetLastCommittedOrigin(
|
||||
}
|
||||
|
||||
void RenderFrameHostImpl::SetInheritedBaseUrl(const GURL& inherited_base_url) {
|
||||
- inherited_base_url_ = inherited_base_url;
|
||||
+ // we only inherit the base url if there's no sandbox,
|
||||
+ // or if there is a sandbox but it has 'allow-same-origin'.
|
||||
+ // See https://github.com/whatwg/html/issues/9025.
|
||||
+ bool sandbox_flags_dont_exist_or_dont_include_allow_same_origin =
|
||||
+ base::FeatureList::IsEnabled(blink::features::kBlockUrlLeakageSandboxIframe) &&
|
||||
+ (!policy_container_host_ ||
|
||||
+ (active_sandbox_flags() & network::mojom::WebSandboxFlags::kOrigin) ==
|
||||
+ network::mojom::WebSandboxFlags::kNone);
|
||||
+ if (sandbox_flags_dont_exist_or_dont_include_allow_same_origin) {
|
||||
+ inherited_base_url_ = inherited_base_url;
|
||||
+ }
|
||||
}
|
||||
|
||||
void RenderFrameHostImpl::SetLastCommittedOriginForTesting(
|
||||
diff --git a/cromite_flags/chrome/browser/about_flags_cc/Block-url-leakage-sandbox-iframe.inc b/cromite_flags/chrome/browser/about_flags_cc/Block-url-leakage-sandbox-iframe.inc
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/cromite_flags/chrome/browser/about_flags_cc/Block-url-leakage-sandbox-iframe.inc
|
||||
@@ -0,0 +1,8 @@
|
||||
+#ifdef FLAG_SECTION
|
||||
+
|
||||
+ {"block-url-leakage-sandbox-iframe",
|
||||
+ "Block leakage of urls in sandbox iframes",
|
||||
+ "Block leakage for referrer, base url and ancestorOrigins in iframe with sandbox.", kOsAll,
|
||||
+ FEATURE_VALUE_TYPE(blink::features::kBlockUrlLeakageSandboxIframe)},
|
||||
+
|
||||
+#endif
|
||||
diff --git a/cromite_flags/third_party/blink/common/features_cc/Block-url-leakage-sandbox-iframe.inc b/cromite_flags/third_party/blink/common/features_cc/Block-url-leakage-sandbox-iframe.inc
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/cromite_flags/third_party/blink/common/features_cc/Block-url-leakage-sandbox-iframe.inc
|
||||
@@ -0,0 +1,3 @@
|
||||
+CROMITE_FEATURE(kBlockUrlLeakageSandboxIframe,
|
||||
+ "BlockUrlLeakageSandboxIframe",
|
||||
+ base::FEATURE_DISABLED_BY_DEFAULT);
|
||||
diff --git a/cromite_flags/third_party/blink/common/features_h/Block-url-leakage-sandbox-iframe.inc b/cromite_flags/third_party/blink/common/features_h/Block-url-leakage-sandbox-iframe.inc
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/cromite_flags/third_party/blink/common/features_h/Block-url-leakage-sandbox-iframe.inc
|
||||
@@ -0,0 +1 @@
|
||||
+BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kBlockUrlLeakageSandboxIframe);
|
||||
diff --git a/third_party/blink/renderer/core/frame/location.cc b/third_party/blink/renderer/core/frame/location.cc
|
||||
--- a/third_party/blink/renderer/core/frame/location.cc
|
||||
+++ b/third_party/blink/renderer/core/frame/location.cc
|
||||
@@ -28,6 +28,7 @@
|
||||
|
||||
#include "third_party/blink/renderer/core/frame/location.h"
|
||||
|
||||
+#include "third_party/blink/public/common/features.h"
|
||||
#include "third_party/blink/renderer/bindings/core/v8/binding_security.h"
|
||||
#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
|
||||
#include "third_party/blink/renderer/core/dom/document.h"
|
||||
@@ -126,8 +127,20 @@ DOMStringList* Location::ancestorOrigins() const {
|
||||
auto* origins = MakeGarbageCollected<DOMStringList>();
|
||||
if (!IsAttached())
|
||||
return origins;
|
||||
+ if (base::FeatureList::IsEnabled(blink::features::kBlockUrlLeakageSandboxIframe)
|
||||
+ && dom_window_->GetFrame()->GetSecurityContext()->IsSandboxed(
|
||||
+ network::mojom::WebSandboxFlags::kOrigin)) {
|
||||
+ // not allow any value for sandboxed frames
|
||||
+ return origins;
|
||||
+ }
|
||||
for (Frame* frame = dom_window_->GetFrame()->Tree().Parent(); frame;
|
||||
frame = frame->Tree().Parent()) {
|
||||
+ if (base::FeatureList::IsEnabled(blink::features::kBlockUrlLeakageSandboxIframe)
|
||||
+ && frame->GetSecurityContext()->IsSandboxed(
|
||||
+ network::mojom::WebSandboxFlags::kOrigin)) {
|
||||
+ // blocks at first sandbox frame
|
||||
+ break;
|
||||
+ }
|
||||
origins->Append(
|
||||
frame->GetSecurityContext()->GetSecurityOrigin()->ToString());
|
||||
}
|
||||
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc
|
||||
--- a/third_party/blink/renderer/core/loader/document_loader.cc
|
||||
+++ b/third_party/blink/renderer/core/loader/document_loader.cc
|
||||
@@ -836,6 +836,11 @@ WebString DocumentLoader::HttpMethod() const {
|
||||
}
|
||||
|
||||
const AtomicString& DocumentLoader::GetReferrer() const {
|
||||
+ if (base::FeatureList::IsEnabled(features::kBlockUrlLeakageSandboxIframe)
|
||||
+ && frame_->DomWindow()->GetSecurityContext().IsSandboxed(
|
||||
+ network::mojom::WebSandboxFlags::kOrigin)) {
|
||||
+ return g_null_atom;
|
||||
+ }
|
||||
return referrer_;
|
||||
}
|
||||
|
||||
@@ -2916,6 +2921,13 @@ void DocumentLoader::CommitNavigation() {
|
||||
response_.HttpHeaderField(http_names::kDocumentPolicyReportOnly));
|
||||
}
|
||||
|
||||
+ if (base::FeatureList::IsEnabled(features::kBlockUrlLeakageSandboxIframe) &&
|
||||
+ frame_->DomWindow()->GetSecurityContext().IsSandboxed(
|
||||
+ network::mojom::WebSandboxFlags::kOrigin)) {
|
||||
+ // If an frame is sandboxed don't give it an inherited base url.
|
||||
+ fallback_base_url_ = KURL();
|
||||
+ }
|
||||
+
|
||||
navigation_scroll_allowed_ = !frame_->DomWindow()->IsFeatureEnabled(
|
||||
mojom::blink::DocumentPolicyFeature::kForceLoadAtTop);
|
||||
|
||||
diff --git a/third_party/blink/renderer/core/loader/document_loader.h b/third_party/blink/renderer/core/loader/document_loader.h
|
||||
--- a/third_party/blink/renderer/core/loader/document_loader.h
|
||||
+++ b/third_party/blink/renderer/core/loader/document_loader.h
|
||||
@@ -773,7 +773,7 @@ class CORE_EXPORT DocumentLoader : public GarbageCollected<DocumentLoader>,
|
||||
// |archive_|, but won't have |loading_main_document_from_mhtml_archive_| set.
|
||||
bool loading_main_document_from_mhtml_archive_ = false;
|
||||
const bool loading_srcdoc_ = false;
|
||||
- const KURL fallback_base_url_;
|
||||
+ KURL fallback_base_url_; // Non-const for sandbox overrides.
|
||||
const bool loading_url_as_empty_document_ = false;
|
||||
const bool is_static_data_ = false;
|
||||
CommitReason commit_reason_ = CommitReason::kRegular;
|
||||
--
|
||||
@@ -1,277 +0,0 @@
|
||||
From: csagan5 <32685696+csagan5@users.noreply.github.com>
|
||||
Date: Wed, 30 Oct 2019 11:50:13 +0100
|
||||
Subject: Block 'qjz9zk' or 'trk:' requests
|
||||
|
||||
An info bar is displayed unless the --disable-trkbar command-line flag or the chrome://flag option is used.
|
||||
This patch is based on Iridium's 'net: add "trk:" scheme and help identify URLs being retrieved'
|
||||
|
||||
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
|
||||
---
|
||||
.../chrome_autocomplete_scheme_classifier.cc | 1 +
|
||||
chrome/browser/history/history_utils.cc | 1 +
|
||||
chrome/browser/ui/singleton_tabs.cc | 5 ++++
|
||||
.../omnibox/browser/autocomplete_input.cc | 8 ++++-
|
||||
components/url_formatter/url_fixer.cc | 4 +++
|
||||
.../child_process_security_policy_impl.cc | 1 +
|
||||
net/BUILD.gn | 2 ++
|
||||
net/url_request/trk_protocol_handler.cc | 25 ++++++++++++++++
|
||||
net/url_request/trk_protocol_handler.h | 30 +++++++++++++++++++
|
||||
net/url_request/url_request.cc | 8 +++++
|
||||
.../url_request_context_builder.cc | 3 ++
|
||||
url/url_constants.h | 1 +
|
||||
url/url_util.cc | 2 ++
|
||||
13 files changed, 90 insertions(+), 1 deletion(-)
|
||||
create mode 100644 net/url_request/trk_protocol_handler.cc
|
||||
create mode 100644 net/url_request/trk_protocol_handler.h
|
||||
|
||||
diff --git a/chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc b/chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc
|
||||
--- a/chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc
|
||||
+++ b/chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc
|
||||
@@ -72,6 +72,7 @@ ChromeAutocompleteSchemeClassifier::GetInputTypeForScheme(
|
||||
if (base::IsStringASCII(scheme) &&
|
||||
(ProfileIOData::IsHandledProtocol(scheme) ||
|
||||
base::EqualsCaseInsensitiveASCII(scheme, content::kViewSourceScheme) ||
|
||||
+ base::EqualsCaseInsensitiveASCII(scheme, url::kTraceScheme) ||
|
||||
base::EqualsCaseInsensitiveASCII(scheme, url::kJavaScriptScheme) ||
|
||||
base::EqualsCaseInsensitiveASCII(scheme, url::kDataScheme))) {
|
||||
return metrics::OmniboxInputType::URL;
|
||||
diff --git a/chrome/browser/history/history_utils.cc b/chrome/browser/history/history_utils.cc
|
||||
--- a/chrome/browser/history/history_utils.cc
|
||||
+++ b/chrome/browser/history/history_utils.cc
|
||||
@@ -22,6 +22,7 @@ bool CanAddURLToHistory(const GURL& url) {
|
||||
url.SchemeIs(content::kChromeUIScheme) ||
|
||||
url.SchemeIs(content::kChromeUIUntrustedScheme) ||
|
||||
url.SchemeIs(content::kViewSourceScheme) ||
|
||||
+ url.SchemeIs(url::kTraceScheme) ||
|
||||
url.SchemeIs(chrome::kChromeNativeScheme) ||
|
||||
url.SchemeIs(chrome::kChromeSearchScheme) ||
|
||||
url.SchemeIs(dom_distiller::kDomDistillerScheme))
|
||||
diff --git a/chrome/browser/ui/singleton_tabs.cc b/chrome/browser/ui/singleton_tabs.cc
|
||||
--- a/chrome/browser/ui/singleton_tabs.cc
|
||||
+++ b/chrome/browser/ui/singleton_tabs.cc
|
||||
@@ -141,6 +141,11 @@ int GetIndexOfExistingTab(BrowserWindowInterface* browser,
|
||||
continue;
|
||||
}
|
||||
|
||||
+ // trk: URLs must not be rewritten
|
||||
+ if (tab_url.SchemeIs(url::kTraceScheme)) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
GURL rewritten_tab_url = tab_url;
|
||||
content::BrowserURLHandler::GetInstance()->RewriteURLIfNecessary(
|
||||
&rewritten_tab_url, browser->GetProfile());
|
||||
diff --git a/components/omnibox/browser/autocomplete_input.cc b/components/omnibox/browser/autocomplete_input.cc
|
||||
--- a/components/omnibox/browser/autocomplete_input.cc
|
||||
+++ b/components/omnibox/browser/autocomplete_input.cc
|
||||
@@ -92,10 +92,15 @@ void OffsetComponentsExcludingScheme(url::Parsed* parts, int offset) {
|
||||
bool HasScheme(const std::u16string& input, const char* scheme) {
|
||||
std::string utf8_input(base::UTF16ToUTF8(input));
|
||||
url::Component view_source_scheme;
|
||||
+
|
||||
+ if (url::FindAndCompareScheme(utf8_input, url::kTraceScheme, &view_source_scheme)) {
|
||||
+ return false;
|
||||
+ }
|
||||
if (url::FindAndCompareScheme(utf8_input, kViewSourceScheme,
|
||||
&view_source_scheme)) {
|
||||
utf8_input.erase(0, view_source_scheme.end() + 1);
|
||||
}
|
||||
+
|
||||
return url::FindAndCompareScheme(utf8_input, scheme, nullptr);
|
||||
}
|
||||
|
||||
@@ -578,7 +583,8 @@ void AutocompleteInput::ParseForEmphasizeComponents(
|
||||
// For the view-source and blob schemes, we should emphasize the host of the
|
||||
// URL qualified by the view-source or blob prefix.
|
||||
if ((base::EqualsCaseInsensitiveASCII(scheme_str, kViewSourceScheme) ||
|
||||
- base::EqualsCaseInsensitiveASCII(scheme_str, url::kBlobScheme)) &&
|
||||
+ base::EqualsCaseInsensitiveASCII(scheme_str, url::kBlobScheme) ||
|
||||
+ base::EqualsCaseInsensitiveASCII(scheme_str, url::kTraceScheme)) &&
|
||||
(static_cast<int>(text.length()) > after_scheme_and_colon)) {
|
||||
// Obtain the URL prefixed by view-source or blob and parse it.
|
||||
std::u16string real_url(text.substr(after_scheme_and_colon));
|
||||
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
|
||||
@@ -598,6 +598,10 @@ GURL FixupURLInternal(const std::string& text,
|
||||
}
|
||||
}
|
||||
|
||||
+ if (scheme == url::kTraceScheme) {
|
||||
+ return GURL();
|
||||
+ }
|
||||
+
|
||||
// We handle the file scheme separately.
|
||||
if (scheme == url::kFileScheme) {
|
||||
return GURL(parts.scheme.is_valid() ? text : FixupPath(text));
|
||||
diff --git a/content/browser/child_process_security_policy_impl.cc b/content/browser/child_process_security_policy_impl.cc
|
||||
--- a/content/browser/child_process_security_policy_impl.cc
|
||||
+++ b/content/browser/child_process_security_policy_impl.cc
|
||||
@@ -969,6 +969,7 @@ ChildProcessSecurityPolicyImpl::ChildProcessSecurityPolicyImpl()
|
||||
RegisterPseudoScheme(url::kJavaScriptScheme);
|
||||
RegisterPseudoScheme(kViewSourceScheme);
|
||||
RegisterPseudoScheme(kGoogleChromeScheme);
|
||||
+ RegisterWebSafeScheme(url::kTraceScheme);
|
||||
}
|
||||
|
||||
ChildProcessSecurityPolicyImpl::~ChildProcessSecurityPolicyImpl() = default;
|
||||
diff --git a/net/BUILD.gn b/net/BUILD.gn
|
||||
--- a/net/BUILD.gn
|
||||
+++ b/net/BUILD.gn
|
||||
@@ -1142,6 +1142,8 @@ component("net") {
|
||||
"url_request/url_request_http_job.cc",
|
||||
"url_request/url_request_http_job.h",
|
||||
"url_request/url_request_interceptor.cc",
|
||||
+ "url_request/trk_protocol_handler.cc",
|
||||
+ "url_request/trk_protocol_handler.h",
|
||||
"url_request/url_request_interceptor.h",
|
||||
"url_request/url_request_job.cc",
|
||||
"url_request/url_request_job.h",
|
||||
diff --git a/net/url_request/trk_protocol_handler.cc b/net/url_request/trk_protocol_handler.cc
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/net/url_request/trk_protocol_handler.cc
|
||||
@@ -0,0 +1,25 @@
|
||||
+// Copyright (c) 2018 The ungoogled-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.
|
||||
+
|
||||
+#include "net/url_request/trk_protocol_handler.h"
|
||||
+
|
||||
+#include "base/logging.h"
|
||||
+#include "net/base/net_errors.h"
|
||||
+#include "net/url_request/url_request_error_job.h"
|
||||
+
|
||||
+namespace net {
|
||||
+
|
||||
+TrkProtocolHandler::TrkProtocolHandler() = default;
|
||||
+
|
||||
+std::unique_ptr<URLRequestJob> TrkProtocolHandler::CreateJob(
|
||||
+ URLRequest* request) const {
|
||||
+ LOG(ERROR) << "Blocked URL in TrkProtocolHandler: " << request->original_url();
|
||||
+ return std::make_unique<URLRequestErrorJob>(request, ERR_BLOCKED_BY_CLIENT);
|
||||
+}
|
||||
+
|
||||
+bool TrkProtocolHandler::IsSafeRedirectTarget(const GURL& location) const {
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
+} // namespace net
|
||||
diff --git a/net/url_request/trk_protocol_handler.h b/net/url_request/trk_protocol_handler.h
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/net/url_request/trk_protocol_handler.h
|
||||
@@ -0,0 +1,30 @@
|
||||
+// Copyright (c) 2018 The ungoogled-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.
|
||||
+
|
||||
+#ifndef NET_URL_REQUEST_TRK_PROTOCOL_HANDLER_H_
|
||||
+#define NET_URL_REQUEST_TRK_PROTOCOL_HANDLER_H_
|
||||
+
|
||||
+#include "base/compiler_specific.h"
|
||||
+#include "net/base/net_export.h"
|
||||
+#include "net/url_request/url_request_job_factory.h"
|
||||
+
|
||||
+namespace net {
|
||||
+
|
||||
+class URLRequestJob;
|
||||
+
|
||||
+// Implements a ProtocolHandler for Trk jobs.
|
||||
+class NET_EXPORT TrkProtocolHandler
|
||||
+ : public URLRequestJobFactory::ProtocolHandler {
|
||||
+ public:
|
||||
+ TrkProtocolHandler(const TrkProtocolHandler&) = delete;
|
||||
+ TrkProtocolHandler& operator=(const TrkProtocolHandler&) = delete;
|
||||
+
|
||||
+ TrkProtocolHandler();
|
||||
+ std::unique_ptr<URLRequestJob> CreateJob(URLRequest* request) const override;
|
||||
+ bool IsSafeRedirectTarget(const GURL& location) const override;
|
||||
+};
|
||||
+
|
||||
+} // namespace net
|
||||
+
|
||||
+#endif // NET_URL_REQUEST_TRK_PROTOCOL_HANDLER_H_
|
||||
diff --git a/net/url_request/url_request.cc b/net/url_request/url_request.cc
|
||||
--- a/net/url_request/url_request.cc
|
||||
+++ b/net/url_request/url_request.cc
|
||||
@@ -15,6 +15,7 @@
|
||||
#include "base/notreached.h"
|
||||
#include "base/rand_util.h"
|
||||
#include "base/strings/utf_string_conversions.h"
|
||||
+#include "base/strings/string_util.h"
|
||||
#include "base/synchronization/lock.h"
|
||||
#include "base/task/single_thread_task_runner.h"
|
||||
#include "base/types/optional_util.h"
|
||||
@@ -55,6 +56,7 @@
|
||||
#include "net/url_request/url_request_redirect_job.h"
|
||||
#include "url/gurl.h"
|
||||
#include "url/origin.h"
|
||||
+#include "url/url_constants.h"
|
||||
|
||||
namespace net {
|
||||
|
||||
@@ -650,6 +652,12 @@ URLRequest::URLRequest(base::PassKey<URLRequestContext> pass_key,
|
||||
// Sanity check out environment.
|
||||
DCHECK(base::SingleThreadTaskRunner::HasCurrentDefault());
|
||||
|
||||
+ if (!url.SchemeIs(url::kTraceScheme) &&
|
||||
+ base::EndsWith(url.host(), "qjz9zk", base::CompareCase::INSENSITIVE_ASCII)) {
|
||||
+ LOG(ERROR) << "Block URL in URLRequest: " << url;
|
||||
+ url_chain_[0] = GURL(url::kTraceScheme + (":" + url.possibly_invalid_spec()));
|
||||
+ }
|
||||
+
|
||||
context->url_requests()->insert(this);
|
||||
net_log_.BeginEvent(NetLogEventType::REQUEST_ALIVE,
|
||||
[&](NetLogCaptureMode capture_mode) {
|
||||
diff --git a/net/url_request/url_request_context_builder.cc b/net/url_request/url_request_context_builder.cc
|
||||
--- a/net/url_request/url_request_context_builder.cc
|
||||
+++ b/net/url_request/url_request_context_builder.cc
|
||||
@@ -55,6 +55,7 @@
|
||||
#include "net/socket/network_binding_client_socket_factory.h"
|
||||
#include "net/ssl/ssl_config_service_defaults.h"
|
||||
#include "net/url_request/static_http_user_agent_settings.h"
|
||||
+#include "net/url_request/trk_protocol_handler.h"
|
||||
#include "net/url_request/url_request_context.h"
|
||||
#include "net/url_request/url_request_job_factory.h"
|
||||
#include "url/url_constants.h"
|
||||
@@ -619,6 +620,8 @@ std::unique_ptr<URLRequestContext> URLRequestContextBuilder::Build() {
|
||||
job_factory->SetProtocolHandler(scheme_handler.first,
|
||||
std::move(scheme_handler.second));
|
||||
}
|
||||
+ job_factory->SetProtocolHandler(url::kTraceScheme,
|
||||
+ std::make_unique<TrkProtocolHandler>());
|
||||
protocol_handlers_.clear();
|
||||
|
||||
context->set_job_factory(std::move(job_factory));
|
||||
diff --git a/url/url_constants.h b/url/url_constants.h
|
||||
--- a/url/url_constants.h
|
||||
+++ b/url/url_constants.h
|
||||
@@ -34,6 +34,7 @@ inline constexpr char16_t kDataScheme16[] = u"data";
|
||||
inline constexpr char kDrivefsScheme[] = "drivefs";
|
||||
inline constexpr char kFileScheme[] = "file";
|
||||
inline constexpr char16_t kFileScheme16[] = u"file";
|
||||
+inline constexpr char kTraceScheme[] = "trk";
|
||||
inline constexpr char kFileSystemScheme[] = "filesystem";
|
||||
inline constexpr char16_t kFileSystemScheme16[] = u"filesystem";
|
||||
inline constexpr char kFtpScheme[] = "ftp";
|
||||
diff --git a/url/url_util.cc b/url/url_util.cc
|
||||
--- a/url/url_util.cc
|
||||
+++ b/url/url_util.cc
|
||||
@@ -54,6 +54,7 @@ struct SchemeRegistry {
|
||||
std::vector<SchemeWithType> standard_schemes = {
|
||||
{kHttpsScheme, SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION},
|
||||
{kHttpScheme, SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION},
|
||||
+ {kTraceScheme, SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION},
|
||||
// Yes, file URLs can have a hostname, so file URLs should be handled as
|
||||
// "standard". File URLs never have a port as specified by the SchemeType
|
||||
// field. Unlike other SCHEME_WITH_HOST schemes, the 'host' in a file
|
||||
@@ -99,6 +100,7 @@ struct SchemeRegistry {
|
||||
kAboutScheme,
|
||||
kJavaScriptScheme,
|
||||
kDataScheme,
|
||||
+ kTraceScheme,
|
||||
};
|
||||
|
||||
// Schemes that can be sent CORS requests.
|
||||
--
|
||||
@@ -1,93 +0,0 @@
|
||||
From: csagan5 <32685696+csagan5@users.noreply.github.com>
|
||||
Date: Sat, 9 Apr 2022 23:01:55 +0200
|
||||
Subject: Bookmarks select all menu entry
|
||||
|
||||
Requires: Restore-BookmarkToolbar-setCurrentFolder.patch
|
||||
|
||||
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
|
||||
---
|
||||
.../menu/bookmark_toolbar_menu_improved.xml | 7 +++++++
|
||||
.../browser/bookmarks/BookmarkToolbar.java | 18 ++++++++++++++++++
|
||||
.../android/strings/android_chrome_strings.grd | 3 +++
|
||||
3 files changed, 28 insertions(+)
|
||||
|
||||
diff --git a/chrome/android/java/res/menu/bookmark_toolbar_menu_improved.xml b/chrome/android/java/res/menu/bookmark_toolbar_menu_improved.xml
|
||||
--- a/chrome/android/java/res/menu/bookmark_toolbar_menu_improved.xml
|
||||
+++ b/chrome/android/java/res/menu/bookmark_toolbar_menu_improved.xml
|
||||
@@ -51,6 +51,13 @@ found in the LICENSE file.
|
||||
android:title="@string/create_new_folder"
|
||||
app:showAsAction="ifRoom"
|
||||
app:iconTint="@color/default_icon_color_secondary_tint_list" />
|
||||
+ <item
|
||||
+ android:id="@+id/select_all_menu_id"
|
||||
+ android:icon="@drawable/ic_done_blue"
|
||||
+ android:title="@string/select_all_bookmarks"
|
||||
+ android:visible="true"
|
||||
+ app:showAsAction="ifRoom"
|
||||
+ app:iconTint="@color/default_icon_color_tint_list" />
|
||||
<item
|
||||
android:id="@+id/import_menu_id"
|
||||
android:icon="@drawable/ic_folder_blue_24dp"
|
||||
diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbar.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbar.java
|
||||
--- a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbar.java
|
||||
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbar.java
|
||||
@@ -28,6 +28,7 @@ import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelega
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.Function;
|
||||
+import java.util.HashSet;
|
||||
|
||||
/**
|
||||
* Main toolbar of bookmark UI. It is responsible for displaying title and buttons associated with
|
||||
@@ -190,6 +191,11 @@ public class BookmarkToolbar extends SelectableListToolbar<BookmarkId>
|
||||
void setCurrentFolder(BookmarkId folder) {
|
||||
mCurrentFolder = mBookmarkModel.getBookmarkById(folder);
|
||||
enableImportExportMenu();
|
||||
+ enableSelectAllMenu();
|
||||
+ }
|
||||
+
|
||||
+ void enableSelectAllMenu() {
|
||||
+ getMenu().findItem(R.id.select_all_menu_id).setVisible(true);
|
||||
}
|
||||
|
||||
void enableImportExportMenu() {
|
||||
@@ -226,6 +232,17 @@ public class BookmarkToolbar extends SelectableListToolbar<BookmarkId>
|
||||
mExportBookmarkRunnable.run();
|
||||
return true;
|
||||
}
|
||||
+ if (menuItem.getItemId() == R.id.select_all_menu_id) {
|
||||
+ if (mBookmarkModel.isBookmarkModelLoaded()) {
|
||||
+ List<BookmarkId> childs = mBookmarkModel.getChildIds(mCurrentFolder.getId());
|
||||
+ HashSet<BookmarkId> ids = new HashSet<>(childs.size());
|
||||
+ for (BookmarkId item : childs) {
|
||||
+ ids.add(item);
|
||||
+ }
|
||||
+ mSelectionDelegate.setSelectedItems(ids);
|
||||
+ }
|
||||
+ return true;
|
||||
+ }
|
||||
return assumeNonNull(mMenuIdClickedFunction).apply(menuItem.getItemId());
|
||||
}
|
||||
|
||||
@@ -248,6 +265,7 @@ public class BookmarkToolbar extends SelectableListToolbar<BookmarkId>
|
||||
|
||||
getMenu().findItem(R.id.import_menu_id).setVisible(mCurrentFolder != null);
|
||||
getMenu().findItem(R.id.export_menu_id).setVisible(mCurrentFolder != null);
|
||||
+ getMenu().findItem(R.id.select_all_menu_id).setVisible(mCurrentFolder != null);
|
||||
|
||||
// SelectableListToolbar will show/hide the entire group.
|
||||
setEditButtonVisible(mEditButtonVisible);
|
||||
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
|
||||
@@ -252,6 +252,9 @@ CHAR_LIMIT guidelines:
|
||||
<message name="IDS_NOTIFICATION_CATEGORY_SITES" desc="Label for notifications from websites, within a list of notification categories. [CHAR_LIMIT=32]">
|
||||
Sites
|
||||
</message>
|
||||
+ <message name="IDS_SELECT_ALL_BOOKMARKS" desc="The label for the select all bookmarks button.">
|
||||
+ Select all
|
||||
+ </message>
|
||||
<message name="IDS_IMPORT_BOOKMARKS" desc="The label for the import bookmarks button.">
|
||||
Import
|
||||
</message>
|
||||
--
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,22 +0,0 @@
|
||||
From: csagan5 <32685696+csagan5@users.noreply.github.com>
|
||||
Date: Sat, 8 Jan 2022 19:42:34 +0100
|
||||
Subject: Bromite package name
|
||||
|
||||
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
|
||||
---
|
||||
chrome/android/chrome_public_apk_tmpl.gni | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/chrome/android/chrome_public_apk_tmpl.gni b/chrome/android/chrome_public_apk_tmpl.gni
|
||||
--- a/chrome/android/chrome_public_apk_tmpl.gni
|
||||
+++ b/chrome/android/chrome_public_apk_tmpl.gni
|
||||
@@ -27,7 +27,7 @@ declare_args() {
|
||||
# WebView providers which declare one of a handful of package names. See
|
||||
# https://chromium.googlesource.com/chromium/src/+/HEAD/android_webview/docs/build-instructions.md#Changing-package-name
|
||||
# for details.
|
||||
- chrome_public_manifest_package = "org.chromium.chrome"
|
||||
+ chrome_public_manifest_package = "org.bromite.bromite"
|
||||
if (use_stable_package_name_for_trichrome) {
|
||||
chrome_public_manifest_package += ".stable"
|
||||
} else if (android_channel != "default" && android_channel != "stable") {
|
||||
--
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,82 +0,0 @@
|
||||
From: uazo <uazo@users.noreply.github.com>
|
||||
Date: Tue, 30 Jul 2024 14:38:58 +0000
|
||||
Subject: Bubble Locking on UI DevTools
|
||||
|
||||
Allows the use of ctrl+shift+click on the refresh button to
|
||||
activate the Bubble Locking mode for the native dev-ui.
|
||||
The current ctrl+shift+R is really inconvenient and often does not work.
|
||||
|
||||
License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
|
||||
---
|
||||
.../browser/ui/views/toolbar/reload_button.cc | 8 ++++++
|
||||
ui/views/widget/widget.h | 25 ++++++++++---------
|
||||
2 files changed, 21 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/chrome/browser/ui/views/toolbar/reload_button.cc b/chrome/browser/ui/views/toolbar/reload_button.cc
|
||||
--- a/chrome/browser/ui/views/toolbar/reload_button.cc
|
||||
+++ b/chrome/browser/ui/views/toolbar/reload_button.cc
|
||||
@@ -225,6 +225,14 @@ void ReloadButton::ButtonPressed(const ui::Event& event) {
|
||||
command = IDC_RELOAD;
|
||||
}
|
||||
|
||||
+ views::Widget::SetDisableActivationChangeHandling(
|
||||
+ views::Widget::DisableActivationChangeHandlingType::kNone);
|
||||
+ if (event.IsShiftDown() && event.IsControlDown()) {
|
||||
+ views::Widget::SetDisableActivationChangeHandling(
|
||||
+ views::Widget::DisableActivationChangeHandlingType::kIgnoreDeactivationOnly);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
// Start a timer - while this timer is running, the reload button cannot be
|
||||
// changed to a stop button. We do not set |intended_mode_| to Mode::kStop
|
||||
// here as the browser will do that when it actually starts loading (which
|
||||
diff --git a/ui/views/widget/widget.h b/ui/views/widget/widget.h
|
||||
--- a/ui/views/widget/widget.h
|
||||
+++ b/ui/views/widget/widget.h
|
||||
@@ -1465,6 +1465,19 @@ class VIEWS_EXPORT Widget : public internal::NativeWidgetDelegate,
|
||||
// initialized.
|
||||
void SaveWindowPlacementIfNeeded();
|
||||
|
||||
+ // Type of ways to ignore activation changes.
|
||||
+ enum class DisableActivationChangeHandlingType {
|
||||
+ kNone = 0, // Don't ignore any activation changes.
|
||||
+ kIgnore, // Ignore both activation and deactivation changes.
|
||||
+ kIgnoreDeactivationOnly, // Ignore only deactivation changes.
|
||||
+ };
|
||||
+
|
||||
+ // Sets/gets the type of disabling widget activation change handling.
|
||||
+ static void SetDisableActivationChangeHandling(
|
||||
+ DisableActivationChangeHandlingType new_type) {
|
||||
+ g_disable_activation_change_handling_ = new_type;
|
||||
+ }
|
||||
+
|
||||
protected:
|
||||
// Creates the RootView to be used within this Widget. Subclasses may override
|
||||
// to create custom RootViews that do specialized event processing.
|
||||
@@ -1505,13 +1518,6 @@ class VIEWS_EXPORT Widget : public internal::NativeWidgetDelegate,
|
||||
void set_widget_closed() { widget_closed_ = true; }
|
||||
|
||||
private:
|
||||
- // Type of ways to ignore activation changes.
|
||||
- enum class DisableActivationChangeHandlingType {
|
||||
- kNone = 0, // Don't ignore any activation changes.
|
||||
- kIgnore, // Ignore both activation and deactivation changes.
|
||||
- kIgnoreDeactivationOnly, // Ignore only deactivation changes.
|
||||
- };
|
||||
-
|
||||
class PaintAsActiveLockImpl;
|
||||
|
||||
friend class ButtonTest;
|
||||
@@ -1522,11 +1528,6 @@ class VIEWS_EXPORT Widget : public internal::NativeWidgetDelegate,
|
||||
friend class ui_devtools::BubbleLocking;
|
||||
friend void DisableActivationChangeHandlingForTests();
|
||||
|
||||
- // Sets/gets the type of disabling widget activation change handling.
|
||||
- static void SetDisableActivationChangeHandling(
|
||||
- DisableActivationChangeHandlingType new_type) {
|
||||
- g_disable_activation_change_handling_ = new_type;
|
||||
- }
|
||||
static DisableActivationChangeHandlingType
|
||||
GetDisableActivationChangeHandling() {
|
||||
return g_disable_activation_change_handling_;
|
||||
--
|
||||
@@ -1,309 +0,0 @@
|
||||
From: uazo <uazo@users.noreply.github.com>
|
||||
Date: Sun, 4 Feb 2024 16:02:48 +0000
|
||||
Subject: Change popup site setting
|
||||
|
||||
In site settings added ability to block all popups per site
|
||||
|
||||
License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
|
||||
---
|
||||
.../settings/site_settings/popups_page.html | 2 +
|
||||
.../tab_under_navigation_throttle.cc | 11 +-
|
||||
.../android/popup_blocked_message_delegate.cc | 20 +++-
|
||||
.../android/popup_blocked_message_delegate.h | 1 +
|
||||
components/blocked_content/popup_blocker.cc | 3 +
|
||||
components/blocked_content_strings.grdp | 3 +
|
||||
.../impl/BromitePopupContentSetting.java | 106 ++++++++++++++++++
|
||||
.../bromite_content_settings/popups.grdp | 18 +++
|
||||
.../bromite_content_settings/popups.inc | 13 +++
|
||||
.../core/browser/content_settings_registry.cc | 2 +-
|
||||
10 files changed, 173 insertions(+), 6 deletions(-)
|
||||
create mode 100644 components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromitePopupContentSetting.java
|
||||
create mode 100644 components/browser_ui/strings/bromite_content_settings/popups.grdp
|
||||
create mode 100644 components/content_settings/core/browser/bromite_content_settings/popups.inc
|
||||
|
||||
diff --git a/chrome/browser/resources/settings/site_settings/popups_page.html b/chrome/browser/resources/settings/site_settings/popups_page.html
|
||||
--- a/chrome/browser/resources/settings/site_settings/popups_page.html
|
||||
+++ b/chrome/browser/resources/settings/site_settings/popups_page.html
|
||||
@@ -9,6 +9,8 @@
|
||||
category="[[contentSettingsTypesEnum_.POPUPS]]"
|
||||
allow-option-label="$i18n{siteSettingsPopupsAllowed}"
|
||||
allow-option-icon="cr:open-in-new"
|
||||
+ ask-option-label="$i18n{brSiteSettingspopupsAsk}"
|
||||
+ ask-option-icon="privacy:open-in-new-off"
|
||||
block-option-label="$i18n{siteSettingsPopupsBlocked}"
|
||||
block-option-icon="privacy:open-in-new-off">
|
||||
</settings-category-default-radio-group>
|
||||
diff --git a/chrome/browser/ui/blocked_content/tab_under_navigation_throttle.cc b/chrome/browser/ui/blocked_content/tab_under_navigation_throttle.cc
|
||||
--- a/chrome/browser/ui/blocked_content/tab_under_navigation_throttle.cc
|
||||
+++ b/chrome/browser/ui/blocked_content/tab_under_navigation_throttle.cc
|
||||
@@ -143,9 +143,14 @@ TabUnderNavigationThrottle::MaybeBlockNavigation() {
|
||||
|
||||
LogTabUnderAttempt(navigation_handle());
|
||||
|
||||
- // We unconditionally proceed. There used to be a tab-under blocking
|
||||
- // experiment, but it never launched.
|
||||
- return content::NavigationThrottle::PROCEED;
|
||||
+ content::WebContents* web_contents = navigation_handle()->GetWebContents();
|
||||
+ const std::string error =
|
||||
+ base::StringPrintf(kBlockTabUnderFormatMessage,
|
||||
+ navigation_handle()->GetURL().spec().c_str());
|
||||
+ web_contents->GetPrimaryMainFrame()->AddMessageToConsole(
|
||||
+ blink::mojom::ConsoleMessageLevel::kError, error.c_str());
|
||||
+ ShowUI();
|
||||
+ return content::NavigationThrottle::CANCEL;
|
||||
}
|
||||
|
||||
void TabUnderNavigationThrottle::ShowUI() {
|
||||
diff --git a/components/blocked_content/android/popup_blocked_message_delegate.cc b/components/blocked_content/android/popup_blocked_message_delegate.cc
|
||||
--- a/components/blocked_content/android/popup_blocked_message_delegate.cc
|
||||
+++ b/components/blocked_content/android/popup_blocked_message_delegate.cc
|
||||
@@ -32,7 +32,7 @@ bool PopupBlockedMessageDelegate::ShowMessage(
|
||||
// the callback.
|
||||
auto message = std::make_unique<messages::MessageWrapper>(
|
||||
messages::MessageIdentifier::POPUP_BLOCKED,
|
||||
- base::BindOnce(&PopupBlockedMessageDelegate::HandleClick,
|
||||
+ base::BindOnce(&PopupBlockedMessageDelegate::HandleOpenLink,
|
||||
base::Unretained(this)),
|
||||
base::BindOnce(&PopupBlockedMessageDelegate::HandleDismissCallback,
|
||||
base::Unretained(this)));
|
||||
@@ -46,7 +46,7 @@ bool PopupBlockedMessageDelegate::ShowMessage(
|
||||
// Don't allow the user to configure the setting in the UI if the setting
|
||||
// is managed by policy.
|
||||
int button_text_id =
|
||||
- allow_settings_changes_ ? IDS_POPUPS_BLOCKED_INFOBAR_BUTTON_SHOW : IDS_OK;
|
||||
+ allow_settings_changes_ ? IDS_POPUPS_BLOCKED_INFOBAR_BUTTON_SHOW_THIS_TIME : IDS_OK;
|
||||
message->SetPrimaryButtonText(l10n_util::GetStringUTF16(button_text_id));
|
||||
messages::MessageDispatcherBridge* message_dispatcher_bridge =
|
||||
messages::MessageDispatcherBridge::Get();
|
||||
@@ -54,6 +54,14 @@ bool PopupBlockedMessageDelegate::ShowMessage(
|
||||
message->SetIconResourceId(message_dispatcher_bridge->MapToJavaDrawableId(
|
||||
IDR_ANDROID_INFOBAR_BLOCKED_POPUPS));
|
||||
|
||||
+ message->SetSecondaryIconResourceId(
|
||||
+ message_dispatcher_bridge->MapToJavaDrawableId(
|
||||
+ IDR_ANDROID_SETTINGS));
|
||||
+ message->SetSecondaryButtonMenuText(
|
||||
+ l10n_util::GetStringUTF16(IDS_POPUPS_BLOCKED_INFOBAR_BUTTON_SHOW));
|
||||
+ message->SetSecondaryActionCallback(
|
||||
+ base::BindRepeating(&PopupBlockedMessageDelegate::HandleClick,
|
||||
+ base::Unretained(this)));
|
||||
// On rare occasions, such as the moment when activity is being recreated
|
||||
// or destroyed, popup blocked message will not be displayed and the
|
||||
// method will return false.
|
||||
@@ -102,6 +110,14 @@ void PopupBlockedMessageDelegate::HandleClick() {
|
||||
std::move(on_show_popups_callback_).Run();
|
||||
}
|
||||
|
||||
+void PopupBlockedMessageDelegate::HandleOpenLink() {
|
||||
+ // Launch popups.
|
||||
+ ShowBlockedPopups(&GetWebContents());
|
||||
+
|
||||
+ if (on_show_popups_callback_)
|
||||
+ std::move(on_show_popups_callback_).Run();
|
||||
+}
|
||||
+
|
||||
WEB_CONTENTS_USER_DATA_KEY_IMPL(PopupBlockedMessageDelegate);
|
||||
|
||||
} // namespace blocked_content
|
||||
diff --git a/components/blocked_content/android/popup_blocked_message_delegate.h b/components/blocked_content/android/popup_blocked_message_delegate.h
|
||||
--- a/components/blocked_content/android/popup_blocked_message_delegate.h
|
||||
+++ b/components/blocked_content/android/popup_blocked_message_delegate.h
|
||||
@@ -41,6 +41,7 @@ class PopupBlockedMessageDelegate
|
||||
|
||||
explicit PopupBlockedMessageDelegate(content::WebContents* web_contents);
|
||||
void HandleClick();
|
||||
+ void HandleOpenLink();
|
||||
void HandleDismissCallback(messages::DismissReason dismiss_reason);
|
||||
|
||||
raw_ptr<HostContentSettingsMap> map_ = nullptr;
|
||||
diff --git a/components/blocked_content/popup_blocker.cc b/components/blocked_content/popup_blocker.cc
|
||||
--- a/components/blocked_content/popup_blocker.cc
|
||||
+++ b/components/blocked_content/popup_blocker.cc
|
||||
@@ -70,6 +70,9 @@ PopupBlockType ShouldBlockPopup(content::WebContents* web_contents,
|
||||
if (cs == CONTENT_SETTING_ALLOW)
|
||||
return PopupBlockType::kNotBlocked;
|
||||
|
||||
+ if (cs == CONTENT_SETTING_ASK)
|
||||
+ return PopupBlockType::kAbusive;
|
||||
+
|
||||
if (!user_gesture)
|
||||
return PopupBlockType::kNoGesture;
|
||||
|
||||
diff --git a/components/blocked_content_strings.grdp b/components/blocked_content_strings.grdp
|
||||
--- a/components/blocked_content_strings.grdp
|
||||
+++ b/components/blocked_content_strings.grdp
|
||||
@@ -4,6 +4,9 @@
|
||||
<message name="IDS_POPUPS_BLOCKED_INFOBAR_BUTTON_SHOW" desc="Pop-up Blocking Show Button [CHAR_LIMIT=32]">
|
||||
Always show
|
||||
</message>
|
||||
+ <message name="IDS_POPUPS_BLOCKED_INFOBAR_BUTTON_SHOW_THIS_TIME" desc="Pop-up Blocking Show Button [CHAR_LIMIT=32]">
|
||||
+ Open this time
|
||||
+ </message>
|
||||
<message name="IDS_POPUPS_BLOCKED_INFOBAR_TEXT" desc="Pop-up Blocking Title [CHAR_LIMIT=32] [ICU Syntax]">
|
||||
{NUM_POPUPS,plural,=1{Pop-up blocked} other{# pop-ups blocked}}
|
||||
</message>
|
||||
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromitePopupContentSetting.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromitePopupContentSetting.java
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromitePopupContentSetting.java
|
||||
@@ -0,0 +1,106 @@
|
||||
+/*
|
||||
+ 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 android.content.Context;
|
||||
+
|
||||
+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 BromitePopupContentSetting extends BromiteCustomContentSetting {
|
||||
+ public BromitePopupContentSetting() {
|
||||
+ super(/*contentSettingsType*/ ContentSettingsType.POPUPS,
|
||||
+ /*defaultEnabledValue*/ ContentSetting.ALLOW,
|
||||
+ /*defaultDisabledValue*/ ContentSetting.BLOCK,
|
||||
+ /*allowException*/ true,
|
||||
+ /*preferenceKey*/ "popups",
|
||||
+ /*profilePrefKey*/ "popups");
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public ContentSettingsResources.ResourceItem getResourceItem() {
|
||||
+ return new ContentSettingsResources.ResourceItem(
|
||||
+ /*icon*/ R.drawable.permission_popups,
|
||||
+ /*title*/ R.string.popup_permission_title,
|
||||
+ /*defaultEnabledValue*/ getDefaultEnabledValue(),
|
||||
+ /*defaultDisabledValue*/ getDefaultDisabledValue(),
|
||||
+ /*enabledSummary*/ R.string.website_settings_category_popup_allowed,
|
||||
+ /*disabledSummary*/ R.string.website_settings_category_popup_blocked,
|
||||
+ /*summaryOverrideForScreenReader*/ 0);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public int getCategorySummary(@Nullable @ContentSetting int value) {
|
||||
+ switch (value) {
|
||||
+ case ContentSetting.ALLOW:
|
||||
+ return R.string.website_settings_category_popup_allowed;
|
||||
+ case ContentSetting.BLOCK:
|
||||
+ return R.string.website_settings_category_popup_blocked;
|
||||
+ case ContentSetting.ASK:
|
||||
+ return R.string.website_settings_category_popup_block_all;
|
||||
+ default:
|
||||
+ return 0;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public int getCategoryDescription() {
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean requiresTriStateContentSetting() {
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public int[] getTriStateSettingDescriptionIDs() {
|
||||
+ int[] descriptionIDs = {
|
||||
+ R.string.website_settings_category_popup_allowed, // ALLOWED
|
||||
+ R.string.website_settings_category_popup_block_all, // ASK
|
||||
+ R.string.website_settings_category_popup_blocked}; // BLOCKED
|
||||
+ return descriptionIDs;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean showOnlyDescriptions() {
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public int getAddExceptionDialogMessage() {
|
||||
+ return R.string.website_settings_category_popup_allowed;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public @Nullable Boolean considerException(SiteSettingsCategory category, @ContentSetting int value) {
|
||||
+ return ContentSetting.ALLOW != value;
|
||||
+ }
|
||||
+}
|
||||
diff --git a/components/browser_ui/strings/bromite_content_settings/popups.grdp b/components/browser_ui/strings/bromite_content_settings/popups.grdp
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/components/browser_ui/strings/bromite_content_settings/popups.grdp
|
||||
@@ -0,0 +1,18 @@
|
||||
+<?xml version="1.0" encoding="utf-8"?>
|
||||
+<grit-part>
|
||||
+ <message name="IDS_WEBSITE_SETTINGS_CATEGORY_POPUP" desc="" formatter_data="android_java">
|
||||
+ Block sites from showing pop-ups and redirects
|
||||
+ </message>
|
||||
+ <message name="IDS_WEBSITE_SETTINGS_CATEGORY_POPUP_DESCRIPTION" desc="" formatter_data="android_java">
|
||||
+ When on, sites can use pop-ups and redirects. When off, sites can’t use pop-ups and redirects.
|
||||
+ </message>
|
||||
+ <message name="IDS_WEBSITE_SETTINGS_CATEGORY_POPUP_BLOCK_ALL" desc="" formatter_data="android_java">
|
||||
+ Block all popups
|
||||
+ </message>
|
||||
+ <message name="IDS_WEBSITE_SETTINGS_CATEGORY_POPUP_ALLOWED" desc="" formatter_data="android_java">
|
||||
+ Allows popups
|
||||
+ </message>
|
||||
+ <message name="IDS_WEBSITE_SETTINGS_CATEGORY_POPUP_BLOCKED" desc="" formatter_data="android_java">
|
||||
+ Block some popups
|
||||
+ </message>
|
||||
+</grit-part>
|
||||
diff --git a/components/content_settings/core/browser/bromite_content_settings/popups.inc b/components/content_settings/core/browser/bromite_content_settings/popups.inc
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/components/content_settings/core/browser/bromite_content_settings/popups.inc
|
||||
@@ -0,0 +1,13 @@
|
||||
+ content_settings::WebsiteSettingsRegistry::GetInstance()
|
||||
+ ->GetMutable(ContentSettingsType::POPUPS)
|
||||
+ ->set_show_into_info_page()
|
||||
+ .set_desktop_ui()
|
||||
+ .set_is_renderer_content_setting()
|
||||
+ .set_title_ui(IDS_WEBSITE_SETTINGS_CATEGORY_POPUP)
|
||||
+ .set_description_ui(IDS_WEBSITE_SETTINGS_CATEGORY_POPUP_DESCRIPTION)
|
||||
+ .set_allowed_ui(IDS_WEBSITE_SETTINGS_CATEGORY_POPUP_ALLOWED)
|
||||
+ .set_ask_ui(IDS_WEBSITE_SETTINGS_CATEGORY_POPUP_BLOCK_ALL)
|
||||
+ .set_blocked_ui(IDS_WEBSITE_SETTINGS_CATEGORY_POPUP_BLOCKED)
|
||||
+ .set_allowed_exceptions_ui(IDS_WEBSITE_SETTINGS_CATEGORY_POPUP_ALLOWED)
|
||||
+ .set_blocked_exceptions_ui(IDS_WEBSITE_SETTINGS_CATEGORY_POPUP_BLOCKED)
|
||||
+ .set_mid_sentence_ui(IDS_WEBSITE_SETTINGS_CATEGORY_POPUP);
|
||||
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
|
||||
@@ -140,7 +140,7 @@ void ContentSettingsRegistry::Init() {
|
||||
WebsiteSettingsInfo::SYNCABLE,
|
||||
/*allowlisted_primary_schemes=*/
|
||||
{kChromeUIScheme, kChromeDevToolsScheme, kExtensionScheme},
|
||||
- /*valid_settings=*/{CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK},
|
||||
+ /*valid_settings=*/{CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK, CONTENT_SETTING_ASK},
|
||||
WebsiteSettingsInfo::TOP_ORIGIN_ONLY_SCOPE,
|
||||
WebsiteSettingsRegistry::ALL_PLATFORMS,
|
||||
ContentSettingsInfo::INHERIT_IN_INCOGNITO,
|
||||
--
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,90 +0,0 @@
|
||||
From: uazo <uazo@users.noreply.github.com>
|
||||
Date: Wed, 19 Apr 2023 09:59:18 +0000
|
||||
Subject: Clear CORS Preflight Cache on clearing data
|
||||
|
||||
License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
|
||||
---
|
||||
services/network/cors/preflight_cache.cc | 4 ++++
|
||||
services/network/cors/preflight_cache.h | 2 ++
|
||||
services/network/cors/preflight_controller.cc | 4 ++++
|
||||
services/network/cors/preflight_controller.h | 2 ++
|
||||
services/network/cors/preflight_result.cc | 2 +-
|
||||
services/network/network_context.cc | 1 +
|
||||
6 files changed, 14 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/services/network/cors/preflight_cache.cc b/services/network/cors/preflight_cache.cc
|
||||
--- a/services/network/cors/preflight_cache.cc
|
||||
+++ b/services/network/cors/preflight_cache.cc
|
||||
@@ -204,6 +204,10 @@ void PreflightCache::MayPurgeForTesting(size_t max_entries, size_t purge_unit) {
|
||||
MayPurge(max_entries, purge_unit);
|
||||
}
|
||||
|
||||
+void PreflightCache::ClearAll() {
|
||||
+ cache_.clear();
|
||||
+}
|
||||
+
|
||||
void PreflightCache::MayPurge(size_t max_entries, size_t purge_unit) {
|
||||
if (cache_.size() <= max_entries) {
|
||||
return;
|
||||
diff --git a/services/network/cors/preflight_cache.h b/services/network/cors/preflight_cache.h
|
||||
--- a/services/network/cors/preflight_cache.h
|
||||
+++ b/services/network/cors/preflight_cache.h
|
||||
@@ -78,6 +78,8 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) PreflightCache final {
|
||||
// `max_entries` for testing.
|
||||
void MayPurgeForTesting(size_t max_entries, size_t purge_unit);
|
||||
|
||||
+ void ClearAll();
|
||||
+
|
||||
private:
|
||||
void MayPurge(size_t max_entries, size_t purge_unit);
|
||||
|
||||
diff --git a/services/network/cors/preflight_controller.cc b/services/network/cors/preflight_controller.cc
|
||||
--- a/services/network/cors/preflight_controller.cc
|
||||
+++ b/services/network/cors/preflight_controller.cc
|
||||
@@ -752,6 +752,10 @@ void PreflightController::ClearCorsPreflightCache(
|
||||
cache_.ClearCache(std::move(url_filter));
|
||||
}
|
||||
|
||||
+void PreflightController::ClearCache() {
|
||||
+ cache_.ClearAll();
|
||||
+}
|
||||
+
|
||||
void PreflightController::RemoveLoader(PreflightLoader* loader) {
|
||||
auto it = loaders_.find(loader);
|
||||
CHECK(it != loaders_.end());
|
||||
diff --git a/services/network/cors/preflight_controller.h b/services/network/cors/preflight_controller.h
|
||||
--- a/services/network/cors/preflight_controller.h
|
||||
+++ b/services/network/cors/preflight_controller.h
|
||||
@@ -151,6 +151,8 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) PreflightController final {
|
||||
url_loader_network_service_observer,
|
||||
const PreflightMode& preflight_mode);
|
||||
|
||||
+ void ClearCache();
|
||||
+
|
||||
// Clears the CORS preflight cache. The time range is always "all time" as
|
||||
// the preflight cache max age is capped to 2hrs. in Chrome.
|
||||
// It clears origins selectively when the url filter is not null, otherwise
|
||||
diff --git a/services/network/cors/preflight_result.cc b/services/network/cors/preflight_result.cc
|
||||
--- a/services/network/cors/preflight_result.cc
|
||||
+++ b/services/network/cors/preflight_result.cc
|
||||
@@ -37,7 +37,7 @@ constexpr base::TimeDelta kDefaultTimeout = base::Seconds(5);
|
||||
// Maximum cache expiry time. Even if a CORS-preflight response contains
|
||||
// Access-Control-Max-Age header that specifies a longer expiry time, this
|
||||
// maximum time is applied.
|
||||
-constexpr base::TimeDelta kMaxTimeout = base::Hours(2);
|
||||
+constexpr base::TimeDelta kMaxTimeout = base::Seconds(600);
|
||||
|
||||
// Holds TickClock instance to overwrite TimeTicks::Now() for testing.
|
||||
const base::TickClock* tick_clock_for_testing = nullptr;
|
||||
diff --git a/services/network/network_context.cc b/services/network/network_context.cc
|
||||
--- a/services/network/network_context.cc
|
||||
+++ b/services/network/network_context.cc
|
||||
@@ -1372,6 +1372,7 @@ void NetworkContext::ClearHttpCache(base::Time start_time,
|
||||
base::Time end_time,
|
||||
mojom::ClearDataFilterPtr filter,
|
||||
ClearHttpCacheCallback callback) {
|
||||
+ cors_preflight_controller_.ClearCache();
|
||||
// It's safe to use Unretained below as the HttpCacheDataRemover is owned by
|
||||
// |this| and guarantees it won't call its callback if deleted.
|
||||
http_cache_data_removers_.push_back(HttpCacheDataRemover::CreateAndStart(
|
||||
--
|
||||
@@ -1,280 +0,0 @@
|
||||
From: csagan5 <32685696+csagan5@users.noreply.github.com>
|
||||
Date: Thu, 22 Jul 2021 23:10:52 +0200
|
||||
Subject: Client hints overrides
|
||||
|
||||
Disable critical client hints and network early hints
|
||||
Use Google Chrome branding for client hints
|
||||
|
||||
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
|
||||
---
|
||||
components/embedder_support/user_agent_utils.cc | 4 +---
|
||||
content/browser/client_hints/client_hints.cc | 15 ++++++++++-----
|
||||
.../browser/loader/navigation_url_loader_impl.cc | 5 +++++
|
||||
.../about_flags_cc/Client-hints-overrides.inc | 9 +++++++++
|
||||
.../common/features_cc/Client-hints-overrides.inc | 1 +
|
||||
.../cpp/features_cc/Client-hints-overrides.inc | 1 +
|
||||
net/http/http_network_transaction.cc | 1 +
|
||||
services/network/public/cpp/client_hints.cc | 1 +
|
||||
.../blink/common/client_hints/client_hints.cc | 6 ++++--
|
||||
.../common/client_hints/enabled_client_hints.cc | 6 ++++++
|
||||
.../blink/renderer/core/frame/navigator_ua.idl | 4 +++-
|
||||
.../renderer/core/frame/navigator_ua_data.cc | 1 +
|
||||
.../renderer/core/frame/navigator_ua_data.idl | 5 ++++-
|
||||
.../renderer/core/loader/frame_fetch_context.cc | 4 +++-
|
||||
.../platform/runtime_enabled_features.json5 | 8 ++++++--
|
||||
15 files changed, 56 insertions(+), 15 deletions(-)
|
||||
create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Client-hints-overrides.inc
|
||||
create mode 100644 cromite_flags/content/common/features_cc/Client-hints-overrides.inc
|
||||
create mode 100644 cromite_flags/services/network/public/cpp/features_cc/Client-hints-overrides.inc
|
||||
|
||||
diff --git a/components/embedder_support/user_agent_utils.cc b/components/embedder_support/user_agent_utils.cc
|
||||
--- a/components/embedder_support/user_agent_utils.cc
|
||||
+++ b/components/embedder_support/user_agent_utils.cc
|
||||
@@ -202,9 +202,7 @@ const blink::UserAgentBrandList GetUserAgentBrandList(
|
||||
bool parse_result = base::StringToInt(major_version, &major_version_number);
|
||||
DCHECK(parse_result);
|
||||
std::optional<std::string> brand;
|
||||
-#if !BUILDFLAG(CHROMIUM_BRANDING)
|
||||
- brand = version_info::GetProductName();
|
||||
-#endif
|
||||
+ brand = "Google Chrome";
|
||||
|
||||
std::string brand_version =
|
||||
output_version_type == blink::UserAgentBrandVersionType::kFullVersion
|
||||
diff --git a/content/browser/client_hints/client_hints.cc b/content/browser/client_hints/client_hints.cc
|
||||
--- a/content/browser/client_hints/client_hints.cc
|
||||
+++ b/content/browser/client_hints/client_hints.cc
|
||||
@@ -58,6 +58,7 @@
|
||||
#include "third_party/blink/public/common/features.h"
|
||||
#include "third_party/blink/public/common/page/page_zoom.h"
|
||||
#include "third_party/blink/public/common/user_agent/user_agent_metadata.h"
|
||||
+#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
|
||||
#include "ui/display/display.h"
|
||||
#include "ui/display/screen.h"
|
||||
#include "url/origin.h"
|
||||
@@ -706,7 +707,8 @@ void UpdateNavigationRequestClientUaHeadersImpl(
|
||||
// value, disable them. This overwrites previous decision from UI.
|
||||
disable_due_to_custom_ua = !ua_metadata.has_value();
|
||||
}
|
||||
-
|
||||
+ if (!blink::RuntimeEnabledFeatures::UserAgentClientHintEnabled())
|
||||
+ disable_due_to_custom_ua = true;
|
||||
if (!disable_due_to_custom_ua) {
|
||||
if (!ua_metadata.has_value())
|
||||
ua_metadata = delegate->GetUserAgentMetadata();
|
||||
@@ -898,10 +900,12 @@ void AddRequestClientHintsHeaders(
|
||||
AddEctHeader(headers, network_quality_tracker, url);
|
||||
}
|
||||
|
||||
- UpdateNavigationRequestClientUaHeadersImpl(
|
||||
- delegate, is_ua_override_on, frame_tree_node,
|
||||
- ClientUaHeaderCallType::kDuringCreation, headers, container_policy, data,
|
||||
- ftn_for_devtools_override);
|
||||
+ if (blink::RuntimeEnabledFeatures::UserAgentClientHintEnabled()) {
|
||||
+ UpdateNavigationRequestClientUaHeadersImpl(
|
||||
+ delegate, is_ua_override_on, frame_tree_node,
|
||||
+ ClientUaHeaderCallType::kDuringCreation, headers, container_policy, data,
|
||||
+ ftn_for_devtools_override);
|
||||
+ }
|
||||
|
||||
if (ShouldAddClientHint(data, WebClientHintsType::kPrefersColorScheme)) {
|
||||
AddPrefersColorSchemeHeader(headers, frame_tree_node);
|
||||
@@ -989,6 +993,7 @@ ParseAndPersistAcceptCHForNavigation(
|
||||
BrowserContext* context,
|
||||
ClientHintsControllerDelegate* delegate,
|
||||
FrameTreeNode* frame_tree_node) {
|
||||
+ if ((true)) return std::nullopt;
|
||||
DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
||||
DCHECK(context);
|
||||
DCHECK(parsed_headers);
|
||||
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc
|
||||
--- a/content/browser/loader/navigation_url_loader_impl.cc
|
||||
+++ b/content/browser/loader/navigation_url_loader_impl.cc
|
||||
@@ -1744,6 +1744,11 @@ void NavigationURLLoaderImpl::OnAcceptCHFrameReceived(
|
||||
return;
|
||||
}
|
||||
|
||||
+ if (!base::FeatureList::IsEnabled(network::features::kAcceptCHFrame)) {
|
||||
+ std::move(callback).Run(net::OK);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
LogAcceptCHFrameStatus(AcceptCHFrameRestart::kFramePresent);
|
||||
|
||||
// Given that this is happening in the middle of navigation, there should
|
||||
diff --git a/cromite_flags/chrome/browser/about_flags_cc/Client-hints-overrides.inc b/cromite_flags/chrome/browser/about_flags_cc/Client-hints-overrides.inc
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/cromite_flags/chrome/browser/about_flags_cc/Client-hints-overrides.inc
|
||||
@@ -0,0 +1,9 @@
|
||||
+#ifdef FLAG_SECTION
|
||||
+
|
||||
+ {"enable-ua-client-hint",
|
||||
+ "Enable UA client hint",
|
||||
+ "Allow sending base low entropy client hints as "
|
||||
+ "UA, UAMobile and UAPlatform for compatibility", kOsAll,
|
||||
+ FEATURE_VALUE_TYPE(blink::features::kUserAgentClientHint)},
|
||||
+
|
||||
+#endif
|
||||
diff --git a/cromite_flags/content/common/features_cc/Client-hints-overrides.inc b/cromite_flags/content/common/features_cc/Client-hints-overrides.inc
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/cromite_flags/content/common/features_cc/Client-hints-overrides.inc
|
||||
@@ -0,0 +1 @@
|
||||
+SET_CROMITE_FEATURE_DISABLED(kCriticalClientHint);
|
||||
diff --git a/cromite_flags/services/network/public/cpp/features_cc/Client-hints-overrides.inc b/cromite_flags/services/network/public/cpp/features_cc/Client-hints-overrides.inc
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/cromite_flags/services/network/public/cpp/features_cc/Client-hints-overrides.inc
|
||||
@@ -0,0 +1 @@
|
||||
+SET_CROMITE_FEATURE_DISABLED(kAcceptCHFrame);
|
||||
diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc
|
||||
--- a/net/http/http_network_transaction.cc
|
||||
+++ b/net/http/http_network_transaction.cc
|
||||
@@ -113,6 +113,7 @@ const size_t kMaxRestarts = 32;
|
||||
|
||||
// Returns true when Early Hints are allowed on the given protocol.
|
||||
bool EarlyHintsAreAllowedOn(HttpConnectionInfo connection_info) {
|
||||
+ if ((true)) return false;
|
||||
switch (connection_info) {
|
||||
case HttpConnectionInfo::kHTTP0_9:
|
||||
case HttpConnectionInfo::kHTTP1_0:
|
||||
diff --git a/services/network/public/cpp/client_hints.cc b/services/network/public/cpp/client_hints.cc
|
||||
--- a/services/network/public/cpp/client_hints.cc
|
||||
+++ b/services/network/public/cpp/client_hints.cc
|
||||
@@ -112,6 +112,7 @@ const DecodeMap& GetDecodeMap() {
|
||||
|
||||
std::optional<std::vector<network::mojom::WebClientHintsType>>
|
||||
ParseClientHintsHeader(const std::string& header) {
|
||||
+ if ((true)) return std::nullopt;
|
||||
// Accept-CH is an sh-list of tokens; see:
|
||||
// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-header-structure-19#section-3.1
|
||||
std::optional<net::structured_headers::List> maybe_list =
|
||||
diff --git a/third_party/blink/common/client_hints/client_hints.cc b/third_party/blink/common/client_hints/client_hints.cc
|
||||
--- a/third_party/blink/common/client_hints/client_hints.cc
|
||||
+++ b/third_party/blink/common/client_hints/client_hints.cc
|
||||
@@ -14,6 +14,7 @@
|
||||
#include "base/strings/string_util.h"
|
||||
#include "services/network/public/cpp/client_hints.h"
|
||||
#include "services/network/public/cpp/permissions_policy/client_hints_permissions_policy_mapping.h"
|
||||
+#include "third_party/blink/public/common/features_generated.h"
|
||||
#include "services/network/public/cpp/permissions_policy/permissions_policy.h"
|
||||
#include "third_party/blink/public/common/features.h"
|
||||
#include "url/origin.h"
|
||||
@@ -22,11 +23,12 @@ namespace blink {
|
||||
|
||||
bool IsClientHintSentByDefault(network::mojom::WebClientHintsType type) {
|
||||
switch (type) {
|
||||
- case network::mojom::WebClientHintsType::kSaveData:
|
||||
case network::mojom::WebClientHintsType::kUA:
|
||||
case network::mojom::WebClientHintsType::kUAMobile:
|
||||
case network::mojom::WebClientHintsType::kUAPlatform:
|
||||
- return true;
|
||||
+ return base::FeatureList::IsEnabled(blink::features::kUserAgentClientHint);
|
||||
+ case network::mojom::WebClientHintsType::kSaveData:
|
||||
+ return false;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
diff --git a/third_party/blink/common/client_hints/enabled_client_hints.cc b/third_party/blink/common/client_hints/enabled_client_hints.cc
|
||||
--- a/third_party/blink/common/client_hints/enabled_client_hints.cc
|
||||
+++ b/third_party/blink/common/client_hints/enabled_client_hints.cc
|
||||
@@ -15,6 +15,12 @@ namespace {
|
||||
using ::network::mojom::WebClientHintsType;
|
||||
|
||||
bool IsDisabledByFeature(const WebClientHintsType type) {
|
||||
+ if (type == WebClientHintsType::kUA ||
|
||||
+ type == WebClientHintsType::kUAMobile ||
|
||||
+ type == WebClientHintsType::kUAPlatform) {
|
||||
+ return false;
|
||||
+ }
|
||||
+ if ((true)) return true;
|
||||
switch (type) {
|
||||
case WebClientHintsType::kUA:
|
||||
case WebClientHintsType::kUAArch:
|
||||
diff --git a/third_party/blink/renderer/core/frame/navigator_ua.idl b/third_party/blink/renderer/core/frame/navigator_ua.idl
|
||||
--- a/third_party/blink/renderer/core/frame/navigator_ua.idl
|
||||
+++ b/third_party/blink/renderer/core/frame/navigator_ua.idl
|
||||
@@ -4,6 +4,8 @@
|
||||
|
||||
// https://github.com/WICG/ua-client-hints
|
||||
|
||||
-interface mixin NavigatorUA {
|
||||
+[
|
||||
+ RuntimeEnabled=UserAgentClientHint
|
||||
+] interface mixin NavigatorUA {
|
||||
[SecureContext] readonly attribute NavigatorUAData userAgentData;
|
||||
};
|
||||
diff --git a/third_party/blink/renderer/core/frame/navigator_ua_data.cc b/third_party/blink/renderer/core/frame/navigator_ua_data.cc
|
||||
--- a/third_party/blink/renderer/core/frame/navigator_ua_data.cc
|
||||
+++ b/third_party/blink/renderer/core/frame/navigator_ua_data.cc
|
||||
@@ -186,6 +186,7 @@ const String& NavigatorUAData::platform() const {
|
||||
}
|
||||
|
||||
bool AllowedToCollectHighEntropyValues(ExecutionContext* execution_context) {
|
||||
+ if ((true)) return false;
|
||||
// To determine whether a document is allowed to use the get high-entropy
|
||||
// client hints returned by navigator.userAgentData.getHighEntropyValues(),
|
||||
// check the following:
|
||||
diff --git a/third_party/blink/renderer/core/frame/navigator_ua_data.idl b/third_party/blink/renderer/core/frame/navigator_ua_data.idl
|
||||
--- a/third_party/blink/renderer/core/frame/navigator_ua_data.idl
|
||||
+++ b/third_party/blink/renderer/core/frame/navigator_ua_data.idl
|
||||
@@ -4,7 +4,10 @@
|
||||
|
||||
// https://github.com/WICG/ua-client-hints
|
||||
|
||||
-[Exposed=(Window,Worker)] interface NavigatorUAData {
|
||||
+[
|
||||
+ RuntimeEnabled=UserAgentClientHint,
|
||||
+ Exposed=(Window,Worker)
|
||||
+] interface NavigatorUAData {
|
||||
[HighEntropy, MeasureAs=NavigatorUAData_Brands] readonly attribute FrozenArray<NavigatorUABrandVersion> brands;
|
||||
[HighEntropy=Direct, MeasureAs=NavigatorUAData_Mobile] readonly attribute boolean mobile;
|
||||
[HighEntropy=Direct, MeasureAs=NavigatorUAData_Platform] readonly attribute DOMString platform;
|
||||
diff --git a/third_party/blink/renderer/core/loader/frame_fetch_context.cc b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
|
||||
--- a/third_party/blink/renderer/core/loader/frame_fetch_context.cc
|
||||
+++ b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
|
||||
@@ -231,6 +231,8 @@ bool ShouldSendClientHint(const network::PermissionsPolicy& policy,
|
||||
bool is_1p_origin,
|
||||
network::mojom::blink::WebClientHintsType type,
|
||||
const ClientHintsPreferences& hints_preferences) {
|
||||
+ if (!RuntimeEnabledFeatures::UserAgentClientHintEnabled())
|
||||
+ return false;
|
||||
// For subresource requests, sending the hint in the fetch request based on
|
||||
// the permissions policy.
|
||||
if (!policy.IsFeatureEnabledForOrigin(
|
||||
@@ -713,7 +715,7 @@ void FrameFetchContext::AddClientHintsIfNecessary(
|
||||
}
|
||||
|
||||
// Only send User Agent hints if the info is available
|
||||
- if (ua) {
|
||||
+ if (RuntimeEnabledFeatures::UserAgentClientHintEnabled() && ua) {
|
||||
// ShouldSendClientHint is called to make sure UA is controlled by
|
||||
// Permissions Policy.
|
||||
if (ShouldSendClientHint(*policy, resource_origin, is_1p_origin,
|
||||
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
|
||||
@@ -569,6 +569,11 @@
|
||||
name: "AriaNotifyV2",
|
||||
status: {"Android": "test", "Win": "test", "Mac": "test", "Linux": "test"},
|
||||
},
|
||||
+ {
|
||||
+ name: "UserAgentClientHint",
|
||||
+ status: "stable",
|
||||
+ base_feature: "UserAgentClientHint",
|
||||
+ },
|
||||
{
|
||||
name: "AriaRowColIndexText",
|
||||
status: "stable",
|
||||
@@ -976,8 +981,7 @@
|
||||
// Allows top-level sites to restrict collection of high-entropy UA client
|
||||
// hints (from 3Ps, or itself) via the getHighEntropyValues API.
|
||||
// crbug.com/385161047
|
||||
- name: "ClientHintUAHighEntropyValuesPermissionPolicy",
|
||||
- status: "test",
|
||||
+ name: "ClientHintUAHighEntropyValuesPermissionPolicy", // disabled by default
|
||||
},
|
||||
{
|
||||
// Enables clipboardchange event API for listening for changes to the
|
||||
--
|
||||
@@ -1,100 +0,0 @@
|
||||
From: uazo <uazo@users.noreply.github.com>
|
||||
Date: Tue, 18 Jun 2024 14:14:06 +0000
|
||||
Subject: Close sessions on ip change
|
||||
|
||||
Exposed a flag to change the behaviour of the network stack with regard
|
||||
to the automatic reconnection of quic connections when the connection changes.
|
||||
By default changed from automatic reconnection to close connection on ip change.
|
||||
No change in doh connections.
|
||||
|
||||
License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
|
||||
---
|
||||
.../browser/network_session_configurator.cc | 12 ++++--------
|
||||
.../about_flags_cc/Close-Sessions-On-Ip-Change.inc | 14 ++++++++++++++
|
||||
.../features_cc/Close-Sessions-On-Ip-Change.inc | 5 +++++
|
||||
.../features_h/Close-Sessions-On-Ip-Change.inc | 3 +++
|
||||
net/base/features.cc | 2 +-
|
||||
5 files changed, 27 insertions(+), 9 deletions(-)
|
||||
create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Close-Sessions-On-Ip-Change.inc
|
||||
create mode 100644 cromite_flags/net/base/features_cc/Close-Sessions-On-Ip-Change.inc
|
||||
create mode 100644 cromite_flags/net/base/features_h/Close-Sessions-On-Ip-Change.inc
|
||||
|
||||
diff --git a/components/network_session_configurator/browser/network_session_configurator.cc b/components/network_session_configurator/browser/network_session_configurator.cc
|
||||
--- a/components/network_session_configurator/browser/network_session_configurator.cc
|
||||
+++ b/components/network_session_configurator/browser/network_session_configurator.cc
|
||||
@@ -222,9 +222,8 @@ quic::QuicTagVector GetQuicClientConnectionOptions(
|
||||
|
||||
bool ShouldQuicCloseSessionsOnIpChange(
|
||||
const VariationParameters& quic_trial_params) {
|
||||
- return base::EqualsCaseInsensitiveASCII(
|
||||
- GetVariationParam(quic_trial_params, "close_sessions_on_ip_change"),
|
||||
- "true");
|
||||
+ return base::FeatureList::IsEnabled(
|
||||
+ net::features::kCloseSessionsOnIpChange);
|
||||
}
|
||||
|
||||
bool ShouldQuicGoAwaySessionsOnIpChange(
|
||||
@@ -305,11 +304,8 @@ bool ShouldQuicEstimateInitialRtt(
|
||||
|
||||
bool ShouldQuicMigrateSessionsOnNetworkChangeV2(
|
||||
const VariationParameters& quic_trial_params) {
|
||||
- return GetVariationBoolParamOrFeatureSetting(
|
||||
- quic_trial_params, "migrate_sessions_on_network_change_v2",
|
||||
- base::FeatureList::IsEnabled(
|
||||
- net::features::kMigrateSessionsOnNetworkChangeV2),
|
||||
- "true");
|
||||
+ return base::FeatureList::IsEnabled(
|
||||
+ net::features::kMigrateSessionsOnNetworkChangeV2);
|
||||
}
|
||||
|
||||
bool ShouldQuicUseNewAlpsCodepoint(
|
||||
diff --git a/cromite_flags/chrome/browser/about_flags_cc/Close-Sessions-On-Ip-Change.inc b/cromite_flags/chrome/browser/about_flags_cc/Close-Sessions-On-Ip-Change.inc
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/cromite_flags/chrome/browser/about_flags_cc/Close-Sessions-On-Ip-Change.inc
|
||||
@@ -0,0 +1,14 @@
|
||||
+#ifdef FLAG_SECTION
|
||||
+
|
||||
+ {"close-sessions-on-ip-change",
|
||||
+ "Close sessions on IP change",
|
||||
+ "Option to close QUIC sessions on an IP address change, "
|
||||
+ "when QUIC connection migration is not enabled.", kOsAll,
|
||||
+ FEATURE_VALUE_TYPE(net::features::kCloseSessionsOnIpChange)},
|
||||
+
|
||||
+ {"migrate-sessions-on-network-change-v2",
|
||||
+ "QUIC connection migration",
|
||||
+ "Enable QUIC connection migration.", kOsAll,
|
||||
+ FEATURE_VALUE_TYPE(net::features::kMigrateSessionsOnNetworkChangeV2)},
|
||||
+
|
||||
+#endif
|
||||
diff --git a/cromite_flags/net/base/features_cc/Close-Sessions-On-Ip-Change.inc b/cromite_flags/net/base/features_cc/Close-Sessions-On-Ip-Change.inc
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/cromite_flags/net/base/features_cc/Close-Sessions-On-Ip-Change.inc
|
||||
@@ -0,0 +1,5 @@
|
||||
+CROMITE_FEATURE(kCloseSessionsOnIpChange,
|
||||
+ "CloseSessionsOnIpChange",
|
||||
+ base::FEATURE_ENABLED_BY_DEFAULT);
|
||||
+
|
||||
+SET_CROMITE_FEATURE_DISABLED(kMigrateSessionsOnNetworkChangeV2);
|
||||
diff --git a/cromite_flags/net/base/features_h/Close-Sessions-On-Ip-Change.inc b/cromite_flags/net/base/features_h/Close-Sessions-On-Ip-Change.inc
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/cromite_flags/net/base/features_h/Close-Sessions-On-Ip-Change.inc
|
||||
@@ -0,0 +1,3 @@
|
||||
+NET_EXPORT BASE_DECLARE_FEATURE(kCloseSessionsOnIpChange);
|
||||
+
|
||||
+NET_EXPORT BASE_DECLARE_FEATURE(kMigrateSessionsOnNetworkChangeV2);
|
||||
diff --git a/net/base/features.cc b/net/base/features.cc
|
||||
--- a/net/base/features.cc
|
||||
+++ b/net/base/features.cc
|
||||
@@ -509,7 +509,7 @@ BASE_FEATURE(kRelatedWebsitePartitionAPI, base::FEATURE_DISABLED_BY_DEFAULT);
|
||||
// NetworkChangeNotifier::AreNetworkHandlesSupported).
|
||||
#if BUILDFLAG(IS_ANDROID)
|
||||
inline constexpr auto kMigrateSessionsOnNetworkChangeV2Default =
|
||||
- base::FEATURE_ENABLED_BY_DEFAULT;
|
||||
+ base::FEATURE_DISABLED_BY_DEFAULT;
|
||||
#else // !BUILDFLAG(IS_ANDROID)
|
||||
inline constexpr auto kMigrateSessionsOnNetworkChangeV2Default =
|
||||
base::FEATURE_DISABLED_BY_DEFAULT;
|
||||
--
|
||||
@@ -1,24 +0,0 @@
|
||||
From: uazo <uazo@users.noreply.github.com>
|
||||
Date: Wed, 19 Jul 2023 09:32:36 +0000
|
||||
Subject: Compress libchrome to free up some space
|
||||
|
||||
upstream removed ModernLinker support for developer build (apk releases).
|
||||
see https://bugs.chromium.org/p/chromium/issues/detail?id=1383210
|
||||
|
||||
License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
|
||||
---
|
||||
chrome/android/chrome_public_apk_tmpl.gni | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/chrome/android/chrome_public_apk_tmpl.gni b/chrome/android/chrome_public_apk_tmpl.gni
|
||||
--- a/chrome/android/chrome_public_apk_tmpl.gni
|
||||
+++ b/chrome/android/chrome_public_apk_tmpl.gni
|
||||
@@ -677,6 +677,7 @@ template("chrome_common_apk_or_module_tmpl") {
|
||||
[ "//components/crash/core/app:chrome_crashpad_handler_named_as_so" ]
|
||||
loadable_modules += [ "$root_out_dir/libchrome_crashpad_handler.so" ]
|
||||
library_always_compress += [ "libchrome_crashpad_handler.so" ]
|
||||
+ library_always_compress += [ "libchrome.so" ]
|
||||
} else if (!_is_trichrome) {
|
||||
# Crashpad trampoline lives in TrichromeLibrary.apk.
|
||||
# https://chromium.googlesource.com/chromium/src/+/main/docs/android_native_libraries.md#Crashpad-Packaging
|
||||
--
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,296 +0,0 @@
|
||||
From: uazo <uazo@users.noreply.github.com>
|
||||
Date: Sat, 21 Sep 2024 15:32:02 +0000
|
||||
Subject: Cromite Branding: improve settings ui
|
||||
|
||||
Modification to the settings ui with the aim of making it clearer.
|
||||
|
||||
License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
|
||||
---
|
||||
chrome/android/chrome_java_resources.gni | 2 +-
|
||||
.../android/java/res/xml/main_preferences.xml | 4 +-
|
||||
.../res/xml/privacy_preferences_cromite.xml | 197 ++++++++++++++++++
|
||||
.../privacy/settings/PrivacySettings.java | 6 +-
|
||||
.../Cromite-settings-ui.grdp | 15 ++
|
||||
5 files changed, 219 insertions(+), 5 deletions(-)
|
||||
create mode 100644 chrome/android/java/res/xml/privacy_preferences_cromite.xml
|
||||
create mode 100644 chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Cromite-settings-ui.grdp
|
||||
|
||||
diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_java_resources.gni
|
||||
--- a/chrome/android/chrome_java_resources.gni
|
||||
+++ b/chrome/android/chrome_java_resources.gni
|
||||
@@ -652,7 +652,7 @@ chrome_java_resources = [
|
||||
"java/res/xml/manage_sync_preferences.xml",
|
||||
"java/res/xml/personalize_google_services_preferences.xml",
|
||||
"java/res/xml/incognito_preferences.xml",
|
||||
- "java/res/xml/privacy_preferences.xml",
|
||||
+ "java/res/xml/privacy_preferences.xml", "java/res/xml/privacy_preferences_cromite.xml",
|
||||
"java/res/xml/referer_policy_preferences.xml",
|
||||
"java/res/layout/radio_button_group_referer_policy_preference.xml",
|
||||
"java/res/xml/search_widget_info.xml",
|
||||
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
|
||||
@@ -11,7 +11,7 @@ found in the LICENSE file.
|
||||
<!-- `order=0` is reserved and it will be added in code. -->
|
||||
<!-- TODO(crbug.com/364906215): Move SettingsPromoCardPreference here once SyncPromoPreference is removed -->
|
||||
<PreferenceCategory
|
||||
- android:key="account_and_google_services_section"
|
||||
+ android:key="account_and_google_services_section" app:isPreferenceVisible="false"
|
||||
android:order="1001"
|
||||
android:title="@string/prefs_section_account_and_google_services"/>
|
||||
<org.chromium.chrome.browser.sync.settings.SignInPreference
|
||||
@@ -24,7 +24,7 @@ found in the LICENSE file.
|
||||
android:layout="@layout/account_management_account_row"
|
||||
android:title="@string/sync_category_title"/>
|
||||
<org.chromium.components.browser_ui.settings.ChromeBasePreference
|
||||
- android:key="google_services"
|
||||
+ android:key="google_services" app:isPreferenceVisible="false"
|
||||
android:order="1004"
|
||||
android:layout="@layout/account_management_account_row"
|
||||
android:title="@string/prefs_google_services"
|
||||
diff --git a/chrome/android/java/res/xml/privacy_preferences_cromite.xml b/chrome/android/java/res/xml/privacy_preferences_cromite.xml
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/chrome/android/java/res/xml/privacy_preferences_cromite.xml
|
||||
@@ -0,0 +1,197 @@
|
||||
+<?xml version="1.0" encoding="utf-8"?><!--
|
||||
+Copyright 2022 The Chromium Authors
|
||||
+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">
|
||||
+
|
||||
+ <PreferenceCategory
|
||||
+ android:title="@string/browsing_data_section_title"/>
|
||||
+ <Preference
|
||||
+ android:key="clear_browsing_data"
|
||||
+ android:title="@string/clear_browsing_data_title"
|
||||
+ android:summary="@string/clear_browsing_data_summary"
|
||||
+ android:fragment="org.chromium.chrome.browser.browsing_data.ClearBrowsingDataFragment" />
|
||||
+ <Preference
|
||||
+ android:key="clear_browsing_data_advanced"
|
||||
+ android:title="@string/clear_browsing_data_at_start_title"
|
||||
+ android:summary="@string/clear_browsing_data_at_start_summary"
|
||||
+ android:fragment="org.chromium.chrome.browser.browsing_data.ClearBrowsingDataFragmentAtStart" />
|
||||
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
|
||||
+ 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" />
|
||||
+ <org.chromium.components.browser_ui.settings.SpinnerPreference
|
||||
+ android:key="history_expire_days_threshold"
|
||||
+ android:persistent="false"
|
||||
+ android:title="@string/history_expire_days_threshold_title"
|
||||
+ android:summary="@string/history_expire_days_threshold_summary"
|
||||
+ app:singleLine="true" />
|
||||
+
|
||||
+ <PreferenceCategory
|
||||
+ android:title="@string/data_exposed_to_website_section_title"/>
|
||||
+ <org.chromium.components.browser_ui.settings.ChromeBasePreference
|
||||
+ android:key="third_party_cookies"
|
||||
+ android:title="@string/third_party_cookies_link_row_label"
|
||||
+ android:fragment="org.chromium.components.browser_ui.site_settings.SingleCategorySettings" />
|
||||
+ <Preference
|
||||
+ android:key="do_not_track"
|
||||
+ android:title="@string/do_not_track_title"
|
||||
+ android:fragment="org.chromium.chrome.browser.privacy.settings.DoNotTrackSettings" />
|
||||
+ <Preference
|
||||
+ android:key="gpc"
|
||||
+ android:title="@string/gpc_title"
|
||||
+ android:fragment="org.chromium.chrome.browser.privacy.settings.GpcSettings" />
|
||||
+ <Preference
|
||||
+ android:key="referers_policy"
|
||||
+ android:title="@string/referers_policy_title"
|
||||
+ android:fragment="org.chromium.chrome.browser.privacy.settings.RefererSettingsFragment"/>
|
||||
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
|
||||
+ android:key="can_make_payment"
|
||||
+ android:title="@string/can_make_payment_title"
|
||||
+ android:summary="@string/settings_can_make_payment_toggle_label" />
|
||||
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
|
||||
+ android:key="throttle_main_thread_to_60hz"
|
||||
+ android:title="@string/throttle_main_thread_to_60hz_title"
|
||||
+ android:summary="@string/throttle_main_thread_to_60hz_summary"
|
||||
+ app:featureName="throttle-main-thread-to-60hz"
|
||||
+ app:needRestart="true" />
|
||||
+
|
||||
+ <PreferenceCategory
|
||||
+ android:title="@string/data_exposed_to_device_section_title"/>
|
||||
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
|
||||
+ 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="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" />
|
||||
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
|
||||
+ android:key="use_tab_switcher_list_mode"
|
||||
+ android:title="@string/tab_switcher_list_mode_title"
|
||||
+ android:summary="@string/tab_switcher_list_mode_summary"
|
||||
+ app:featureName="TabSwitcherListMode"
|
||||
+ app:needRestart="true" />
|
||||
+ <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" />
|
||||
+
|
||||
+ <PreferenceCategory
|
||||
+ android:title="@string/incognito_related_section_title"/>
|
||||
+ <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" />
|
||||
+ <org.chromium.chrome.browser.incognito.reauth.IncognitoReauthSettingSwitchPreference
|
||||
+ android:key="incognito_lock"
|
||||
+ android:title="@string/settings_incognito_tab_lock_title"
|
||||
+ android:summary="@string/settings_incognito_tab_lock_summary_android_setting_off"
|
||||
+ android:persistent="false" />
|
||||
+ <Preference
|
||||
+ android:key="incognito_settings"
|
||||
+ android:title="@string/incognito_settings_title"
|
||||
+ android:summary="@string/incognito_settings_summary"
|
||||
+ android:fragment="org.chromium.chrome.browser.privacy.settings.IncognitoSettings"/>
|
||||
+
|
||||
+ <PreferenceCategory
|
||||
+ android:key="security_section"
|
||||
+ android:title="@string/security_section_title"/>
|
||||
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
|
||||
+ android:key="https_first_mode_legacy"
|
||||
+ android:title="@string/settings_https_first_mode_title"
|
||||
+ android:summary="@string/settings_https_first_mode_summary" />
|
||||
+ <Preference
|
||||
+ android:key="https_first_mode"
|
||||
+ android:title="@string/settings_https_first_mode_title"
|
||||
+ android:fragment="org.chromium.chrome.browser.ssl.HttpsFirstModeSettingsFragment" />
|
||||
+ <org.chromium.components.browser_ui.settings.ChromeBasePreference
|
||||
+ android:key="secure_dns"
|
||||
+ android:title="@string/settings_secure_dns_title"
|
||||
+ android:fragment="org.chromium.chrome.browser.privacy.secure_dns.SecureDnsSettings" />
|
||||
+
|
||||
+ <PreferenceCategory
|
||||
+ android:title="@string/services_category_title"/>
|
||||
+ <org.chromium.chrome.browser.about_settings.HyperlinkPreference
|
||||
+ android:key="proxy"
|
||||
+ android:title="@string/proxy_title"
|
||||
+ app:url="@string/proxy_url" />
|
||||
+ <org.chromium.chrome.browser.about_settings.HyperlinkPreference
|
||||
+ android:key="cromite_flags"
|
||||
+ android:title="@string/cromite_flags_title"
|
||||
+ app:url="@string/cromite_flags_url" />
|
||||
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
|
||||
+ android:key="search_suggestions"
|
||||
+ android:title="@string/improve_search_suggestions_title"
|
||||
+ android:summary="@string/improve_search_suggestions_summary"
|
||||
+ android:persistent="false"/>
|
||||
+
|
||||
+ <!--Always hidden-->
|
||||
+ <org.chromium.chrome.browser.safety_hub.SafetyHubExpandablePreference
|
||||
+ android:key="advanced_protection_info"
|
||||
+ android:title="@string/settings_privacy_and_security_advanced_protection_section_title"
|
||||
+ app:isPreferenceVisible="false" />
|
||||
+ <Preference
|
||||
+ android:key="safe_browsing"
|
||||
+ android:title="@string/prefs_safe_browsing_title"
|
||||
+ android:summary="@string/prefs_safe_browsing_summary"
|
||||
+ android:fragment="org.chromium.chrome.browser.safe_browsing.settings.SafeBrowsingSettingsFragment"
|
||||
+ app:isPreferenceVisible="false" />
|
||||
+ <org.chromium.components.browser_ui.settings.ChromeBasePreference
|
||||
+ android:key="contextual_search"
|
||||
+ android:title="@string/contextual_search_title"
|
||||
+ android:fragment="org.chromium.chrome.browser.contextualsearch.ContextualSearchSettingsFragment"
|
||||
+ app:isPreferenceVisible="false" />
|
||||
+ <Preference
|
||||
+ android:key="privacy_guide"
|
||||
+ app:isPreferenceVisible="false"
|
||||
+ android:title="@string/privacy_guide_pref_title"
|
||||
+ android:summary="@string/privacy_guide_pref_summary"
|
||||
+ android:fragment="org.chromium.chrome.browser.privacy_guide.PrivacyGuideFragment" />
|
||||
+ <Preference
|
||||
+ android:key="tracking_protection"
|
||||
+ android:title="@string/third_party_cookies_link_row_label"
|
||||
+ android:fragment="org.chromium.components.privacy_sandbox.TrackingProtectionSettings"
|
||||
+ app:isPreferenceVisible="false" />
|
||||
+ <Preference
|
||||
+ android:key="incognito_tracking_protections"
|
||||
+ android:title="@string/incognito_tracking_protections_link_row_label"
|
||||
+ android:summary="@string/incognito_tracking_protections_link_row_sublabel"
|
||||
+ android:fragment="org.chromium.components.privacy_sandbox.IncognitoTrackingProtectionsFragment"
|
||||
+ app:isPreferenceVisible="false" />
|
||||
+ <Preference
|
||||
+ android:key="privacy_sandbox"
|
||||
+ android:title="@string/ad_privacy_link_row_label"
|
||||
+ android:summary="@string/ad_privacy_link_row_sub_label"
|
||||
+ android:fragment="org.chromium.chrome.browser.privacy_sandbox.PrivacySandboxSettingsFragment" />
|
||||
+ <Preference
|
||||
+ android:key="preload_pages"
|
||||
+ android:title="@string/preload_pages_title"
|
||||
+ android:summary="@string/preload_pages_summary"
|
||||
+ android:fragment="org.chromium.chrome.browser.prefetch.settings.PreloadPagesSettingsFragment"
|
||||
+ app:isPreferenceVisible="false" />
|
||||
+ <org.chromium.components.browser_ui.settings.TextMessagePreference
|
||||
+ android:key="sync_and_services_link"
|
||||
+ android:summary="@string/privacy_sync_and_services_link_legacy"
|
||||
+ app:allowDividerBelow="false"
|
||||
+ app:isPreferenceVisible="false" />
|
||||
+ <org.chromium.components.browser_ui.settings.ChromeBasePreference
|
||||
+ android:key="javascript_optimizer"
|
||||
+ android:title="@string/website_settings_privacy_and_security_javascript_optimizer_row_label"
|
||||
+ android:fragment="org.chromium.components.browser_ui.site_settings.SingleCategorySettings"
|
||||
+ app:isPreferenceVisible="false" />
|
||||
+</PreferenceScreen>
|
||||
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
|
||||
@@ -194,7 +194,7 @@ public class PrivacySettings extends ChromeBaseSettingsFragment
|
||||
public void onCreatePreferencesCromite(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
|
||||
mPageTitle.set(getString(R.string.prefs_privacy_security));
|
||||
|
||||
- SettingsUtils.addPreferencesFromResource(this, R.xml.privacy_preferences);
|
||||
+ SettingsUtils.addPreferencesFromResource(this, R.xml.privacy_preferences_cromite);
|
||||
|
||||
Preference incognitoTrackingProtectionsPreference =
|
||||
findPreference(PREF_INCOGNITO_TRACKING_PROTECTIONS);
|
||||
@@ -290,7 +290,9 @@ public class PrivacySettings extends ChromeBaseSettingsFragment
|
||||
|
||||
ChromeSwitchPreference passwordLeakTogglePref =
|
||||
(ChromeSwitchPreference) findPreference(PREF_PASSWORD_LEAK_DETECTION);
|
||||
- passwordLeakTogglePref.setOnPreferenceChangeListener(this);
|
||||
+ if (passwordLeakTogglePref != null) {
|
||||
+ passwordLeakTogglePref.setVisible(false);
|
||||
+ }
|
||||
|
||||
mSearchSuggestions = (ChromeSwitchPreference) findPreference(PREF_SEARCH_SUGGESTIONS);
|
||||
mSearchSuggestions.setOnPreferenceChangeListener(this);
|
||||
diff --git a/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Cromite-settings-ui.grdp b/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Cromite-settings-ui.grdp
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Cromite-settings-ui.grdp
|
||||
@@ -0,0 +1,15 @@
|
||||
+<?xml version="1.0" encoding="utf-8"?>
|
||||
+<grit-part>
|
||||
+ <message name="IDS_BROWSING_DATA_SECTION_TITLE" desc="">
|
||||
+ Browsing data
|
||||
+ </message>
|
||||
+ <message name="IDS_DATA_EXPOSED_TO_WEBSITE_SECTION_TITLE" desc="">
|
||||
+ Data exposed to the websites
|
||||
+ </message>
|
||||
+ <message name="IDS_INCOGNITO_RELATED_SECTION_TITLE" desc="">
|
||||
+ Incognito mode
|
||||
+ </message>
|
||||
+ <message name="IDS_DATA_EXPOSED_TO_DEVICE_SECTION_TITLE" desc="">
|
||||
+ Data exposed in the device
|
||||
+ </message>
|
||||
+</grit-part>
|
||||
--
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user