M115 stage 6

This commit is contained in:
Alexander Frick 2023-08-11 04:54:54 -05:00
parent 85ec748136
commit 65337b1866
25 changed files with 1548 additions and 1280 deletions

View file

@ -355,9 +355,7 @@ bool IsDefaultSupportedAudioType(const AudioType& type) {
case AudioCodec::kAMR_NB:
case AudioCodec::kAMR_WB:
case AudioCodec::kGSM_MS:
case AudioCodec::kEAC3:
case AudioCodec::kALAC:
case AudioCodec::kAC3:
case AudioCodec::kMpegHAudio:
case AudioCodec::kUnknown:
return false;
@ -368,6 +366,13 @@ bool IsDefaultSupportedAudioType(const AudioType& type) {
return true;
#else
return false;
#endif
case AudioCodec::kAC3:
case AudioCodec::kEAC3:
#if BUILDFLAG(ENABLE_PLATFORM_AC3_EAC3_AUDIO)
return true;
#else
return false;
#endif
}
}
@ -379,7 +384,7 @@ bool IsBuiltInVideoCodec(VideoCodec codec) {
if (codec == VideoCodec::kVP8)
return true;
#if BUILDFLAG(USE_PROPRIETARY_CODECS)
if (codec == VideoCodec::kH264)
if (codec == VideoCodec::kH264 || codec == VideoCodec::kHEVC)
return true;
#endif // BUILDFLAG(USE_PROPRIETARY_CODECS)
#endif // BUILDFLAG(ENABLE_FFMPEG_VIDEO_DECODERS)

View file

@ -740,7 +740,7 @@ bool AVStreamToVideoDecoderConfig(const AVStream* stream,
AVMasteringDisplayMetadata* metadata =
reinterpret_cast<AVMasteringDisplayMetadata*>(side_data.data);
if (metadata->has_primaries) {
hdr_metadata.color_volume_metadata.primaries = {
hdr_metadata.smpte_st_2086.primaries = {
static_cast<float>(av_q2d(metadata->display_primaries[0][0])),
static_cast<float>(av_q2d(metadata->display_primaries[0][1])),
static_cast<float>(av_q2d(metadata->display_primaries[1][0])),
@ -752,9 +752,9 @@ bool AVStreamToVideoDecoderConfig(const AVStream* stream,
};
}
if (metadata->has_luminance) {
hdr_metadata.color_volume_metadata.luminance_max =
hdr_metadata.smpte_st_2086.luminance_max =
av_q2d(metadata->max_luminance);
hdr_metadata.color_volume_metadata.luminance_min =
hdr_metadata.smpte_st_2086.luminance_min =
av_q2d(metadata->min_luminance);
}
}
@ -910,26 +910,6 @@ VideoPixelFormat AVPixelFormatToVideoPixelFormat(AVPixelFormat pixel_format) {
return PIXEL_FORMAT_UNKNOWN;
}
VideoColorSpace AVColorSpaceToColorSpace(AVColorSpace color_space,
AVColorRange color_range) {
// TODO(hubbe): make this better
if (color_range == AVCOL_RANGE_JPEG)
return VideoColorSpace::JPEG();
switch (color_space) {
case AVCOL_SPC_UNSPECIFIED:
break;
case AVCOL_SPC_BT709:
return VideoColorSpace::REC709();
case AVCOL_SPC_SMPTE170M:
case AVCOL_SPC_BT470BG:
return VideoColorSpace::REC601();
default:
DVLOG(1) << "Unknown AVColorSpace: " << color_space;
}
return VideoColorSpace();
}
std::string AVErrorToString(int errnum) {
char errbuf[AV_ERROR_MAX_STRING_SIZE] = {0};
av_strerror(errnum, errbuf, AV_ERROR_MAX_STRING_SIZE);

View file

@ -113,6 +113,10 @@ declare_args() {
enable_hevc_parser_and_hw_decoder =
proprietary_codecs &&
(use_fuzzing_engine || is_win || is_mac || is_android || is_linux)
# Enable inclusion of VVC/H.266 parser/demuxer, and also enable VVC/H.266 decoding
# with hardware acceleration provided by platform. Disabled by default for all builds.
enable_platform_vvc = false
}
# Use another declare_args() to allow dependence on args defined above.

View file

@ -355,9 +355,7 @@ bool IsDefaultSupportedAudioType(const AudioType& type) {
case AudioCodec::kAMR_NB:
case AudioCodec::kAMR_WB:
case AudioCodec::kGSM_MS:
case AudioCodec::kEAC3:
case AudioCodec::kALAC:
case AudioCodec::kAC3:
case AudioCodec::kMpegHAudio:
case AudioCodec::kUnknown:
return false;
@ -368,6 +366,13 @@ bool IsDefaultSupportedAudioType(const AudioType& type) {
return true;
#else
return false;
#endif
case AudioCodec::kAC3:
case AudioCodec::kEAC3:
#if BUILDFLAG(ENABLE_PLATFORM_AC3_EAC3_AUDIO)
return true;
#else
return false;
#endif
}
}

View file

@ -740,7 +740,7 @@ bool AVStreamToVideoDecoderConfig(const AVStream* stream,
AVMasteringDisplayMetadata* metadata =
reinterpret_cast<AVMasteringDisplayMetadata*>(side_data.data);
if (metadata->has_primaries) {
hdr_metadata.color_volume_metadata.primaries = {
hdr_metadata.smpte_st_2086.primaries = {
static_cast<float>(av_q2d(metadata->display_primaries[0][0])),
static_cast<float>(av_q2d(metadata->display_primaries[0][1])),
static_cast<float>(av_q2d(metadata->display_primaries[1][0])),
@ -752,9 +752,9 @@ bool AVStreamToVideoDecoderConfig(const AVStream* stream,
};
}
if (metadata->has_luminance) {
hdr_metadata.color_volume_metadata.luminance_max =
hdr_metadata.smpte_st_2086.luminance_max =
av_q2d(metadata->max_luminance);
hdr_metadata.color_volume_metadata.luminance_min =
hdr_metadata.smpte_st_2086.luminance_min =
av_q2d(metadata->min_luminance);
}
}
@ -910,26 +910,6 @@ VideoPixelFormat AVPixelFormatToVideoPixelFormat(AVPixelFormat pixel_format) {
return PIXEL_FORMAT_UNKNOWN;
}
VideoColorSpace AVColorSpaceToColorSpace(AVColorSpace color_space,
AVColorRange color_range) {
// TODO(hubbe): make this better
if (color_range == AVCOL_RANGE_JPEG)
return VideoColorSpace::JPEG();
switch (color_space) {
case AVCOL_SPC_UNSPECIFIED:
break;
case AVCOL_SPC_BT709:
return VideoColorSpace::REC709();
case AVCOL_SPC_SMPTE170M:
case AVCOL_SPC_BT470BG:
return VideoColorSpace::REC601();
default:
DVLOG(1) << "Unknown AVColorSpace: " << color_space;
}
return VideoColorSpace();
}
std::string AVErrorToString(int errnum) {
char errbuf[AV_ERROR_MAX_STRING_SIZE] = {0};
av_strerror(errnum, errbuf, AV_ERROR_MAX_STRING_SIZE);

View file

@ -203,7 +203,7 @@
<DT><A HREF="https://source.chromium.org/chromium/chromium/src/+/refs/tags/115.0.5790.172:media/ffmpeg/ffmpeg_common.cc;bpv=1" ADD_DATE="1678753149" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADIUlEQVQ4jW1TXWwUZRQ955ufnZ3dlm4VpE2Q+lND1cSQYDBaKY2VEkUFa1d9K4laBROEIg+mDfvkg5Bu9MWoD/hkTJdqJBFCMRENEqONRkMbIiWGWn5SjWw7OzO7szPf9UFCCnrebu7JuTc55xA3QURYKkEtXw7+1gDm0mDWBtMm+GcAnb+P0VI+lw4fTIp7C6O7dU3nlKFyisxp0TmDRpMmmyDSCqLY96D1HUQIUsxrd9nfD3VrHDbDTi/ENi5V/TCdtmlQ0Y60dmwANNXT0HpodEx+2kNUb/4e45PSUhBR/1lcw6Gvf3fGf4gmJn6NBgGgUBBFAHj+vepdKSvp2r5m/pPu7juqA4fEOTcXvhaG2KAMVjOp5MjJ4eynBOTIz7Vnzs5Jcfoiej9+1TlHAHjyneArKrl/XcVtnQLcS/A/b23J9DzUBgQRcPo84JX90VOF7JCIGFsOBLMCTB/dl3lc9b+7uA1O+jHb4OuFAvVl+oOtLZmekc1JbUc36nt7pb6zK0mslL2n6+3wUZJJyuIuOm7Ps8Xyc8qP3Q+TMDj+2W73MABUatK5vg26vcVQf3navOqL+Ui7kay53dJeEG8AgPE33PEkDI6HSfZ9BRFAQJF/LSVYDSIQEBiKsE0lsRaGNSiTEl43X4SAQKWN8GUj427qG/XyAJB15IvTM+CJKW04FuoiEpd+1Grmj8BvzPIYAGwten2mm9mUsauDBIAnDvgnAHQMrHZX5/NMOguLBy07NXTPKhvVGnDhb0BH3pvfDjcelDExnpoNLormmS/3uT0KAFY0xDs2dhiLqXZsBoBThca9QK1z8mxlZPpCZZeq+2dMqi2AcGYtzOZG9dayrHoFACgiJCkTU9FAJZCtCxX7he3dvCFl60b8ta6lh2/T2Rdf2oam3gc4f2MXRLi7NOd0tq34iFS/aNFHIwBhJLGVSLRqZd3rWNYQfj+L5igOdb6YvoISNEC5LgBSDk9G6ynYScgVrbGgFMsQKSdiLIhIWSe6rGifzz/M8H/bCABjU2L781BeOCMrK5FcvfNeuexB8M1J7N+/MSEpS/n/AGH0clblBN69AAAAAElFTkSuQmCC">ffmpeg_common.cc - Chromium Code Search</A>
<DT><A HREF="https://source.chromium.org/chromium/chromium/src/+/refs/tags/115.0.5790.172:build/config/android/BUILD.gn;bpv=1" ADD_DATE="1679174369" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADIUlEQVQ4jW1TXWwUZRQ955ufnZ3dlm4VpE2Q+lND1cSQYDBaKY2VEkUFa1d9K4laBROEIg+mDfvkg5Bu9MWoD/hkTJdqJBFCMRENEqONRkMbIiWGWn5SjWw7OzO7szPf9UFCCnrebu7JuTc55xA3QURYKkEtXw7+1gDm0mDWBtMm+GcAnb+P0VI+lw4fTIp7C6O7dU3nlKFyisxp0TmDRpMmmyDSCqLY96D1HUQIUsxrd9nfD3VrHDbDTi/ENi5V/TCdtmlQ0Y60dmwANNXT0HpodEx+2kNUb/4e45PSUhBR/1lcw6Gvf3fGf4gmJn6NBgGgUBBFAHj+vepdKSvp2r5m/pPu7juqA4fEOTcXvhaG2KAMVjOp5MjJ4eynBOTIz7Vnzs5Jcfoiej9+1TlHAHjyneArKrl/XcVtnQLcS/A/b23J9DzUBgQRcPo84JX90VOF7JCIGFsOBLMCTB/dl3lc9b+7uA1O+jHb4OuFAvVl+oOtLZmekc1JbUc36nt7pb6zK0mslL2n6+3wUZJJyuIuOm7Ps8Xyc8qP3Q+TMDj+2W73MABUatK5vg26vcVQf3navOqL+Ui7kay53dJeEG8AgPE33PEkDI6HSfZ9BRFAQJF/LSVYDSIQEBiKsE0lsRaGNSiTEl43X4SAQKWN8GUj427qG/XyAJB15IvTM+CJKW04FuoiEpd+1Grmj8BvzPIYAGwten2mm9mUsauDBIAnDvgnAHQMrHZX5/NMOguLBy07NXTPKhvVGnDhb0BH3pvfDjcelDExnpoNLormmS/3uT0KAFY0xDs2dhiLqXZsBoBThca9QK1z8mxlZPpCZZeq+2dMqi2AcGYtzOZG9dayrHoFACgiJCkTU9FAJZCtCxX7he3dvCFl60b8ta6lh2/T2Rdf2oam3gc4f2MXRLi7NOd0tq34iFS/aNFHIwBhJLGVSLRqZd3rWNYQfj+L5igOdb6YvoISNEC5LgBSDk9G6ynYScgVrbGgFMsQKSdiLIhIWSe6rGifzz/M8H/bCABjU2L781BeOCMrK5FcvfNeuexB8M1J7N+/MSEpS/n/AGH0clblBN69AAAAAElFTkSuQmCC">BUILD.gn - Chromium Code Search</A>
<DT><A HREF="https://source.chromium.org/chromium/chromium/src/+/refs/tags/115.0.5790.172:media/media_options.gni;bpv=1" ADD_DATE="1679174990" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADIUlEQVQ4jW1TXWwUZRQ955ufnZ3dlm4VpE2Q+lND1cSQYDBaKY2VEkUFa1d9K4laBROEIg+mDfvkg5Bu9MWoD/hkTJdqJBFCMRENEqONRkMbIiWGWn5SjWw7OzO7szPf9UFCCnrebu7JuTc55xA3QURYKkEtXw7+1gDm0mDWBtMm+GcAnb+P0VI+lw4fTIp7C6O7dU3nlKFyisxp0TmDRpMmmyDSCqLY96D1HUQIUsxrd9nfD3VrHDbDTi/ENi5V/TCdtmlQ0Y60dmwANNXT0HpodEx+2kNUb/4e45PSUhBR/1lcw6Gvf3fGf4gmJn6NBgGgUBBFAHj+vepdKSvp2r5m/pPu7juqA4fEOTcXvhaG2KAMVjOp5MjJ4eynBOTIz7Vnzs5Jcfoiej9+1TlHAHjyneArKrl/XcVtnQLcS/A/b23J9DzUBgQRcPo84JX90VOF7JCIGFsOBLMCTB/dl3lc9b+7uA1O+jHb4OuFAvVl+oOtLZmekc1JbUc36nt7pb6zK0mslL2n6+3wUZJJyuIuOm7Ps8Xyc8qP3Q+TMDj+2W73MABUatK5vg26vcVQf3navOqL+Ui7kay53dJeEG8AgPE33PEkDI6HSfZ9BRFAQJF/LSVYDSIQEBiKsE0lsRaGNSiTEl43X4SAQKWN8GUj427qG/XyAJB15IvTM+CJKW04FuoiEpd+1Grmj8BvzPIYAGwten2mm9mUsauDBIAnDvgnAHQMrHZX5/NMOguLBy07NXTPKhvVGnDhb0BH3pvfDjcelDExnpoNLormmS/3uT0KAFY0xDs2dhiLqXZsBoBThca9QK1z8mxlZPpCZZeq+2dMqi2AcGYtzOZG9dayrHoFACgiJCkTU9FAJZCtCxX7he3dvCFl60b8ta6lh2/T2Rdf2oam3gc4f2MXRLi7NOd0tq34iFS/aNFHIwBhJLGVSLRqZd3rWNYQfj+L5igOdb6YvoISNEC5LgBSDk9G6ynYScgVrbGgFMsQKSdiLIhIWSe6rGifzz/M8H/bCABjU2L781BeOCMrK5FcvfNeuexB8M1J7N+/MSEpS/n/AGH0clblBN69AAAAAElFTkSuQmCC">media_options.gni - Chromium Code Search</A>
<DT><A HREF="https://source.chromium.org/chromium/chromium/src/+/main:tools/cfi/ignores.txt;bpv=1" ADD_DATE="1682694796" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADIUlEQVQ4jW1TXWwUZRQ955ufnZ3dlm4VpE2Q+lND1cSQYDBaKY2VEkUFa1d9K4laBROEIg+mDfvkg5Bu9MWoD/hkTJdqJBFCMRENEqONRkMbIiWGWn5SjWw7OzO7szPf9UFCCnrebu7JuTc55xA3QURYKkEtXw7+1gDm0mDWBtMm+GcAnb+P0VI+lw4fTIp7C6O7dU3nlKFyisxp0TmDRpMmmyDSCqLY96D1HUQIUsxrd9nfD3VrHDbDTi/ENi5V/TCdtmlQ0Y60dmwANNXT0HpodEx+2kNUb/4e45PSUhBR/1lcw6Gvf3fGf4gmJn6NBgGgUBBFAHj+vepdKSvp2r5m/pPu7juqA4fEOTcXvhaG2KAMVjOp5MjJ4eynBOTIz7Vnzs5Jcfoiej9+1TlHAHjyneArKrl/XcVtnQLcS/A/b23J9DzUBgQRcPo84JX90VOF7JCIGFsOBLMCTB/dl3lc9b+7uA1O+jHb4OuFAvVl+oOtLZmekc1JbUc36nt7pb6zK0mslL2n6+3wUZJJyuIuOm7Ps8Xyc8qP3Q+TMDj+2W73MABUatK5vg26vcVQf3navOqL+Ui7kay53dJeEG8AgPE33PEkDI6HSfZ9BRFAQJF/LSVYDSIQEBiKsE0lsRaGNSiTEl43X4SAQKWN8GUj427qG/XyAJB15IvTM+CJKW04FuoiEpd+1Grmj8BvzPIYAGwten2mm9mUsauDBIAnDvgnAHQMrHZX5/NMOguLBy07NXTPKhvVGnDhb0BH3pvfDjcelDExnpoNLormmS/3uT0KAFY0xDs2dhiLqXZsBoBThca9QK1z8mxlZPpCZZeq+2dMqi2AcGYtzOZG9dayrHoFACgiJCkTU9FAJZCtCxX7he3dvCFl60b8ta6lh2/T2Rdf2oam3gc4f2MXRLi7NOd0tq34iFS/aNFHIwBhJLGVSLRqZd3rWNYQfj+L5igOdb6YvoISNEC5LgBSDk9G6ynYScgVrbGgFMsQKSdiLIhIWSe6rGifzz/M8H/bCABjU2L781BeOCMrK5FcvfNeuexB8M1J7N+/MSEpS/n/AGH0clblBN69AAAAAElFTkSuQmCC">ignores.txt - Chromium Code Search</A>
<DT><A HREF="https://source.chromium.org/chromium/chromium/src/+/refs/tags/115.0.5790.172:tools/cfi/ignores.txt;bpv=1" ADD_DATE="1682694796" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADIUlEQVQ4jW1TXWwUZRQ955ufnZ3dlm4VpE2Q+lND1cSQYDBaKY2VEkUFa1d9K4laBROEIg+mDfvkg5Bu9MWoD/hkTJdqJBFCMRENEqONRkMbIiWGWn5SjWw7OzO7szPf9UFCCnrebu7JuTc55xA3QURYKkEtXw7+1gDm0mDWBtMm+GcAnb+P0VI+lw4fTIp7C6O7dU3nlKFyisxp0TmDRpMmmyDSCqLY96D1HUQIUsxrd9nfD3VrHDbDTi/ENi5V/TCdtmlQ0Y60dmwANNXT0HpodEx+2kNUb/4e45PSUhBR/1lcw6Gvf3fGf4gmJn6NBgGgUBBFAHj+vepdKSvp2r5m/pPu7juqA4fEOTcXvhaG2KAMVjOp5MjJ4eynBOTIz7Vnzs5Jcfoiej9+1TlHAHjyneArKrl/XcVtnQLcS/A/b23J9DzUBgQRcPo84JX90VOF7JCIGFsOBLMCTB/dl3lc9b+7uA1O+jHb4OuFAvVl+oOtLZmekc1JbUc36nt7pb6zK0mslL2n6+3wUZJJyuIuOm7Ps8Xyc8qP3Q+TMDj+2W73MABUatK5vg26vcVQf3navOqL+Ui7kay53dJeEG8AgPE33PEkDI6HSfZ9BRFAQJF/LSVYDSIQEBiKsE0lsRaGNSiTEl43X4SAQKWN8GUj427qG/XyAJB15IvTM+CJKW04FuoiEpd+1Grmj8BvzPIYAGwten2mm9mUsauDBIAnDvgnAHQMrHZX5/NMOguLBy07NXTPKhvVGnDhb0BH3pvfDjcelDExnpoNLormmS/3uT0KAFY0xDs2dhiLqXZsBoBThca9QK1z8mxlZPpCZZeq+2dMqi2AcGYtzOZG9dayrHoFACgiJCkTU9FAJZCtCxX7he3dvCFl60b8ta6lh2/T2Rdf2oam3gc4f2MXRLi7NOd0tq34iFS/aNFHIwBhJLGVSLRqZd3rWNYQfj+L5igOdb6YvoISNEC5LgBSDk9G6ynYScgVrbGgFMsQKSdiLIhIWSe6rGifzz/M8H/bCABjU2L781BeOCMrK5FcvfNeuexB8M1J7N+/MSEpS/n/AGH0clblBN69AAAAAElFTkSuQmCC">ignores.txt - Chromium Code Search</A>
</DL><p>
<DT><H3 ADD_DATE="1685601933" LAST_MODIFIED="1685602782">Th23</H3>
<DL><p>

View file

@ -8,10 +8,6 @@
- https://github.com/ungoogled-software/ungoogled-chromium/pull/2314/files
&#45; Add env variables for all scripts for chromium src dir location
- https://github.com/Alex313031/thorium/blob/main/trunk.sh
&#45; Update build instructions and add Mac build instructions (also merge to website)
- https://github.com/Alex313031/thorium/blob/main/trunk.sh
@ -19,3 +15,12 @@
&#45; Update win scripts to work seamlessly
- https://github.com/Alex313031/thorium/tree/main/win_scripts
&#45; Re-evaluate vector icons and webui images for CR23 refresh
- To keep .icons correct
&#45; Add new Thorium shortcuts to ThoriumOS Shortcuts App
- For ChromeOS only: If you plan on adding a new accelerator and want it
displayed in the Shortcuts app, please follow the instructions at: `ash/webui/shortcut_customization_ui/backend/accelerator_layout_table.h`.

View file

@ -1 +1 @@
START "" "%cd%\BIN\114.0.5735.205\thorium_shell.exe" --data-path="%~dp0%\USER_DATA\thorium_shell" --allow-outdated-plugins --disable-logging --disable-breakpad --enable-experimental-web-platform-features --new-canvas-2d-api
START "" "%cd%\BIN\115.0.5790.172\thorium_shell.exe" --data-path="%~dp0%\USER_DATA\thorium_shell" --allow-outdated-plugins --disable-logging --disable-breakpad --enable-experimental-web-platform-features --new-canvas-2d-api

930
src/build/install-build-deps.py Executable file
View file

@ -0,0 +1,930 @@
#!/usr/bin/env python3
# Copyright 2023 The Chromium Authors and Alex313031
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Script to install everything needed to build chromium
# including items requiring sudo privileges.
# See https://chromium.googlesource.com/chromium/src/+/main/docs/linux/build_instructions.md
import argparse
import functools
import os
import re
import shutil
import subprocess
import sys
@functools.lru_cache(maxsize=1)
def build_apt_package_list():
print("Building apt package list.", file=sys.stderr)
output = subprocess.check_output(["apt-cache", "dumpavail"]).decode()
arch_map = {"i386": ":i386"}
package_regex = re.compile(r"^Package: (.+?)$.+?^Architecture: (.+?)$",
re.M | re.S)
return set(package + arch_map.get(arch, "")
for package, arch in re.findall(package_regex, output))
def package_exists(package_name: str) -> bool:
return package_name in build_apt_package_list()
def parse_args(argv):
parser = argparse.ArgumentParser(
description="Install Chromium build dependencies.")
parser.add_argument("--syms",
action="store_true",
help="Enable installation of debugging symbols")
parser.add_argument(
"--no-syms",
action="store_false",
dest="syms",
help="Disable installation of debugging symbols",
)
parser.add_argument(
"--lib32",
action="store_true",
help="Enable installation of 32-bit libraries, e.g. for V8 snapshot",
)
parser.add_argument(
"--android",
action="store_true",
help="Enable installation of android dependencies",
)
parser.add_argument(
"--no-android",
action="store_false",
dest="android",
help="Disable installation of android dependencies",
)
parser.add_argument("--arm",
action="store_true",
help="Enable installation of arm cross toolchain")
parser.add_argument(
"--no-arm",
action="store_false",
dest="arm",
help="Disable installation of arm cross toolchain",
)
parser.add_argument(
"--chromeos-fonts",
action="store_true",
help="Enable installation of Chrome OS fonts",
)
parser.add_argument(
"--no-chromeos-fonts",
action="store_false",
dest="chromeos_fonts",
help="Disable installation of Chrome OS fonts",
)
parser.add_argument(
"--nacl",
action="store_true",
help="Enable installation of prerequisites for building NaCl",
)
parser.add_argument(
"--no-nacl",
action="store_false",
dest="nacl",
help="Disable installation of prerequisites for building NaCl",
)
parser.add_argument(
"--backwards-compatible",
action="store_true",
help=
"Enable installation of packages that are no longer currently needed and"
+ "have been removed from this script. Useful for bisection.",
)
parser.add_argument(
"--no-backwards-compatible",
action="store_false",
dest="backwards_compatible",
help=
"Disable installation of packages that are no longer currently needed and"
+ "have been removed from this script.",
)
parser.add_argument("--no-prompt",
action="store_true",
help="Automatic yes to prompts")
parser.add_argument(
"--quick-check",
action="store_true",
help="Quickly try to determine if dependencies are installed",
)
parser.add_argument(
"--unsupported",
action="store_true",
help="Attempt installation even on unsupported systems",
)
options = parser.parse_args(argv)
if options.arm or options.android:
options.lib32 = True
return options
def check_lsb_release():
if not shutil.which("lsb_release"):
print("ERROR: lsb_release not found in $PATH", file=sys.stderr)
print("try: sudo apt-get install lsb-release", file=sys.stderr)
sys.exit(1)
@functools.lru_cache(maxsize=1)
def distro_codename():
return subprocess.check_output(["lsb_release", "--codename",
"--short"]).decode().strip()
def check_distro(options):
if options.unsupported or options.quick_check:
return
distro_id = subprocess.check_output(["lsb_release", "--id",
"--short"]).decode().strip()
supported_codenames = ["bionic", "focal", "jammy", "kinetic", "lunar"]
supported_ids = ["Debian"]
if (distro_codename() not in supported_codenames
and distro_id not in supported_ids):
print(
"WARNING: The following distributions are supported,",
"but distributions not in the list below can also try to install",
"dependencies by passing the `--unsupported` parameter",
"\tUbuntu 18.04 LTS (bionic with EoL April 2028)",
"\tUbuntu 20.04 LTS (focal with EoL April 2030)",
"\tUbuntu 22.04 LTS (jammy with EoL April 2032)",
"\tUbuntu 22.10 (kinetic with EoL October 2023)\n" \
"\tUbuntu 23.04 (lunar with EoL April 2024)\n" \
"\tDebian 10 (buster), 11 (bullseye) or 12 (bookworm)",
sep="\n",
file=sys.stderr,
)
sys.exit(1)
def check_architecture():
architecture = subprocess.check_output(["uname", "-m"]).decode().strip()
if architecture not in ["i686", "x86_64"]:
print("Only x86 architectures are currently supported", file=sys.stderr)
sys.exit(1)
def check_root():
if os.geteuid() != 0:
print("Running as non-root user.", file=sys.stderr)
print("You might have to enter your password one or more times for 'sudo'.",
file=sys.stderr)
print(file=sys.stderr)
def apt_update(options):
if options.lib32 or options.nacl:
subprocess.check_call(["sudo", "dpkg", "--add-architecture", "i386"])
subprocess.check_call(["sudo", "apt-get", "update"])
# Packages needed for development
def dev_list():
packages = [
"binutils",
"bison",
"bzip2",
"cdbs",
"curl",
"dbus-x11",
"devscripts",
"dpkg-dev",
"elfutils",
"fakeroot",
"flex",
"git-core",
"gperf",
"icoutils",
"libasound2-dev",
"libatspi2.0-dev",
"libbrlapi-dev",
"libbz2-dev",
"libc6-dev",
"libcairo2-dev",
"libcap-dev",
"libcups2-dev",
"libcurl4-gnutls-dev",
"libdrm-dev",
"libelf-dev",
"libevdev-dev",
"libffi-dev",
"libgbm-dev",
"libglib2.0-dev",
"libglu1-mesa-dev",
"libgtk-3-dev",
"libkrb5-dev",
"libnspr4-dev",
"libnss3-dev",
"libpam0g-dev",
"libpci-dev",
"libpulse-dev",
"libsctp-dev",
"libspeechd-dev",
"libsqlite3-dev",
"libssl-dev",
"libsystemd-dev",
"libudev-dev",
"libva-dev",
"libwww-perl",
"libxshmfence-dev",
"libxslt1-dev",
"libxss-dev",
"libxt-dev",
"libxtst-dev",
"lighttpd",
"locales",
"openbox",
"p7zip",
"patch",
"perl",
"pkg-config",
"rpm",
"ruby",
"subversion",
"uuid-dev",
"wdiff",
"wget",
"x11-utils",
"xcompmgr",
"xz-utils",
"zip",
]
# Packages needed for chromeos only
packages += [
"libbluetooth-dev",
"libxkbcommon-dev",
"mesa-common-dev",
"zstd",
]
if package_exists("realpath"):
packages.append("realpath")
if package_exists("libjpeg-dev"):
packages.append("libjpeg-dev")
else:
packages.append("libjpeg62-dev")
if package_exists("libudev1"):
packages.append("libudev1")
else:
packages.append("libudev0")
if package_exists("libbrlapi0.8"):
packages.append("libbrlapi0.8")
elif package_exists("libbrlapi0.7"):
packages.append("libbrlapi0.7")
elif package_exists("libbrlapi0.6"):
packages.append("libbrlapi0.6")
else:
packages.append("libbrlapi0.5")
if package_exists("libav-tools"):
packages.append("libav-tools")
if package_exists("libvulkan-dev"):
packages.append("libvulkan-dev")
if package_exists("libinput-dev"):
packages.append("libinput-dev")
# Cross-toolchain strip is needed for building the sysroots.
if package_exists("binutils-arm-linux-gnueabihf"):
packages.append("binutils-arm-linux-gnueabihf")
if package_exists("binutils-aarch64-linux-gnu"):
packages.append("binutils-aarch64-linux-gnu")
if package_exists("binutils-mipsel-linux-gnu"):
packages.append("binutils-mipsel-linux-gnu")
if package_exists("binutils-mips64el-linux-gnuabi64"):
packages.append("binutils-mips64el-linux-gnuabi64")
# 64-bit systems need a minimum set of 32-bit compat packages for the
# pre-built NaCl binaries.
if "ELF 64-bit" in subprocess.check_output(["file", "-L",
"/sbin/init"]).decode():
packages.extend(["libc6-i386", "lib32stdc++6"])
# lib32gcc-s1 used to be called lib32gcc1 in older distros.
if package_exists("lib32gcc-s1"):
packages.append("lib32gcc-s1")
elif package_exists("lib32gcc1"):
packages.append("lib32gcc1")
return packages
# List of required run-time libraries
def lib_list():
packages = [
"lib32z1",
"libasound2",
"libatk1.0-0",
"libatspi2.0-0",
"libc6",
"libcairo2",
"libcap2",
"libcgi-session-perl",
"libcups2",
"libdrm2",
"libegl1",
"libevdev2",
"libexpat1",
"libfontconfig1",
"libfreetype6",
"libgbm1",
"libglib2.0-0",
"libgl1",
"libgtk-3-0",
"libncurses5",
"libpam0g",
"libpango-1.0-0",
"libpangocairo-1.0-0",
"libpci3",
"libpcre3",
"libpixman-1-0",
"libspeechd2",
"libstdc++6",
"libsqlite3-0",
"libuuid1",
"libwayland-egl1",
"libwayland-egl1-mesa",
"libx11-6",
"libx11-xcb1",
"libxau6",
"libxcb1",
"libxcomposite1",
"libxcursor1",
"libxdamage1",
"libxdmcp6",
"libxext6",
"libxfixes3",
"libxi6",
"libxinerama1",
"libxrandr2",
"libxrender1",
"libxtst6",
"x11-utils",
"xvfb",
"zlib1g",
]
# Run-time libraries required by chromeos only
packages += [
"libpulse0",
"libbz2-1.0",
]
if package_exists("libffi8"):
packages.append("libffi8")
elif package_exists("libffi7"):
packages.append("libffi7")
elif package_exists("libffi6"):
packages.append("libffi6")
if package_exists("libpng16-16"):
packages.append("libpng16-16")
else:
packages.append("libpng12-0")
if package_exists("libnspr4"):
packages.extend(["libnspr4", "libnss3"])
else:
packages.extend(["libnspr4-0d", "libnss3-1d"])
if package_exists("appmenu-gtk"):
packages.append("appmenu-gtk")
if package_exists("libgnome-keyring0"):
packages.append("libgnome-keyring0")
if package_exists("libgnome-keyring-dev"):
packages.append("libgnome-keyring-dev")
if package_exists("libvulkan1"):
packages.append("libvulkan1")
if package_exists("libinput10"):
packages.append("libinput10")
return packages
def lib32_list(options):
if not options.lib32:
print("Skipping 32-bit libraries.", file=sys.stderr)
return []
print("Including 32-bit libraries.", file=sys.stderr)
packages = [
# 32-bit libraries needed for a 32-bit build
# includes some 32-bit libraries required by the Android SDK
# See https://developer.android.com/sdk/installing/index.html?pkg=tools
"libasound2:i386",
"libatk-bridge2.0-0:i386",
"libatk1.0-0:i386",
"libatspi2.0-0:i386",
"libdbus-1-3:i386",
"libegl1:i386",
"libgl1:i386",
"libglib2.0-0:i386",
"libncurses5:i386",
"libnss3:i386",
"libpango-1.0-0:i386",
"libpangocairo-1.0-0:i386",
"libstdc++6:i386",
"libwayland-egl1:i386",
"libx11-xcb1:i386",
"libxcomposite1:i386",
"libxdamage1:i386",
"libxkbcommon0:i386",
"libxrandr2:i386",
"libxtst6:i386",
"zlib1g:i386",
# 32-bit libraries needed e.g. to compile V8 snapshot for Android or armhf
"linux-libc-dev-i386-cross",
"libpci3:i386",
]
# When cross building for arm/Android on 64-bit systems the host binaries
# that are part of v8 need to be compiled with -m32 which means
# that basic multilib support is needed.
if "ELF 64-bit" in subprocess.check_output(["file", "-L",
"/sbin/init"]).decode():
# gcc-multilib conflicts with the arm cross compiler but
# g++-X.Y-multilib gives us the 32-bit support that we need. Find out the
# appropriate value of X and Y by seeing what version the current
# distribution's g++-multilib package depends on.
lines = subprocess.check_output(
["apt-cache", "depends", "g++-multilib", "--important"]).decode()
pattern = re.compile(r"g\+\+-[0-9.]+-multilib")
packages += re.findall(pattern, lines)
return packages
# Packages that have been removed from this script. Regardless of configuration
# or options passed to this script, whenever a package is removed, it should be
# added here.
def backwards_compatible_list(options):
if not options.backwards_compatible:
print("Skipping backwards compatible packages.", file=sys.stderr)
return []
print("Including backwards compatible packages.", file=sys.stderr)
packages = [
"7za",
"fonts-indic",
"fonts-ipafont",
"fonts-stix",
"fonts-thai-tlwg",
"fonts-tlwg-garuda",
"g++",
"g++-4.8-multilib-arm-linux-gnueabihf",
"gcc-4.8-multilib-arm-linux-gnueabihf",
"g++-9-multilib-arm-linux-gnueabihf",
"gcc-9-multilib-arm-linux-gnueabihf",
"gcc-arm-linux-gnueabihf",
"g++-10-multilib-arm-linux-gnueabihf",
"gcc-10-multilib-arm-linux-gnueabihf",
"g++-10-arm-linux-gnueabihf",
"gcc-10-arm-linux-gnueabihf",
"git-svn",
"language-pack-da",
"language-pack-fr",
"language-pack-he",
"language-pack-zh-hant",
"libappindicator-dev",
"libappindicator1",
"libappindicator3-1",
"libappindicator3-dev",
"libdconf-dev",
"libdconf1",
"libdconf1:i386",
"libexif-dev",
"libexif12",
"libexif12:i386",
"libgbm-dev",
"libgbm-dev-lts-trusty",
"libgbm-dev-lts-xenial",
"libgconf-2-4:i386",
"libgconf2-dev",
"libgl1-mesa-dev",
"libgl1-mesa-dev-lts-trusty",
"libgl1-mesa-dev-lts-xenial",
"libgl1-mesa-glx:i386",
"libgl1-mesa-glx-lts-trusty:i386",
"libgl1-mesa-glx-lts-xenial:i386",
"libgles2-mesa-dev",
"libgles2-mesa-dev-lts-trusty",
"libgles2-mesa-dev-lts-xenial",
"libgtk-3-0:i386",
"libgtk2.0-0",
"libgtk2.0-0:i386",
"libgtk2.0-dev",
"mesa-common-dev",
"mesa-common-dev-lts-trusty",
"mesa-common-dev-lts-xenial",
"msttcorefonts",
"python-dev",
"python-setuptools",
"snapcraft",
"ttf-dejavu-core",
"ttf-indic-fonts",
"ttf-kochi-gothic",
"ttf-kochi-mincho",
"ttf-mscorefonts-installer",
"xfonts-mathml",
]
if package_exists("python-is-python2"):
packages.extend(["python-is-python2", "python2-dev"])
else:
packages.append("python")
if package_exists("python-crypto"):
packages.append("python-crypto")
if package_exists("python-numpy"):
packages.append("python-numpy")
if package_exists("python-openssl"):
packages.append("python-openssl")
if package_exists("python-psutil"):
packages.append("python-psutil")
if package_exists("python-yaml"):
packages.append("python-yaml")
if package_exists("apache2.2-bin"):
packages.append("apache2.2-bin")
else:
packages.append("apache2-bin")
php_versions = [
("php8.1-cgi", "libapache2-mod-php8.1"),
("php8.0-cgi", "libapache2-mod-php8.0"),
("php7.4-cgi", "libapache2-mod-php7.4"),
("php7.3-cgi", "libapache2-mod-php7.3"),
("php7.2-cgi", "libapache2-mod-php7.2"),
("php7.1-cgi", "libapache2-mod-php7.1"),
("php7.0-cgi", "libapache2-mod-php7.0"),
("php5-cgi", "libapache2-mod-php5"),
]
for php_cgi, mod_php in php_versions:
if package_exists(php_cgi):
packages.extend([php_cgi, mod_php])
break
return [package for package in packages if package_exists(package)]
def arm_list(options):
if not options.arm:
print("Skipping ARM cross toolchain.", file=sys.stderr)
return []
print("Including ARM cross toolchain.", file=sys.stderr)
# arm cross toolchain packages needed to build chrome on armhf
packages = [
"libc6-dev-armhf-cross",
"libc6-dev-arm64-cross",
"linux-libc-dev-armhf-cross",
"linux-libc-dev-arm64-cross",
"g++-arm-linux-gnueabihf",
]
# Work around for dependency issue Ubuntu: http://crbug.com/435056
if distro_codename() == "bionic":
packages.extend([
"g++-5-multilib-arm-linux-gnueabihf",
"gcc-5-multilib-arm-linux-gnueabihf",
"gcc-arm-linux-gnueabihf",
])
elif distro_codename() == "focal":
packages.extend([
"g++-10-multilib-arm-linux-gnueabihf",
"gcc-10-multilib-arm-linux-gnueabihf",
"gcc-arm-linux-gnueabihf",
])
elif distro_codename() == "jammy":
packages.extend([
"gcc-arm-linux-gnueabihf",
"g++-11-arm-linux-gnueabihf",
"gcc-11-arm-linux-gnueabihf",
])
elif distro_codename() == "kinetic":
packages.extend([
"gcc-arm-linux-gnueabihf",
"g++-11-arm-linux-gnueabihf",
"gcc-11-arm-linux-gnueabihf",
])
elif distro_codename() == "lunar":
packages.extend([
"gcc-arm-linux-gnueabihf",
"g++-11-arm-linux-gnueabihf",
"gcc-11-arm-linux-gnueabihf",
])
return packages
def nacl_list(options):
if not options.nacl:
print("Skipping NaCl, NaCl toolchain, NaCl ports dependencies.",
file=sys.stderr)
return []
print("Including NaCl, NaCl toolchain, NaCl ports dependencies.",
file=sys.stderr)
packages = [
"g++-mingw-w64-i686",
"lib32z1-dev",
"libasound2:i386",
"libcap2:i386",
"libelf-dev:i386",
"libfontconfig1:i386",
"libglib2.0-0:i386",
"libgpm2:i386",
"libncurses5:i386",
"lib32ncurses5-dev",
"libnss3:i386",
"libpango-1.0-0:i386",
"libssl-dev:i386",
"libtinfo-dev",
"libtinfo-dev:i386",
"libtool",
"libuuid1:i386",
"libxcomposite1:i386",
"libxcursor1:i386",
"libxdamage1:i386",
"libxi6:i386",
"libxrandr2:i386",
"libxss1:i386",
"libxtst6:i386",
"texinfo",
"xvfb",
# Packages to build NaCl, its toolchains, and its ports.
"ant",
"autoconf",
"bison",
"cmake",
"gawk",
"intltool",
"xutils-dev",
"xsltproc",
]
# Some package names have changed over time
if package_exists("libssl-dev"):
packages.append("libssl-dev:i386")
elif package_exists("libssl1.1"):
packages.append("libssl1.1:i386")
elif package_exists("libssl1.0.2"):
packages.append("libssl1.0.2:i386")
else:
packages.append("libssl1.0.0:i386")
if package_exists("libtinfo5"):
packages.append("libtinfo5")
if package_exists("libudev1"):
packages.append("libudev1:i386")
else:
packages.append("libudev0:i386")
return packages
# Debian is in the process of transitioning to automatic debug packages, which
# have the -dbgsym suffix (https://wiki.debian.org/AutomaticDebugPackages).
# Untransitioned packages have the -dbg suffix. And on some systems, neither
# will be available, so exclude the ones that are missing.
def dbg_package_name(package):
if package_exists(package + "-dbgsym"):
return [package + "-dbgsym"]
if package_exists(package + "-dbg"):
return [package + "-dbg"]
return []
def dbg_list(options):
if not options.syms:
print("Skipping debugging symbols.", file=sys.stderr)
return []
print("Including debugging symbols.", file=sys.stderr)
packages = [
dbg_package for package in lib_list()
for dbg_package in dbg_package_name(package)
]
# Debugging symbols packages not following common naming scheme
if not dbg_package_name("libstdc++6"):
for version in ["8", "7", "6", "5", "4.9", "4.8", "4.7", "4.6"]:
if package_exists("libstdc++6-%s-dbg" % version):
packages.append("libstdc++6-%s-dbg" % version)
break
if not dbg_package_name("libatk1.0-0"):
packages.extend(dbg_package_name("libatk1.0"))
if not dbg_package_name("libpango-1.0-0"):
packages.extend(dbg_package_name("libpango1.0-dev"))
return packages
def package_list(options):
packages = (dev_list() + lib_list() + dbg_list(options) +
lib32_list(options) + arm_list(options) + nacl_list(options) +
backwards_compatible_list(options))
# Sort all the :i386 packages to the front, to avoid confusing dpkg-query
# (https://crbug.com/446172).
return sorted(set(packages), key=lambda x: (not x.endswith(":i386"), x))
def missing_packages(packages):
try:
subprocess.run(
["dpkg-query", "-W", "-f", " "] + packages,
check=True,
capture_output=True,
).decode()
return []
except subprocess.CalledProcessError as e:
return [line.split(" ")[-1] for line in e.stderr.strip().splitlines()]
def package_is_installable(package):
result = subprocess.run(["apt-cache", "show", package],
capture_output=True).decode()
return result.returncode == 0
def quick_check(options):
if not options.quick_check:
return
missing = missing_packages(package_list(options))
if not missing:
sys.exit(0)
not_installed = []
unknown = []
for p in missing:
if package_is_installable(p):
not_installed.append(p)
else:
unknown.append(p)
if not_installed:
print("WARNING: The following packages are not installed:", file=sys.stderr)
print(" ".join(not_installed), file=sys.stderr)
if unknown:
print("WARNING: The following packages are unknown to your system",
file=sys.stderr)
print("(maybe missing a repo or need to 'sudo apt-get update'):",
file=sys.stderr)
print(" ".join(unknown), file=sys.stderr)
sys.exit(1)
def find_missing_packages(options):
print("Finding missing packages...", file=sys.stderr)
packages = package_list(options)
packages_str = " ".join(packages)
print("Packages required: " + packages_str, file=sys.stderr)
query_cmd = ["apt-get", "--just-print", "install"] + packages
env = os.environ.copy()
env["LANGUAGE"] = "en"
env["LANG"] = "C"
cmd_output = subprocess.check_output(query_cmd, env=env).decode()
lines = cmd_output.splitlines()
install = []
for pattern in (
"The following NEW packages will be installed:",
"The following packages will be upgraded:",
):
if pattern in lines:
for line in lines[lines.index(pattern) + 1:]:
if not line.startswith(" "):
break
install += line.strip().split(" ")
return install
def install_packages(options):
try:
packages = find_missing_packages(options)
if packages:
quiet = ["-qq", "--assume-yes"] if options.no_prompt else []
subprocess.check_call(["sudo", "apt-get", "install"] + quiet + packages)
print(file=sys.stderr)
else:
print("No missing packages, and the packages are up to date.",
file=sys.stderr)
except subprocess.CalledProcessError as e:
# An apt-get exit status of 100 indicates that a real error has occurred.
print("`apt-get --just-print install ...` failed", file=sys.stderr)
print("It produced the following output:", file=sys.stderr)
print(e.output.decode(), file=sys.stderr)
print(file=sys.stderr)
print("You will have to install the above packages yourself.",
file=sys.stderr)
print(file=sys.stderr)
sys.exit(100)
# Install the Chrome OS default fonts. This must go after running
# apt-get, since install-chromeos-fonts depends on curl.
def install_chromeos_fonts(options):
if not options.chromeos_fonts:
print("Skipping installation of Chrome OS fonts.", file=sys.stderr)
return
print("Installing Chrome OS fonts.", file=sys.stderr)
dir = os.path.abspath(os.path.dirname(__file__))
try:
subprocess.check_call(
["sudo",
os.path.join(dir, "linux", "install-chromeos-fonts.py")])
except subprocess.CalledProcessError:
print("ERROR: The installation of the Chrome OS default fonts failed.",
file=sys.stderr)
if (subprocess.check_output(
["stat", "-f", "-c", "%T", dir], ).decode().startswith("nfs")):
print(
"The reason is that your repo is installed on a remote file system.",
file=sys.stderr)
else:
print(
"This is expected if your repo is installed on a remote file system.",
file=sys.stderr)
print("It is recommended to install your repo on a local file system.",
file=sys.stderr)
print("You can skip the installation of the Chrome OS default fonts with",
file=sys.stderr)
print("the command line option: --no-chromeos-fonts.", file=sys.stderr)
sys.exit(1)
def install_locales():
print("Installing locales.", file=sys.stderr)
CHROMIUM_LOCALES = [
"da_DK.UTF-8", "fr_FR.UTF-8", "he_IL.UTF-8", "zh_TW.UTF-8"
]
LOCALE_GEN = "/etc/locale.gen"
if os.path.exists(LOCALE_GEN):
old_locale_gen = open(LOCALE_GEN).read()
for locale in CHROMIUM_LOCALES:
subprocess.check_call(
["sudo", "sed", "-i",
"s/^# %s/%s/" % (locale, locale), LOCALE_GEN])
# Regenerating locales can take a while, so only do it if we need to.
locale_gen = open(LOCALE_GEN).read()
if locale_gen != old_locale_gen:
subprocess.check_call(["sudo", "locale-gen"])
else:
print("Locales already up-to-date.", file=sys.stderr)
else:
for locale in CHROMIUM_LOCALES:
subprocess.check_call(["sudo", "locale-gen", locale])
def main():
options = parse_args(sys.argv[1:])
check_lsb_release()
check_distro(options)
check_architecture()
quick_check(options)
check_root()
apt_update(options)
install_packages(options)
install_chromeos_fonts(options)
install_locales()
return 0
if __name__ == "__main__":
sys.exit(main())

View file

@ -1,828 +0,0 @@
#!/bin/bash -e
# Copyright 2023 The Chromium Authors and Alex313031
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Script to install everything needed to build chromium (well, ideally, anyway)
# including items requiring sudo privileges.
# See https://chromium.googlesource.com/chromium/src/+/main/docs/linux/build_instructions.md
# and https://chromium.googlesource.com/chromium/src/+/HEAD/docs/android_build_instructions.md
usage() {
echo "Usage: $0 [--options]"
echo "Options:"
echo "--[no-]syms: enable or disable installation of debugging symbols"
echo "--lib32: enable installation of 32-bit libraries, e.g. for V8 snapshot"
echo "--[no-]android: enable or disable installation of android dependencies"
echo "--[no-]arm: enable or disable installation of arm cross toolchain"
echo "--[no-]chromeos-fonts: enable or disable installation of Chrome OS"\
"fonts"
echo "--[no-]nacl: enable or disable installation of prerequisites for"\
"building standalone NaCl and all its toolchains"
echo "--[no-]backwards-compatible: enable or disable installation of packages
that are no longer currently needed and have been removed from this
script. Useful for bisection."
echo "--no-prompt: silently select standard options/defaults"
echo "--quick-check: quickly try to determine if dependencies are installed"
echo " (this avoids interactive prompts and sudo commands,"
echo " so might not be 100% accurate)"
echo "--unsupported: attempt installation even on unsupported systems"
echo "Script will prompt interactively if options not given."
exit 1
}
# Build list of apt packages in dpkg --get-selections format.
build_apt_package_list() {
echo "Building apt package list." >&2
apt-cache dumpavail | \
python3 -c 'import re,sys; \
o = sys.stdin.read(); \
p = {"i386": ":i386"}; \
f = re.M | re.S; \
r = re.compile(r"^Package: (.+?)$.+?^Architecture: (.+?)$", f); \
m = ["%s%s" % (x, p.get(y, "")) for x, y in re.findall(r, o)]; \
print("\n".join(m))'
}
# Checks whether a particular package is available in the repos.
# Uses pre-formatted ${apt_package_list}.
# USAGE: $ package_exists <package name>
package_exists() {
if [ -z "${apt_package_list}" ]; then
echo "Call build_apt_package_list() prior to calling package_exists()" >&2
apt_package_list=$(build_apt_package_list)
fi
# `grep` takes a regex string, so the +'s in package names, e.g. "libstdc++",
# need to be escaped.
local escaped="$(echo $1 | sed 's/[\~\+\.\:-]/\\&/g')"
[ ! -z "$(grep "^${escaped}$" <<< "${apt_package_list}")" ]
}
do_inst_arm=0
do_inst_nacl=0
do_inst_android=0
while [ "$1" != "" ]
do
case "$1" in
--syms) do_inst_syms=1;;
--no-syms) do_inst_syms=0;;
--lib32) do_inst_lib32=1;;
--android) do_inst_android=1;;
--no-android) do_inst_android=0;;
--arm) do_inst_arm=1;;
--no-arm) do_inst_arm=0;;
--chromeos-fonts) do_inst_chromeos_fonts=1;;
--no-chromeos-fonts) do_inst_chromeos_fonts=0;;
--nacl) do_inst_nacl=1;;
--no-nacl) do_inst_nacl=0;;
--backwards-compatible) do_inst_backwards_compatible=1;;
--no-backwards-compatible) do_inst_backwards_compatible=0;;
--add-cross-tool-repo) add_cross_tool_repo=1;;
--no-prompt) do_default=1
do_quietly="-qq --assume-yes"
;;
--quick-check) do_quick_check=1;;
--unsupported) do_unsupported=1;;
*) usage;;
esac
shift
done
if [ "$do_inst_arm" = "1" ]; then
do_inst_lib32=1
fi
if [ "$do_inst_android" = "1" ]; then
do_inst_lib32=1
fi
# Check for lsb_release command in $PATH
if ! which lsb_release > /dev/null; then
echo "ERROR: lsb_release not found in \$PATH" >&2
echo "try: sudo apt-get install lsb-release" >&2
exit 1;
fi
distro_codename=$(lsb_release --codename --short)
distro_id=$(lsb_release --id --short)
supported_codenames="(bionic|focal|jammy|kinetic|lunar)"
supported_ids="(Debian)"
if [ 0 -eq "${do_unsupported-0}" ] && [ 0 -eq "${do_quick_check-0}" ] ; then
if [[ ! $distro_codename =~ $supported_codenames &&
! $distro_id =~ $supported_ids ]]; then
echo -e "WARNING: The following distributions are supported,
but distributions not in the list below can also try to install
dependencies by passing the `--unsupported` parameter\n" \
"\tUbuntu 18.04 LTS (bionic with EoL April 2028)\n" \
"\tUbuntu 20.04 LTS (focal with EoL April 2030)\n" \
"\tUbuntu 22.04 LTS (jammy with EoL April 2032)\n" \
"\tUbuntu 22.10 (kinetic with EoL October 2023)\n" \
"\tUbuntu 23.04 (lunar with EoL April 2024)\n" \
"\tDebian 10 (buster) or later" >&2
exit 1
fi
# Check system architecture
if ! uname -m | egrep -q "i686|x86_64"; then
echo "Only x86 architectures are currently supported" >&2
exit
fi
fi
if [ "x$(id -u)" != x0 ] && [ 0 -eq "${do_quick_check-0}" ]; then
echo "Running as non-root user."
echo "You might have to enter your password one or more times for 'sudo'."
echo
fi
if [ 0 -eq "${do_quick_check-0}" ] ; then
if [ "$do_inst_lib32" = "1" ] || [ "$do_inst_nacl" = "1" ]; then
sudo dpkg --add-architecture i386
fi
sudo apt-get update
fi
# Populate ${apt_package_list} for package_exists() parsing.
apt_package_list=$(build_apt_package_list)
# Packages needed for chromeos only
chromeos_dev_list="libbluetooth-dev libxkbcommon-dev mesa-common-dev zstd"
if package_exists realpath; then
chromeos_dev_list="${chromeos_dev_list} realpath"
fi
# Packages needed for development
dev_list="\
binutils
bison
bzip2
cdbs
curl
dbus-x11
dpkg-dev
elfutils
devscripts
fakeroot
flex
git-core
gperf
icoutils
libasound2-dev
libatspi2.0-dev
libbrlapi-dev
libbz2-dev
libcairo2-dev
libcap-dev
libc6-dev
libcups2-dev
libcurl4-gnutls-dev
libdrm-dev
libelf-dev
libevdev-dev
libffi-dev
libgbm-dev
libglib2.0-dev
libglu1-mesa-dev
libgtk-3-dev
libkrb5-dev
libnspr4-dev
libnss3-dev
libpam0g-dev
libpci-dev
libpulse-dev
libsctp-dev
libspeechd-dev
libsqlite3-dev
libssl-dev
libsystemd-dev
libudev-dev
libva-dev
libwww-perl
libxshmfence-dev
libxslt1-dev
libxss-dev
libxt-dev
libxtst-dev
lighttpd
locales
openbox
p7zip
patch
perl
pkg-config
rpm
ruby
subversion
uuid-dev
wdiff
wget
x11-utils
xcompmgr
xz-utils
zip
$chromeos_dev_list
"
# 64-bit systems need a minimum set of 32-bit compat packages for the pre-built
# NaCl binaries.
if file -L /sbin/init | grep -q 'ELF 64-bit'; then
dev_list="${dev_list} libc6-i386 lib32stdc++6"
# lib32gcc-s1 used to be called lib32gcc1 in older distros.
if package_exists lib32gcc-s1; then
dev_list="${dev_list} lib32gcc-s1"
elif package_exists lib32gcc1; then
dev_list="${dev_list} lib32gcc1"
fi
fi
# Run-time libraries required by chromeos only
chromeos_lib_list="libpulse0 libbz2-1.0"
# List of required run-time libraries
common_lib_list="\
lib32z1
libasound2
libatk1.0-0
libatspi2.0-0
libc6
libcairo2
libcap2
libcgi-session-perl
libcups2
libdrm2
libegl1
libevdev2
libexpat1
libfontconfig1
libfreetype6
libgbm1
libglib2.0-0
libgl1
libgtk-3-0
libncurses5
libpam0g
libpango-1.0-0
libpangocairo-1.0-0
libpci3
libpcre3
libpixman-1-0
libspeechd2
libstdc++6
libsqlite3-0
libuuid1
libwayland-egl1
libwayland-egl1-mesa
libx11-6
libx11-xcb1
libxau6
libxcb1
libxcomposite1
libxcursor1
libxdamage1
libxdmcp6
libxext6
libxfixes3
libxi6
libxinerama1
libxrandr2
libxrender1
libxtst6
x11-utils
xvfb
zlib1g
"
if package_exists libffi8; then
common_lib_list="${common_lib_list} libffi8"
elif package_exists libffi7; then
common_lib_list="${common_lib_list} libffi7"
elif package_exists libffi6; then
common_lib_list="${common_lib_list} libffi6"
fi
# Full list of required run-time libraries
lib_list="\
$common_lib_list
$chromeos_lib_list
"
# 32-bit libraries needed e.g. to compile V8 snapshot for Android or armhf
lib32_list="linux-libc-dev-i386-cross libpci3:i386"
# 32-bit libraries needed for a 32-bit build
# includes some 32-bit libraries required by the Android SDK
# See https://developer.android.com/sdk/installing/index.html?pkg=tools
lib32_list="$lib32_list
libasound2:i386
libatk-bridge2.0-0:i386
libatk1.0-0:i386
libatspi2.0-0:i386
libdbus-1-3:i386
libegl1:i386
libgl1:i386
libglib2.0-0:i386
libncurses5:i386
libnss3:i386
libpango-1.0-0:i386
libpangocairo-1.0-0:i386
libstdc++6:i386
libwayland-egl1:i386
libx11-xcb1:i386
libxcomposite1:i386
libxdamage1:i386
libxkbcommon0:i386
libxrandr2:i386
libxtst6:i386
zlib1g:i386
"
# Packages that have been removed from this script. Regardless of configuration
# or options passed to this script, whenever a package is removed, it should be
# added here.
backwards_compatible_list="\
7za
fonts-indic
fonts-ipafont
fonts-stix
fonts-thai-tlwg
fonts-tlwg-garuda
g++
g++-4.8-multilib-arm-linux-gnueabihf
gcc-4.8-multilib-arm-linux-gnueabihf
g++-9-multilib-arm-linux-gnueabihf
gcc-9-multilib-arm-linux-gnueabihf
gcc-arm-linux-gnueabihf
g++-10-multilib-arm-linux-gnueabihf
gcc-10-multilib-arm-linux-gnueabihf
g++-10-arm-linux-gnueabihf
gcc-10-arm-linux-gnueabihf
git-svn
language-pack-da
language-pack-fr
language-pack-he
language-pack-zh-hant
libappindicator-dev
libappindicator1
libappindicator3-1
libappindicator3-dev
libdconf-dev
libdconf1
libdconf1:i386
libexif-dev
libexif12
libexif12:i386
libgbm-dev
libgbm-dev-lts-trusty
libgbm-dev-lts-xenial
libgconf-2-4:i386
libgconf2-dev
libgl1-mesa-dev
libgl1-mesa-dev-lts-trusty
libgl1-mesa-dev-lts-xenial
libgl1-mesa-glx:i386
libgl1-mesa-glx-lts-trusty:i386
libgl1-mesa-glx-lts-xenial:i386
libgles2-mesa-dev
libgles2-mesa-dev-lts-trusty
libgles2-mesa-dev-lts-xenial
libgtk-3-0:i386
libgtk2.0-0
libgtk2.0-0:i386
libgtk2.0-dev
mesa-common-dev
mesa-common-dev-lts-trusty
mesa-common-dev-lts-xenial
msttcorefonts
python-dev
python-setuptools
ttf-dejavu-core
ttf-indic-fonts
ttf-kochi-gothic
ttf-kochi-mincho
ttf-mscorefonts-installer
xfonts-mathml
"
if package_exists python-is-python2; then
backwards_compatible_list="${backwards_compatible_list} python-is-python2 python2-dev"
else
backwards_compatible_list="${backwards_compatible_list} python"
fi
if package_exists python-crypto; then
backwards_compatible_list="${backwards_compatible_list} python-crypto"
fi
if package_exists python-numpy; then
backwards_compatible_list="${backwards_compatible_list} python-numpy"
fi
if package_exists python-openssl; then
backwards_compatible_list="${backwards_compatible_list} python-openssl"
fi
if package_exists python-psutil; then
backwards_compatible_list="${backwards_compatible_list} python-psutil"
fi
if package_exists python-yaml; then
backwards_compatible_list="${backwards_compatible_list} python-yaml"
fi
if package_exists apache2.2-bin; then
backwards_compatible_list="${backwards_compatible_list} apache2.2-bin"
else
backwards_compatible_list="${backwards_compatible_list} apache2-bin"
fi
if package_exists php8.1-cgi; then
backwards_compatible_list="${backwards_compatible_list} php8.1-cgi libapache2-mod-php8.1"
elif package_exists php8.0-cgi; then
backwards_compatible_list="${backwards_compatible_list} php8.0-cgi libapache2-mod-php8.0"
elif package_exists php7.4-cgi; then
backwards_compatible_list="${backwards_compatible_list} php7.4-cgi libapache2-mod-php7.4"
elif package_exists php7.3-cgi; then
backwards_compatible_list="${backwards_compatible_list} php7.3-cgi libapache2-mod-php7.3"
elif package_exists php7.2-cgi; then
backwards_compatible_list="${backwards_compatible_list} php7.2-cgi libapache2-mod-php7.2"
elif package_exists php7.1-cgi; then
backwards_compatible_list="${backwards_compatible_list} php7.1-cgi libapache2-mod-php7.1"
elif package_exists php7.0-cgi; then
backwards_compatible_list="${backwards_compatible_list} php7.0-cgi libapache2-mod-php7.0"
elif package_exists php8.0-cgi; then
backwards_compatible_list="${backwards_compatible_list} php8.0-cgi libapache2-mod-php8.0"
else
backwards_compatible_list="${backwards_compatible_list} php5-cgi libapache2-mod-php5"
fi
# arm cross toolchain packages needed to build chrome on armhf
arm_list="libc6-dev-armhf-cross
libc6-dev-arm64-cross
linux-libc-dev-armhf-cross
linux-libc-dev-arm64-cross
g++-arm-linux-gnueabihf"
# Work around for dependency issue Ubuntu: http://crbug.com/435056
case $distro_codename in
bionic)
arm_list+=" g++-5-multilib-arm-linux-gnueabihf
gcc-5-multilib-arm-linux-gnueabihf
gcc-arm-linux-gnueabihf"
;;
focal)
arm_list+=" g++-10-multilib-arm-linux-gnueabihf
gcc-10-multilib-arm-linux-gnueabihf
gcc-arm-linux-gnueabihf"
;;
jammy)
arm_list+=" gcc-arm-linux-gnueabihf
g++-11-arm-linux-gnueabihf
gcc-11-arm-linux-gnueabihf"
;;
kinetic)
arm_list+=" gcc-arm-linux-gnueabihf
g++-11-arm-linux-gnueabihf
gcc-11-arm-linux-gnueabihf"
;;
lunar)
arm_list+=" gcc-arm-linux-gnueabihf
g++-11-arm-linux-gnueabihf
gcc-11-arm-linux-gnueabihf"
;;
esac
# Packages to build NaCl, its toolchains, and its ports.
naclports_list="ant autoconf bison cmake gawk intltool xutils-dev xsltproc"
nacl_list="\
g++-mingw-w64-i686
lib32z1-dev
libasound2:i386
libcap2:i386
libelf-dev:i386
libfontconfig1:i386
libglib2.0-0:i386
libgpm2:i386
libncurses5:i386
lib32ncurses5-dev
libnss3:i386
libpango-1.0-0:i386
libssl-dev:i386
libtinfo-dev
libtinfo-dev:i386
libtool
libuuid1:i386
libxcomposite1:i386
libxcursor1:i386
libxdamage1:i386
libxi6:i386
libxrandr2:i386
libxss1:i386
libxtst6:i386
texinfo
xvfb
${naclports_list}
"
# Some package names have changed over time
if package_exists libssl-dev; then
nacl_list="${nacl_list} libssl-dev:i386"
elif package_exists libssl1.1; then
nacl_list="${nacl_list} libssl1.1:i386"
elif package_exists libssl1.0.2; then
nacl_list="${nacl_list} libssl1.0.2:i386"
else
nacl_list="${nacl_list} libssl1.0.0:i386"
fi
if package_exists libtinfo5; then
nacl_list="${nacl_list} libtinfo5"
fi
if package_exists libpng16-16; then
lib_list="${lib_list} libpng16-16"
else
lib_list="${lib_list} libpng12-0"
fi
if package_exists libnspr4; then
lib_list="${lib_list} libnspr4 libnss3"
else
lib_list="${lib_list} libnspr4-0d libnss3-1d"
fi
if package_exists libjpeg-dev; then
dev_list="${dev_list} libjpeg-dev"
else
dev_list="${dev_list} libjpeg62-dev"
fi
if package_exists libudev1; then
dev_list="${dev_list} libudev1"
nacl_list="${nacl_list} libudev1:i386"
else
dev_list="${dev_list} libudev0"
nacl_list="${nacl_list} libudev0:i386"
fi
if package_exists libbrlapi0.8; then
dev_list="${dev_list} libbrlapi0.8"
elif package_exists libbrlapi0.7; then
dev_list="${dev_list} libbrlapi0.7"
elif package_exists libbrlapi0.6; then
dev_list="${dev_list} libbrlapi0.6"
else
dev_list="${dev_list} libbrlapi0.5"
fi
if package_exists libav-tools; then
dev_list="${dev_list} libav-tools"
fi
# Some packages are only needed if the distribution actually supports
# installing them.
if package_exists appmenu-gtk; then
lib_list="$lib_list appmenu-gtk"
fi
if package_exists libgnome-keyring0; then
lib_list="${lib_list} libgnome-keyring0"
fi
if package_exists libgnome-keyring-dev; then
lib_list="${lib_list} libgnome-keyring-dev"
fi
if package_exists libvulkan-dev; then
dev_list="${dev_list} libvulkan-dev"
fi
if package_exists libvulkan1; then
lib_list="${lib_list} libvulkan1"
fi
if package_exists libinput10; then
lib_list="${lib_list} libinput10"
fi
if package_exists libinput-dev; then
dev_list="${dev_list} libinput-dev"
fi
# Cross-toolchain strip is needed for building the sysroots.
if package_exists binutils-arm-linux-gnueabihf; then
dev_list="${dev_list} binutils-arm-linux-gnueabihf"
fi
if package_exists binutils-aarch64-linux-gnu; then
dev_list="${dev_list} binutils-aarch64-linux-gnu"
fi
if package_exists binutils-mipsel-linux-gnu; then
dev_list="${dev_list} binutils-mipsel-linux-gnu"
fi
if package_exists binutils-mips64el-linux-gnuabi64; then
dev_list="${dev_list} binutils-mips64el-linux-gnuabi64"
fi
# When cross building for arm/Android on 64-bit systems the host binaries
# that are part of v8 need to be compiled with -m32 which means
# that basic multilib support is needed.
if file -L /sbin/init | grep -q 'ELF 64-bit'; then
# gcc-multilib conflicts with the arm cross compiler but
# g++-X.Y-multilib gives us the 32-bit support that we need. Find out the
# appropriate value of X and Y by seeing what version the current
# distribution's g++-multilib package depends on.
multilib_package=$(apt-cache depends g++-multilib --important | \
grep -E --color=never --only-matching '\bg\+\+-[0-9.]+-multilib\b')
lib32_list="$lib32_list $multilib_package"
fi
if [ "$do_inst_syms" = "1" ]; then
echo "Including debugging symbols."
# Debian is in the process of transitioning to automatic debug packages, which
# have the -dbgsym suffix (https://wiki.debian.org/AutomaticDebugPackages).
# Untransitioned packages have the -dbg suffix. And on some systems, neither
# will be available, so exclude the ones that are missing.
dbg_package_name() {
if package_exists "$1-dbgsym"; then
echo "$1-dbgsym"
elif package_exists "$1-dbg"; then
echo "$1-dbg"
fi
}
for package in "${common_lib_list}"; do
dbg_list="$dbg_list $(dbg_package_name ${package})"
done
# Debugging symbols packages not following common naming scheme
if [ "$(dbg_package_name libstdc++6)" == "" ]; then
if package_exists libstdc++6-8-dbg; then
dbg_list="${dbg_list} libstdc++6-8-dbg"
elif package_exists libstdc++6-7-dbg; then
dbg_list="${dbg_list} libstdc++6-7-dbg"
elif package_exists libstdc++6-6-dbg; then
dbg_list="${dbg_list} libstdc++6-6-dbg"
elif package_exists libstdc++6-5-dbg; then
dbg_list="${dbg_list} libstdc++6-5-dbg"
elif package_exists libstdc++6-4.9-dbg; then
dbg_list="${dbg_list} libstdc++6-4.9-dbg"
elif package_exists libstdc++6-4.8-dbg; then
dbg_list="${dbg_list} libstdc++6-4.8-dbg"
elif package_exists libstdc++6-4.7-dbg; then
dbg_list="${dbg_list} libstdc++6-4.7-dbg"
elif package_exists libstdc++6-4.6-dbg; then
dbg_list="${dbg_list} libstdc++6-4.6-dbg"
fi
fi
if [ "$(dbg_package_name libatk1.0-0)" == "" ]; then
dbg_list="$dbg_list $(dbg_package_name libatk1.0)"
fi
if [ "$(dbg_package_name libpango-1.0-0)" == "" ]; then
dbg_list="$dbg_list $(dbg_package_name libpango1.0-dev)"
fi
else
echo "Skipping debugging symbols."
dbg_list=
fi
if [ "$do_inst_lib32" = "1" ]; then
echo "Including 32-bit libraries."
else
echo "Skipping 32-bit libraries."
lib32_list=
fi
if [ "$do_inst_android" = "1" ]; then
echo "Including Android dependencies."
else
echo "Skipping Android dependencies."
fi
if [ "$do_inst_arm" = "1" ]; then
echo "Including ARM cross toolchain."
else
echo "Skipping ARM cross toolchain."
arm_list=
fi
if [ "$do_inst_nacl" = "1" ]; then
echo "Including NaCl, NaCl toolchain, NaCl ports dependencies."
else
echo "Skipping NaCl, NaCl toolchain, NaCl ports dependencies."
nacl_list=
fi
filtered_backwards_compatible_list=
if [ "$do_inst_backwards_compatible" = "1" ]; then
echo "Including backwards compatible packages."
for package in ${backwards_compatible_list}; do
if package_exists ${package}; then
filtered_backwards_compatible_list+=" ${package}"
fi
done
fi
# The `sort -r -s -t: -k2` sorts all the :i386 packages to the front, to avoid
# confusing dpkg-query (crbug.com/446172).
packages="$(
echo "${dev_list} ${lib_list} ${dbg_list} ${lib32_list} ${arm_list}" \
"${nacl_list}" ${filtered_backwards_compatible_list} | tr " " "\n" | \
sort -u | sort -r -s -t: -k2 | tr "\n" " "
)"
if [ 1 -eq "${do_quick_check-0}" ] ; then
if ! missing_packages="$(dpkg-query -W -f ' ' ${packages} 2>&1)"; then
# Distinguish between packages that actually aren't available to the
# system (i.e. not in any repo) and packages that just aren't known to
# dpkg (i.e. managed by apt).
missing_packages="$(echo "${missing_packages}" | awk '{print $NF}')"
not_installed=""
unknown=""
for p in ${missing_packages}; do
if apt-cache show ${p} > /dev/null 2>&1; then
not_installed="${p}\n${not_installed}"
else
unknown="${p}\n${unknown}"
fi
done
if [ -n "${not_installed}" ]; then
echo "WARNING: The following packages are not installed:"
echo -e "${not_installed}" | sed -e "s/^/ /"
fi
if [ -n "${unknown}" ]; then
echo "WARNING: The following packages are unknown to your system"
echo "(maybe missing a repo or need to 'sudo apt-get update'):"
echo -e "${unknown}" | sed -e "s/^/ /"
fi
exit 1
fi
exit 0
fi
echo "Finding missing packages..."
# Intentionally leaving $packages unquoted so it's more readable.
echo "Packages required: " $packages
echo
query_cmd="apt-get --just-print install $(echo $packages)"
if cmd_output="$(LANGUAGE=en LANG=C $query_cmd)"; then
new_list=$(echo "$cmd_output" |
sed -e '1,/The following NEW packages will be installed:/d;s/^ //;t;d' |
sed 's/ *$//')
upgrade_list=$(echo "$cmd_output" |
sed -e '1,/The following packages will be upgraded:/d;s/^ //;t;d' |
sed 's/ *$//')
if [ -z "$new_list" ] && [ -z "$upgrade_list" ]; then
echo "No missing packages, and the packages are up to date."
else
echo "Installing and upgrading packages: $new_list $upgrade_list."
sudo apt-get install ${do_quietly-} ${new_list} ${upgrade_list}
fi
echo
else
# An apt-get exit status of 100 indicates that a real error has occurred.
# I am intentionally leaving out the '"'s around query_cmd,
# as this makes it easier to cut and paste the output
echo "The following command failed: " ${query_cmd}
echo
echo "It produced the following output:"
echo "$cmd_output"
echo
echo "You will have to install the above packages yourself."
echo
exit 100
fi
# Install the Chrome OS default fonts. This must go after running
# apt-get, since install-chromeos-fonts depends on curl.
if [ "$do_inst_chromeos_fonts" != "0" ]; then
echo
echo "Installing Chrome OS fonts."
dir=`echo $0 | sed -r -e 's/\/[^/]+$//'`
if ! sudo $dir/linux/install-chromeos-fonts.py; then
echo "ERROR: The installation of the Chrome OS default fonts failed."
if [ `stat -f -c %T $dir` == "nfs" ]; then
echo "The reason is that your repo is installed on a remote file system."
else
echo "This is expected if your repo is installed on a remote file system."
fi
echo "It is recommended to install your repo on a local file system."
echo "You can skip the installation of the Chrome OS default fonts with"
echo "the command line option: --no-chromeos-fonts."
exit 1
fi
else
echo "Skipping installation of Chrome OS fonts."
fi
echo "Installing locales."
CHROMIUM_LOCALES="da_DK.UTF-8 fr_FR.UTF-8 he_IL.UTF-8 zh_TW.UTF-8"
LOCALE_GEN=/etc/locale.gen
if [ -e ${LOCALE_GEN} ]; then
OLD_LOCALE_GEN="$(cat /etc/locale.gen)"
for CHROMIUM_LOCALE in ${CHROMIUM_LOCALES}; do
sudo sed -i "s/^# ${CHROMIUM_LOCALE}/${CHROMIUM_LOCALE}/" ${LOCALE_GEN}
done
# Regenerating locales can take a while, so only do it if we need to.
if (echo "${OLD_LOCALE_GEN}" | cmp -s ${LOCALE_GEN}); then
echo "Locales already up-to-date."
else
sudo locale-gen
fi
else
for CHROMIUM_LOCALE in ${CHROMIUM_LOCALES}; do
sudo locale-gen ${CHROMIUM_LOCALE}
done
fi
sudo snap install --classic snapcraft
sudo snap install --classic multipass

View file

@ -58,6 +58,72 @@ if (current_toolchain == default_toolchain) {
app_hooks_impl = "java/src/org/chromium/chrome/browser/AppHooksImpl.java"
template("chrome_public_bundle") {
_is_monochrome = defined(invoker.is_monochrome) && invoker.is_monochrome
if (_is_monochrome) {
_module_descs = monochrome_module_descs
} else {
_module_descs = chrome_module_descs
}
_base_module_target_name = "${invoker.target_name}__base_bundle_module"
chrome_public_apk_or_module_tmpl(_base_module_target_name) {
forward_variables_from(invoker,
[
"add_view_trace_events",
"expected_android_manifest",
"is_64_bit_browser",
"is_monochrome",
"is_trichrome",
"include_32_bit_webview",
"include_64_bit_webview",
"static_library_provider",
"resource_ids_provider_dep",
])
target_type = "android_app_bundle_module"
srcjar_deps = []
foreach(_module_desc, _module_descs) {
if (defined(_module_desc.jni_registration)) {
srcjar_deps += [ _module_desc.jni_registration ]
}
}
if (defined(invoker.expected_android_manifest_template)) {
expected_android_manifest =
string_replace(invoker.expected_android_manifest_template,
"SPLIT_NAME",
"base")
}
}
chrome_bundle(target_name) {
forward_variables_from(invoker,
[
"add_view_trace_events",
"baseline_profile_path",
"bundle_name",
"enable_lint",
"include_32_bit_webview",
"include_64_bit_webview",
"is_64_bit_browser",
"is_monochrome",
"is_trichrome",
"lint_baseline_file",
"lint_min_sdk_version",
"lint_suppressions_file",
"static_library_provider",
"expected_android_manifest_template",
"expected_libs_and_assets",
"expected_proguard_config",
])
base_module_target = ":$_base_module_target_name"
manifest_package = chrome_public_manifest_package
module_descs = _module_descs
chrome_deps = [ ":delegate_public_impl_java" ]
}
}
jinja_template("chrome_public_android_feature_vr_manifest") {
input = "features/vr/java/AndroidManifest.xml"
output = feature_module_vr_android_manifest_path
@ -217,7 +283,7 @@ if (current_toolchain == default_toolchain) {
"//chrome/android/webapk/libs/common:splash_java",
"//chrome/android/webapk/libs/runtime_library:webapk_service_aidl_java",
"//chrome/browser/accessibility/hierarchysnapshotter/android:java",
"//chrome/browser/android/browserservices/constants:java",
"//chrome/browser/android/auxiliary_search/proto:proto_java",
"//chrome/browser/android/browserservices/intents:java",
"//chrome/browser/android/browserservices/metrics:java",
"//chrome/browser/android/browserservices/verification:java",
@ -277,6 +343,7 @@ if (current_toolchain == default_toolchain) {
"//chrome/browser/password_entry_edit:public_java",
"//chrome/browser/password_manager/android:java",
"//chrome/browser/password_manager/android:settings_interface_java",
"//chrome/browser/password_manager/android/pwd_migration:java",
"//chrome/browser/policy/android:java",
"//chrome/browser/preferences:java",
"//chrome/browser/prefetch/android:java",
@ -332,9 +399,6 @@ if (current_toolchain == default_toolchain) {
"//chrome/browser/user_education:java",
"//chrome/browser/util:java",
"//chrome/browser/version:java",
"//chrome/browser/video_tutorials:factory_java",
"//chrome/browser/video_tutorials:java",
"//chrome/browser/video_tutorials:java_resources",
"//chrome/browser/webapps/android:java",
"//chrome/browser/webauthn/android:java",
"//chrome/browser/xsurface:java",
@ -487,7 +551,6 @@ if (current_toolchain == default_toolchain) {
"//mojo/public/java/system:system_impl_java",
"//mojo/public/mojom/base:base_java",
"//net/android:net_java",
"//services/audio/public/java:audio_feature_list_java",
"//services/data_decoder/public/cpp/android:safe_json_java",
"//services/device/public/java:device_feature_list_java",
"//services/device/public/mojom:mojom_java",
@ -532,7 +595,9 @@ if (current_toolchain == default_toolchain) {
"//third_party/blink/public/mojom:android_mojo_bindings_java",
"//third_party/blink/public/mojom:mojom_platform_java",
"//third_party/gif_player:gif_player_java",
"//third_party/kotlin_stdlib:kotlin_stdlib_java",
"//third_party/metrics_proto:metrics_proto_java",
"//ui/accessibility:ax_base_java",
"//ui/android:ui_java",
"//ui/base/ime/mojom:mojom_java",
"//ui/base/mojom:mojom_java",
@ -664,7 +729,7 @@ if (current_toolchain == default_toolchain) {
java_package = "org.chromium.chrome.browser"
}
# This is a list of all base module java dependencies. New features should be
# This is a list of all chrome module java dependencies. New features should be
# added to this list.
java_group("chrome_all_java") {
deps = [
@ -681,13 +746,13 @@ if (current_toolchain == default_toolchain) {
"//chrome/browser/tabmodel/internal:java",
"//chrome/browser/touch_to_fill/android/internal:java",
"//chrome/browser/touch_to_fill/common/android:java",
"//chrome/browser/touch_to_fill/password_generation/android/internal:java",
"//chrome/browser/touch_to_fill/payments/android/internal:java",
"//chrome/browser/ui/android/appmenu/internal:java",
"//chrome/browser/ui/android/autofill/internal:java",
"//chrome/browser/ui/android/edge_to_edge/internal:java",
"//chrome/browser/ui/android/fast_checkout/internal:java",
"//chrome/browser/ui/android/webid/internal:java",
"//chrome/browser/video_tutorials/internal:java",
"//components/browser_ui/bottomsheet/android/internal:java",
"//components/messages/android/internal:java",
"//components/segmentation_platform/internal:internal_java",
@ -803,7 +868,7 @@ if (current_toolchain == default_toolchain) {
"//chrome/android/webapk/libs/common:common_java",
"//chrome/android/webapk/libs/common:splash_java",
"//chrome/android/webapk/test:junit_test_support",
"//chrome/browser/android/browserservices/constants:java",
"//chrome/browser/android/auxiliary_search/proto:proto_java",
"//chrome/browser/android/browserservices/intents:java",
"//chrome/browser/android/browserservices/intents:junit",
"//chrome/browser/android/browserservices/metrics:java",
@ -862,6 +927,7 @@ if (current_toolchain == default_toolchain) {
"//chrome/browser/omaha/android:java",
"//chrome/browser/optimization_guide/android:java",
"//chrome/browser/partnercustomizations:java",
"//chrome/browser/partnercustomizations:junit",
"//chrome/browser/password_edit_dialog/android:junit",
"//chrome/browser/password_entry_edit/android/internal:junit",
"//chrome/browser/password_manager/android:java",
@ -939,14 +1005,11 @@ if (current_toolchain == default_toolchain) {
"//chrome/browser/util:java",
"//chrome/browser/util:junit_tests",
"//chrome/browser/version:java",
"//chrome/browser/video_tutorials:factory_java",
"//chrome/browser/video_tutorials:java",
"//chrome/browser/video_tutorials:test_support_java",
"//chrome/browser/video_tutorials/internal:junit",
"//chrome/browser/webapps/android:java",
"//chrome/browser/xsurface:java",
"//chrome/test:sync_integration_test_support_java",
"//chrome/test/android:chrome_java_unit_test_support",
"//components/autofill/android:autofill_features_java",
"//components/autofill/android:main_autofill_java",
"//components/autofill/android:prefeditor_autofill_java",
"//components/background_task_scheduler:background_task_scheduler_java",
@ -969,6 +1032,7 @@ if (current_toolchain == default_toolchain) {
"//components/browser_ui/util/android:java",
"//components/browser_ui/widget/android:java",
"//components/browser_ui/widget/android:test_support_java",
"//components/browsing_data/core:java",
"//components/commerce/core:proto_java",
"//components/commerce/core/android:core_java",
"//components/content_capture/android:java",
@ -1029,6 +1093,8 @@ if (current_toolchain == default_toolchain) {
"//components/webapk/android/libs/client:java",
"//components/webapk/android/libs/common:java",
"//components/webapps/browser/android:java",
"//components/webauthn/android:java",
"//components/webauthn/android:test_support_java",
"//content/public/android:content_java",
"//content/public/common:common_java",
"//content/public/test/android:content_java_test_support",
@ -1036,6 +1102,7 @@ if (current_toolchain == default_toolchain) {
"//mojo/public/java:system_java",
"//mojo/public/mojom/base:base_java",
"//net/android:net_java",
"//services/device/public/java:device_feature_list_java",
"//services/device/public/mojom:mojom_java",
"//services/media_session/public/cpp/android:media_session_java",
"//services/media_session/public/mojom:mojom_java",
@ -1075,6 +1142,7 @@ if (current_toolchain == default_toolchain) {
"//url:gurl_junit_tests",
"//url:origin_java",
"//url/mojom:url_mojom_gurl_java",
"//url/mojom:url_mojom_origin_java",
]
deps += chrome_junit_test_java_deps
@ -1113,6 +1181,7 @@ if (current_toolchain == default_toolchain) {
"//content/public/test/android:content_java_test_support",
"//third_party/androidx:androidx_annotation_annotation_java",
"//third_party/androidx:androidx_browser_browser_java",
"//third_party/androidx:androidx_test_core_java",
"//third_party/androidx:androidx_test_monitor_java",
"//third_party/junit:junit",
"//url:gurl_java",
@ -1333,6 +1402,12 @@ if (current_toolchain == default_toolchain) {
data = [ "//chrome/test/data/android/" ]
}
flatbuffer_java_library(
"critical_persisted_tab_data_flatbuffer_test_v1_java") {
root_dir = "javatests/src/org/chromium/chrome/browser/tab/state/"
sources = [ "$root_dir/critical_persisted_tab_data_test_v1.fbs" ]
}
android_library("chrome_test_java") {
testonly = true
resources_package = "org.chromium.chrome.test"
@ -1340,11 +1415,15 @@ if (current_toolchain == default_toolchain) {
# From java_sources.gni.
sources = chrome_test_java_sources
mergeable_android_manifests =
[ "javatests/AndroidManifest_ChromeTests.xml" ]
deps = [
":base_module_java",
":browser_java_test_support",
":chrome_app_java_resources",
":chrome_test_util_java",
":critical_persisted_tab_data_flatbuffer_test_v1_java",
":delegate_public_impl_java",
"$google_play_services_package:google_play_services_base_java",
"$google_play_services_package:google_play_services_basement_java",
@ -1371,7 +1450,6 @@ if (current_toolchain == default_toolchain) {
"//chrome/android/webapk/libs/client:client_java",
"//chrome/android/webapk/libs/common:common_java",
"//chrome/android/webapk/libs/runtime_library:webapk_service_aidl_java",
"//chrome/browser/android/browserservices/constants:java",
"//chrome/browser/android/browserservices/intents:java",
"//chrome/browser/android/browserservices/verification:java",
"//chrome/browser/android/browserservices/verification:javatests",
@ -1494,7 +1572,6 @@ if (current_toolchain == default_toolchain) {
"//chrome/browser/ui/messages/android:java",
"//chrome/browser/uid/android:java",
"//chrome/browser/util:java",
"//chrome/browser/video_tutorials:test_support_java",
"//chrome/browser/webapps/android:java",
"//chrome/test:sync_integration_test_support_java",
"//chrome/test:test_support_java",
@ -1668,11 +1745,13 @@ if (current_toolchain == default_toolchain) {
"//third_party/junit",
"//third_party/metrics_proto:metrics_proto_java",
"//third_party/mockito:mockito_java",
"//ui/accessibility:ax_base_java",
"//ui/android:clipboard_java_test_support",
"//ui/android:ui_java",
"//ui/android:ui_java_test_support",
"//ui/base/ime/mojom:mojom_java",
"//ui/base/mojom:mojom_java",
"//url:android_test_helper_java",
"//url:gurl_java",
"//url:gurl_junit_test_support",
"//url:origin_java",
@ -1752,7 +1831,6 @@ if (current_toolchain == default_toolchain) {
"//base:base_java_test_support",
"//chrome/android:chrome_java",
"//chrome/android:delegate_public_impl_java",
"//chrome/android/features/vr:java",
"//chrome/browser/flags:java",
"//chrome/browser/tab:java",
"//chrome/browser/tabmodel:java",
@ -1767,6 +1845,7 @@ if (current_toolchain == default_toolchain) {
"//net/android:net_java_test_support",
"//third_party/androidx:androidx_annotation_annotation_java",
"//third_party/androidx:androidx_browser_browser_java",
"//third_party/androidx:androidx_test_core_java",
"//third_party/androidx:androidx_test_monitor_java",
"//third_party/androidx:androidx_test_rules_java",
"//third_party/androidx:androidx_test_runner_java",
@ -1775,6 +1854,10 @@ if (current_toolchain == default_toolchain) {
"//ui/android:ui_java",
]
if (enable_gvr_services) {
chrome_test_xr_java_deps += [ "//chrome/android/features/vr:java" ]
}
# Files used for both VR and AR testing
android_library("chrome_test_xr_java") {
testonly = true
@ -1810,29 +1893,10 @@ if (current_toolchain == default_toolchain) {
resources_package = "org.chromium.chrome.vr"
sources = [
"javatests/src/org/chromium/chrome/browser/vr/EmulatedVrController.java",
"javatests/src/org/chromium/chrome/browser/vr/TestVrShellDelegate.java",
"javatests/src/org/chromium/chrome/browser/vr/VrDaydreamReadyModuleInstallTest.java",
"javatests/src/org/chromium/chrome/browser/vr/VrInstallUpdateMessageTest.java",
"javatests/src/org/chromium/chrome/browser/vr/WebXrVrDeviceTest.java",
"javatests/src/org/chromium/chrome/browser/vr/WebXrVrInputTest.java",
"javatests/src/org/chromium/chrome/browser/vr/WebXrVrPermissionTest.java",
"javatests/src/org/chromium/chrome/browser/vr/WebXrVrPermissionTestFramework.java",
"javatests/src/org/chromium/chrome/browser/vr/WebXrVrTabTest.java",
"javatests/src/org/chromium/chrome/browser/vr/WebXrVrTestFramework.java",
"javatests/src/org/chromium/chrome/browser/vr/WebXrVrTransitionTest.java",
"javatests/src/org/chromium/chrome/browser/vr/mock/MockVrCoreVersionChecker.java",
"javatests/src/org/chromium/chrome/browser/vr/mock/MockVrDaydreamApi.java",
"javatests/src/org/chromium/chrome/browser/vr/rules/ChromeTabbedActivityVrTestRule.java",
"javatests/src/org/chromium/chrome/browser/vr/rules/CustomTabActivityVrTestRule.java",
"javatests/src/org/chromium/chrome/browser/vr/rules/VrModuleNotInstalled.java",
"javatests/src/org/chromium/chrome/browser/vr/rules/VrTestRule.java",
"javatests/src/org/chromium/chrome/browser/vr/rules/WebappActivityVrTestRule.java",
"javatests/src/org/chromium/chrome/browser/vr/util/NativeUiUtils.java",
"javatests/src/org/chromium/chrome/browser/vr/util/VrMessageUtils.java",
"javatests/src/org/chromium/chrome/browser/vr/util/VrShellDelegateUtils.java",
"javatests/src/org/chromium/chrome/browser/vr/util/VrTestRuleUtils.java",
"javatests/src/org/chromium/chrome/browser/vr/util/VrTransitionUtils.java",
]
deps = chrome_test_xr_java_deps + [
@ -1850,11 +1914,42 @@ if (current_toolchain == default_toolchain) {
"//components/messages/android/internal:java",
"//components/messages/android/test:test_support_java",
"//components/module_installer/android:module_installer_java",
"//third_party/gvr-android-sdk:controller_test_api_java",
"//third_party/gvr-android-sdk:gvr_common_java",
"//third_party/androidx:androidx_test_core_java",
"//third_party/androidx:androidx_test_core_java",
"//ui/android:ui_java_test_support",
]
if (enable_gvr_services) {
sources += [
"javatests/src/org/chromium/chrome/browser/vr/EmulatedVrController.java",
"javatests/src/org/chromium/chrome/browser/vr/TestVrShellDelegate.java",
"javatests/src/org/chromium/chrome/browser/vr/VrDaydreamReadyModuleInstallTest.java",
"javatests/src/org/chromium/chrome/browser/vr/VrInstallUpdateMessageTest.java",
# TODO(https://crbug.com/1429384): Modify these tests to run on non-GVR runtimes.
"javatests/src/org/chromium/chrome/browser/vr/WebXrVrDeviceTest.java",
"javatests/src/org/chromium/chrome/browser/vr/WebXrVrInputTest.java",
"javatests/src/org/chromium/chrome/browser/vr/WebXrVrPermissionTest.java",
"javatests/src/org/chromium/chrome/browser/vr/WebXrVrPermissionTestFramework.java",
"javatests/src/org/chromium/chrome/browser/vr/WebXrVrTabTest.java",
"javatests/src/org/chromium/chrome/browser/vr/WebXrVrTestFramework.java",
"javatests/src/org/chromium/chrome/browser/vr/WebXrVrTransitionTest.java",
"javatests/src/org/chromium/chrome/browser/vr/mock/MockVrCoreVersionChecker.java",
"javatests/src/org/chromium/chrome/browser/vr/mock/MockVrDaydreamApi.java",
"javatests/src/org/chromium/chrome/browser/vr/rules/ChromeTabbedActivityVrTestRule.java",
"javatests/src/org/chromium/chrome/browser/vr/rules/CustomTabActivityVrTestRule.java",
"javatests/src/org/chromium/chrome/browser/vr/rules/WebappActivityVrTestRule.java",
"javatests/src/org/chromium/chrome/browser/vr/util/VrShellDelegateUtils.java",
"javatests/src/org/chromium/chrome/browser/vr/util/VrTestRuleUtils.java",
"javatests/src/org/chromium/chrome/browser/vr/util/VrTransitionUtils.java",
]
deps += [
"//third_party/gvr-android-sdk:controller_test_api_java",
"//third_party/gvr-android-sdk:gvr_common_java",
]
}
data = [
"//chrome/android/shared_preference_files/test/",
"//third_party/gvr-android-sdk/test-apks/",
@ -2158,17 +2253,6 @@ if (current_toolchain == default_toolchain) {
is_bundle_module = true
}
# Java libraries that go into each public chrome APK and base module. The chrome
# JNI registration is generated based on this target.
# TODO(tiborg): Remove the following three groups once we have a APK / module
# target that contain exactly the grouped java libraries.
java_group("chrome_public_base_module_java") {
deps = [
":chrome_all_java",
":delegate_public_impl_java",
]
}
# Exists separately from chrome_public_base_module_java_for_test to allow
# downstream to depend on test support packages without needing to depend on
# delegate_public_impl_java.
@ -2191,13 +2275,12 @@ if (current_toolchain == default_toolchain) {
]
}
# Similar to chrome_public_base_module_java but for Java libraries that go into
# the public chrome test APK.
java_group("chrome_public_base_module_java_for_test") {
testonly = true
deps = [
":chrome_public_base_module_java",
":chrome_all_java",
":chrome_public_base_module_java_test_support",
":delegate_public_impl_java",
]
}
@ -2279,6 +2362,10 @@ if (current_toolchain == default_toolchain) {
baseline_profile_path = "//chrome/android/baseline_profiles/profile.txt"
}
chrome_public_bundle("chrome_public_bundle") {
bundle_name = "ChromePublic"
}
android_library("monochrome_java") {
deps = [
":base_module_java",
@ -2533,6 +2620,7 @@ if (current_toolchain == default_toolchain) {
"//chrome/browser/optimization_guide/android:unit_device_javatests",
"//chrome/browser/partnercustomizations:unit_device_javatests",
"//chrome/browser/password_edit_dialog/android:unit_device_javatests",
"//chrome/browser/recent_tabs/internal:unit_device_javatests",
"//chrome/browser/signin/services/android:unit_device_javatests",
"//chrome/browser/thumbnail/generator:unit_device_javatests",
"//chrome/browser/ui/android/appmenu/internal:unit_device_javatests",
@ -2541,7 +2629,6 @@ if (current_toolchain == default_toolchain) {
"//chrome/browser/ui/android/searchactivityutils:unit_device_javatests",
"//chrome/browser/ui/android/signin:unit_device_javatests",
"//chrome/browser/ui/messages/android:unit_device_javatests",
"//chrome/browser/video_tutorials/internal:unit_device_javatests",
"//components/browser_ui/bottomsheet/android/internal:unit_device_javatests",
"//components/browser_ui/contacts_picker/android:unit_device_javatests",
"//components/browser_ui/modaldialog/android:unit_device_javatests",
@ -2592,6 +2679,7 @@ if (current_toolchain == default_toolchain) {
"//chrome/browser/engagement/android:javatests",
"//chrome/browser/flags:javatests",
"//chrome/browser/password_check/android:test_java",
"//chrome/browser/password_manager/android/pwd_migration:javatests",
"//chrome/browser/subresource_filter:subresource_filter_javatests",
"//chrome/browser/touch_to_fill/android:test_java",
"//chrome/browser/touch_to_fill/payments/android/internal:javatests",
@ -2668,10 +2756,13 @@ if (current_toolchain == default_toolchain) {
"javatests/src/org/chromium/chrome/test/smoke/AndroidManifest.xml"
target_sdk_version = android_sdk_version
testonly = true
sources =
[ "javatests/src/org/chromium/chrome/test/smoke/ChromeSmokeTest.java" ]
sources = [
"javatests/src/org/chromium/chrome/test/smoke/ChromeTabSwitcherTest.java",
"javatests/src/org/chromium/chrome/test/smoke/utilities/FirstRunNavigator.java",
]
data = [ "javatests/src/org/chromium/chrome/test/smoke/test.html" ]
deps = [
"//base:base_java",
"//base:base_java_test_support",
"//chrome/test/android:chrome_java_test_pagecontroller",
"//content/public/test/android:content_java_test_support",
@ -2881,65 +2972,6 @@ if (current_toolchain == default_toolchain) {
]
}
template("chrome_bundle_tmpl") {
_is_monochrome = defined(invoker.is_monochrome) && invoker.is_monochrome
_base_module_target_name = "${invoker.target_name}__base_bundle_module"
chrome_public_apk_or_module_tmpl(_base_module_target_name) {
forward_variables_from(invoker,
[
"add_view_trace_events",
"expected_android_manifest",
"is_64_bit_browser",
"is_monochrome",
"is_trichrome",
"include_32_bit_webview",
"include_64_bit_webview",
"static_library_provider",
"resource_ids_provider_dep",
])
target_type = "android_app_bundle_module"
bundle_target = ":${invoker.target_name}"
if (defined(invoker.expected_android_manifest_template)) {
expected_android_manifest =
string_replace(invoker.expected_android_manifest_template,
"SPLIT_NAME",
"base")
}
}
chrome_bundle(target_name) {
forward_variables_from(invoker,
[
"add_view_trace_events",
"baseline_profile_path",
"bundle_name",
"enable_lint",
"include_32_bit_webview",
"include_64_bit_webview",
"is_64_bit_browser",
"is_monochrome",
"is_trichrome",
"lint_baseline_file",
"lint_min_sdk_version",
"lint_suppressions_file",
"static_library_provider",
"expected_android_manifest_template",
"expected_libs_and_assets",
"expected_proguard_config",
])
base_module_target = ":$_base_module_target_name"
manifest_package = chrome_public_manifest_package
if (_is_monochrome) {
module_descs = monochrome_module_descs
} else {
module_descs = chrome_module_descs
}
chrome_deps = [ ":delegate_public_impl_java" ]
}
}
group("android_lint") {
if (android_64bit_target_cpu && skip_secondary_abi_for_cq) {
assert(disable_android_lint)
@ -2962,7 +2994,7 @@ if (current_toolchain == default_toolchain) {
} else {
# Public webview targets don't work with non-public sdks.
# https://crbug.com/1000763
chrome_bundle_tmpl("monochrome_public_bundle") {
chrome_public_bundle("monochrome_public_bundle") {
is_monochrome = true
bundle_name = "MonochromePublic"
@ -3004,7 +3036,7 @@ if (current_toolchain == default_toolchain) {
}
}
chrome_bundle_tmpl("trichrome_chrome_bundle") {
chrome_public_bundle("trichrome_chrome_bundle") {
is_trichrome = true
bundle_name = "TrichromeChrome"
static_library_provider = ":trichrome_library_apk"
@ -3118,14 +3150,14 @@ if (current_toolchain == default_toolchain) {
}
if (android_64bit_target_cpu) {
chrome_bundle_tmpl("monochrome_64_public_bundle") {
chrome_public_bundle("monochrome_64_public_bundle") {
is_monochrome = true
bundle_name = "MonochromePublic64"
is_64_bit_browser = true
include_32_bit_webview = false
}
chrome_bundle_tmpl("trichrome_chrome_64_bundle") {
chrome_public_bundle("trichrome_chrome_64_bundle") {
is_trichrome = true
bundle_name = "TrichromeChrome64"
is_64_bit_browser = true
@ -3138,21 +3170,21 @@ if (current_toolchain == default_toolchain) {
}
if (!skip_secondary_abi_for_cq) {
chrome_bundle_tmpl("monochrome_32_public_bundle") {
chrome_public_bundle("monochrome_32_public_bundle") {
is_monochrome = true
bundle_name = "MonochromePublic32"
is_64_bit_browser = false
include_64_bit_webview = false
}
chrome_bundle_tmpl("monochrome_64_32_public_bundle") {
chrome_public_bundle("monochrome_64_32_public_bundle") {
is_monochrome = true
bundle_name = "MonochromePublic6432"
is_64_bit_browser = true
include_32_bit_webview = true
}
chrome_bundle_tmpl("trichrome_chrome_64_32_bundle") {
chrome_public_bundle("trichrome_chrome_64_32_bundle") {
is_trichrome = true
bundle_name = "TrichromeChrome6432"
is_64_bit_browser = true
@ -3163,7 +3195,7 @@ if (current_toolchain == default_toolchain) {
"expectations/$target_name.$target_cpu.libs_and_assets.expected"
}
}
chrome_bundle_tmpl("trichrome_chrome_32_bundle") {
chrome_public_bundle("trichrome_chrome_32_bundle") {
is_trichrome = true
bundle_name = "TrichromeChrome32"
is_64_bit_browser = false
@ -3197,7 +3229,6 @@ generate_jni("chrome_jni_headers") {
"java/src/org/chromium/chrome/browser/announcement/AnnouncementNotificationManager.java",
"java/src/org/chromium/chrome/browser/app/send_tab_to_self/SendTabToSelfNotificationReceiver.java",
"java/src/org/chromium/chrome/browser/app/tab_activity_glue/ReparentingTask.java",
"java/src/org/chromium/chrome/browser/app/video_tutorials/VideoTutorialsServiceUtils.java",
"java/src/org/chromium/chrome/browser/autofill/AutofillAccessibilityUtils.java",
"java/src/org/chromium/chrome/browser/autofill/AutofillExpirationDateFixFlowBridge.java",
"java/src/org/chromium/chrome/browser/autofill/AutofillLogger.java",
@ -3209,11 +3240,10 @@ generate_jni("chrome_jni_headers") {
"java/src/org/chromium/chrome/browser/autofill/PhoneNumberUtil.java",
"java/src/org/chromium/chrome/browser/autofill/SaveUpdateAddressProfilePrompt.java",
"java/src/org/chromium/chrome/browser/autofill/SaveUpdateAddressProfilePromptController.java",
"java/src/org/chromium/chrome/browser/autofill/VirtualCardEnrollmentDelegate.java",
"java/src/org/chromium/chrome/browser/autofill/VirtualCardEnrollmentDialogViewBridge.java",
"java/src/org/chromium/chrome/browser/autofill/settings/AutofillPaymentMethodsDelegate.java",
"java/src/org/chromium/chrome/browser/autofill/settings/AutofillProfileBridge.java",
"java/src/org/chromium/chrome/browser/autofill/settings/VirtualCardEnrollmentFields.java",
"java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchBridge.java",
"java/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTask.java",
"java/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskScheduler.java",
"java/src/org/chromium/chrome/browser/background_sync/GooglePlayServicesChecker.java",
@ -3221,7 +3251,6 @@ generate_jni("chrome_jni_headers") {
"java/src/org/chromium/chrome/browser/background_task_scheduler/ChromeBackgroundTaskFactory.java",
"java/src/org/chromium/chrome/browser/background_task_scheduler/ProxyNativeTask.java",
"java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java",
"java/src/org/chromium/chrome/browser/browserservices/QualityEnforcer.java",
"java/src/org/chromium/chrome/browser/browserservices/digitalgoods/SiteIsolator.java",
"java/src/org/chromium/chrome/browser/browserservices/permissiondelegation/InstalledWebappBridge.java",
"java/src/org/chromium/chrome/browser/browserservices/permissiondelegation/InstalledWebappGeolocationBridge.java",
@ -3340,7 +3369,6 @@ generate_jni("chrome_jni_headers") {
"java/src/org/chromium/chrome/browser/query_tiles/QueryTileUtils.java",
"java/src/org/chromium/chrome/browser/query_tiles/TileProviderFactory.java",
"java/src/org/chromium/chrome/browser/query_tiles/TileServiceUtils.java",
"java/src/org/chromium/chrome/browser/read_later/ReadingListBridge.java",
"java/src/org/chromium/chrome/browser/renderer_host/ChromeNavigationUIData.java",
"java/src/org/chromium/chrome/browser/resources/ResourceMapper.java",
"java/src/org/chromium/chrome/browser/rlz/RevenueStats.java",
@ -3469,6 +3497,7 @@ template("libchrome_impl") {
deps += [ "//chrome/browser/android/vr:module_factory" ]
}
java_targets = [ "//chrome/android:chrome_public_apk" ]
forward_variables_from(invoker, "*", [ "deps" ])
}
}
@ -3487,6 +3516,8 @@ libchrome_impl("libchrome") {
# it comes before the actual (very slow) link step.
deps = [ ":libchrome_inputs" ]
}
module_descs = chrome_module_descs
}
chrome_common_shared_library("libchromefortest") {
@ -3516,9 +3547,6 @@ chrome_common_shared_library("libchromefortest") {
if (enable_vr) {
deps += [ "//chrome/browser/android/vr:test_support" ]
}
if (allow_jni_multiplexing) {
enable_jni_multiplexing = true
}
# Make this a partitioned library, since some partitioned code is linked in
# (otherwise, the library will warn at build time that it contains multiple
@ -3526,6 +3554,19 @@ chrome_common_shared_library("libchromefortest") {
# required or packaged into the APK. This can be removed if LLD starts
# supporting a "no partitions" argument (https://crbug.com/1021108).
module_descs = []
java_targets = [
"//chrome/android:chrome_public_unit_test_apk__test_apk",
"//chrome/android:chrome_public_test_apk__test_apk",
"//chrome/test/android:chrome_java_test_pagecontroller_tests__test_apk",
"//chrome/test/android:chrome_java_test_wpr_tests__test_apk",
"//chrome/test/android:chrome_java_test_feed_test__test_apk",
"//chrome/test/android:chrome_webapk_integration_tests__test_apk",
"//chrome/test/android:chrome_java_test_pagecontroller_codelab__test_apk",
]
if (enable_vr) {
java_targets += [ "//chrome/android:chrome_public_test_vr_apk__test_apk" ]
}
}
# Monochrome equivalent of Chrome's APK or bundle library template.
@ -3550,6 +3591,11 @@ template("libmonochrome_apk_or_bundle_tmpl") {
if (allow_jni_multiplexing) {
enable_jni_multiplexing = true
}
if (android_64bit_target_cpu) {
java_targets = [ "//chrome/android:monochrome_64_public_bundle" ]
} else {
java_targets = [ "//chrome/android:monochrome_public_bundle" ]
}
if (enable_vr) {
deps += [ "//chrome/browser/android/vr:module_factory" ]

View file

@ -174,6 +174,11 @@ template("chrome_common_apk_or_module_tmpl") {
_version_code = chrome_version_code
}
# Need to apply override explicitly to have it apply to library version.
if (android_override_version_code != "") {
_version_code = android_override_version_code
}
if (defined(invoker.manifest_package)) {
_manifest_package = invoker.manifest_package
} else if (_is_test) {
@ -466,7 +471,6 @@ template("chrome_common_apk_or_module_tmpl") {
} else if (!_is_trichrome) {
deps += [
"//chrome/android:chrome_public_apk_base_module_resources",
"//chrome/android:chrome_public_base_module_java",
"//chrome/android:chrome_public_non_pak_assets",
"//components/browser_ui/styles/android:chrome_public_apk_resources",
]
@ -478,7 +482,10 @@ template("chrome_common_apk_or_module_tmpl") {
"//components/language/android:ulp_delegate_public_java",
]
} else {
deps += [ "//chrome/android:delegate_public_impl_java" ]
deps += [
"//chrome/android:chrome_all_java",
"//chrome/android:delegate_public_impl_java",
]
}
if (_is_test) {
deps += [ "//chrome/android:chrome_public_base_module_java_for_test" ]
@ -545,32 +552,48 @@ template("chrome_common_apk_or_module_tmpl") {
shared_libraries += invoker.shared_libraries
} else if (_is_test) {
shared_libraries += [ "//chrome/android:libchromefortest" ]
} else if (_is_monochrome) {
srcjar_deps = [ "//chrome/android:libchromefortest__jni_registration($default_toolchain)" ]
} else if (_is_monochrome || _is_trichrome) {
# We are only doing the jni_registrations for Trichrome - the actual
# native libraries will end up in the Trichrome library.
if (android_64bit_target_cpu) {
# Build //android_webview:monochrome with the opposite bitness that
# Chrome runs in.
if (_is_64_bit_browser) {
shared_libraries += [ "//chrome/android:libmonochrome_64" ]
if (_include_32_bit_webview) {
secondary_abi_shared_libraries += [ "//android_webview:monochrome_64($android_secondary_abi_toolchain)" ]
}
if (build_hwasan_splits) {
shared_libraries +=
[ "//chrome/android:libmonochrome_64($_hwasan_toolchain)" ]
srcjar_deps = [ "//chrome/android:libmonochrome_64__jni_registration($default_toolchain)" ]
if (_is_monochrome) {
shared_libraries += [ "//chrome/android:libmonochrome_64" ]
if (_include_32_bit_webview) {
secondary_abi_shared_libraries += [ "//android_webview:monochrome_64($android_secondary_abi_toolchain)" ]
}
if (build_hwasan_splits) {
shared_libraries +=
[ "//chrome/android:libmonochrome_64($_hwasan_toolchain)" ]
}
}
} else {
if (_include_64_bit_webview) {
shared_libraries += [ "//android_webview:monochrome" ]
srcjar_deps = [ "//chrome/android:libmonochrome__jni_registration($android_secondary_abi_toolchain)" ]
if (_is_monochrome) {
if (_include_64_bit_webview) {
shared_libraries += [ "//android_webview:monochrome" ]
}
secondary_abi_shared_libraries += [ "//chrome/android:libmonochrome($android_secondary_abi_toolchain)" ]
}
secondary_abi_shared_libraries += [
"//chrome/android:libmonochrome($android_secondary_abi_toolchain)",
]
}
} else {
shared_libraries += [ "//chrome/android:libmonochrome" ]
srcjar_deps = [ "//chrome/android:libmonochrome__jni_registration($default_toolchain)" ]
if (_is_monochrome) {
shared_libraries += [ "//chrome/android:libmonochrome" ]
}
}
} else if (!_is_trichrome) {
shared_libraries += [ "//chrome/android:libchrome" ]
srcjar_deps =
[ "//chrome/android:libchrome__jni_registration($default_toolchain)" ]
}
if (defined(invoker.srcjar_deps)) {
srcjar_deps += invoker.srcjar_deps
}
if (enable_arcore) {
@ -719,6 +742,7 @@ template("chrome_common_apk_or_module_tmpl") {
"secondary_abi_loadable_modules",
"secondary_abi_shared_libraries",
"shared_libraries",
"srcjar_deps",
"version_code",
"version_name",
])

View file

@ -1,4 +1,4 @@
// Copyright 2023 The Chromium Authors and Alex313031. All rights reserved.
// Copyright 2012 The Chromium Authors and Alex313031
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@ -30,8 +30,8 @@
#include "url/gurl.h"
#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
#include "chrome/browser/supervised_user/supervised_user_service.h"
#include "chrome/browser/supervised_user/supervised_user_service_factory.h"
#include "components/supervised_user/core/browser/supervised_user_service.h"
#include "components/supervised_user/core/browser/supervised_user_url_filter.h" // nogncheck
#endif
@ -140,7 +140,7 @@ bool IsNTPOrRelatedURLHelper(const GURL& url, Profile* profile) {
bool IsURLAllowedForSupervisedUser(const GURL& url, Profile* profile) {
#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
SupervisedUserService* supervised_user_service =
supervised_user::SupervisedUserService* supervised_user_service =
SupervisedUserServiceFactory::GetForProfile(profile);
if (!supervised_user_service ||
!supervised_user_service->IsURLFilteringEnabled()) {

View file

@ -600,9 +600,6 @@ CHAR_LIMIT guidelines:
<message name="IDS_PASSWORDS_LEAK_DETECTION_SWITCH_TITLE" desc="Title for the switch toggling whether Thorium should check that entered credentials have been part of a leak.">
Warn you if passwords are exposed in a data breach
</message>
<message name="IDS_PASSWORDS_LEAK_DETECTION_SWITCH_SIGNED_OUT_ENABLE_DESCRIPTION" desc="Description for the switch toggling whether Thorium should check that entered credentials have been part of a leak. Displayed for users who are not signed in and syncing.">
When you sign in to your Google Account, this feature is turned on
</message>
<message name="IDS_PASSWORDS_CHECK_TITLE" desc="Title for the check passwords button which allows to check whether the user's passwords have been compromised.">
Check passwords
</message>
@ -732,18 +729,25 @@ CHAR_LIMIT guidelines:
<message name="IDS_PASSWORD_SETTINGS_EXPORT_ERROR_DETAILS" desc="A short prefix to introduce a technical error message passed to the user from Android after exporting passwords through a temporary file fails. Both the prefix and the error message are shown in the body of an alert dialog.">
Details: <ph name="ERROR_DESCRIPTION">%1$s<ex>IOException: No space left on device</ex></ph>
</message>
<message name="IDS_UPM_ERROR_NOTIFICATION_TITLE" translateable="false" desc="The title of the UI surface telling the user that the new password manager backend has encountered an error.">
Unified password manager error
</message>
<message name="IDS_UPM_ERROR_NOTIFICATION_CONTENTS" translateable="false" desc="The contents of the UI surface shown when the new password manager backend encounters an error, prompting the user to file a bug.">
The unified password manager was automatically disabled. Please submit an issue via the bug app!
</message>
<message name="IDS_PASSWORDS_NOT_SECURE_FILLING" desc="The title of the dialog which is shown when the user attempts to enter obfuscated text to a regular text field.">
Not secure
</message>
<message name="IDS_PASSWORDS_NOT_SECURE_FILLING_DETAILS" desc="The message of the dialog which is shown when the user attempts to enter obfuscated text to a regular text field.">
To protect your privacy, Thorium will not autofill your password in this field.
</message>
<message name="IDS_PASSWORD_MIGRATION_WARNING_TITLE" desc="The title of the password migration warning sheet.">
Were changing how passwords are saved on this device
</message>
<message name="IDS_PASSWORD_MIGRATION_WARNING_SUBTITLE" desc="The subtitle of the password migration warning sheet." formatter_data="android_java">
Your lists of saved passwords for Thorium and Thorium <ph name="ERROR_DESCRIPTION">%1$s<ex>Dev</ex></ph> will merge after version 121. Youll be able to autofill all your saved passwords on both apps.
</message>
<message name="IDS_PASSWORD_MIGRATION_WARNING_ACKNOWLEDGE" desc="The text on the button that acknowledges the password migration warning.">
Got it
</message>
<message name="IDS_PASSWORD_MIGRATION_WARNING_OTHER_OPTIONS" desc="The text on the button that leads to other options in the password migration warning sheet.">
Other options
</message>
<!-- Lock Screen Fragment -->
<message name="IDS_LOCKSCREEN_DESCRIPTION_COPY" desc="When a user attempts to copy a password for a particular website into clipboard in Thorium's settings, Thorium launches a lock screen to verify the user's identity and displays the following explanation.">
@ -841,8 +845,8 @@ CHAR_LIMIT guidelines:
<message name="IDS_CONTEXTUAL_SEARCH_SEE_BETTER_RESULTS_SUMMARY" desc="Summary for the see better results switch in Contextual Search preference.">
By including more of a pages text, you might see better results
</message>
<message name="IDS_DO_NOT_TRACK_TITLE" desc="Title for 'Do Not Track' preference">
“Do Not Track”
<message name="IDS_DO_NOT_TRACK_TITLE" desc="Title for the 'Do Not Track' preference. Please leave the 'Do Not Track' part in English according to the glossary.">
Send a “Do Not Track” request
</message>
<message name="IDS_DO_NOT_TRACK_DESCRIPTION" desc="Description for 'Do Not Track' preference">
Enabling “Do Not Track” means that a request will be included with your browsing traffic. Any effect depends on whether a website responds to the request, and how the request is interpreted.
@ -866,6 +870,9 @@ For example, some websites may respond to this request by showing you ads that a
<message name="IDS_PRIVACY_SANDBOX_SNACKBAR_MESSAGE" desc="The text displayed in the snackbar, which gives the user an option to navigate to the Privacy Sandbox settings page. 'Privacy sandbox' has TC ID 5753235213964358658.">
Learn about and control new technologies that aim to replace third-party cookies
</message>
<message name="IDS_SETTINGS_AD_PRIVACY_RESTRICTED_LINK_ROW_SUB_LABEL" desc="A string that describes 'Ad privacy', the label that appears just above it. This is the version of IDS_SETTINGS_AD_PRIVACY_PAGE_TOPICS_LINK_ROW_LABEL for restricted users.">
Manage info used by sites to measure ad performance
</message>
<message name="IDS_PRIVACY_SANDBOX_TRIALS_TITLE" desc="The title of the settings page on which the user can find all Privacy Sandbox trials. When launched, this page will appear at chrome://settings/privacySandbox. To get there: 1) go to Thorium settings 2) From the main menu (top left of the page) choose “Security and privacy” 3) At the bottom of the page, choose “Privacy Sandbox” There are 3 cards on this page that are presented as features. Only the first includes controls the user can manage, but we want to convey that Privacy Sandbox includes all of the things on this page.">
Trials
@ -1069,14 +1076,17 @@ Private state tokens improve privacy on the web and cant be used to find out
</message>
<!-- Privacy Sandbox v4 - Consent & Notice Flow -->
<message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_BULLET_2" desc="* This is 2 of 2 bullets that site beneath the sentence: 'Were launching new ways to limit what sites can learn about you when they show you personalized ads, for example:' * 'ad measurement' is the name of a new setting we're launching and that appears on the Ad privacy page of Thorium settings. * 'limited types of data': This setting helps an advertiser associate a user's actions on one site with their actions on another. For example, a user sees an ad on one site and then later buys that product from the company that sells the product. The ad measurement setting allows Thorium to help a company make the association between the two sites so that the first site can be fairly compensated for showing an ad. Compared with third-party cookies, very little info is shared between sites to support this functionality. **** CONTEXT PRIVACY SANDBOX **** Thoriums Privacy Sandbox initiative 1) deprecates third-party cookies in Thorium, 2) supports free and open content on the web (by finding better ways to support ads online), 3) while providing stronger privacy protections for users. You can see a high-level description of this public project at www.privacysanbox.com. **** CONTEXT EEA NOTICE **** 1) This screen provides notice to Thorium users in the European Economic Area (EEA). It follows guidelines established by the GDPR. 2) This screen is the second of 2 screens. This second screen describes 2 settings: “Site-suggested ads” and “Ad measurement”. The first screen describes the “Ad topics” setting. " formatter_data="android_java">
<message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_BULLET_2" desc="* This is 2 of 2 bullets that site beneath the sentence: 'Were launching new ways to limit what sites can learn about you when they show you personalized ads, for example:' * 'ad measurement' is the name of a new setting we're launching and that appears on the Ad privacy page of Thorium settings. * 'limited types of data': This setting helps an advertiser associate a user's actions on one site with their actions on another. For example, a user sees an ad on one site and then later buys that product from the company that sells the product. The ad measurement setting allows Thorium to help a company make the association between the two sites so that the first site can be fairly compensated for showing an ad. Compared with third-party cookies, very little info is shared between sites to support this functionality. **** CONTEXT PRIVACY SANDBOX **** Thoriums Privacy Sandbox initiative 1) deprecates third-party cookies in Thorium, 2) supports free and open content on the web (by finding better ways to support ads online), 3) while providing stronger privacy protections for users. You can see a high-level description of this public project at www.privacysanbox.com. **** CONTEXT EEA NOTICE **** 1) This screen provides notice to Thorium users in the European Economic Area (EEA). It follows guidelines established by the GDPR. 2) This screen is the second of 2 screens. This second screen describes 2 settings: “Site-suggested ads” and “Ad measurement”. The first screen describes the “Ad topics” setting. ">
With ad measurement, limited types of data can be shared among sites and apps to measure the performance of their ads, such as the time of day an ad was shown to you.
</message>
<message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_DESCRIPTION_3" desc="A paragraph on the 'Enhanced ad privacy in Thorium' page that provides notice to Thorium users outside of the EEA. **** CONTEXT PRIVACY SANDBOX **** Thoriums Privacy Sandbox initiative 1) deprecates third-party cookies in Thorium, 2) supports free and open content on the web (by finding better ways to support ads online), 3) while providing stronger privacy protections for users. You can see a high-level description of this public project at www.privacysanbox.com. **** CONTEXT ROW NOTICE **** 1) This screen provides notice to Thorium users outside of the European Economic Area (EEA) (we typically refer to this screen as “Rest of World” or “ROW”). It follows guidelines established by the GDPR. 2) Were using similar but distinct content for EEA / ROW because legal requirements differ. For ROW, we can provide notice for all 3 settings, and so all 3 settings can appear on a single screen. ">
To measure the performance of an ad, limited types of data can be shared among sites, such as the time of day an ad was shown to you.
</message>
<message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_RESTRICTED_DESCRIPTION_3" translateable="false" formatter_data="android_java">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
<message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_RESTRICTED_DESCRIPTION_1_ANDROID" desc="First description in the restricted notice which applies to Android only">
Were launching a new ad privacy feature called ad measurement. Thorium shares only very limited information among sites and apps, such as when an ad was shown to you, to help measure the performance of ads.
</message>
<message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_RESTRICTED_DESCRIPTION_ANDROID" desc="Special description in the restricted notice which applies to Android only">
Your Android device may include a similar setting. If this setting is turned on in Thorium and on your Android device, a company may be able to measure the effectiveness of an ad across websites you visit and apps you use.
</message>
<message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_EEA_LEARN_MORE_DESCRIPTION_ANDROID" desc="As part of Privacy Sandbox (see details below), both Thorium and Android devices will have a new setting called 'Ad measurement'. Some details are different, but these settings essentially do the same thing. The Thorium setting allows sites you visit to ask Thorium for information that helps them measure the performance of their ads, linking 1) an ad for site B the user sees on site A, with 2) a purchase or other action the user might take on site B. On Android, it's essentially the same story only it's between apps and not sites. The challenge is that on Android, Thorium is a browser but it's also an App. This paragraph helps the user understand that, if both settings are on, information about the user's actions on a site might be connected with actions the user takes in an app. **** CONTEXT PRIVACY SANDBOX **** Thoriums Privacy Sandbox initiative 1) deprecates third-party cookies in Thorium, 2) supports free and open content on the web (by finding better ways to support ads online), 3) while providing stronger privacy protections for users. You can see a high-level description of this public project at www.privacysanbox.com.">
Your Android device may include a similar setting. If Ad measurement is turned on in Thorium and on your Android device, a company may be able to measure the effectiveness of an ad across web sites you visit and apps you use.
@ -1347,9 +1357,6 @@ Your Google account may have other forms of browsing history like searches and a
<message name="IDS_CLEAR_BROWSING_DATA_TAB_PERIOD_TITLE" desc="Label of the dropdown that selects the time range for which browsing data will be deleted.">
Time range
</message>
<message name="IDS_CLEAR_BROWSING_DATA_TAB_PERIOD_15_MINUTES" desc="The option to delete browsing data from the last 15 minutes.">
Last 15 minutes
</message>
<message name="IDS_CLEAR_BROWSING_DATA_TAB_PERIOD_HOUR" desc="The option to delete browsing data from the last hour.">
Last hour
</message>
@ -1488,7 +1495,7 @@ Your Google account may have other forms of browsing history like searches and a
Privacy Sandbox trial
</message>
<message name="IDS_PRIVACY_GUIDE_PRIVACY_SANDBOX_DESCRIPTION" desc="Description for the Privacy Sandbox item on the final page of the privacy guide">
See how Thorium plans to safeguard you from cross-site tracking while preserving the open web
Thorium is exploring new features that allow sites to deliver the same browsing experience using less of your data
</message>
<message name="IDS_PRIVACY_GUIDE_WEB_APP_ACTIVITY_HEADING" desc="Title for the Web and App Activity item on the final page of the privacy guide">
Web &amp; App Activity
@ -1726,9 +1733,6 @@ Your Google account may have other forms of browsing history like searches and a
<message name="IDS_ADD_LANGUAGE" desc="Title for the screen that allows users to add languages to their preferred language list. [CHAR_LIMIT=32]">
Add language
</message>
<message name="IDS_CHANGE_CHROME_LANG" desc="Title of page to select a language within Thorium's language settings. [CHAR_LIMIT=32]">
Change language
</message>
<message name="IDS_LANGUAGES_SELECT" desc="Option in overflow menu on Language settings page to change Thoriums user interface language. [CHAR_LIMIT=32]">
Select language
</message>
@ -1959,30 +1963,6 @@ Your Google account may have other forms of browsing history like searches and a
</message>
<!-- Child accounts -->
<message name="IDS_ACCOUNT_MANAGEMENT_PARENTAL_SETTINGS" desc="Title of parental settings section of account page for child account.">
Parental Settings
</message>
<message name="IDS_ACCOUNT_MANAGEMENT_NO_PARENTAL_DATA" desc="String saying that we are waiting for family information.">
Waiting for details of parents.
</message>
<message name="IDS_ACCOUNT_MANAGEMENT_ONE_PARENT_NAME" desc="String for name of single parent for child account.">
This browser is managed by <ph name="PARENT_NAME">%1$s<ex>parent1@gmail.com</ex></ph>.
</message>
<message name="IDS_ACCOUNT_MANAGEMENT_TWO_PARENT_NAMES" desc="String for names of two parents for child account.">
This browser is managed by <ph name="PARENT_NAME_1">%1$s<ex>parent1@gmail.com</ex></ph> and <ph name="PARENT_NAME_2">%2$s<ex>parent2@gmail.com</ex></ph>.
</message>
<message name="IDS_ACCOUNT_MANAGEMENT_CHILD_CONTENT_TITLE" desc="Title of the Content setting, which controls which websites a child is allowed to visit.">
Content
</message>
<message name="IDS_ACCOUNT_MANAGEMENT_CHILD_CONTENT_APPROVED" desc="Setting that permits child accounts to visit only sites approved by their parents.">
Only allow certain sites
</message>
<message name="IDS_ACCOUNT_MANAGEMENT_CHILD_CONTENT_FILTER_MATURE" desc="Setting that permits child accounts to visit any websites that don't have mature contents. As the filter is not perfect, the browser can only attempt to block these sites.">
Try to block mature sites
</message>
<message name="IDS_ACCOUNT_MANAGEMENT_CHILD_CONTENT_ALL" desc="Setting that permits child accounts to visit any websites.">
Allow all sites
</message>
<message name="IDS_ACCOUNT_MANAGEMENT_HEADER_NO_PARENTAL_DATA" desc="String saying that child should go to parent for help for child account.">
If you need help, ask your parent
</message>
@ -2260,9 +2240,6 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_SYNC_NEEDS_VERIFICATION_TITLE" desc="Title of the error message shown when sync needs to verify the user.">
Sync needs to verify it's you
</message>
<message name="IDS_HINT_SYNC_AUTH_ERROR" desc="Hint message to resolve sync auth error.">
Sign in again to start sync
</message>
<message name="IDS_HINT_SYNC_AUTH_ERROR_MODERN" desc="Hint message to resolve sync auth error updated to align with the UPM error message.">
Sign back in to start sync
</message>
@ -2864,6 +2841,12 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_DOWNLOAD_MANAGER_NO_DOWNLOADS" desc="Text appearing on an empty tab that indicates that downloaded files appear on this tab.">
Files that you download appear here
</message>
<message name="IDS_DOWNLOAD_MANAGER_NO_DOWNLOADS_EMPTY_STATE" desc="Text appearing on an empty tab that indicates that downloaded files appear on this tab.">
Youll find your downloads here
</message>
<message name="IDS_DOWNLOAD_MANAGER_NO_DOWNLOADS_VIEW_OFFLINE_OR_SHARE" desc="Text appearing on an empty tab that indicates that users can save downloaded files to view offline or share in other apps.">
You can save images and files to view offline or share in other apps
</message>
<message name="IDS_DOWNLOAD_MANAGER_OPEN_WITH" desc="Menu item to open an item with another app.">
Open with…
</message>
@ -2914,6 +2897,12 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_HISTORY_MANAGER_EMPTY" desc="Indicates that there are no browsing history items.">
Pages that you visit appear here
</message>
<message name="IDS_HISTORY_MANAGER_EMPTY_STATE" desc="Indicates that there are no browsing history items.">
Youll find your history here
</message>
<message name="IDS_HISTORY_MANAGER_EMPTY_STATE_VIEW_OR_CLEAR_PAGE_VISITED" desc="Indicates that users can view or clear page visited here">
You can see the pages youve visited or clear them from your history
</message>
<message name="IDS_HISTORY_MANAGER_NO_RESULTS" desc="Text explaining that no browsing history items match a search query.">
Cant find that page. Check your spelling or try a search on <ph name="SEARCH_ENGINE">%1$s<ex>Google</ex></ph>.
</message>
@ -2976,10 +2965,10 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
Thorium First Run Experience
</message>
<message name="IDS_LIGHTWEIGHT_FRE_ASSOCIATED_APP_TOS" desc="Message explaining that use of Thorium is governed by Thorium's terms of service.">
<ph name="APP_NAME">%1$s<ex>Google Maps</ex></ph> will open in Thorium. By continuing, you agree to the <ph name="BEGIN_LINK1">&lt;LINK1&gt;</ph>Google Terms of Service<ph name="END_LINK1">&lt;/LINK1&gt;</ph>, and the <ph name="BEGIN_LINK2">&lt;LINK2&gt;</ph>Google Thorium and ThoriumOS Additional Terms of Service<ph name="END_LINK2">&lt;/LINK2&gt;</ph>.
<ph name="APP_NAME">%1$s<ex>Google Maps</ex></ph> will open in Thorium. By continuing, you agree to the <ph name="BEGIN_LINK1">&lt;LINK1&gt;</ph>Google Terms of Service<ph name="END_LINK1">&lt;/LINK1&gt;</ph>, and the <ph name="BEGIN_LINK2">&lt;LINK2&gt;</ph>Thorium and ThoriumOS Additional Terms of Service<ph name="END_LINK2">&lt;/LINK2&gt;</ph>.
</message>
<message name="IDS_LIGHTWEIGHT_FRE_ASSOCIATED_APP_TOS_AND_PRIVACY_CHILD_ACCOUNT" desc="Message explaining that use of Thorium is governed by Thorium's terms of service, and the Google Privacy Policy.">
<ph name="APP_NAME">%1$s<ex>Google Maps</ex></ph> will open in Thorium. By continuing, you agree to the <ph name="BEGIN_LINK1">&lt;LINK1&gt;</ph>Google Terms of Service<ph name="END_LINK1">&lt;/LINK1&gt;</ph>, and the <ph name="BEGIN_LINK2">&lt;LINK2&gt;</ph>Google Thorium and ThoriumOS Additional Terms of Service<ph name="END_LINK2">&lt;/LINK2&gt;</ph>. The <ph name="BEGIN_LINK3">&lt;LINK3&gt;</ph>Privacy Policy<ph name="END_LINK3">&lt;/LINK3&gt;</ph> also applies.
<ph name="APP_NAME">%1$s<ex>Google Maps</ex></ph> will open in Thorium. By continuing, you agree to the <ph name="BEGIN_LINK1">&lt;LINK1&gt;</ph>Google Terms of Service<ph name="END_LINK1">&lt;/LINK1&gt;</ph>, and the <ph name="BEGIN_LINK2">&lt;LINK2&gt;</ph>Thorium and ThoriumOS Additional Terms of Service<ph name="END_LINK2">&lt;/LINK2&gt;</ph>. The <ph name="BEGIN_LINK3">&lt;LINK3&gt;</ph>Privacy Policy<ph name="END_LINK3">&lt;/LINK3&gt;</ph> also applies.
</message>
<message name="IDS_FRE_ACCEPT_CONTINUE" desc="Text for first page accept and continue button [CHAR_LIMIT=20]">
Accept &amp; continue
@ -3050,21 +3039,26 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
</message>
<!-- Strings for the Device Lock. -->
<!-- TODO(crbug.com/1431577): Finalize strings and set to translateable -->
<message name="IDS_DEVICE_LOCK_TITLE" translateable="false" desc="">
Keep your data secure with profile lock
<message name="IDS_DEVICE_LOCK_TITLE" desc="Title shown on the profile lock page prompting the user to set a profile lock.">
Create a profile lock for your car
</message>
<message name="IDS_DEVICE_LOCK_DESCRIPTION" translateable="false" desc="">
For your data security in the car, profile lock is required to sync and save your passwords, payments, and more.
<message name="IDS_DEVICE_LOCK_EXISTING_LOCK_TITLE" desc="Title shown on the profile lock page if there is a pre-existing profile lock.">
Your info is secured with a profile lock
</message>
<message name="IDS_DEVICE_LOCK_HIGHLIGHTED_NOTICE" translateable="false" desc="">
Your saved data will be erased if profile lock is removed later
<message name="IDS_DEVICE_LOCK_DESCRIPTION" desc="Text description explaining that a profile lock is required for automotive devices to protect data privacy. 'Sync' is short for synchronization.">
To sync your info and keep your data secure in the car, you must create a profile lock. Youll use a code or password every time you enter the car.
</message>
<message name="IDS_DEVICE_LOCK_CREATE_LOCK_BUTTON" translateable="false" desc="">
Set up a profile lock
<message name="IDS_DEVICE_LOCK_THROUGH_SETTINGS_DESCRIPTION" desc="Text description explaining that a profile lock is required for automotive devices to protect data privacy, and that such a lock can be created in the device's security settings. 'Sync' is short for synchronization.">
To sync your info and keep your data secure in the car, you must create a profile lock in your security settings. Youll use a code or password every time you enter the car.
</message>
<message name="IDS_DEVICE_LOCK_USER_UNDERSTANDS_BUTTON" translateable="false" desc="">
I understand
<message name="IDS_DEVICE_LOCK_EXISTING_LOCK_DESCRIPTION" desc="Text description explaining to users who have already set an existing lock that a profile lock is required for automotive devices to protect data privacy. 'Sync' is short for synchronization.">
Your profile lock keeps your info secure in the car, including synced passwords, payments and more.
</message>
<message name="IDS_DEVICE_LOCK_NOTICE" desc="Notice appearing on the profile lock page informing users that data saved on Thorium will be erased if they remove the profile lock from the device.">
Your saved info will be erased if you remove profile lock later.
</message>
<message name="IDS_DEVICE_LOCK_CREATE_LOCK_BUTTON" desc="Text for the button that navigates the user to create a profile lock on the device.">
Create a profile lock
</message>
<!-- Strings for Streamlined Signin and Unified Consent. -->
@ -3156,6 +3150,14 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
Sign in to manage your preferences
</message>
<!-- Cormorant Signin Strings -->
<message name="IDS_SIGNIN_ACCOUNT_PICKER_BOTTOM_SHEET_TITLE_FOR_CORMORANT_SIGNIN" desc="The title for the bottom sheet that shows the list of accounts on the device and asks the user to select one of these accounts, when signin from Cormorant triggered the UI. [CHAR_LIMIT=27]">
Get better suggestions
</message>
<message name="IDS_SIGNIN_ACCOUNT_PICKER_BOTTOM_SHEET_SUBTITLE_FOR_CORMORANT_SIGNIN" desc="The subtitle for the account picker bottom sheet that tells the user what happens if the Continue button is clicked, when signin from Cormorant triggered the UI.">
Sync to get the most relevant content from Google
</message>
<!-- Personalized Signin Promos Strings -->
<message name="IDS_SYNC_PROMO_CONTINUE_AS" desc="Button to sign into Thorium with the displayed account and without having to reenter a password. John is replaced with the users given name, or the users full name if the given name is not available. Ensure consistency with related OneGoogle sign-in buttons (see e.g. TC ID 5569230012177947065).">
Continue as <ph name="USER_FULL_NAME">%1$s<ex>John</ex></ph>
@ -3371,7 +3373,9 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_NTP_DISCOVER_OFF_BRANDED" desc="Title in the feed header when the feed is turned off and the default search engine is not Google. Please use the branded term for Discover, as listed under Product Names in the Google Glossary Manager (TC ID 1799975766543019278).">
Discover by Google - off
</message>
<message name="IDS_NTP_FOLLOWING" desc="Title in the feed header for user-customized following feed.">Following</message>
<message name="IDS_NTP_FOLLOWING"
meaning="Title for content - e.g. Followed sites"
desc="Title in the feed header for user-customized following feed. This feed is composed of articles and content from sites that the user has followed">Following</message>
<message name="IDS_NTP_FEED_MENU_IPH" desc="In-product help that points at the menu icon for the news feed on Thorium's new tab page. This string instructs the user to open the menu for settings that let them control the content that appears on the feed.">
Control your stories and activity here
</message>
@ -3433,71 +3437,6 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
Explore content to follow
</message>
<!-- Video tutorials -->
<message name="IDS_VIDEO_TUTORIALS_CARD_CHROME_INTRO" desc="Card text prompting user to learn about an introduction to chrome. Tapping on this card will open a video tutorial.">
How to use Thorium
</message>
<message name="IDS_VIDEO_TUTORIALS_CARD_SEARCH" desc="Card text prompting user to learn about how to search using chrome. Tapping on this card will open a video tutorial.">
How to search with Thorium
</message>
<message name="IDS_VIDEO_TUTORIALS_CARD_VOICE_SEARCH" desc="Card text prompting user to learn about how use voice search inside chrome. Tapping on this card will open a video tutorial.">
How to search with your voice
</message>
<message name="IDS_VIDEO_TUTORIALS_CARD_DOWNLOAD" desc="Card text prompting user to learn about how to download content using chrome. Tapping on this card will open a video tutorial.">
How to download content for later
</message>
<message name="IDS_VIDEO_TUTORIALS_CARD_ALL_VIDEOS" desc="Card text prompting user to tap on this card and explore videos on various aspects of chrome. Tapping on this card will open up a page listing all the available video tutorials.">
Videos about how to use Thorium
</message>
<message name="IDS_VIDEO_TUTORIALS_LEARN_CHROME" desc="Header text for the video tutorials home page that lists all the video tutorials.">
Learn Thorium
</message>
<message name="IDS_VIDEO_TUTORIALS_POPULAR_VIDEOS" desc="Header text for the video tutorials carousel on the help and feedback page.">
Popular videos
</message>
<message name="IDS_VIDEO_TUTORIALS_TILE_CHROME_INTRO" desc="Text under image tile prompting user to learn about an introduction to chrome. Tapping on this image will open a video tutorial.">
Navigate Thorium
</message>
<message name="IDS_VIDEO_TUTORIALS_TILE_SEARCH" desc="Text under image tile prompting user to learn about how to search using chrome. Tapping on this image will open a video tutorial.">
Search the internet
</message>
<message name="IDS_VIDEO_TUTORIALS_TILE_VOICE_SEARCH" desc="Text under image tile prompting user to learn about how use voice search inside chrome. Tapping on this image will open a video tutorial.">
Use voice search
</message>
<message name="IDS_VIDEO_TUTORIALS_TILE_DOWNLOAD" desc="Text under image tile prompting user to learn about how to download content using chrome. Tapping on this image will open a video tutorial.">
Download content
</message>
<message name="IDS_VIDEO_TUTORIALS_LANGUAGE_PICKER_TITLE" desc="Label text in the video player prompting user to pick a language.">
Pick your language
</message>
<message name="IDS_VIDEO_TUTORIALS_WATCH" desc="Button text in the video player prompting user to watch the video.">
Watch
</message>
<message name="IDS_VIDEO_TUTORIALS_TRY_NOW" desc="Button text in the video player prompting user to try out the steps mentioned in the tutorial.">
Try now
</message>
<message name="IDS_VIDEO_TUTORIALS_WATCH_NEXT_VIDEO" desc="Button text in the video player prompting user to watch the next video.">
Watch next video
</message>
<message name="IDS_VIDEO_TUTORIALS_CHANGE_LANGUAGE" desc="Button text in the video player prompting user to change the language.">
Change <ph name="LANGUAGE">%1$s<ex>Hindi</ex></ph>?
</message>
<message name="IDS_VIDEO_TUTORIALS_ACCESSIBILITY_SHARE" desc="Accessibility text in the video player describing that users can tap on this icon to share the video.">
Share
</message>
<message name="IDS_VIDEO_TUTORIALS_ACCESSIBILITY_CLOSE" desc="Accessibility text in the video player describing that users can tap on this icon to close the video.">
Close
</message>
<message name="IDS_VIDEO_TUTORIALS_IPH_TAP_HERE_TO_START" desc="In-product help bubble text prompting user to click on the search box to start.">
Tap here to start
</message>
<message name="IDS_VIDEO_TUTORIALS_IPH_TAP_VOICE_ICON_TO_START" desc="In-product help bubble text prompting user to start typing on the search box or tap on the microphone icon to start a voice search.">
Type here or tap the voice icon to start
</message>
<message name="IDS_VIDEO_TUTORIALS_LOADING" desc="Text on the loading animation screen indicating that the video loading is currently in progress.">
Loading…
</message>
<!-- Feature notification guide -->
<message name="IDS_FEATURE_NOTIFICATION_GUIDE_NOTIFICATION_TITLE" desc="Notification title text educating user about tips and tricks in chrome.">
Thorium tips
@ -3680,10 +3619,15 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_MENU_FIND_IN_PAGE" desc="Menu item allowing users to find text within the current page. [CHAR_LIMIT=27]">
Find in page
</message>
<message name="IDS_MENU_PAGE_INSIGHTS" desc="Menu item showing Page Insights hub. [CHAR_LIMIT=27]">
View page insights
</message>
<message name="IDS_MENU_FOLLOW" desc="Menu item allowing users to follow the current website. [CHAR_LIMIT=27]">
Follow
</message>
<message name="IDS_MENU_FOLLOWING" desc="Menu item indicating the current website is followed, allowing users to unfollow the current website. [CHAR_LIMIT=27]">
<message name="IDS_MENU_FOLLOWING"
meaning="Toggle button text for something that is being followed."
desc="Menu item indicating the current website is followed, allowing users to unfollow the current website. [CHAR_LIMIT=27]">
Following
</message>
<message name="IDS_FOLLOW_ACCELERATOR" desc="IPH text for letting a user know that a website can be followed with minimal context. [CHAR_LIMIT=50]">
@ -3745,6 +3689,18 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_NO_BOOKMARKS" desc="Text describing that there is no bookmarks in a bookmark folder.">
No bookmarks
</message>
<message name="IDS_BOOKMARK_MANAGER_EMPTY_STATE" desc="Text appearing on an empty tab that indicates that bookmarked page appear on this tab.">
Youll find your bookmarks here
</message>
<message name="IDS_BOOKMARK_MANAGER_BACK_TO_PAGE_BY_ADDING_BOOKMARK" desc="Text appearing on an empty tab that indicates that users can get back to pages in this tab by adding bookmark.">
You can get back to a page thats important to you by adding a bookmark
</message>
<message name="IDS_READING_LIST_MANAGER_EMPTY_STATE" desc="Text appearing on an empty tab that indicates that reading list page appear on this tab.">
Youll find your reading list here
</message>
<message name="IDS_READING_LIST_MANAGER_SAVE_PAGE_TO_READ_LATER" desc="Text appearing on an empty tab that indicates that users can save pages read later in this tab.">
You can save pages to read later or offline
</message>
<message name="IDS_BOOKMARKS_COUNT" desc="Text describing the number of bookmarks in a bookmark folder [ICU Syntax]">
{BOOKMARKS_COUNT, plural,
=1 {<ph name="BOOKMARKS_COUNT_ONE">%1$d<ex>1</ex></ph> bookmark}
@ -3893,9 +3849,6 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_IPH_SHOPPING_LIST_SAVE_FLOW" desc="In-product help text that notifies a user that they can organize their saved products from a folder in bookmarks.">
Organize your tracked products in Bookmarks
</message>
<message name="IDS_IPH_SHOPPING_LIST_SAVE_FLOW_ACCESSIBILITY" is_accessibility_with_no_ui="true" desc="In-product help accessibility text that notifies a user that they can organize their saved products from a folder in bookmarks.">
Organize your tracked products in Bookmarks from the folder icon
</message>
<message name="IDS_SORT_SUBMENU" desc="Sub-menu in the bookmarks manager for sort/view options. [CHAR_LIMIT=24]">
Sort and view options
</message>
@ -3937,14 +3890,6 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_READING_LIST_MARK_AS_UNREAD" desc="The text for the action to mark the reading list as unread.">
Mark as unread
</message>
<message name="IDS_READING_LIST_REMINDER_NOTIFICATION_TITLE" desc="The title of the reminder notification for reading list.">
Catch up on your reading list
</message>
<message name="IDS_READING_LIST_REMINDER_NOTIFICATION_SUBTITLE" desc="The subtitle of the reminder notification for reading list.">
{READING_LIST_REMINDER_NOTIFICATION_SUBTITLE, plural,
=1 {You have <ph name="READING_LIST_REMINDER_NOTIFICATION_SUBTITLE_ONE">%1$d<ex>1</ex></ph> unread page}
other {You have <ph name="READING_LIST_REMINDER_NOTIFICATION_SUBTITLE_MANY">%1$d<ex>8</ex></ph> unread pages}}
</message>
<message name="IDS_READING_LIST_UNREAD_PAGE_COUNT" desc="Inform the user about the number of unread reading list items.">
{READING_LIST_UNREAD_PAGE_COUNT, plural,
=1 {<ph name="READING_LIST_UNREAD_PAGE_COUNT_ONE">%1$d<ex>1</ex></ph> unread page}
@ -4517,15 +4462,6 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_TWA_CLEAR_DATA_SITE_SELECTION_TITLE" desc="Title of screen showing the sites linked to TWA, allowing the user to clean data in any of them.">
Linked sites
</message>
<message name="IDS_TWA_QUALITY_ENFORCEMENT_VIOLATION_ERROR" desc="Text shown on a toast when TWA violation 404.">
<ph name="ERROR_CODE">%1$s<ex>404</ex></ph> on <ph name="VIOLATED_URL">%2$s<ex>https://example.com/</ex></ph>
</message>
<message name="IDS_TWA_QUALITY_ENFORCEMENT_VIOLATION_ASSET_LINK" desc="Text shown on a toast when TWA violate the quality enforcement criteria: digital asset link verification failed.">
Digital asset links verification failed on <ph name="VIOLATED_URL">%1$s<ex>https://example.com/</ex></ph>
</message>
<message name="IDS_TWA_QUALITY_ENFORCEMENT_VIOLATION_OFFLINE" desc="Text shown on a toast when TWA violate the quality enforcement criteria: page unavailable offline.">
Page unavailable offline: <ph name="VIOLATED_URL">%1$s<ex>https://example.com/</ex></ph>
</message>
<message name="IDS_WEBAPP_TAP_TO_COPY_URL" desc="Message on the notification that indicates that taping it will copy a Web App's URL into the clipboard.">
Tap to copy the URL for this app
@ -4598,14 +4534,14 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_KEYBOARD_SHORTCUT_RELOAD_NO_CACHE" desc="A text label that appears next to the keyboard shortcut that will reload the current page without a cache. The shortcut description is shown in a system dialog along with all other supported shortcuts. [CHAR_LIMIT=55]">
Reload the current page, ignoring cached content
</message>
<message name="IDS_KEYBOARD_SHORTCUT_HELP_CENTER" desc="A text label that appears next to the keyboard shortcut that will open the Google Thorium Help Center in a new tab. The shortcut description is shown in a system dialog along with all other supported shortcuts. [CHAR_LIMIT=55]">
<message name="IDS_KEYBOARD_SHORTCUT_HELP_CENTER" desc="A text label that appears next to the keyboard shortcut that will open the Thorium Help Center in a new tab. The shortcut description is shown in a system dialog along with all other supported shortcuts. [CHAR_LIMIT=55]">
Open the Thorium Help Center in a new tab
</message>
<message name="IDS_KEYBOARD_SHORTCUT_TAB_GROUP_HEADER" desc="A text label that appears above a list of shortcuts that are related to the tab window. This group is part of several groups of keyboard shortcuts all shown in a dialog.">
Tab and window shortcuts
</message>
<message name="IDS_KEYBOARD_SHORTCUT_CHROME_FEATURE_GROUP_HEADER" desc="A text label that appears above a list of shortcuts that are related to the Thorium app features. This group is part of several groups of keyboard shortcuts all shown in a dialog.">
Google Thorium feature shortcuts
Thorium feature shortcuts
</message>
<message name="IDS_KEYBOARD_SHORTCUT_WEBPAGE_GROUP_HEADER" desc="A text label that appears above a list of shortcuts that are related to manipulation of the current tab window. This group is part of several groups of keyboard shortcuts all shown in a dialog.">
Webpage shortcuts
@ -5059,7 +4995,7 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_CABLEV2_ACTIVITY_TITLE"
desc="The label of the Activity for using your phone as a security key. A 'security key' in this context is generally a small USB device that is used for logging into websites. This feature allows Thorium on an Android phone to act as a security key. A user may see it in Android permissions prompts (see screenshot).">
Google Thorium as a Security Key
Thorium as a Security Key
</message>
<message name="IDS_CABLEV2_REGISTRATION_SUCCEEDED"
@ -5315,6 +5251,10 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
Save to device
</message>
<message name="IDS_SHARING_SEND_TAB_TO_SELF" desc="Label for the button in sharing hub for sending the current tab to other devices if user signed in (Send Tab to Self feature).">
Send to devices
</message>
<message name="IDS_SHARING_INCLUDE_LINK" desc="Label for the button in android share sheet to include a link to share along with highlighted text.">
Include link
</message>
@ -5511,7 +5451,7 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
Save up to 60% data
</message>
<message name="IDS_CHROME_REENGAGEMENT_NOTIFICATION_2_DESCRIPTION" desc="The body text of a notification shown to suggest that users use Thorium. Users probably have not opened Thorium in a while. Promotes data savings.">
Use Lite mode on Google Thorium
Use Lite mode on Thorium
</message>
<message name="IDS_CHROME_REENGAGEMENT_NOTIFICATION_3_TITLE" desc="The title of a notification shown to suggest that users use Thorium. Users probably have not opened Thorium in a while.">
Google recommends Thorium
@ -5763,12 +5703,29 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
Undo
</message>
<!-- Partial Custom Tab accessibility -->
<message name="IDS_ACCESSIBILITY_PARTIAL_CUSTOM_TAB_BOTTOM_SHEET" desc="Content description for partial custom tab of bottom sheet type">
Bottom sheet
</message>
<message name="IDS_ACCESSIBILITY_PARTIAL_CUSTOM_TAB_SIDE_SHEET" desc="Content description for partial custom tab of side sheet type">
Side sheet
</message>
<message name="IDS_ACCESSIBILITY_PARTIAL_CUSTOM_TAB_FULL_SHEET" desc="Content description for partial custom tab of full size type">
Full-size sheet
</message>
<!-- Quick Delete strings -->
<message name="IDS_QUICK_DELETE_DIALOG_TITLE" desc="Title of the dialog when asking users to confirm deleting the last 15 minutes of browsing data.">
Delete last 15 minutes?
</message>
<message name="IDS_QUICK_DELETE_DIALOG_DESCRIPTION" desc="Description of the dialog when asking users to confirm deleting the last 15 minutes of browsing data.">
Following data from the last 15 minutes will be deleted:
History from the last 15 minutes will be deleted:
</message>
<message name="IDS_QUICK_DELETE_DIALOG_TABS_CLOSED_TEXT" desc="Text indicating that the tabs which a user recently used to visit a website within 15 minutes would be closed.">
{NUM_TABS, plural, =1 {1 tab on this device} other {# tabs on this device}}
</message>
<message name="IDS_QUICK_DELETE_DIALOG_COOKIES_CACHE_AND_OTHER_SITE_DATA_TEXT" desc="Text indicating that browsing data like cookies, cache, and other site data would be deleted.">
Cookies, cache, and other site data
</message>
<message name="IDS_QUICK_DELETE_DIALOG_SEARCH_HISTORY_DISAMBIGUATION_TEXT" desc="Text for signed in users only in the Quick Delete dialog, that is shown when the user clicks on 'Delete last 15 minutes' option in the three dots menu, informing signed in users that search history and other forms of Activity saved in their Google account will not be deleted.">
<ph name="BEGIN_LINK1">&lt;link1&gt;</ph>Search history<ph name="END_LINK1">&lt;/link1&gt;</ph> and <ph name="BEGIN_LINK2">&lt;link2&gt;</ph>other forms of activity<ph name="END_LINK2">&lt;/link2&gt;</ph> may be saved in your Google Account

View file

@ -990,7 +990,7 @@ Browser::DownloadCloseType Browser::OkToCloseWithInProgressDownloads(
return DownloadCloseType::kOk;
int total_download_count =
DownloadCoreService::NonMaliciousDownloadCountAllProfiles();
DownloadCoreService::BlockingShutdownCountAllProfiles();
if (total_download_count == 0)
return DownloadCloseType::kOk; // No downloads; can definitely close.
@ -1023,10 +1023,9 @@ Browser::DownloadCloseType Browser::OkToCloseWithInProgressDownloads(
DownloadCoreService* download_core_service =
DownloadCoreServiceFactory::GetForBrowserContext(profile());
if ((profile_window_count == 0) &&
(download_core_service->NonMaliciousDownloadCount() > 0) &&
(download_core_service->BlockingShutdownCount() > 0) &&
(profile()->IsIncognitoProfile() || profile()->IsGuestSession())) {
*num_downloads_blocking =
download_core_service->NonMaliciousDownloadCount();
*num_downloads_blocking = download_core_service->BlockingShutdownCount();
return profile()->IsGuestSession()
? DownloadCloseType::kLastWindowInGuestSession
: DownloadCloseType::kLastWindowInIncognitoProfile;
@ -3296,7 +3295,7 @@ BackgroundContents* Browser::CreateBackgroundContents(
}
#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
// TODO(https://1278249): Update function name (and trigger chain) when usage
// TODO(crbug.com/1443349): Update function name (and trigger chain) when usage
// is finalized.
void Browser::RunScreenAIAnnotator() {
screen_ai::AXScreenAIAnnotatorFactory::GetForBrowserContext(profile())

View file

@ -26,6 +26,10 @@
namespace {
// For ChromeOS only: If you plan on adding a new accelerator and want it
// displayed in the Shortcuts app, please follow the instructions at:
// `ash/webui/shortcut_customization_ui/backend/accelerator_layout_table.h`.
// NOTE: Between each ifdef block, keep the list in the same
// (mostly-alphabetical) order as the Windows accelerators in
// ../../app/chrome_dll.rc.

View file

@ -213,6 +213,7 @@ Tab::Tab(TabSlotController* controller)
title_->SetAutoColorReadabilityEnabled(false);
title_->SetText(CoreTabHelper::GetDefaultTitle());
title_->SetFontList(tab_style_views_->GetFontList());
title_->SetBackgroundColor(SK_ColorTRANSPARENT);
// |title_| paints on top of an opaque region (the tab background) of a
// non-opaque layer (the tabstrip's layer), which cannot currently be detected
// by the subpixel-rendering opacity check.
@ -820,6 +821,7 @@ bool Tab::IsActive() const {
void Tab::ActiveStateChanged() {
UpdateTabIconNeedsAttentionBlocked();
UpdateForegroundColors();
icon_->SetActiveState(IsActive());
alert_indicator_button_->OnParentTabButtonColorChanged();
title_->SetFontList(tab_style_views_->GetFontList());
Layout();

View file

@ -72,6 +72,7 @@
#include "chrome/browser/ui/web_applications/app_browser_controller.h"
#include "chrome/grit/generated_resources.h"
#include "chrome/grit/theme_resources.h"
#include "chromeos/constants/chromeos_features.h"
#include "components/crash/core/common/crash_key.h"
#include "components/tab_groups/tab_group_color.h"
#include "components/tab_groups/tab_group_id.h"
@ -178,7 +179,7 @@ class TabStrip::TabDragContextImpl : public TabDragContext,
}
bool OnMouseDragged(const ui::MouseEvent& event) override {
ContinueDrag(this, event);
(void)ContinueDrag(this, event);
return true;
}
@ -189,6 +190,7 @@ class TabStrip::TabDragContextImpl : public TabDragContext,
void OnMouseCaptureLost() override { EndDrag(END_DRAG_CAPTURE_LOST); }
void OnGestureEvent(ui::GestureEvent* event) override {
Liveness tabstrip_alive = Liveness::kAlive;
switch (event->type()) {
case ui::ET_GESTURE_SCROLL_END:
case ui::ET_SCROLL_FLING_START:
@ -202,7 +204,8 @@ class TabStrip::TabDragContextImpl : public TabDragContext,
}
case ui::ET_GESTURE_SCROLL_UPDATE:
ContinueDrag(this, *event);
// N.B. !! ContinueDrag may enter a nested run loop !!
tabstrip_alive = ContinueDrag(this, *event);
break;
case ui::ET_GESTURE_TAP_DOWN:
@ -214,6 +217,12 @@ class TabStrip::TabDragContextImpl : public TabDragContext,
}
event->SetHandled();
// If tabstrip was destroyed (during ContinueDrag above), return early to
// avoid UAF below.
if (tabstrip_alive == Liveness::kDeleted) {
return;
}
// TabDragContext gets event capture as soon as a drag session begins, which
// precludes TabStrip from ever getting events like tap or long tap. Forward
// this on to TabStrip so it can respond to those events.
@ -302,20 +311,20 @@ class TabStrip::TabDragContextImpl : public TabDragContext,
std::move(drag_controller_set_callback_).Run(drag_controller_.get());
}
void ContinueDrag(views::View* view, const ui::LocatedEvent& event) {
if (drag_controller_.get() &&
drag_controller_->event_source() == EventSourceFromEvent(event)) {
gfx::Point screen_location(event.location());
views::View::ConvertPointToScreen(view, &screen_location);
// Note: |tab_strip_| can be destroyed during drag, also destroying
// |this|.
base::WeakPtr<TabDragContext> weak_ptr(weak_factory_.GetWeakPtr());
drag_controller_->Drag(screen_location);
if (!weak_ptr)
return;
Liveness ContinueDrag(views::View* view, const ui::LocatedEvent& event) {
if (!drag_controller_.get() ||
drag_controller_->event_source() != EventSourceFromEvent(event)) {
return Liveness::kAlive;
}
gfx::Point screen_location(event.location());
views::View::ConvertPointToScreen(view, &screen_location);
// Note: `tab_strip_` can be destroyed during drag, also destroying `this`.
base::WeakPtr<TabDragContext> weak_ptr(weak_factory_.GetWeakPtr());
drag_controller_->Drag(screen_location);
return weak_ptr ? Liveness::kAlive : Liveness::kDeleted;
}
bool EndDrag(EndDragReason reason) {
@ -604,7 +613,7 @@ class TabStrip::TabDragContextImpl : public TabDragContext,
int source_view_index = static_cast<int>(
base::ranges::find(views, source_view) - views.begin());
const auto should_animate_tab = [=, &views, this](int index_in_views) {
const auto should_animate_tab = [&](size_t index_in_views) {
// If the tab at `index_in_views` is already animating, don't interrupt
// it.
if (bounds_animator_.IsAnimating(views[index_in_views]))
@ -1163,6 +1172,12 @@ bool TabStrip::ShouldDrawStrokes() const {
return false;
}
#if BUILDFLAG(IS_CHROMEOS_ASH)
if (chromeos::features::IsJellyrollEnabled()) {
return false;
}
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
// The tabstrip normally avoids strokes and relies on the active tab
// contrasting sufficiently with the frame background. When there isn't
// enough contrast, fall back to a stroke. Always compute the contrast ratio
@ -1606,8 +1621,10 @@ void TabStrip::MaybeStartDrag(
drag_context_->MaybeStartDrag(source, event, original_selection);
}
void TabStrip::ContinueDrag(views::View* view, const ui::LocatedEvent& event) {
drag_context_->ContinueDrag(view, event);
TabSlotController::Liveness TabStrip::ContinueDrag(
views::View* view,
const ui::LocatedEvent& event) {
return drag_context_->ContinueDrag(view, event);
}
bool TabStrip::EndDrag(EndDragReason reason) {

View file

@ -39,9 +39,12 @@
#include "chrome/browser/ui/global_error/global_error_service_factory.h"
#include "chrome/browser/ui/intent_picker_tab_helper.h"
#include "chrome/browser/ui/layout_constants.h"
#include "chrome/browser/ui/side_panel/companion/companion_utils.h"
#include "chrome/browser/ui/side_search/side_search_utils.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/browser/ui/toolbar/chrome_labs_model.h"
#include "chrome/browser/ui/toolbar/chrome_labs_prefs.h"
#include "chrome/browser/ui/toolbar/chrome_labs_utils.h"
#include "chrome/browser/ui/ui_features.h"
#include "chrome/browser/ui/view_ids.h"
#include "chrome/browser/ui/views/bookmarks/bookmark_bubble_view.h"
@ -66,9 +69,7 @@
#include "chrome/browser/ui/views/toolbar/app_menu.h"
#include "chrome/browser/ui/views/toolbar/back_forward_button.h"
#include "chrome/browser/ui/views/toolbar/browser_app_menu_button.h"
#include "chrome/browser/ui/views/toolbar/chrome_labs_bubble_view_model.h"
#include "chrome/browser/ui/views/toolbar/chrome_labs_button.h"
#include "chrome/browser/ui/views/toolbar/chrome_labs_utils.h"
#include "chrome/browser/ui/views/toolbar/home_button.h"
#include "chrome/browser/ui/views/toolbar/reload_button.h"
#include "chrome/browser/ui/views/toolbar/side_panel_toolbar_button.h"
@ -167,6 +168,8 @@ constexpr int kToolbarDividerWidth = 2;
constexpr int kToolbarDividerHeight = 16;
constexpr int kToolbarDividerCornerRadius = 1;
constexpr int kToolbarDividerSpacing = 9;
constexpr int kBrowserAppMenuRefreshExpandedMargin = 5;
constexpr int kBrowserAppMenuRefreshCollapsedMargin = 2;
} // namespace
@ -316,8 +319,7 @@ void ToolbarView::Init() {
std::unique_ptr<SidePanelToolbarContainer> side_panel_toolbar_container;
if (browser_view_->unified_side_panel() &&
!base::CommandLine::ForCurrentProcess()->HasSwitch("hide-sidepanel-button")) {
if (base::FeatureList::IsEnabled(
companion::features::kSidePanelCompanion)) {
if (companion::IsCompanionFeatureEnabled()) {
side_panel_toolbar_container =
std::make_unique<SidePanelToolbarContainer>(browser_view_);
} else {
@ -343,11 +345,10 @@ void ToolbarView::Init() {
}
if (base::FeatureList::IsEnabled(features::kChromeLabs)) {
chrome_labs_model_ = std::make_unique<ChromeLabsBubbleViewModel>();
chrome_labs_model_ = std::make_unique<ChromeLabsModel>();
UpdateChromeLabsNewBadgePrefs(browser_->profile(),
chrome_labs_model_.get());
if (ChromeLabsButton::ShouldShowButton(chrome_labs_model_.get(),
browser_->profile())) {
if (ShouldShowChromeLabsUI(chrome_labs_model_.get(), browser_->profile())) {
chrome_labs_button_ = AddChildView(std::make_unique<ChromeLabsButton>(
browser_view_, chrome_labs_model_.get()));
@ -827,10 +828,26 @@ void ToolbarView::InitLayout() {
void ToolbarView::LayoutCommon() {
DCHECK(display_mode_ == DisplayMode::NORMAL);
const gfx::Insets interior_margin =
gfx::Insets interior_margin =
GetLayoutInsets(browser_view_->webui_tab_strip()
? LayoutInset::WEBUI_TAB_STRIP_TOOLBAR_INTERIOR_MARGIN
: LayoutInset::TOOLBAR_INTERIOR_MARGIN);
if (features::IsChromeRefresh2023() && !browser_view_->webui_tab_strip()) {
if (app_menu_button_->IsLabelPresentAndVisible()) {
// The interior margin in an expanded state should be more than in a
// collapsed state.
interior_margin.set_right(interior_margin.right() + 1);
app_menu_button_->SetProperty(
views::kMarginsKey,
gfx::Insets::VH(0, kBrowserAppMenuRefreshExpandedMargin));
} else {
app_menu_button_->SetProperty(
views::kMarginsKey,
gfx::Insets::VH(0, kBrowserAppMenuRefreshCollapsedMargin));
}
}
layout_manager_->SetInteriorMargin(interior_margin);
// Extend buttons to the window edge if we're either in a maximized or

View file

@ -294,6 +294,9 @@
<message name="IDS_QUICK_ANSWERS_VIEW_A11Y_RETRY_LABEL_NAME_TEMPLATE" desc="A11y retry label name template for the Quick Answers view.">
<ph name="DESC_TEXT">$1<ex>Cannot connect to the internet. Click to try again.</ex></ph>: Retry
</message>
<message name="IDS_QUICK_ANSWERS_VIEW_EXPANSION_INDICATOR_LABEL" desc="Description text of the expansion affordance indicator for the Quick Answers view.">
more
</message>
<message name="IDS_QUICK_ANSWERS_VIEW_REPORT_QUERY_INTERNAL_LABEL" desc="Description text of the report query button for the Quick Answers view.">
Internal only
</message>
@ -308,7 +311,7 @@
<!-- Multitask Menu -->
<message name="IDS_MULTITASK_MENU_HALF_BUTTON_NAME" desc="Title of the half button on the multitask menu.">
Half
Split
</message>
<message name="IDS_MULTITASK_MENU_PARTIAL_BUTTON_NAME" desc="Title and and accessible name of the partial button on the multitask menu.">
Partial
@ -441,7 +444,7 @@
Use as a personal device
</message>
<message name="IDS_ASH_SHELF_OS_INSTALL_BUTTON" desc="Text shown on install ThoriumOS Flex button on login screen.">
Install ThoriumOS
Install ThoriumOS Flex
</message>
<message name="IDS_ASH_SHELF_APP_LIST_LAUNCHER_TITLE" desc="The title used for the Ash Launcher in the Shelf (not mentioning 'Apps' since this is a general launcher).">
Launcher
@ -648,6 +651,9 @@
<message name="IDS_PRINT_MANAGEMENT_CLIENT_UNAUTHORIZED_ERROR_STATUS" desc="The error status displayed next to a print job to indicate to users that their print job failed because their authorization with printer has failed.">
Failed - Authorization Failed
</message>
<message name="IDS_PRINT_MANAGEMENT_EXPIRED_CERTIFICATE_ERROR_STATUS" desc="The error status displayed next to a print job to indicate to users that their print job failed because their printer has an expired SSL certificate.">
Failed - Certificate Expired
</message>
<message name="IDS_PRINT_MANAGEMENT_UNKNOWN_ERROR_STATUS" desc="The error status displayed next to a print job to indicate to users that their print job failed due to an unknown error.">
Failed - Unknown error
</message>
@ -690,6 +696,15 @@
<message name="IDS_PRINT_MANAGEMENT_COLLAPSE_PRINTING_STATUS" desc="A text that indicates to the user that the print job is currently printing. This text only appears if the width of the app's window is small and cannot display the entire ongoing printing status.">
Printing
</message>
<message translateable="false" name="IDS_PRINT_MANAGEMENT_EMPTY_STATE_NO_JOBS_MESSAGE" desc="The message shown to users if they do not have any print jobs in progress i.e. being printed.">
No printer jobs
</message>
<message translateable="false" name="IDS_PRINT_MANAGEMENT_EMPTY_STATE_PRINTER_SETTINGS_MESSAGE" desc="The message shown to users to suggest navigating to Printer settings when they do not have any print jobs.">
Go to Printer settings to manage your printers
</message>
<message translateable="false" name="IDS_PRINT_MANAGEMENT_EMPTY_STATE_MANAGE_PRINTERS_LABEL" desc="The label for the button that opens Printer settings when they do not have any print jobs.">
Manage printers
</message>
<!-- Scanning App -->
<message name="IDS_SCANNING_APP_TITLE" desc="The title of the scanning app.">
@ -2479,7 +2494,7 @@
Dawn to dark
</message>
<message name="IDS_PERSONALIZATION_APP_AMBIENT_MODE_TOPIC_SOURCE_VIDEO_DESCRIPTION" desc="Description for the radio button to choose the topic source from video animation. The radio button allows the user to set which video to play for ambient mode.">
Select Thoriumbook exclusive artwork
Select <ph name="PRODUCT_NAME">$1<ex>Thoriumbook</ex></ph> exclusive artwork
</message>
<message name="IDS_PERSONALIZATION_APP_AMBIENT_MODE_TOPIC_SOURCE_SELECTED_ROW" desc="A11y label for the selected topic source row in ambient mode.">
<ph name="TOPIC_SOURCE">$1<ex>Google Photos</ex></ph> <ph name="TOPIC_SOURCE_DESC">$2<ex>Select your memories</ex></ph> selected, press Enter to select <ph name="TOPIC_SOURCE">$1<ex>Google Photos</ex></ph> albums
@ -2679,13 +2694,16 @@
Earth Flow
</message>
<message name="IDS_PERSONALIZATION_APP_TIME_OF_DAY_VIDEO_ALBUM_DESCRIPTION" desc="Common description all videos in the ambient section of the hub.">
Thoriumbook exclusive
<ph name="PRODUCT_NAME">$1<ex>Thoriumbook</ex></ph> exclusive
</message>
<message name="IDS_PERSONALIZATION_APP_TIME_OF_DAY_BANNER_TITLE" desc="Title for the Time of Day promo banner.">
Exclusive Thoriumbook assets now available
Exclusive <ph name="PRODUCT_NAME">$1<ex>Thoriumbook</ex></ph> assets now available
</message>
<message name="IDS_PERSONALIZATION_APP_TIME_OF_DAY_BANNER_DESCRIPTION" desc="Description shown in the Time of Day promo banner.">
You now have access to new <ph name="BEGIN_LINK_WALLPAPER_SUBPAGE">&lt;a href="chrome://personalization/wallpaper"&gt;</ph>wallpapers<ph name="END_LINK_WALLPAPER_SUBPAGE">&lt;/a&gt;</ph> and <ph name="BEGIN_LINK_SCREENSAVER_SUBPAGE">&lt;a href="chrome://personalization/ambient"&gt;</ph>screen saver<ph name="END_LINK_SCREENSAVER_SUBPAGE">&lt;/a&gt;</ph>
You now have access to new <ph name="BEGIN_LINK_WALLPAPER_SUBPAGE">&lt;a href="chrome://personalization/wallpaper/collection?id=_time_of_day_chromebook_collection"&gt;</ph>wallpapers<ph name="END_LINK_WALLPAPER_SUBPAGE">&lt;/a&gt;</ph> and <ph name="BEGIN_LINK_SCREENSAVER_SUBPAGE">&lt;a href="chrome://personalization/ambient"&gt;</ph>screen saver<ph name="END_LINK_SCREENSAVER_SUBPAGE">&lt;/a&gt;</ph>
</message>
<message name="IDS_PERSONALIZATION_APP_TIME_OF_DAY_BANNER_DESCRIPTION_NO_SCREENSAVER" desc="Description shown in the Time of Day promo banner without screen saver link.">
You now have access to new <ph name="BEGIN_LINK_WALLPAPER_SUBPAGE">&lt;a href="chrome://personalization/wallpaper/collection?id=_time_of_day_chromebook_collection"&gt;</ph>wallpapers<ph name="END_LINK_WALLPAPER_SUBPAGE">&lt;/a&gt;</ph>
</message>
<!-- Personalization App Search Results -->
@ -2812,6 +2830,36 @@
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_DARK_MODE_SCHEDULE_ALT4" desc="Text for search result item which, when clicked, navigates the user to personalization app dark mode settings, with a dropdown to select scheduling mode. Alternate phrase for: 'Dark theme schedule', 'Dark mode schedule', 'Automatic dark mode', 'Automatic light mode'">
Automatic dark theme
</message>
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_DYNAMIC_COLOR" desc="Text for search result item, which, when clicked, navigates the user to personalization app theme setting.">
Theme
</message>
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_DYNAMIC_COLOR_ALT1" desc="Text for search result item, which, when clicked, navigates the user to personalization app theme setting. Alternate phrase 1">
Theme color
</message>
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_DYNAMIC_COLOR_ALT2" desc="Text for search result item, which, when clicked, navigates the user to personalization app theme setting. Alternate phrase 2">
Accent color
</message>
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_DYNAMIC_COLOR_ALT3" desc="Text for search result item, which, when clicked, navigates the user to personalization app theme setting. Alternate phrase 3">
System color
</message>
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_DYNAMIC_COLOR_ALT4" desc="Text for search result item, which, when clicked, navigates the user to personalization app theme setting. Alternate phrase 4">
Launcher color
</message>
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_DYNAMIC_COLOR_ALT5" desc="Text for search result item, which, when clicked, navigates the user to personalization app theme setting. Alternate phrase 5">
Wallpaper color
</message>
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_DYNAMIC_COLOR_ALT6" desc="Text for search result item, which, when clicked, navigates the user to personalization app theme setting. Alternate phrase 6">
Desktop color
</message>
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_DYNAMIC_COLOR_ALT7" desc="Text for search result item, which, when clicked, navigates the user to personalization app theme setting. Alternate phrase 7">
Background image
</message>
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_DYNAMIC_COLOR_ALT8" desc="Text for search result item, which, when clicked, navigates the user to personalization app theme setting. Alternate phrase 8">
UI color
</message>
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_DYNAMIC_COLOR_ALT9" desc="Text for search result item, which, when clicked, navigates the user to personalization app theme setting. Alternate phrase 9">
Interface color
</message>
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_KEYBOARD_BACKLIGHT" desc="Text for search result item which, when clicked, navigates the user to personalization app keyboard backlight setting.">
Keyboard backlight
</message>
@ -2830,6 +2878,51 @@
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_KEYBOARD_BACKLIGHT_ALT5" desc="Text for search result item which, when clicked, navigates the user to personalization app keyboard backlight setting. Alternate phrase 5">
backlit color
</message>
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_KEYBOARD_BACKLIGHT_ALT6" desc="Text for search result item which, when clicked, navigates the user to personalization app keyboard backlight setting. Alternate phrase 6">
keyboard underglow
</message>
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_KEYBOARD_BACKLIGHT_ALT7" desc="Text for search result item which, when clicked, navigates the user to personalization app keyboard backlight setting. Alternate phrase 7">
keyboard light
</message>
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_KEYBOARD_BACKLIGHT_ALT8" desc="Text for search result item which, when clicked, navigates the user to personalization app keyboard backlight setting. Alternate phrase 8">
keyboard multicolor
</message>
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_KEYBOARD_BACKLIGHT_ALT9" desc="Text for search result item which, when clicked, navigates the user to personalization app keyboard backlight setting. Alternate phrase 9">
keyboard hue
</message>
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_KEYBOARD_BACKLIGHT_ALT10" desc="Text for search result item which, when clicked, navigates the user to personalization app keyboard backlight setting. Alternate phrase 10">
keyboard customize
</message>
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_KEYBOARD_BACKLIGHT_ALT11" desc="Text for search result item which, when clicked, navigates the user to personalization app keyboard backlight setting. Alternate phrase 11">
keyboard brighten
</message>
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_KEYBOARD_BACKLIGHT_ALT12" desc="Text for search result item which, when clicked, navigates the user to personalization app keyboard backlight setting. Alternate phrase 12">
keyboard brighter
</message>
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_KEYBOARD_BACKLIGHT_ALT13" desc="Text for search result item which, when clicked, navigates the user to personalization app keyboard backlight setting. Alternate phrase 13">
keyboard brightness
</message>
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_KEYBOARD_BACKLIGHT_ALT14" desc="Text for search result item which, when clicked, navigates the user to personalization app keyboard backlight setting. Alternate phrase 14">
keyboard dim
</message>
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_KEYBOARD_BACKLIGHT_ALT15" desc="Text for search result item which, when clicked, navigates the user to personalization app keyboard backlight setting. Alternate phrase 15">
keyboard dimming
</message>
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_KEYBOARD_BACKLIGHT_ALT16" desc="Text for search result item which, when clicked, navigates the user to personalization app keyboard backlight setting. Alternate phrase 16">
keyboard darken
</message>
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_KEYBOARD_BACKLIGHT_ALT17" desc="Text for search result item which, when clicked, navigates the user to personalization app keyboard backlight setting. Alternate phrase 17">
keyboard darker
</message>
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_KEYBOARD_BACKLIGHT_ALT18" desc="Text for search result item which, when clicked, navigates the user to personalization app keyboard backlight setting. Alternate phrase 18">
key color
</message>
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_KEYBOARD_BACKLIGHT_ALT19" desc="Text for search result item which, when clicked, navigates the user to personalization app keyboard backlight setting. Alternate phrase 19">
keyboard zone
</message>
<message name="IDS_PERSONALIZATION_APP_SEARCH_RESULT_KEYBOARD_BACKLIGHT_ALT20" desc="Text for search result item which, when clicked, navigates the user to personalization app keyboard backlight setting. Alternate phrase 20">
rgb controls
</message>
<!-- Traffic Counters UI -->
<message name="IDS_TRAFFIC_COUNTERS_UNKNOWN" desc="Traffic counters related to an unknown source">
@ -3862,21 +3955,24 @@
<message name="IDS_SHORTCUT_CUSTOMIZATION_SHORTCUT_WITH_CONFILICT_STATUS_MESSAGE" desc="The status message that displays when user clicks button to override an accelerator" translateable="false">
Shortcut is used by <ph name="CONFLICT_ACCEL_NAME">$1<ex>BRIGHTNESS_UP</ex></ph>. Press a new shortcut or press the same one again to use it for this action instead.
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_SEARCH_NO_RESULTS" desc="Text description of a search that has no results." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_SEARCH_NO_RESULTS" desc="Text description of a search that has no results.">
No search results found
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_SEARCH_CLEAR_QUERY_LABEL" desc="The label for the button that clears search input, displayed when the user hovers over the button or when a screen reader describes that button." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_SEARCH_CLEAR_QUERY_LABEL" desc="The label for the button that clears search input, displayed when the user hovers over the button or when a screen reader describes that button.">
Clear search
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_SEARCH_PLACEHOLDER_LABEL" desc="Placeholder text shown in search input field before user has typed anything." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_SEARCH_PLACEHOLDER_LABEL" desc="Placeholder text shown in search input field before user has typed anything.">
Search shortcuts
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_SEARCH_ACCELERATOR_TEXT_DIVIDER" desc="The text shown between multiple shortcut keys in search results." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_SEARCH_ACCELERATOR_TEXT_DIVIDER" desc="The text shown between multiple shortcut keys in search results.">
or
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_SEARCH_RESULT_ROW_A11Y_RESULT_SELECTED" desc="ThoriumVox alert to indicate the position number of a selected result in a list of search results and the selected result text itself, and that the user can press enter to navigate to section described by the search result." translateable="false">
<message name="IDS_SHORTCUT_CUSTOMIZATION_SEARCH_RESULT_ROW_A11Y_RESULT_SELECTED" desc="ThoriumVox alert to indicate the position number of a selected result in a list of search results and the selected result text itself, and that the user can press enter to navigate to section described by the search result.">
Search result <ph name="LIST_POSITION">$1<ex>1</ex></ph> of <ph name="LIST_SIZE">$2<ex>2</ex></ph>: <ph name="SEARCH_RESULT_TEXT">$3<ex>Open new tab, ctrl T</ex></ph>. Press Enter to navigate to shortcut.
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_NO_SHORTCUT_ASSIGNED" desc="The text shown when no shortcut is enabled with the accelerator" translateable="false">
No shortcut assigned
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_CATEGORY_GENERAL" desc="Category named 'General' shown on the navigation sidebar">
General
</message>
@ -3991,8 +4087,8 @@
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_BROWSER_REFRESH" desc="The text read aloud by the screen reader describing the keyboard icon 'refresh'.">
refresh
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_BROWSER_SEARCH" desc="The text read aloud by the screen reader describing the keyboard icon 'search'." translateable="false">
search
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_BROWSER_SEARCH" desc="The text read aloud by the screen reader describing the keyboard icon 'browser search'.">
browser search
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_TOGGLE_DICTATION" desc="The text read aloud by the screen reader describing the keyboard icon 'toggle dictation'.">
toggle dictation
@ -4045,8 +4141,11 @@
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_MODE_CHANGE" desc="The text read aloud by the screen reader describing the keyboard icon 'mode change'.">
mode change
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_OPEN_LAUNCHER" desc="The text read aloud by the screen reader describing the keyboard icon 'launcher'." translateable="false">
launcher
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_OPEN_LAUNCHER" desc="The text read aloud by the screen reader describing the keyboard icon 'open launcher'.">
open launcher
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_OPEN_SEARCH" desc="The text read aloud by the screen reader describing the keyboard icon 'open search'.">
open search
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_POWER" desc="The text read aloud by the screen reader describing the keyboard icon 'power'." translateable="false">
power
@ -4060,6 +4159,9 @@
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_SETTINGS" desc="The text read aloud by the screen reader describing the keyboard icon 'settings'.">
settings
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_VIEW_ALL_APPS" desc="The text read aloud by the screen reader describing the keyboard icon 'view all apps'.">
view all apps
</message>
<message name="IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_ZOOM_TOGGLE" desc="The text read aloud by the screen reader describing the keyboard icon 'full screen'.">
full screen
</message>
@ -4084,8 +4186,11 @@
<message name="IDS_SETTINGS_APN_ZERO_STATE_DESCRIPTION" desc="Text explaining there is no APN information to show because the network has not been attempted to be connected with, and that the user might need to add a custom APN.">
You are not connected yet. If your mobile carrier recommends a custom APN, enter the APN information by selecting "+ New APN"
</message>
<message name="IDS_SETTINGS_APN_DATABASE_APNS_ERROR_MESSAGE" desc="Error message displayed when a cellular network fails to connect to any database APNs due to APN-related reasons.">
Cant connect to this network using automatically detected APNs. Contact your mobile carrier for more information.
</message>
<message name="IDS_SETTINGS_APN_CUSTOM_APNS_ERROR_MESSAGE" desc="Error message displayed when a cellular network fails to connect due to APN-related reasons, informing the user that none of the enabled custom APNs were successful in being used to connect.">
Can't connect to any enabled custom APNs. Contact your mobile carrier for more information.
Cant connect to this network using any enabled custom APNs. Contact your mobile carrier for more information.
</message>
<message name="IDS_SETTINGS_APN_MENU_DETAILS" desc="Details button in three dotted menu for APNs">
Details
@ -4100,7 +4205,7 @@
Remove
</message>
<message name="IDS_SETTINGS_APN_MORE_ACTIONS_TITLE" desc="Description of the tree dotted menu for APNs">
More actions
More actions for <ph name="APN_NAME">$1<ex>vzwinternet</ex></ph>
</message>
<message name="IDS_SETTINGS_ADD_APN_DIALOG_TITLE" desc="Title for the dialog that creates a new custom APN">
Add a new APN
@ -4157,7 +4262,7 @@
Automatically detected
</message>
<message name="IDS_SETTINGS_APN_WARNING_PROMPT_FOR_DISABLE_REMOVE" desc="Warning Prompt describing why the APN can't be disabled or removed.">
Can't disable or remove this APN. Make sure enabled attached APNs are disabled or removed.
Can't disable or remove this APN. Make sure enabled attach APNs are disabled or removed.
</message>
<message name="IDS_SETTINGS_APN_DIALOG_ADD" desc="Text used for adding a new APN.">
Add

View file

@ -715,7 +715,7 @@ void HistoryBackend::SetPageLanguageForVisitByVisitID(
annotations.page_language = page_language;
db_->AddContentAnnotationsForVisit(visit_id, annotations);
}
NotifyVisitUpdated(visit_row);
NotifyVisitUpdated(visit_row, VisitUpdateReason::kSetPageLanguage);
ScheduleCommit();
}
}
@ -752,7 +752,7 @@ void HistoryBackend::SetPasswordStateForVisitByVisitID(
annotations.password_state = password_state;
db_->AddContentAnnotationsForVisit(visit_id, annotations);
}
NotifyVisitUpdated(visit_row);
NotifyVisitUpdated(visit_row, VisitUpdateReason::kSetPasswordState);
ScheduleCommit();
}
}
@ -891,7 +891,7 @@ void HistoryBackend::UpdateVisitDuration(VisitID visit_id, const Time end_ts) {
? end_ts - visit_row.visit_time
: base::Microseconds(0);
db_->UpdateVisitRow(visit_row);
NotifyVisitUpdated(visit_row);
NotifyVisitUpdated(visit_row, VisitUpdateReason::kUpdateVisitDuration);
}
}
@ -1079,7 +1079,7 @@ void HistoryBackend::AddPage(const HistoryAddPageArgs& request) {
visit_row.transition = ui::PageTransitionFromInt(
visit_row.transition & ~ui::PAGE_TRANSITION_CHAIN_END);
db_->UpdateVisitRow(visit_row);
NotifyVisitUpdated(visit_row);
NotifyVisitUpdated(visit_row, VisitUpdateReason::kUpdateTransition);
}
extended_redirect_chain = GetCachedRecentRedirects(request.referrer);
@ -1304,7 +1304,7 @@ void HistoryBackend::InitImpl(
// Get the first item in our database.
db_->GetStartDate(&first_recorded_time_);
// Start expiring old stuff if flag unset.
// Start expiring old stuff if flag is unset.
if (!base::CommandLine::ForCurrentProcess()->HasSwitch("keep-all-history"))
expirer_.StartExpiringOldStuff(base::Days(kExpireDaysThreshold));
}
@ -1809,7 +1809,7 @@ VisitID HistoryBackend::UpdateSyncedVisit(
content_annotations->password_state);
}
NotifyVisitUpdated(updated_row);
NotifyVisitUpdated(updated_row, VisitUpdateReason::kUpdateSyncedVisit);
ScheduleCommit();
return updated_row.visit_id;
}
@ -2149,7 +2149,7 @@ void HistoryBackend::AddContextAnnotationsForVisit(
if (!db_ || !db_->GetRowForVisit(visit_id, &visit_row))
return;
db_->AddContextAnnotationsForVisit(visit_id, visit_context_annotations);
NotifyVisitUpdated(visit_row);
NotifyVisitUpdated(visit_row, VisitUpdateReason::kAddContextAnnotations);
ScheduleCommit();
}
@ -2171,7 +2171,8 @@ void HistoryBackend::SetOnCloseContextAnnotationsForVisit(
} else {
db_->AddContextAnnotationsForVisit(visit_id, visit_context_annotations);
}
NotifyVisitUpdated(visit_row);
NotifyVisitUpdated(visit_row,
VisitUpdateReason::kSetOnCloseContextAnnotations);
ScheduleCommit();
}
@ -3534,9 +3535,10 @@ void HistoryBackend::NotifyURLsDeleted(DeletionInfo deletion_info) {
delegate_->NotifyURLsDeleted(std::move(deletion_info));
}
void HistoryBackend::NotifyVisitUpdated(const VisitRow& visit) {
void HistoryBackend::NotifyVisitUpdated(const VisitRow& visit,
VisitUpdateReason reason) {
for (HistoryBackendObserver& observer : observers_) {
observer.OnVisitUpdated(visit);
observer.OnVisitUpdated(visit, reason);
}
}

View file

@ -120,7 +120,6 @@ source_set("browser") {
"//components/viz/host",
"//components/web_package",
"//content:content_resources",
"//content:dev_ui_content_resources",
"//content/browser/aggregation_service:mojo_bindings",
"//content/browser/aggregation_service/proto:aggregatable_report_proto",
"//content/browser/attribution_reporting:attribution_reporting_proto",
@ -448,6 +447,8 @@ source_set("browser") {
"attribution_reporting/attribution_manager_impl.cc",
"attribution_reporting/attribution_manager_impl.h",
"attribution_reporting/attribution_observer.h",
"attribution_reporting/attribution_os_level_manager.cc",
"attribution_reporting/attribution_os_level_manager.h",
"attribution_reporting/attribution_report.cc",
"attribution_reporting/attribution_report.h",
"attribution_reporting/attribution_report_network_sender.cc",
@ -472,6 +473,10 @@ source_set("browser") {
"attribution_reporting/common_source_info.h",
"attribution_reporting/create_report_result.cc",
"attribution_reporting/create_report_result.h",
"attribution_reporting/destination_throttler.cc",
"attribution_reporting/destination_throttler.h",
"attribution_reporting/os_registration.cc",
"attribution_reporting/os_registration.h",
"attribution_reporting/rate_limit_result.h",
"attribution_reporting/rate_limit_table.cc",
"attribution_reporting/rate_limit_table.h",
@ -647,10 +652,8 @@ source_set("browser") {
"browsing_topics/browsing_topics_site_data_manager_impl.h",
"browsing_topics/browsing_topics_site_data_storage.cc",
"browsing_topics/browsing_topics_site_data_storage.h",
"browsing_topics/browsing_topics_url_loader.cc",
"browsing_topics/browsing_topics_url_loader.h",
"browsing_topics/browsing_topics_url_loader_service.cc",
"browsing_topics/browsing_topics_url_loader_service.h",
"browsing_topics/browsing_topics_url_loader_interceptor.cc",
"browsing_topics/browsing_topics_url_loader_interceptor.h",
"browsing_topics/header_util.cc",
"browsing_topics/header_util.h",
"buckets/bucket_context.h",
@ -903,6 +906,8 @@ source_set("browser") {
"download/save_package_serialization_handler.h",
"download/save_types.cc",
"download/save_types.h",
"environment_integrity/environment_integrity_service_impl.cc",
"environment_integrity/environment_integrity_service_impl.h",
"eye_dropper_chooser_impl.cc",
"eye_dropper_chooser_impl.h",
"feature_observer.cc",
@ -1118,10 +1123,14 @@ source_set("browser") {
"installedapp/installed_app_provider_impl.h",
"interest_group/ad_auction_document_data.cc",
"interest_group/ad_auction_document_data.h",
"interest_group/ad_auction_page_data.cc",
"interest_group/ad_auction_page_data.h",
"interest_group/ad_auction_result_metrics.cc",
"interest_group/ad_auction_result_metrics.h",
"interest_group/ad_auction_service_impl.cc",
"interest_group/ad_auction_service_impl.h",
"interest_group/ad_auction_url_loader_interceptor.cc",
"interest_group/ad_auction_url_loader_interceptor.h",
"interest_group/auction_metrics_recorder.cc",
"interest_group/auction_metrics_recorder.h",
"interest_group/auction_process_manager.cc",
@ -1209,12 +1218,16 @@ source_set("browser") {
"loader/object_navigation_fallback_body_loader.h",
"loader/prefetch_url_loader.cc",
"loader/prefetch_url_loader.h",
"loader/prefetch_url_loader_service.cc",
"loader/prefetch_url_loader_service.h",
"loader/prefetch_url_loader_service_context.cc",
"loader/prefetch_url_loader_service_context.h",
"loader/resource_cache_manager.cc",
"loader/resource_cache_manager.h",
"loader/shared_cors_origin_access_list_impl.cc",
"loader/shared_cors_origin_access_list_impl.h",
"loader/subresource_proxying_url_loader.cc",
"loader/subresource_proxying_url_loader.h",
"loader/subresource_proxying_url_loader_service.cc",
"loader/subresource_proxying_url_loader_service.h",
"loader/url_loader_throttles.cc",
"locks/lock_manager.cc",
"locks/lock_manager.h",
@ -1321,6 +1334,8 @@ source_set("browser") {
"message_port_provider.cc",
"metrics/histogram_controller.cc",
"metrics/histogram_controller.h",
"metrics/histogram_shared_memory_config.cc",
"metrics/histogram_shared_memory_config.h",
"metrics/histogram_subscriber.h",
"metrics/histogram_synchronizer.cc",
"metrics/histogram_synchronizer.h",
@ -1493,6 +1508,8 @@ source_set("browser") {
"preloading/preloading_decider.h",
"preloading/preloading_prediction.cc",
"preloading/preloading_prediction.h",
"preloading/prerender/devtools_prerender_attempt.cc",
"preloading/prerender/devtools_prerender_attempt.h",
"preloading/prerender/prerender_attributes.cc",
"preloading/prerender/prerender_attributes.h",
"preloading/prerender/prerender_commit_deferring_condition.cc",
@ -1793,6 +1810,8 @@ source_set("browser") {
"renderer_host/media/video_capture_provider_switcher.h",
"renderer_host/media/virtual_video_capture_devices_changed_observer.cc",
"renderer_host/media/virtual_video_capture_devices_changed_observer.h",
"renderer_host/mixed_content_checker.cc",
"renderer_host/mixed_content_checker.h",
"renderer_host/mixed_content_navigation_throttle.cc",
"renderer_host/mixed_content_navigation_throttle.h",
"renderer_host/native_web_keyboard_event_aura.cc",
@ -1908,6 +1927,7 @@ source_set("browser") {
"renderer_host/stored_page.h",
"renderer_host/subframe_history_navigation_throttle.cc",
"renderer_host/subframe_history_navigation_throttle.h",
"renderer_host/system_entropy_utils.h",
"renderer_host/text_input_manager.cc",
"renderer_host/text_input_manager.h",
"renderer_host/transient_allow_popup.cc",
@ -2248,6 +2268,8 @@ source_set("browser") {
"webid/federated_provider_fetcher.h",
"webid/flags.cc",
"webid/flags.h",
"webid/identity_registry.cc",
"webid/identity_registry.h",
"webid/idp_network_request_manager.cc",
"webid/idp_network_request_manager.h",
"webid/mdocs/mdoc_provider.cc",
@ -2364,7 +2386,6 @@ source_set("browser") {
"font_access/font_enumeration_data_source_linux.h",
"font_service.cc",
"font_service.h",
"media/stable_video_decoder_factory.cc",
"media/video_encode_accelerator_provider_launcher.cc",
"media/video_encode_accelerator_provider_launcher.h",
"memory/swap_metrics_driver_impl_linux.cc",
@ -2383,11 +2404,15 @@ source_set("browser") {
"//components/crash/content/browser/error_reporting",
"//components/services/font:lib",
"//content/common:sandbox_support_linux",
"//media/mojo/mojom/stable:stable_video_decoder",
"//third_party/blink/public/mojom:memory_usage_monitor_linux_mojo_bindings",
]
}
if (allow_oop_video_decoder) {
sources += [ "media/stable_video_decoder_factory.cc" ]
deps += [ "//media/mojo/mojom/stable:stable_video_decoder" ]
}
if (is_chromeos) {
sources += [
"handwriting/handwriting_recognition_service_impl_cros.cc",
@ -2488,7 +2513,6 @@ source_set("browser") {
deps += [
"//third_party/abseil-cpp:absl",
"//third_party/fuchsia-sdk/sdk/fidl/fuchsia.accessibility.semantics:fuchsia.accessibility.semantics_cpp",
"//third_party/fuchsia-sdk/sdk/fidl/fuchsia.accessibility.semantics:fuchsia.accessibility.semantics_cpp_hlcpp_conversion",
"//third_party/fuchsia-sdk/sdk/fidl/fuchsia.mediacodec:fuchsia.mediacodec_hlcpp",
"//third_party/fuchsia-sdk/sdk/pkg/inspect",
"//third_party/fuchsia-sdk/sdk/pkg/sys_inspect_cpp",
@ -2755,6 +2779,7 @@ source_set("browser") {
]
deps += [
"//components/services/screen_ai/public/cpp:utilities",
"//content/utility:delegate_data",
"//third_party/blink/public/common:font_unique_name_table_proto",
"//third_party/iaccessible2",
"//third_party/isimpledom",
@ -2977,6 +3002,8 @@ source_set("browser") {
"android/gpu_process_callback.cc",
"android/ime_adapter_android.cc",
"android/ime_adapter_android.h",
"android/impression_utils.cc",
"android/impression_utils.h",
"android/java/gin_java_bound_object.cc",
"android/java/gin_java_bound_object.h",
"android/java/gin_java_bound_object_delegate.cc",
@ -3021,6 +3048,8 @@ source_set("browser") {
"android/select_popup.h",
"android/selection/composited_touch_handle_drawable.cc",
"android/selection/composited_touch_handle_drawable.h",
"android/selection/magnifier_surface_control.cc",
"android/selection/magnifier_surface_control.h",
"android/selection/selection_popup_controller.cc",
"android/selection/selection_popup_controller.h",
"android/selection/smart_selection_client.cc",
@ -3039,11 +3068,8 @@ source_set("browser") {
"android/web_contents_observer_proxy.h",
"attribution_reporting/attribution_input_event_tracker_android.cc",
"attribution_reporting/attribution_input_event_tracker_android.h",
"attribution_reporting/attribution_os_level_manager.h",
"attribution_reporting/attribution_os_level_manager_android.cc",
"attribution_reporting/attribution_os_level_manager_android.h",
"attribution_reporting/os_registration.cc",
"attribution_reporting/os_registration.h",
"child_process_launcher_helper_android.cc",
"contacts/contacts_provider_android.cc",
"contacts/contacts_provider_android.h",
@ -3206,6 +3232,8 @@ source_set("browser") {
"webauth/virtual_fido_discovery_factory.h",
# The Document Picture-in-Picture API is not implemented on Android.
"picture_in_picture/document_picture_in_picture_navigation_throttle.cc",
"picture_in_picture/document_picture_in_picture_navigation_throttle.h",
"picture_in_picture/document_picture_in_picture_window_controller_impl.cc",
"picture_in_picture/document_picture_in_picture_window_controller_impl.h",
]

View file

@ -744,7 +744,7 @@ bool AVStreamToVideoDecoderConfig(const AVStream* stream,
AVMasteringDisplayMetadata* metadata =
reinterpret_cast<AVMasteringDisplayMetadata*>(side_data.data);
if (metadata->has_primaries) {
hdr_metadata.color_volume_metadata.primaries = {
hdr_metadata.smpte_st_2086.primaries = {
static_cast<float>(av_q2d(metadata->display_primaries[0][0])),
static_cast<float>(av_q2d(metadata->display_primaries[0][1])),
static_cast<float>(av_q2d(metadata->display_primaries[1][0])),
@ -756,9 +756,9 @@ bool AVStreamToVideoDecoderConfig(const AVStream* stream,
};
}
if (metadata->has_luminance) {
hdr_metadata.color_volume_metadata.luminance_max =
hdr_metadata.smpte_st_2086.luminance_max =
av_q2d(metadata->max_luminance);
hdr_metadata.color_volume_metadata.luminance_min =
hdr_metadata.smpte_st_2086.luminance_min =
av_q2d(metadata->min_luminance);
}
}
@ -914,26 +914,6 @@ VideoPixelFormat AVPixelFormatToVideoPixelFormat(AVPixelFormat pixel_format) {
return PIXEL_FORMAT_UNKNOWN;
}
VideoColorSpace AVColorSpaceToColorSpace(AVColorSpace color_space,
AVColorRange color_range) {
// TODO(hubbe): make this better
if (color_range == AVCOL_RANGE_JPEG)
return VideoColorSpace::JPEG();
switch (color_space) {
case AVCOL_SPC_UNSPECIFIED:
break;
case AVCOL_SPC_BT709:
return VideoColorSpace::REC709();
case AVCOL_SPC_SMPTE170M:
case AVCOL_SPC_BT470BG:
return VideoColorSpace::REC601();
default:
DVLOG(1) << "Unknown AVColorSpace: " << color_space;
}
return VideoColorSpace();
}
std::string AVErrorToString(int errnum) {
char errbuf[AV_ERROR_MAX_STRING_SIZE] = {0};
av_strerror(errnum, errbuf, AV_ERROR_MAX_STRING_SIZE);

View file

@ -110,6 +110,10 @@ declare_args() {
# with hardware acceleration assist. Enabled by default for fuzzer builds,
# ChromeOS builds with protected content support, Windows, Mac, and Android.
enable_hevc_parser_and_hw_decoder = true
# Enable inclusion of VVC/H.266 parser/demuxer, and also enable VVC/H.266 decoding
# with hardware acceleration provided by platform. Disabled by default for all builds.
enable_platform_vvc = false
}
# Use another declare_args() to allow dependence on args defined above.

View file

@ -38,6 +38,7 @@ generate_grd("build_grdp") {
"throbber_small_dark.svg",
"throbber_small.svg",
"tree_triangle.svg",
"2x/checkbox_black.png",
"2x/checkbox_white.png",
"2x/check.png",
@ -55,6 +56,7 @@ generate_grd("build_grdp") {
"icon_arrow_back.svg",
"icon_arrow_dropdown.svg",
"icon_bookmark.svg",
"icon_checkmark.svg",
"icon_clear.svg",
"icon_clock.svg",
"icon_delete_gray.svg",