diff --git a/.gitignore b/.gitignore index 06f8371132a..13b7a857813 100644 --- a/.gitignore +++ b/.gitignore @@ -847,7 +847,6 @@ __pycache__/ !src/extensions/strings/BUILD.gn !src/infra/config/generated/testing/variants.pyl !src/infra/config/targets/lacros-version-skew-variants.jso -!src/media/BUILD.gn !src/media/filters/BUILD.gn !src/mojo/public/tools/mojom/mojom_parser.py !src/remoting/resources/remoting_strings.grd diff --git a/src/DEPS b/src/DEPS index e2287b13de2..ae8f752c22c 100644 --- a/src/DEPS +++ b/src/DEPS @@ -253,7 +253,7 @@ vars = { # luci-go CIPD package version. # Make sure the revision is uploaded by infra-packagers builder. # https://ci.chromium.org/p/infra-internal/g/infra-packagers/console - 'luci_go': 'git_revision:a60c8017241731d109e8909b5ecbb7b6d6f54af3', + 'luci_go': 'git_revision:4967d21f2b92546ac3747086cdcbb046b6db52fb', # This can be overridden, e.g. with custom_vars, to build clang from HEAD # instead of downloading the prebuilt pinned revision. @@ -277,11 +277,11 @@ vars = { # screen-ai CIPD packages # TODO(b/281483558): Use a tag to download the latest version of screen-ai # (e.g. 'version:121.3') and find a way to automate updating //DEPS with it. - 'screen_ai_linux': 'version:124.00', - 'screen_ai_macos_amd64': 'version:124.00', - 'screen_ai_macos_arm64': 'version:124.00', - 'screen_ai_windows_amd64': 'version:124.00', - 'screen_ai_windows_386': 'version:124.00', + 'screen_ai_linux': 'version:124.2', + 'screen_ai_macos_amd64': 'version:124.2', + 'screen_ai_macos_arm64': 'version:124.2', + 'screen_ai_windows_amd64': 'version:124.2', + 'screen_ai_windows_386': 'version:124.2', # siso CIPD package version. 'siso_version': 'git_revision:df7a992166415f66f6958744f149f724df138879', @@ -289,6 +289,9 @@ vars = { # download libaom test data 'download_libaom_testdata': False, + # download libvpx test data + 'download_libvpx_testdata': False, + 'android_git': 'https://android.googlesource.com', 'aomedia_git': 'https://aomedia.googlesource.com', 'boringssl_git': 'https://boringssl.googlesource.com', @@ -304,38 +307,38 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'src_internal_revision': '342050dfbbbfe808eb799cd2fe817987cf111f57', + 'src_internal_revision': '7cfd7cb236763a003c41ea9280adc864b6af3bb8', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': '071cbd93d0a46c38a3788b8f8e3c2846bdd928a6', + 'skia_revision': '6a4be21dde0876d2e8ef37a32f0e007da8fb916f', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': '2a06d4e3534debe1294744c208e85d8c4f06d579', + 'v8_revision': 'b46374a9a1d4f3b127f16454b3b0304973d726ab', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': 'a00babd8a64d4e7b983cdb450528c7f8ba70596f', + 'angle_revision': '0d772ebe305100288c25ed18ae297052c4f45c00', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. - 'swiftshader_revision': 'da334852e70510d259bfa8cbaa7c5412966b2f41', + 'swiftshader_revision': '90519141a709a92db90640b52176aaf82942e937', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': 'e735541f03e8e6630e4dab1e0098b09dbd3ac4f9', + 'pdfium_revision': '151ec02bc547f4d0a52a2386b12e0bb17e89dd4d', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling BoringSSL # and whatever else without interference from each other. # # Note this revision should be updated with # third_party/boringssl/roll_boringssl.py, not roll-dep. - 'boringssl_revision': '2fb5f9cb8feec2234952f6999af941ac48555710', + 'boringssl_revision': '2db0eb3f96a5756298dcd7f9319e56a98585bd10', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Fuchsia sdk # and whatever else without interference from each other. - 'fuchsia_version': 'version:20.20240515.2.1', + 'fuchsia_version': 'version:20.20240522.3.1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling google-toolbox-for-mac # and whatever else without interference from each other. @@ -343,7 +346,7 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling googletest # and whatever else without interference from each other. - 'googletest_revision': '33af80a883ddc33d9c0fac0a5b4578301efb18de', + 'googletest_revision': '9b4993ca7d1279dec5c5d41ba327cb11a77bdc00', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling lighttpd # and whatever else without interference from each other. @@ -359,7 +362,7 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. - 'freetype_revision': 'cdd3572e52aba43823b93b7ba08076e90e7a7576', + 'freetype_revision': '9ff4153cbfd60491f11bb56905ce6e20e94d23c7', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. @@ -379,11 +382,11 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '1bce0121e31e08811030f6f79c2f9a90801ff380', + 'catapult_revision': 'c61c9780dc4f84b3fbbf2d171e0df29d0bedf60d', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling chromium_variations # and whatever else without interference from each other. - 'chromium_variations_revision': 'a24371073c455dfc595f7113e776eb8c0234d438', + 'chromium_variations_revision': 'a3956df3c2eb62003ff8e5843cc9a0d2bfa6c3bb', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling CrossBench # and whatever else without interference from each other. @@ -395,11 +398,11 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling fuzztest # and whatever else without interference from each other. - 'fuzztest_revision': '34584108adea9bb274f71cee34fc091f89d7b2d5', + 'fuzztest_revision': '32eb84a95951fa3a0148fb3e6a1a02f830ded136', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling devtools-frontend # and whatever else without interference from each other. - 'devtools_frontend_revision': '00b985ef7ffcd9f527e0587d36547cb07f8cdf63', + 'devtools_frontend_revision': '37207fe6267bfd7f198ef52e93fe7a33347afdfc', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libprotobuf-mutator # and whatever else without interference from each other. @@ -423,7 +426,7 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': 'e3a4352eecabbf7737b1c7158e8dd70701e00360', + 'dawn_revision': '0d7751b60af75e8bb0061a27b9093ff180b0f25e', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -443,7 +446,7 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libavif # and whatever else without interference from each other. - 'libavif_revision': '5d97130f0820dbc97738f5480e2dd00865a35744', + 'libavif_revision': 'd369ffb6a21646395df9c57ae7c0545bf6846101', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling crabbyavif # and whatever else without interference from each other. @@ -459,7 +462,7 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling nearby # and whatever else without interference from each other. - 'nearby_revision': 'f26d25ed0106bd8946f8bb380bb67fb552e7390d', + 'nearby_revision': '7164bc98f6044d3dd2e4d138d44db63642ce7a69', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling securemessage # and whatever else without interference from each other. @@ -471,7 +474,7 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'cros_components_revision': 'f2d69fd1ec90a1e8a8571bc5e0e53337a126a60c', + 'cros_components_revision': '55e46734e675486d9453f0ddd9aee8adc49ae83d', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -479,11 +482,11 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'libcxxabi_revision': 'fc3fb0729ef1197d815bc6711f10640cc5cb9f2d', + 'libcxxabi_revision': '5067b87e93fc1ffbe3ba332dda932a605307538e', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'libunwind_revision': '419b03c0b8f20d6da9ddcb0d661a94a97cdd7dad', + 'libunwind_revision': '0906c4a31502cc7a46b5cf1794e21664ffa23be1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -540,6 +543,7 @@ allowed_hosts = [ # TODO(337061377): Move into a separate allowed gcs bucket list. 'chromium-ads-detection', + 'chromium-browser-clang', 'chromium-clang-format', 'chromium-nodejs', 'chromium-tfhub-models', @@ -700,6 +704,66 @@ deps = { }, ], }, + # Pull down Node binaries for WebUI toolchain. + # The Linux binary is always downloaded regardless of host os and architecture + # since remote node actions run on Linux worker. + # See also //third_party/node/node.gni + 'src/third_party/node/linux': { + 'dep_type': 'gcs', + 'condition': 'non_git_source', + 'bucket': 'chromium-nodejs', + 'objects': [ + { + 'object_name': '20.11.0/f9a337cfa0e2b92d3e5c671c26b454bd8e99769e', + 'sha256sum': '0ba9cc91698c1f833a1fdc1fe0cb392d825ad484c71b0d84388ac80bfd3d6079', + 'size_bytes': 43716484, + 'generation': 1711567575687220, + }, + ], + }, + # The Mac x64/arm64 binaries are downloaded regardless of host architecture + # since it's possible to cross-compile for the other architecture. This can + # cause problems for tests that use node if the test device architecture does + # not match the architecture of the compile machine. + 'src/third_party/node/mac': { + 'dep_type': 'gcs', + 'condition': 'host_os == "mac" and non_git_source', + 'bucket': 'chromium-nodejs', + 'objects': [ + { + 'object_name': '20.11.0/e3c0fd53caae857309815f3f8de7c2dce49d7bca', + 'sha256sum': '20affacca2480c368b75a1d91ec1a2720604b325207ef0cf39cfef3c235dad19', + 'size_bytes': 40649378, + 'generation': 1711567481181885, + }, + ], + }, + 'src/third_party/node/mac_arm64': { + 'dep_type': 'gcs', + 'condition': 'host_os == "mac" and non_git_source', + 'bucket': 'chromium-nodejs', + 'objects': [ + { + 'object_name': '20.11.0/5b5681e12a21cda986410f69e03e6220a21dd4d2', + 'sha256sum': 'cecb99fbb369a9090dddc27e228b66335cd72555b44fa8839ef78e56c51682c5', + 'size_bytes': 38989321, + 'generation': 1711567557161126, + }, + ], + }, + 'src/third_party/node/win': { + 'dep_type': 'gcs', + 'condition': 'host_os == "win" and non_git_source', + 'bucket': 'chromium-nodejs', + 'objects': [ + { + 'object_name': '20.11.0/2cb36010af52bc5e2a2d1e3675c10361c80d8f8d', + 'sha256sum': '5da5e201155bb3ea99134b404180adebcfa696b0dbc09571d01a09ca5489f53e', + 'size_bytes': 70017688, + 'generation': 1705443750949255, + }, + ], + }, # Download selected models from TFHub as testdata. 'src/third_party/tfhub_models': { 'bucket': 'chromium-tfhub-models', @@ -713,6 +777,41 @@ deps = { }, ], }, + # Update prebuilt Rust toolchain. + 'src/third_party/rust-toolchain': { + 'dep_type': 'gcs', + 'bucket': 'chromium-browser-clang', + 'objects': [ + { + 'object_name': 'Linux_x64/rust-toolchain-32dd3795bce8b347fda786529cf5e42a813e0b7d-2-llvmorg-19-init-10646-g084e2b53.tar.xz', + 'sha256sum': 'e7e236fe6e61b7a41ba6b1e4bc64e91119359cdddce268597c6328b9fea8d76d', + 'size_bytes': 151082700, + 'generation': 1715715529295267, + 'condition': 'host_os == "linux" and non_git_source', + }, + { + 'object_name': 'Mac/rust-toolchain-32dd3795bce8b347fda786529cf5e42a813e0b7d-2-llvmorg-19-init-10646-g084e2b53.tar.xz', + 'sha256sum': '3860d592e7f6a853aa06a00642f4110132c7af7f2b91d7bdd399d00dbd5177f6', + 'size_bytes': 143827372, + 'generation': 1715715530889094, + 'condition': 'host_os == "mac" and host_cpu == "x64"', + }, + { + 'object_name': 'Mac_arm64/rust-toolchain-32dd3795bce8b347fda786529cf5e42a813e0b7d-2-llvmorg-19-init-10646-g084e2b53.tar.xz', + 'sha256sum': '333dfb93cb0d944acb1ed9f0c44aba9dfdb4e7cd2c660758014338bea37ce8da', + 'size_bytes': 135183068, + 'generation': 1715715532458630, + 'condition': 'host_os == "mac" and host_cpu == "arm64"', + }, + { + 'object_name': 'Win/rust-toolchain-32dd3795bce8b347fda786529cf5e42a813e0b7d-2-llvmorg-19-init-10646-g084e2b53.tar.xz', + 'sha256sum': 'f610825518d0f3b6f1e9d2772065165b5bcac3302448a53ac89b3684bae7dbd2', + 'size_bytes': 206423884, + 'generation': 1715715534082072, + 'condition': 'host_os == "win"', + }, + ], + }, 'src/third_party/clang-format/script': Var('chromium_git') + '/external/github.com/llvm/llvm-project/clang/tools/clang-format.git@' + @@ -838,7 +937,7 @@ deps = { }, 'src/chrome/browser/resources/preinstalled_web_apps/internal': { - 'url': Var('chrome_git') + '/components/default_apps.git' + '@' + '3ca47d00648c126561056443c2c5f401c02eda9d', + 'url': Var('chrome_git') + '/chrome/components/default_apps.git' + '@' + '3ca47d00648c126561056443c2c5f401c02eda9d', 'condition': 'checkout_src_internal', }, @@ -1004,16 +1103,16 @@ deps = { 'src/clank': { 'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' + - 'a442700a5ca2621d3ef1e57080d68a0f9ed35d1a', + '5781ae13953c0e4ddc6ddd46636aaab7280b3b0a', 'condition': 'checkout_android and checkout_src_internal', }, 'src/docs/website': { - 'url': Var('chromium_git') + '/website.git' + '@' + '12e229a0a2a544144430dfa389933ccc869ad72b', + 'url': Var('chromium_git') + '/website.git' + '@' + 'ad3c41770ae5f45d262e90baf25492995c91db1f', }, 'src/ios/third_party/earl_grey2/src': { - 'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + 'fc1cd2e1711142575100d1f7360859e5ea47a4d3', + 'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + '558cbbb8c1554fbb3863a4ee0b0fab3cb7d8d671', 'condition': 'checkout_ios', }, @@ -1163,7 +1262,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/androidx', - 'version': 'dlDm3te-6Rj2Q6fEY-zYqzoe4ibNqNcFgqvRZscj6icC', + 'version': 'DuibK2rceCB96Ru0WNxKc-Pjd5VB-4YE9dyWFDwsrIcC', }, ], 'condition': 'checkout_android', @@ -1425,7 +1524,7 @@ deps = { # Tools used when building Chrome for Chrome OS. This affects both the Simple # Chrome workflow, as well as the chromeos-chrome ebuild. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '8a31c4e2f3416b669a31b6e6b8be77bf4ec12532', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '8199e2bbaef867e258148454b1ee7a472fe3a638', 'condition': 'checkout_chromeos', }, @@ -1460,13 +1559,13 @@ deps = { }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '6708d95ec6d819098093cd57c746636a5bb9a4ea', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'cd6d85be9c073bee480c5413ad59849a34b5d7c7', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), 'src/third_party/devtools-frontend-internal': { - 'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + 'f9fcad07d1e205738777cdce488f7d573dd64a61', + 'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '1ec845134e015c889b271e5eb07dbd1a15221cea', 'condition': 'checkout_src_internal', }, @@ -1502,7 +1601,7 @@ deps = { Var('chromium_git') + '/chromium/deps/flac.git' + '@' + '689da3a7ed50af7448c3f1961d1791c7c1d9c85c', 'src/third_party/flatbuffers/src': - Var('chromium_git') + '/external/github.com/google/flatbuffers.git' + '@' + 'c696275eaffec33796b5ca8755614fd9fec0a6a7', + Var('chromium_git') + '/external/github.com/google/flatbuffers.git' + '@' + '150644d7f4d030a0629c564fd90dc3becab77636', # Used for embedded builds. CrOS & Linux use the system version. 'src/third_party/fontconfig/src': { @@ -1511,7 +1610,7 @@ deps = { }, 'src/third_party/fp16/src': - Var('chromium_git') + '/external/github.com/Maratyszcza/FP16.git' + '@' + '0a92994d729ff76a58f692d3028ca1b64b145d91', + Var('chromium_git') + '/external/github.com/Maratyszcza/FP16.git' + '@' + '95163a75c51bc8dc29f72d0d7419ec50132984ff', 'src/third_party/gemmlowp/src': Var('chromium_git') + '/external/github.com/google/gemmlowp.git' + '@' + '13d57703abca3005d97b19df1f2db731607a7dc2', @@ -1698,7 +1797,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/kotlin_stdlib', - 'version': 'bCpFA9jdfF0zeuOKYuv9n1vqxV_lykSRR1oAYrVKmFsC', + 'version': '_4e0lDaCjMgaNeq2v2olJs_15Ax3PxGfCU9fMt0FTKcC', }, ], 'condition': 'checkout_android', @@ -1709,7 +1808,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/kotlinc', - 'version': 'NL2kgA9OlpYPhqM3x3fUl_nbJCGGPtPyNGN3fsrHcwYC', + 'version': '0jpbSygC1gCOFyv-hsyNVfvxPLhDSXnTCSnxHY_mjKoC', }, ], 'condition': 'checkout_android', @@ -1802,7 +1901,7 @@ deps = { }, 'src/third_party/libvpx/source/libvpx': - Var('chromium_git') + '/webm/libvpx.git' + '@' + '611d9ba0a55df154ff5cb7a97d41a41103265f5e', + Var('chromium_git') + '/webm/libvpx.git' + '@' + '5b4cfe88e45a42fbdf22f7210ed253faec9c0fe6', 'src/third_party/libwebm/source': Var('chromium_git') + '/webm/libwebm.git' + '@' + 'e4fbea0c9751ae8aa86629b197a28d8276a2b0da', @@ -1930,7 +2029,7 @@ deps = { Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + '09a4f3ec842a8932341b195c5b01e141c8a16eb7', 'src/third_party/openscreen/src': - Var('chromium_git') + '/openscreen' + '@' + 'c474965ed417600b6964f6d7ef4657c493dfc8a2', + Var('chromium_git') + '/openscreen' + '@' + '2fdf9fc760444fa335a6750a85d2fa5b6d5db215', 'src/third_party/openxr/src': { 'url': Var('chromium_git') + '/external/github.com/KhronosGroup/OpenXR-SDK' + '@' + '95fe35ffb383710a6e0567e958ead9a3b66e930c', @@ -1956,7 +2055,84 @@ deps = { Var('pdfium_git') + '/pdfium.git' + '@' + Var('pdfium_revision'), 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'cb380924121f7b210ea622818a697c0348b0652d', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '035095c2bd44bc9f8d42269048126a5c8dbd599c', + + 'src/base/tracing/test/data': { + 'bucket': 'perfetto', + 'objects': [ + { + 'object_name': 'test_data/chrome_fcp_lcp_navigations.pftrace-ae01d849fbd75a98be1b7ddd5a8873217c377b393a1d5bbd788ed3364f7fefc3', + 'sha256sum': 'ae01d849fbd75a98be1b7ddd5a8873217c377b393a1d5bbd788ed3364f7fefc3', + 'size_bytes': 2398645, + 'generation': 1697714434866488, + 'output_file': 'chrome_fcp_lcp_navigations.pftrace' + }, + { + 'object_name': 'test_data/chrome_input_with_frame_view.pftrace-a93548822e481508c728ccc5da3ad34afcd0aec02ca7a7a4dad84ff340ee5975', + 'sha256sum': 'a93548822e481508c728ccc5da3ad34afcd0aec02ca7a7a4dad84ff340ee5975', + 'size_bytes': 6392331, + 'generation': 1711402389089075, + 'output_file': 'chrome_input_with_frame_view.pftrace' + }, + { + 'object_name': 'test_data/scroll_offsets_trace_2.pftrace-2ddd9f78d91d51e39c72c520bb54fdc9dbf1333ae722e87633fc345159296289', + 'sha256sum': '2ddd9f78d91d51e39c72c520bb54fdc9dbf1333ae722e87633fc345159296289', + 'size_bytes': 1496388, + 'generation': 1712592637141461, + 'output_file': 'scroll_offsets_trace_2.pftrace' + }, + { + 'object_name': 'test_data/top_level_java_choreographer_slices-8001e73b2458e94f65a606bb558a645ba5bca553b57fe416001f6c2175675a8a', + 'sha256sum': '8001e73b2458e94f65a606bb558a645ba5bca553b57fe416001f6c2175675a8a', + 'size_bytes': 5323017, + 'generation': 1671708979893186, + 'output_file': 'top_level_java_choreographer_slices' + }, + { + 'object_name': 'test_data/chrome_page_load_all_categories_not_extended.pftrace.gz-6586e9e2bbc0c996caddb321a0374328654983733e6ffd7f4635ac07db32a493', + 'sha256sum': '6586e9e2bbc0c996caddb321a0374328654983733e6ffd7f4635ac07db32a493', + 'size_bytes': 1277750, + 'generation': 1652442088902445, + 'output_file': 'chrome_page_load_all_categories_not_extended.pftrace.gz' + }, + { + 'object_name': 'test_data/speedometer.perfetto_trace.gz-8a159b354d74a3ca0d38ce9cd071ef47de322db4261ee266bfafe04d70310529', + 'sha256sum': '8a159b354d74a3ca0d38ce9cd071ef47de322db4261ee266bfafe04d70310529', + 'size_bytes': 891088, + 'generation': 1684336047660953, + 'output_file': 'speedometer.perfetto_trace.gz' + }, + { + 'object_name': 'test_data/cpu_powerups_1.pb-70f5511ba0cd6ce1359e3cadb4d1d9301fb6e26be85158e3384b06f41418d386', + 'sha256sum': '70f5511ba0cd6ce1359e3cadb4d1d9301fb6e26be85158e3384b06f41418d386', + 'size_bytes': 2033064, + 'generation': 1669652389509708, + 'output_file': 'cpu_powerups_1.pb' + }, + { + 'object_name': 'test_data/chrome_5672_histograms.pftrace.gz-a09bd44078ac71bcfbc901b0544750e8344d0d0f6f96e220f700a5a53fa932ee', + 'sha256sum': 'a09bd44078ac71bcfbc901b0544750e8344d0d0f6f96e220f700a5a53fa932ee', + 'size_bytes': 1127472, + 'generation': 1684946598804577, + 'output_file': 'chrome_5672_histograms.pftrace.gz' + }, + { + 'object_name': 'test_data/chrome_custom_navigation_trace.gz-ff68279e3cec94076b69259d756eed181a63eaf834d8b956a7f4ba665fabf939', + 'sha256sum': 'ff68279e3cec94076b69259d756eed181a63eaf834d8b956a7f4ba665fabf939', + 'size_bytes': 7572484, + 'generation': 1666713705258900, + 'output_file': 'chrome_custom_navigation_trace.gz' + }, + { + 'object_name': 'test_data/scroll_offsets.pftrace-62101edb5204fec8bea30124f65d4e49bda0808d7b036e95f89445aaad6d8d98', + 'sha256sum': '62101edb5204fec8bea30124f65d4e49bda0808d7b036e95f89445aaad6d8d98', + 'size_bytes': 769741, + 'generation': 1693402148909129, + 'output_file': 'scroll_offsets.pftrace' + } + ], + 'dep_type': 'gcs' + }, 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '8ef97ff3b7332e38e61b347a2fbed425a4617151', @@ -1993,13 +2169,13 @@ deps = { }, 'src/third_party/re2/src': - Var('chromium_git') + '/external/github.com/google/re2.git' + '@' + 'a67d6c1d5308b0950a91fed8e03e5c048d22d5cd', + Var('chromium_git') + '/external/github.com/google/re2.git' + '@' + 'a771d3fbe7c432dc4db68360c6c0004fdde5646b', 'src/third_party/r8': { 'packages': [ { 'package': 'chromium/third_party/r8', - 'version': 'CCWS0qWaAWt-cT_itG4vFNt7tuI0FjLHwr9kd8GllPYC', + 'version': '2VsAp2dMXnrxyG6_BD0El4gDAxTXPqrw8xCV0MNmxcUC', }, ], 'condition': 'checkout_android', @@ -2120,13 +2296,13 @@ deps = { Var('chromium_git') + '/external/github.com/GoogleChromeLabs/text-fragments-polyfill.git' + '@' + 'c036420683f672d685e27415de0a5f5e85bdc23f', 'src/third_party/tflite/src': - Var('chromium_git') + '/external/github.com/tensorflow/tensorflow.git' + '@' + '6b9a25f438944132acc54ecf2c59af53c10fd6a1', + Var('chromium_git') + '/external/github.com/tensorflow/tensorflow.git' + '@' + 'd0e577447a11533887249e87e0f9b701d00d527c', 'src/third_party/turbine': { 'packages': [ { 'package': 'chromium/third_party/turbine', - 'version': 'fYpnoJAvh8-OaNB9k81XWGrwiODb_uTipTBEUeIFM98C', + 'version': 'JA8o86DtHkYnsW4v8F9pdcvi7uqN1WB-L1XFLggZdtAC', }, ], 'condition': 'checkout_android', @@ -2170,10 +2346,10 @@ deps = { Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '1b6371436a0a60e6b9a4ae2a40a8eba198e3af02', 'src/third_party/webgpu-cts/src': - Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '007e1015875a0a91794edbc14feb3ad5fe60f90b', + Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '9af84b8d4827c98cd914ebcdacdc6500a846d19a', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '57c2f35cfc2da8b7b507709237a7fe9791fc64e0', + Var('webrtc_git') + '/src.git' + '@' + 'b5df2ba10db3cd04febcde8727e782457708f2fa', # Wuffs' canonical repository is at github.com/google/wuffs, but we use # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file. @@ -2198,7 +2374,7 @@ deps = { }, 'src/third_party/xnnpack/src': - Var('chromium_git') + '/external/github.com/google/XNNPACK.git' + '@' + 'c9f0470750e7c3c71974cdb997aeb2990d2e2137', + Var('chromium_git') + '/external/github.com/google/XNNPACK.git' + '@' + 'fcb36699c67201ceff7358df42730809e8f2c9cc', 'src/tools/page_cycler/acid3': Var('chromium_git') + '/chromium/deps/acid3.git' + '@' + 'a926d0a32e02c4c03ae95bb798e6c780e0e184ba', @@ -2223,7 +2399,7 @@ deps = { 'packages': [ { 'package': 'skia/tools/goldctl/linux-amd64', - 'version': 'POF6EHjK2ABZjWG8M_kH0eR8pQSZ29p4yA3H8EbR3CkC', + 'version': 'WMIZj5iCtXaIDiOhz7iiswLMOl8EWWP5gfRyHAEZUSAC', }, ], 'dep_type': 'cipd', @@ -2233,7 +2409,7 @@ deps = { 'packages': [ { 'package': 'skia/tools/goldctl/windows-amd64', - 'version': 'D1kXDOnp7MBbgxkE6rvufF3H7zHEYUGc1F8m8zUgpvIC', + 'version': 'zHUBIGOiczuqjD1DhUqsPCLIcVp7c-7bnuOzAncAsy0C', }, ], 'dep_type': 'cipd', @@ -2244,7 +2420,7 @@ deps = { 'packages': [ { 'package': 'skia/tools/goldctl/mac-amd64', - 'version': 'DsWZ6Md4C0PbdllkonvRIJ_zdXUVvUAuZaGkkyH__3IC', + 'version': '88_YxpnUWyvy_qTnp6FH2cvFsJ3eKeNLLph6CbyXHmoC', }, ], 'dep_type': 'cipd', @@ -2255,7 +2431,7 @@ deps = { 'packages': [ { 'package': 'skia/tools/goldctl/mac-arm64', - 'version': 'f79BgDTVjc4x-Q-SYfX-GuXxOK_aezuZ-tjwQ85T2fIC', + 'version': 'TtqdFmghiNp8fsnpcuBhyC8e9PjVxKAXDBQhNoTReaUC', }, ], 'dep_type': 'cipd', @@ -2285,7 +2461,7 @@ deps = { 'packages': [ { 'package': 'chromeos_internal/apps/eche_app/app', - 'version': 'R5j2nxwBfmK703n29nR7emkjwrBf-pQtgXywpHbPRSsC', + 'version': 'n0C9-7p3WdlNo3_HWzTMEPAXLklPmZNyUyVq5pK3naUC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -2296,7 +2472,7 @@ deps = { 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'vRmN7TqpQKpze5a9InwYnw47cdroddfP0fTnQMdPSmgC', + 'version': 'jioqQEze9hU8Bny8MGGOUu6-_hr4Ksl9Fl4LL8rYBe0C', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -2307,7 +2483,7 @@ deps = { 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': 'Unbf-0_tAaQqzS2efPsb5kW0_MiAIuWMDn1vHYcdUaUC', + 'version': 'cPs0W6yHeN4h0Oj96yuLRx4SbCxisElkk9MTenXrwUsC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -2340,7 +2516,7 @@ deps = { 'packages': [ { 'package': 'chromeos_internal/apps/projector_app/app', - 'version': 'xV5T7yU0_EPt5Xa8lrmItPqVNudpXLib1H4Wr8mnzQkC', + 'version': 'OYkDCDbaRWBwtuFzcaoTa7808V2OKL14StmmaDI8ypAC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -4085,11 +4261,10 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/io_branch_sdk_android_library', - 'version': 'version:2@5.16.2.cr1', + 'version': 'version:2@5.20.0.cr1', }, ], 'condition': 'checkout_android', - 'dep_type': 'cipd', }, 'src/third_party/android_deps/libs/io_branch_sdk_android_xiaomi': { @@ -4100,7 +4275,6 @@ deps = { }, ], 'condition': 'checkout_android', - 'dep_type': 'cipd', }, 'src/third_party/android_deps/libs/com_android_installreferrer_installreferrer': { @@ -4111,7 +4285,6 @@ deps = { }, ], 'condition': 'checkout_android', - 'dep_type': 'cipd', }, 'src/third_party/android_deps/libs/com_google_android_gms_play_services_ads_identifier': { @@ -4122,7 +4295,6 @@ deps = { }, ], 'condition': 'checkout_android', - 'dep_type': 'cipd', }, 'src/third_party/android_deps/libs/com_huawei_hms_ads_identifier': { @@ -4133,7 +4305,6 @@ deps = { }, ], 'condition': 'checkout_android', - 'dep_type': 'cipd', }, 'src/third_party/android_deps/libs/store_galaxy_samsung_installreferrer': { @@ -4144,7 +4315,6 @@ deps = { }, ], 'condition': 'checkout_android', - 'dep_type': 'cipd', }, # === ANDROID_DEPS Generated Code End === @@ -4199,19 +4369,19 @@ deps = { # Dependencies from src_internal 'src/chromeos/ash/resources/internal': { 'url': Var('chrome_git') + '/chrome/chromeos/ash/resources/internal.git' + '@' + - '70bca0e40f5fbbfc98120d9c45d3946b172415b0', + '2535bda7eaf460b4c563f8ca62908818463e9d12', 'condition': 'checkout_src_internal and checkout_chromeos', }, 'src/chromeos/assistant/internal': { 'url': Var('chrome_git') + '/chrome/assistant.git' + '@' + - 'd8acec2a6d951970a3c857f1b5e2452b6eb3390c', + '5885da7fd3b1622325506bc2d4468cd95195366f', 'condition': 'checkout_src_internal and checkout_chromeos', }, 'src/ash/webui/conch': { 'url': Var('chrome_git') + '/ash/webui/conch.git' + '@' + - '9ac2782451623ef5607a7b7f87f41303abb953fa', + '670fa8695ce7e76b8bad8cefe162f8e08f08ce76', 'condition': 'checkout_src_internal and checkout_chromeos', }, @@ -4244,7 +4414,7 @@ deps = { 'src/chrome/app/theme/google_chrome': { 'url': Var('chrome_git') + '/chrome/theme/google_chrome.git' + '@' + - 'd9e6a8d9c213ae34bf15a4fef5691dbd9154ded7', + 'ee36936bac5f53ba3058174c2dc2d750d584a24b', 'condition': 'checkout_src_internal', }, @@ -4280,7 +4450,7 @@ deps = { 'src/chrome/browser/platform_experience/win': { 'url': Var('chrome_git') + '/chrome/browser/platform_experience/win.git' + '@' + - '203bb990e01a33360e543edbf03db386355a4d26', + 'e11c66cf5dcfd34a03fbd475d93b8a068b9479ee', 'condition': 'checkout_src_internal', }, @@ -4334,7 +4504,7 @@ deps = { # grepping. 'src/chrome/installer/mac/internal': { 'url': Var('chrome_git') + '/chrome/installer/mac/internal.git' + '@' + - '41badb00eefc7b698e126870555c1cb65d1acfdb', + '504e608fba2b504f8dedbb66bf436b14dc62851d', 'condition': 'checkout_src_internal', }, @@ -4392,67 +4562,67 @@ deps = { }, 'src/components/autofill/core/browser/form_parsing/internal_resources': { - 'url': Var('chrome_git') + '/components/autofill_regex_patterns.git' + '@' + + 'url': Var('chrome_git') + '/chrome/components/autofill_regex_patterns.git' + '@' + 'feb267b80dd9df83ce4949470d5b1cc6214cd775', 'condition': 'checkout_src_internal', }, 'src/components/crash/core/app/internal': { - 'url': Var('chrome_git') + '/components/crash.git' + '@' + '977755983e64eb91813875407050afcc7c1b6683', + 'url': Var('chrome_git') + '/chrome/components/crash.git' + '@' + '977755983e64eb91813875407050afcc7c1b6683', 'condition': 'checkout_src_internal', }, 'src/components/metrics/internal': { - 'url': Var('chrome_git') + '/components/metrics/internal.git' + '@' + + 'url': Var('chrome_git') + '/chrome/components/metrics/internal.git' + '@' + 'ac51808a082f35a97395ebb49c74dca809bd7540', 'condition': 'checkout_src_internal', }, 'src/components/ntp_tiles/resources/internal': { - 'url': Var('chrome_git') + '/components/ntp_tiles/resources.git' + '@' + + 'url': Var('chrome_git') + '/chrome/components/ntp_tiles/resources.git' + '@' + '48c257ae331a9c642af38b8f62cb2c789e2a7da6', 'condition': 'checkout_src_internal', }, 'src/components/optimization_guide/internal': { - 'url': Var('chrome_git') + '/components/optimization_guide.git' + '@' + - '5015c9cb9b8a8b5bd5dcfd6cbaa7b41e1d2af2d7', + 'url': Var('chrome_git') + '/chrome/components/optimization_guide.git' + '@' + + 'bb711b135c104041b59152abdbc52d5244ace51a', 'condition': 'checkout_src_internal', }, 'src/components/plus_addresses/resources/internal': { - 'url': Var('chrome_git') + '/components/plus_addresses/resources.git' + '@' + + 'url': Var('chrome_git') + '/chrome/components/plus_addresses/resources.git' + '@' + '4f595c87a18088bf7c43613ebae849f23559f725', 'condition': 'checkout_src_internal', }, 'src/components/resources/default_100_percent/google_chrome': { - 'url': Var('chrome_git') + '/components/default_100_percent/google_chrome.git' + '@' + + 'url': Var('chrome_git') + '/chrome/components/default_100_percent/google_chrome.git' + '@' + 'de2513c741f9caf5889b1300ea3e51ce3efc88b8', 'condition': 'checkout_src_internal', }, 'src/components/resources/default_200_percent/google_chrome': { - 'url': Var('chrome_git') + '/components/default_200_percent/google_chrome.git' + '@' + + 'url': Var('chrome_git') + '/chrome/components/default_200_percent/google_chrome.git' + '@' + '515db2e8d702f1b0d2c7a3fa3140a338d306102c', 'condition': 'checkout_src_internal', }, 'src/components/resources/default_300_percent/google_chrome': { - 'url': Var('chrome_git') + '/components/default_300_percent/google_chrome.git' + '@' + + 'url': Var('chrome_git') + '/chrome/components/default_300_percent/google_chrome.git' + '@' + '79dd350d2fee765ea02f603fc2ca140f20debb86', 'condition': 'checkout_src_internal', }, 'src/components/site_isolation/internal': { - 'url': Var('chrome_git') + '/components/site_isolation.git' + '@' + + 'url': Var('chrome_git') + '/chrome/components/site_isolation.git' + '@' + 'e0d8a7769c1daabb974bf0d229970534a0aede77', 'condition': 'checkout_src_internal', }, 'src/components/test/data/autofill/heuristics-json/internal': { 'url': Var('chrome_git') + '/chrome/test/autofill/structured_forms.git' + '@' + - '3499d6a388aa2546dd41ba559da0c959d32491b9', + '9003254f2582c512a366eac433e7f5c321913a95', 'condition': 'checkout_chromium_autofill_test_dependencies', }, @@ -4476,7 +4646,7 @@ deps = { 'src/ios_internal': { 'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' + - 'cfc4783f84619a2a28ce97fdff886300fd246d83', + '5c05d2ed71d0ce6cf76a282940d5b57cc58787dc', 'condition': 'checkout_ios and checkout_src_internal', }, @@ -4970,12 +5140,6 @@ hooks = [ 'condition': 'not llvm_force_head_revision', 'action': ['vpython3', 'src/tools/clang/scripts/update.py'], }, - { - # Update prebuilt Rust toolchain. - 'name': 'rust-toolchain', - 'pattern': '.', - 'action': ['vpython3', 'src/tools/rust/update_rust.py'], - }, { # Build the clang toolchain from tip-of-tree. # Note: On Win, this should run after win_toolchain, as it may use it. @@ -5136,64 +5300,6 @@ hooks = [ 'src/third_party/apache-win32', ], }, - # Pull down Node binaries for WebUI toolchain. - # The Linux binary is always downloaded regardless of host os and architecture - # since remote node actions run on Linux worker. - # See also //third_party/node/node.gni - { - 'name': 'node_linux64', - 'pattern': '.', - 'action': [ 'python3', - 'src/third_party/depot_tools/download_from_google_storage.py', - '--no_resume', - '--extract', - '--no_auth', - '--bucket', 'chromium-nodejs/20.11.0', - '-s', 'src/third_party/node/linux/node-linux-x64.tar.gz.sha1', - ], - }, - # The Mac x64/arm64 binaries are downloaded regardless of host architecture - # since it's possible to cross-compile for the other architecture. This can - # cause problems for tests that use node if the test device architecture does - # not match the architecture of the compile machine. - { - 'name': 'node_mac', - 'pattern': '.', - 'condition': 'host_os == "mac"', - 'action': [ 'python3', - 'src/third_party/depot_tools/download_from_google_storage.py', - '--no_resume', - '--extract', - '--no_auth', - '--bucket', 'chromium-nodejs/20.11.0', - '-s', 'src/third_party/node/mac/node-darwin-x64.tar.gz.sha1', - ], - }, - { - 'name': 'node_mac_arm64', - 'pattern': '.', - 'condition': 'host_os == "mac"', - 'action': [ 'python3', - 'src/third_party/depot_tools/download_from_google_storage.py', - '--no_resume', - '--extract', - '--no_auth', - '--bucket', 'chromium-nodejs/20.11.0', - '-s', 'src/third_party/node/mac/node-darwin-arm64.tar.gz.sha1', - ], - }, - { - 'name': 'node_win', - 'pattern': '.', - 'condition': 'host_os == "win"', - 'action': [ 'python3', - 'src/third_party/depot_tools/download_from_google_storage.py', - '--no_resume', - '--no_auth', - '--bucket', 'chromium-nodejs/20.11.0', - '-s', 'src/third_party/node/win/node.exe.sha1', - ], - }, # Pull down NPM dependencies for WebUI toolchain. { @@ -5265,16 +5371,6 @@ hooks = [ ], }, - # Download test data for Perfetto diff tests - { - 'name': 'perfetto_testdata', - 'condition': 'host_os == "linux"', - 'pattern': '\\.sha256', - 'action': [ 'vpython3', - 'src/base/tracing/test/test_data.py', - 'download', - ], - }, # Pull down WPR Archive files { 'name': 'Fetch WPR archive files', @@ -5813,6 +5909,18 @@ hooks = [ 'gs://aom-test-data', 'src/third_party/libaom/testdata'] }, + { + 'name': 'libvpx_testdata', + 'pattern': '.', + 'condition': 'download_libvpx_testdata', + 'action': ['python3', + 'src/third_party/depot_tools/gsutil.py', + '-q', + '-m', + 'rsync', + 'gs://downloads.webmproject.org/test_data/libvpx', + 'src/third_party/libvpx/testdata'], + }, ] # Add any corresponding DEPS files from this list to chromium.exclusions in diff --git a/src/base/BUILD.gn b/src/base/BUILD.gn index 73f05bc9628..679bfcb2131 100644 --- a/src/base/BUILD.gn +++ b/src/base/BUILD.gn @@ -178,16 +178,6 @@ if (is_fuchsia) { } } -config("perfetto_config") { - if (use_perfetto_client_library) { - defines = [ - # Use TRACE_EVENT macro implementation from Perfetto. See - # trace_event/trace_event_common.h. - "BASE_USE_PERFETTO_CLIENT_LIBRARY=1", - ] - } -} - if (enable_pkeys && is_debug) { config("no_stack_protector") { cflags = [ "-fno-stack-protector" ] @@ -1288,7 +1278,15 @@ component("base") { deps += [ ":base_jni", ":base_shared_preferences_jni", + ":callback_jni", + ":command_line_jni", + ":jank_tracker_jni", + ":library_loader_jni", + ":memory_jni", + ":metrics_jni", ":process_launcher_jni", + ":sys_utils_jni", + ":tasks_jni", "//third_party/ashmem", "//third_party/cpu_features:ndk_compat", ] @@ -1351,7 +1349,6 @@ component("base") { "android/jni_array.h", "android/jni_bytebuffer.cc", "android/jni_bytebuffer.h", - "android/jni_conversions.cc", "android/jni_registrar.cc", "android/jni_registrar.h", "android/jni_string.cc", @@ -2442,24 +2439,17 @@ component("base") { "//third_party/perfetto/include/perfetto/protozero", ] - all_dependent_configs += [ - ":perfetto_config", - "//third_party/perfetto/gn:public_config", - ] + all_dependent_configs += [ "//third_party/perfetto/gn:public_config" ] if (is_win) { sources += [ + "trace_event/etw_interceptor_win.cc", + "trace_event/etw_interceptor_win.h", "trace_event/trace_event_etw_export_win.cc", "trace_event/trace_event_etw_export_win.h", "trace_event/trace_logging_minimal_win.cc", "trace_event/trace_logging_minimal_win.h", ] - if (use_perfetto_client_library) { - sources += [ - "trace_event/etw_interceptor_win.cc", - "trace_event/etw_interceptor_win.h", - ] - } } if (is_android) { @@ -2666,7 +2656,6 @@ buildflag_header("tracing_buildflags") { flags = [ "ENABLE_BASE_TRACING=$enable_base_tracing", - "USE_PERFETTO_CLIENT_LIBRARY=$use_perfetto_client_library", "USE_PERFETTO_TRACE_PROCESSOR=$use_perfetto_trace_processor", "OPTIONAL_TRACE_EVENTS_ENABLED=$optional_trace_events_enabled", ] @@ -4333,14 +4322,10 @@ if (is_android || is_robolectric) { generate_jni("base_jni") { sources = [ "android/java/src/org/chromium/base/ApkAssets.java", - "android/java/src/org/chromium/base/ApplicationStatus.java", "android/java/src/org/chromium/base/BuildInfo.java", "android/java/src/org/chromium/base/BundleUtils.java", - "android/java/src/org/chromium/base/Callback.java", - "android/java/src/org/chromium/base/CommandLine.java", "android/java/src/org/chromium/base/ContentUriUtils.java", "android/java/src/org/chromium/base/CpuFeatures.java", - "android/java/src/org/chromium/base/EarlyTraceEvent.java", "android/java/src/org/chromium/base/EventLog.java", "android/java/src/org/chromium/base/FeatureList.java", "android/java/src/org/chromium/base/FeatureMap.java", @@ -4355,28 +4340,14 @@ if (is_android || is_robolectric) { "android/java/src/org/chromium/base/JavaHandlerThread.java", "android/java/src/org/chromium/base/JniAndroid.java", "android/java/src/org/chromium/base/LocaleUtils.java", - "android/java/src/org/chromium/base/MemoryPressureListener.java", "android/java/src/org/chromium/base/PathService.java", "android/java/src/org/chromium/base/PathUtils.java", "android/java/src/org/chromium/base/PowerMonitor.java", "android/java/src/org/chromium/base/RadioUtils.java", - "android/java/src/org/chromium/base/SysUtils.java", - "android/java/src/org/chromium/base/ThreadUtils.java", "android/java/src/org/chromium/base/TimezoneUtils.java", "android/java/src/org/chromium/base/Token.java", "android/java/src/org/chromium/base/TokenBase.java", - "android/java/src/org/chromium/base/TraceEvent.java", "android/java/src/org/chromium/base/UnguessableToken.java", - "android/java/src/org/chromium/base/jank_tracker/JankMetricUMARecorder.java", - "android/java/src/org/chromium/base/library_loader/LibraryLoader.java", - "android/java/src/org/chromium/base/library_loader/LibraryPrefetcher.java", - "android/java/src/org/chromium/base/memory/JavaHeapDumpGenerator.java", - "android/java/src/org/chromium/base/memory/MemoryInfoBridge.java", - "android/java/src/org/chromium/base/memory/MemoryPurgeManager.java", - "android/java/src/org/chromium/base/metrics/NativeUmaRecorder.java", - "android/java/src/org/chromium/base/metrics/StatisticsRecorderAndroid.java", - "android/java/src/org/chromium/base/task/PostTask.java", - "android/java/src/org/chromium/base/task/TaskRunnerImpl.java", ] if (use_clang_profiling) { @@ -4429,6 +4400,10 @@ if (is_android) { template = "android/java/src/org/chromium/base/BaseFeatures.java.tmpl" } + android_library("base_switches_java") { + srcjar_deps = [ ":java_switches_srcjar" ] + } + java_cpp_strings("java_switches_srcjar") { # External code should depend on ":base_java" instead. visibility = [ ":*" ] @@ -4472,7 +4447,6 @@ if (is_android) { ":base_android_java_enums_srcjar", ":base_jni", ":java_features_srcjar", - ":java_switches_srcjar", ] deps = [ @@ -4485,24 +4459,16 @@ if (is_android) { ] sources = [ - "android/java/src/org/chromium/base/ActivityLifecycleCallbacksAdapter.java", - "android/java/src/org/chromium/base/ActivityState.java", - "android/java/src/org/chromium/base/ApiCompatibilityUtils.java", "android/java/src/org/chromium/base/ApkAssets.java", - "android/java/src/org/chromium/base/ApplicationStatus.java", "android/java/src/org/chromium/base/BuildInfo.java", "android/java/src/org/chromium/base/BundleUtils.java", - "android/java/src/org/chromium/base/Callback.java", "android/java/src/org/chromium/base/Callbacks.java", "android/java/src/org/chromium/base/CallbackController.java", "android/java/src/org/chromium/base/CollectionUtil.java", - "android/java/src/org/chromium/base/CommandLine.java", "android/java/src/org/chromium/base/CommandLineInitUtil.java", "android/java/src/org/chromium/base/ContentUriUtils.java", - "android/java/src/org/chromium/base/ContextUtils.java", "android/java/src/org/chromium/base/CpuFeatures.java", "android/java/src/org/chromium/base/DiscardableReferencePool.java", - "android/java/src/org/chromium/base/EarlyTraceEvent.java", "android/java/src/org/chromium/base/EventLog.java", "android/java/src/org/chromium/base/FeatureList.java", "android/java/src/org/chromium/base/FeatureMap.java", @@ -4519,16 +4485,12 @@ if (is_android) { "android/java/src/org/chromium/base/JavaExceptionReporter.java", "android/java/src/org/chromium/base/JavaHandlerThread.java", "android/java/src/org/chromium/base/JniAndroid.java", - "android/java/src/org/chromium/base/LifetimeAssert.java", "android/java/src/org/chromium/base/LocaleUtils.java", - "android/java/src/org/chromium/base/Log.java", "android/java/src/org/chromium/base/MathUtils.java", - "android/java/src/org/chromium/base/MemoryPressureListener.java", "android/java/src/org/chromium/base/MutableBooleanParamWithSafeDefault.java", "android/java/src/org/chromium/base/MutableFlagWithSafeDefault.java", "android/java/src/org/chromium/base/MutableIntParamWithSafeDefault.java", "android/java/src/org/chromium/base/MutableParamWithSafeDefault.java", - "android/java/src/org/chromium/base/ObserverList.java", "android/java/src/org/chromium/base/PackageManagerUtils.java", "android/java/src/org/chromium/base/PackageUtils.java", "android/java/src/org/chromium/base/PathService.java", @@ -4536,35 +4498,106 @@ if (is_android) { "android/java/src/org/chromium/base/PiiElider.java", "android/java/src/org/chromium/base/PowerMonitor.java", "android/java/src/org/chromium/base/PowerMonitorForQ.java", - "android/java/src/org/chromium/base/Promise.java", "android/java/src/org/chromium/base/RadioUtils.java", "android/java/src/org/chromium/base/RequiredCallback.java", - "android/java/src/org/chromium/base/ResettersForTesting.java", - "android/java/src/org/chromium/base/StreamUtil.java", - "android/java/src/org/chromium/base/StrictModeContext.java", - "android/java/src/org/chromium/base/SysUtils.java", - "android/java/src/org/chromium/base/ThreadUtils.java", - "android/java/src/org/chromium/base/TimeUtils.java", "android/java/src/org/chromium/base/TimezoneUtils.java", "android/java/src/org/chromium/base/Token.java", "android/java/src/org/chromium/base/TokenBase.java", - "android/java/src/org/chromium/base/TraceEvent.java", "android/java/src/org/chromium/base/UnguessableToken.java", - "android/java/src/org/chromium/base/UnownedUserData.java", - "android/java/src/org/chromium/base/UnownedUserDataHost.java", - "android/java/src/org/chromium/base/UnownedUserDataKey.java", "android/java/src/org/chromium/base/UserData.java", "android/java/src/org/chromium/base/UserDataHost.java", "android/java/src/org/chromium/base/ValueChangedCallback.java", "android/java/src/org/chromium/base/WrappedClassLoader.java", - "android/java/src/org/chromium/base/compat/ApiHelperForM.java", - "android/java/src/org/chromium/base/compat/ApiHelperForN.java", - "android/java/src/org/chromium/base/compat/ApiHelperForO.java", - "android/java/src/org/chromium/base/compat/ApiHelperForOMR1.java", - "android/java/src/org/chromium/base/compat/ApiHelperForP.java", - "android/java/src/org/chromium/base/compat/ApiHelperForQ.java", - "android/java/src/org/chromium/base/compat/ApiHelperForR.java", - "android/java/src/org/chromium/base/compat/ApiHelperForS.java", + ] + + if (use_clang_profiling) { + sources += [ + "test/android/javatests/src/org/chromium/base/test/ClangProfiler.java", + ] + } else { + sources += [ "test/android/javatests/src/stub/org/chromium/base/test/ClangProfiler.java" ] + } + + resources_package = "org.chromium.base" + + proguard_configs = [ "android/proguard/shared_with_cronet.flags" ] + public_deps = [ + ":activity_state_java", + ":api_helpers_java", + ":base_switches_java", + ":callback_java", + ":command_line_java", + ":jank_tracker_java", + ":library_loader_java", + ":lifetime_java", + ":log_java", + ":memory_java", + ":metrics_java", + ":promise_java", + ":resetters_java", + ":stream_util_java", + ":supplier_java", + ":sys_utils_java", + ":tasks_java", + ":time_utils_java", + ":unowned_user_data_java", + ] + if (!is_cronet_build) { + proguard_configs += [ + "android/proguard/chromium_apk.flags", + "android/proguard/remove_logging.flags", + ] + } + } + + generate_jni("metrics_jni") { + sources = [ + "android/java/src/org/chromium/base/metrics/NativeUmaRecorder.java", + "android/java/src/org/chromium/base/metrics/StatisticsRecorderAndroid.java", + ] + } + + java_cpp_enum("metrics_enum_srcjar") { + sources = [ "metrics/histogram_base.h" ] + } + + android_library("metrics_java") { + srcjar_deps = [ + ":metrics_enum_srcjar", + ":metrics_jni", + ] + sources = [ + "android/java/src/org/chromium/base/metrics/CachingUmaRecorder.java", + "android/java/src/org/chromium/base/metrics/HistogramBucket.java", + "android/java/src/org/chromium/base/metrics/NativeUmaRecorder.java", + "android/java/src/org/chromium/base/metrics/NoopUmaRecorder.java", + "android/java/src/org/chromium/base/metrics/RecordHistogram.java", + "android/java/src/org/chromium/base/metrics/RecordUserAction.java", + "android/java/src/org/chromium/base/metrics/ScopedSysTraceEvent.java", + "android/java/src/org/chromium/base/metrics/StatisticsRecorderAndroid.java", + "android/java/src/org/chromium/base/metrics/TimingMetric.java", + "android/java/src/org/chromium/base/metrics/UmaRecorder.java", + "android/java/src/org/chromium/base/metrics/UmaRecorderHolder.java", + ] + deps = [ + ":callback_java", + ":log_java", + ":time_utils_java", + "//build/android:build_java", + "//third_party/android_deps:com_google_code_findbugs_jsr305_java", + "//third_party/android_deps:com_google_errorprone_error_prone_annotations_java", + "//third_party/androidx:androidx_annotation_annotation_java", + "//third_party/jni_zero:jni_zero_java", + ] + } + + generate_jni("jank_tracker_jni") { + sources = [ "android/java/src/org/chromium/base/jank_tracker/JankMetricUMARecorder.java" ] + } + + android_library("jank_tracker_java") { + srcjar_deps = [ ":jank_tracker_jni" ] + sources = [ "android/java/src/org/chromium/base/jank_tracker/FrameMetricsListener.java", "android/java/src/org/chromium/base/jank_tracker/FrameMetricsStore.java", "android/java/src/org/chromium/base/jank_tracker/JankActivityTracker.java", @@ -4578,32 +4611,95 @@ if (is_android) { "android/java/src/org/chromium/base/jank_tracker/JankTrackerImpl.java", "android/java/src/org/chromium/base/jank_tracker/JankTrackerStateController.java", "android/java/src/org/chromium/base/jank_tracker/PlaceholderJankTracker.java", - "android/java/src/org/chromium/base/library_loader/LibraryLoader.java", - "android/java/src/org/chromium/base/library_loader/LibraryPrefetcher.java", - "android/java/src/org/chromium/base/library_loader/Linker.java", - "android/java/src/org/chromium/base/library_loader/LinkerJni.java", - "android/java/src/org/chromium/base/library_loader/LoaderErrors.java", - "android/java/src/org/chromium/base/library_loader/NativeLibraryPreloader.java", - "android/java/src/org/chromium/base/library_loader/ProcessInitException.java", - "android/java/src/org/chromium/base/lifetime/DestroyChecker.java", - "android/java/src/org/chromium/base/lifetime/Destroyable.java", + ] + deps = [ + ":activity_state_java", + ":lifetime_java", + ":log_java", + ":tasks_java", + ":time_utils_java", + "//build/android:build_java", + "//third_party/androidx:androidx_annotation_annotation_java", + "//third_party/jni_zero:jni_zero_java", + ] + } + + java_cpp_enum("memory_pressure_level_enum_srcjar") { + sources = [ "memory/memory_pressure_listener.h" ] + } + + generate_jni("memory_jni") { + sources = [ + "android/java/src/org/chromium/base/MemoryPressureListener.java", + "android/java/src/org/chromium/base/memory/JavaHeapDumpGenerator.java", + "android/java/src/org/chromium/base/memory/MemoryInfoBridge.java", + "android/java/src/org/chromium/base/memory/MemoryPurgeManager.java", + ] + } + + android_library("memory_java") { + srcjar_deps = [ + ":memory_jni", + ":memory_pressure_level_enum_srcjar", + ] + sources = [ + "android/java/src/org/chromium/base/MemoryPressureListener.java", "android/java/src/org/chromium/base/memory/JavaHeapDumpGenerator.java", "android/java/src/org/chromium/base/memory/MemoryInfoBridge.java", "android/java/src/org/chromium/base/memory/MemoryPressureCallback.java", "android/java/src/org/chromium/base/memory/MemoryPressureMonitor.java", "android/java/src/org/chromium/base/memory/MemoryPressureUma.java", "android/java/src/org/chromium/base/memory/MemoryPurgeManager.java", - "android/java/src/org/chromium/base/metrics/CachingUmaRecorder.java", - "android/java/src/org/chromium/base/metrics/HistogramBucket.java", - "android/java/src/org/chromium/base/metrics/NativeUmaRecorder.java", - "android/java/src/org/chromium/base/metrics/NoopUmaRecorder.java", - "android/java/src/org/chromium/base/metrics/RecordHistogram.java", - "android/java/src/org/chromium/base/metrics/RecordUserAction.java", - "android/java/src/org/chromium/base/metrics/ScopedSysTraceEvent.java", - "android/java/src/org/chromium/base/metrics/StatisticsRecorderAndroid.java", - "android/java/src/org/chromium/base/metrics/TimingMetric.java", - "android/java/src/org/chromium/base/metrics/UmaRecorder.java", - "android/java/src/org/chromium/base/metrics/UmaRecorderHolder.java", + ] + deps = [ + ":library_loader_java", + ":supplier_java", + ":tasks_java", + "//base:log_java", + "//base:metrics_java", + "//base:resetters_java", + "//base:time_utils_java", + "//third_party/androidx:androidx_annotation_annotation_java", + "//third_party/jni_zero:jni_zero_java", + ] + } + + android_library("lifetime_java") { + sources = [ + "android/java/src/org/chromium/base/LifetimeAssert.java", + "android/java/src/org/chromium/base/lifetime/DestroyChecker.java", + "android/java/src/org/chromium/base/lifetime/Destroyable.java", + ] + deps = [ + "//build/android:build_java", + "//third_party/androidx:androidx_annotation_annotation_java", + ] + } + + android_library("promise_java") { + sources = [ "android/java/src/org/chromium/base/Promise.java" ] + deps = [ + ":callback_java", + "//third_party/androidx:androidx_annotation_annotation_java", + ] + } + + android_library("unowned_user_data_java") { + sources = [ + "android/java/src/org/chromium/base/UnownedUserData.java", + "android/java/src/org/chromium/base/UnownedUserDataHost.java", + "android/java/src/org/chromium/base/UnownedUserDataKey.java", + ] + deps = [ + ":lifetime_java", + ":tasks_java", + "//build/android:build_java", + "//third_party/androidx:androidx_annotation_annotation_java", + ] + } + + android_library("supplier_java") { + sources = [ "android/java/src/org/chromium/base/supplier/DestroyableObservableSupplier.java", "android/java/src/org/chromium/base/supplier/LazyOneshotSupplier.java", "android/java/src/org/chromium/base/supplier/LazyOneshotSupplierImpl.java", @@ -4619,6 +4715,90 @@ if (is_android) { "android/java/src/org/chromium/base/supplier/TransitiveObservableSupplier.java", "android/java/src/org/chromium/base/supplier/UnownedUserDataSupplier.java", "android/java/src/org/chromium/base/supplier/UnwrapObservableSupplier.java", + ] + deps = [ + ":callback_java", + ":lifetime_java", + ":promise_java", + ":resetters_java", + ":tasks_java", + ":unowned_user_data_java", + "//third_party/androidx:androidx_annotation_annotation_java", + ] + } + android_library("time_utils_java") { + sources = [ "android/java/src/org/chromium/base/TimeUtils.java" ] + deps = [ "//build/android:build_java" ] + } + + generate_jni("callback_jni") { + sources = [ "android/java/src/org/chromium/base/Callback.java" ] + } + + android_library("callback_java") { + sources = [ "android/java/src/org/chromium/base/Callback.java" ] + deps = [ + "//build/android:build_java", + "//third_party/android_deps:com_google_code_findbugs_jsr305_java", + "//third_party/android_deps:com_google_errorprone_error_prone_annotations_java", + "//third_party/androidx:androidx_annotation_annotation_experimental_java", + "//third_party/androidx:androidx_annotation_annotation_java", + "//third_party/jni_zero:jni_zero_java", + ] + } + + java_cpp_enum("library_loader_java_enums_srcjar") { + sources = [ "android/library_loader/library_loader_hooks.h" ] + } + + generate_jni("library_loader_jni") { + sources = [ + "android/java/src/org/chromium/base/library_loader/LibraryLoader.java", + "android/java/src/org/chromium/base/library_loader/LibraryPrefetcher.java", + ] + } + + generate_jni("tasks_jni") { + sources = [ + "android/java/src/org/chromium/base/ApplicationStatus.java", + "android/java/src/org/chromium/base/EarlyTraceEvent.java", + "android/java/src/org/chromium/base/ThreadUtils.java", + "android/java/src/org/chromium/base/TraceEvent.java", + "android/java/src/org/chromium/base/task/PostTask.java", + "android/java/src/org/chromium/base/task/TaskRunnerImpl.java", + ] + } + + java_cpp_enum("task_trait_enum_srcjar") { + sources = [ + "android/task_scheduler/task_runner_android.h", + "android/task_scheduler/task_traits_android.h", + ] + } + + android_library("tasks_java") { + srcjar_deps = [ + ":task_trait_enum_srcjar", + ":tasks_jni", + ] + sources = [ + # Dependencies added after this comment is tech-debt, should be untangled + # and moved to their own separate android_library. + "android/java/src/org/chromium/base/ApiCompatibilityUtils.java", + "android/java/src/org/chromium/base/ApplicationStatus.java", + "android/java/src/org/chromium/base/ContextUtils.java", + "android/java/src/org/chromium/base/EarlyTraceEvent.java", + "android/java/src/org/chromium/base/ObserverList.java", + "android/java/src/org/chromium/base/StrictModeContext.java", + "android/java/src/org/chromium/base/ThreadUtils.java", + "android/java/src/org/chromium/base/TraceEvent.java", + + # End of cyclic dependencies. + # The root of the problem stems from the fact that tasks/* depends + # on source code outside of task which created a harsh cycle + # dependency between AsyncTask -> TraceEvent -> ThreadUtil -> + # PostTask -> AsyncTask. This should be solved by making everything inside + # task/* self contained. "android/java/src/org/chromium/base/task/AsyncTask.java", "android/java/src/org/chromium/base/task/BackgroundOnlyAsyncTask.java", "android/java/src/org/chromium/base/task/ChainedTasks.java", @@ -4635,24 +4815,143 @@ if (is_android) { "android/java/src/org/chromium/base/task/ThreadPoolTaskExecutor.java", "android/java/src/org/chromium/base/task/UiThreadTaskExecutor.java", ] + deps = [ + ":activity_state_java", + ":base_switches_java", + ":command_line_java", + ":log_java", + ":metrics_java", + ":resetters_java", + ":time_utils_java", + "//build/android:build_java", + "//third_party/android_deps:com_google_code_findbugs_jsr305_java", + "//third_party/androidx:androidx_annotation_annotation_java", + "//third_party/jni_zero:jni_zero_java", + ] + } + android_library("log_java") { + sources = [ "android/java/src/org/chromium/base/Log.java" ] + deps = [ "//build/android:build_java" ] + } - if (use_clang_profiling) { - sources += [ - "test/android/javatests/src/org/chromium/base/test/ClangProfiler.java", - ] - } else { - sources += [ "test/android/javatests/src/stub/org/chromium/base/test/ClangProfiler.java" ] - } + generate_jni("command_line_jni") { + sources = [ "android/java/src/org/chromium/base/CommandLine.java" ] + } + android_library("command_line_java") { + srcjar_deps = [ ":command_line_jni" ] + sources = [ "android/java/src/org/chromium/base/CommandLine.java" ] + deps = [ + ":log_java", + "//third_party/androidx:androidx_annotation_annotation_experimental_java", + "//third_party/androidx:androidx_annotation_annotation_java", + "//third_party/jni_zero:jni_zero_java", + ] + } - resources_package = "org.chromium.base" + android_library("activity_state_java") { + srcjar_deps = [ ":application_status_enum_srcjar" ] + sources = [ + "android/java/src/org/chromium/base/ActivityLifecycleCallbacksAdapter.java", + "android/java/src/org/chromium/base/ActivityState.java", + ] + deps = [ "//third_party/androidx:androidx_annotation_annotation_java" ] + } - proguard_configs = [ "android/proguard/shared_with_cronet.flags" ] - if (!is_cronet_build) { - proguard_configs += [ - "android/proguard/chromium_apk.flags", - "android/proguard/remove_logging.flags", - ] - } + java_cpp_enum("application_status_enum_srcjar") { + sources = [ "android/application_status_listener.h" ] + } + + android_library("resetters_java") { + deps = [ + "//build/android:build_java", + "//third_party/androidx:androidx_annotation_annotation_experimental_java", + "//third_party/androidx:androidx_annotation_annotation_java", + ] + sources = [ "android/java/src/org/chromium/base/ResettersForTesting.java" ] + } + + generate_jni("sys_utils_jni") { + sources = [ "android/java/src/org/chromium/base/SysUtils.java" ] + } + + java_cpp_enum("sys_utils_enum_srcjar") { + sources = [ "android/linker/linker_jni.h" ] + } + + android_library("sys_utils_java") { + srcjar_deps = [ + ":sys_utils_enum_srcjar", + ":sys_utils_jni", + ] + sources = [ "android/java/src/org/chromium/base/SysUtils.java" ] + deps = [ + ":tasks_java", + "//build/android:build_java", + "//third_party/androidx:androidx_annotation_annotation_java", + "//third_party/jni_zero:jni_zero_java", + ] + } + + android_library("stream_util_java") { + sources = [ "android/java/src/org/chromium/base/StreamUtil.java" ] + } + + android_library("library_loader_java") { + srcjar_deps = [ + ":library_loader_java_enums_srcjar", + ":library_loader_jni", + ] + sources = [ + "android/java/src/org/chromium/base/library_loader/LibraryLoader.java", + "android/java/src/org/chromium/base/library_loader/LibraryPrefetcher.java", + "android/java/src/org/chromium/base/library_loader/Linker.java", + "android/java/src/org/chromium/base/library_loader/LinkerJni.java", + "android/java/src/org/chromium/base/library_loader/LoaderErrors.java", + "android/java/src/org/chromium/base/library_loader/NativeLibraryPreloader.java", + "android/java/src/org/chromium/base/library_loader/ProcessInitException.java", + ] + + deps = [ + ":base_switches_java", + ":callback_java", + ":command_line_java", + ":log_java", + ":metrics_java", + ":resetters_java", + ":stream_util_java", + ":sys_utils_java", + ":tasks_java", + ":time_utils_java", + "//build/android:build_java", + "//third_party/android_deps:com_google_code_findbugs_jsr305_java", + "//third_party/android_deps:com_google_errorprone_error_prone_annotations_java", + "//third_party/androidx:androidx_annotation_annotation_experimental_java", + "//third_party/androidx:androidx_annotation_annotation_java", + "//third_party/jni_zero:jni_zero_java", + ] + } + + # TODO(crbug.com/40825179): Delete these targets and inline their calls. + android_library("api_helpers_java") { + sources = [ + "android/java/src/org/chromium/base/compat/ApiHelperForM.java", + "android/java/src/org/chromium/base/compat/ApiHelperForN.java", + "android/java/src/org/chromium/base/compat/ApiHelperForO.java", + "android/java/src/org/chromium/base/compat/ApiHelperForOMR1.java", + "android/java/src/org/chromium/base/compat/ApiHelperForP.java", + "android/java/src/org/chromium/base/compat/ApiHelperForQ.java", + "android/java/src/org/chromium/base/compat/ApiHelperForR.java", + "android/java/src/org/chromium/base/compat/ApiHelperForS.java", + ] + deps = [ + ":callback_java", + ":log_java", + ":tasks_java", + "//build/android:build_java", + "//third_party/androidx:androidx_annotation_annotation_experimental_java", + "//third_party/androidx:androidx_annotation_annotation_java", + "//third_party/jni_zero:jni_zero_java", + ] } android_library("base_shared_preferences_java") { @@ -4819,12 +5118,10 @@ if (is_android) { "test/android/javatests/src/org/chromium/base/test/BaseActivityTestRule.java", "test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java", "test/android/javatests/src/org/chromium/base/test/BaseJUnit4ClassRunner.java", - "test/android/javatests/src/org/chromium/base/test/BaseJUnit4TestRule.java", "test/android/javatests/src/org/chromium/base/test/LoadNative.java", - "test/android/javatests/src/org/chromium/base/test/MockitoErrorHandler.java", "test/android/javatests/src/org/chromium/base/test/ScreenshotOnFailureStatement.java", + "test/android/javatests/src/org/chromium/base/test/SharedPreferencesTestUtil.java", "test/android/javatests/src/org/chromium/base/test/TestTraceEvent.java", - "test/android/javatests/src/org/chromium/base/test/UnitTestLifetimeAssertRule.java", "test/android/javatests/src/org/chromium/base/test/params/BaseJUnit4RunnerDelegate.java", "test/android/javatests/src/org/chromium/base/test/params/BlockJUnit4RunnerDelegate.java", "test/android/javatests/src/org/chromium/base/test/params/MethodParamAnnotationRule.java", @@ -4845,6 +5142,7 @@ if (is_android) { "test/android/javatests/src/org/chromium/base/test/util/AnnotationRule.java", "test/android/javatests/src/org/chromium/base/test/util/ApplicationContextWrapper.java", "test/android/javatests/src/org/chromium/base/test/util/ApplicationTestUtils.java", + "test/android/javatests/src/org/chromium/base/test/util/BaseRestrictions.java", "test/android/javatests/src/org/chromium/base/test/util/Batch.java", "test/android/javatests/src/org/chromium/base/test/util/CallbackHelper.java", "test/android/javatests/src/org/chromium/base/test/util/CommandLineFlags.java", @@ -4858,7 +5156,6 @@ if (is_android) { "test/android/javatests/src/org/chromium/base/test/util/DoNotRevive.java", "test/android/javatests/src/org/chromium/base/test/util/DumpThreadsOnFailureRule.java", "test/android/javatests/src/org/chromium/base/test/util/EnormousTest.java", - "test/android/javatests/src/org/chromium/base/test/util/EspressoIdleTimeoutRule.java", "test/android/javatests/src/org/chromium/base/test/util/Feature.java", "test/android/javatests/src/org/chromium/base/test/util/Features.java", "test/android/javatests/src/org/chromium/base/test/util/FieldTrials.java", @@ -4986,6 +5283,7 @@ if (is_android) { "android/junit/src/org/chromium/base/PostNativeFlagUnitTest.java", "android/junit/src/org/chromium/base/PromiseTest.java", "android/junit/src/org/chromium/base/ResettersForTestingTest.java", + "android/junit/src/org/chromium/base/ThreadUtilsTest.java", "android/junit/src/org/chromium/base/TimeUtilsTest.java", "android/junit/src/org/chromium/base/TokenUnitTest.java", "android/junit/src/org/chromium/base/TraceEventTest.java", @@ -5062,14 +5360,7 @@ if (is_android) { java_cpp_enum("base_android_java_enums_srcjar") { sources = [ - "android/application_status_listener.h", "android/child_process_binding_types.h", - "android/library_loader/library_loader_hooks.h", - "android/linker/linker_jni.h", - "android/task_scheduler/task_runner_android.h", - "android/task_scheduler/task_traits_android.h", - "memory/memory_pressure_listener.h", - "metrics/histogram_base.h", "process/kill.h", "task/task_traits.h", ] diff --git a/src/build/config/android/config.gni b/src/build/config/android/config.gni index 89c5b1fd749..0c60ec12830 100644 --- a/src/build/config/android/config.gni +++ b/src/build/config/android/config.gni @@ -225,10 +225,10 @@ if (is_android || is_chromeos) { # Forced Android versionCode - android_override_version_code = "112" + android_override_version_code = "130" # Forced Android versionName - android_override_version_name = "0.90" + android_override_version_name = "1.01" # The path to the keystore to use for signing builds. android_keystore_path = default_android_keystore_path diff --git a/src/cc/trees/layer_tree_host_impl.cc b/src/cc/trees/layer_tree_host_impl.cc index a8a9594fb52..a674977b25b 100644 --- a/src/cc/trees/layer_tree_host_impl.cc +++ b/src/cc/trees/layer_tree_host_impl.cc @@ -268,7 +268,9 @@ class LayerTreeHostImpl::ImageDecodeCacheHolder { private: std::unique_ptr image_decode_cache_; - raw_ptr image_decode_cache_ptr_ = nullptr; + // RAW_PTR_EXCLUSION: ImageDecodeCache is marked as not supported by raw_ptr. + // See raw_ptr.h for more information. + RAW_PTR_EXCLUSION ImageDecodeCache* image_decode_cache_ptr_ = nullptr; }; void LayerTreeHostImpl::DidUpdateScrollAnimationCurve() { diff --git a/src/chrome/android/BUILD.gn b/src/chrome/android/BUILD.gn index 257d2e03c0a..40867baef1e 100644 --- a/src/chrome/android/BUILD.gn +++ b/src/chrome/android/BUILD.gn @@ -754,7 +754,6 @@ if (current_toolchain == default_toolchain) { "//url:gurl_java", "//url/mojom:url_mojom_gurl_java", "//url/mojom:url_mojom_origin_java", - ] deps += feed_deps diff --git a/src/chrome/android/chrome_java_sources.gni b/src/chrome/android/chrome_java_sources.gni index 398a31524b2..f469ba2b61a 100644 --- a/src/chrome/android/chrome_java_sources.gni +++ b/src/chrome/android/chrome_java_sources.gni @@ -233,7 +233,6 @@ chrome_java_sources = [ "java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowProperties.java", "java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowView.java", "java/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowViewBinder.java", - "java/src/org/chromium/chrome/browser/bookmarks/PageImageServiceQueue.java", "java/src/org/chromium/chrome/browser/bookmarks/PendingRunnable.java", "java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkMetrics.java", "java/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkUtils.java", diff --git a/src/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java b/src/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java index 4945b4d6d52..b27c4a6a425 100644 --- a/src/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java +++ b/src/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java @@ -1356,4 +1356,4 @@ void updateBackgroundColor(PropertyModel propertyModel) { void setIsIncognitoForTesting(boolean isIncognito) { mIsIncognito = isIncognito; } -} \ No newline at end of file +} diff --git a/src/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java b/src/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java index 79e8609795d..c2afaddc7d3 100644 --- a/src/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java +++ b/src/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java @@ -16,6 +16,7 @@ import android.view.View.OnLayoutChangeListener; import android.view.ViewGroup; import android.widget.ImageView; + import android.os.Parcel; import android.os.Parcelable; import androidx.annotation.IntDef; @@ -26,11 +27,11 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView.OnItemTouchListener; + import android.content.res.Configuration; import org.chromium.base.Callback; import org.chromium.base.Log; import org.chromium.base.TraceEvent; -import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.supplier.Supplier; import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; @@ -497,7 +498,8 @@ public void onLayoutCompleted(RecyclerView.State state) { .getDecorView() .getWindowVisibleDisplayFrame(frame); updateGridCardLayout(frame.width()); - } else if (mMode == TabListMode.STRIP) { + } else if (mMode == TabListMode.STRIP + || mMode == TabListMode.LIST) { LinearLayoutManager layoutManager = new LinearLayoutManager( context, @@ -512,17 +514,6 @@ public void onLayoutCompleted(RecyclerView.State state) { } }; mRecyclerView.setLayoutManager(layoutManager); - } else if (mMode == TabListMode.LIST) { - LinearLayoutManager layout = - new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) { - @Override - public void onLayoutCompleted(RecyclerView.State state) { - super.onLayoutCompleted(state); - checkAwaitingLayout(); - } - }; - layout.setStackFromEnd(true); - mRecyclerView.setLayoutManager(layout); } mMediator.setRecyclerViewItemAnimationToggle(mRecyclerView::setDisableItemAnimations); } @@ -545,6 +536,11 @@ public void onLayoutCompleted(RecyclerView.State state) { } } + /** Returns the {@link TabListMode} of the coordinator. */ + public @TabListMode int getTabListMode() { + return mMode; + } + /** * @param onLongPressTabItemEventListener to handle long press events on tabs. */ @@ -1006,4 +1002,4 @@ private int getIndexForTabId(int tabId) { void showQuickDeleteAnimation(Runnable onAnimationEnd, List tabs) { mMediator.showQuickDeleteAnimation(onAnimationEnd, tabs, mRecyclerView); } -} \ No newline at end of file +} diff --git a/src/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEmptyCoordinator.java b/src/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEmptyCoordinator.java index f7aedb66011..913cd5e1ec3 100644 --- a/src/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEmptyCoordinator.java +++ b/src/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEmptyCoordinator.java @@ -127,9 +127,7 @@ public void attachEmptyView() { FrameLayout.LayoutParams emptyViewParams = (FrameLayout.LayoutParams) mEmptyView.getLayoutParams(); int toolbarHeightPx = mBrowserControlsStateProvider.getTopControlsHeight(); - emptyViewParams.bottomMargin = toolbarHeightPx; - mEmptyView.setLayoutParams(emptyViewParams); } setEmptyViewVisibility(View.GONE); diff --git a/src/chrome/android/java/AndroidManifest.xml b/src/chrome/android/java/AndroidManifest.xml index c4864839a83..90a150acb0c 100644 --- a/src/chrome/android/java/AndroidManifest.xml +++ b/src/chrome/android/java/AndroidManifest.xml @@ -1546,4 +1546,3 @@ by a child template that "extends" this file. {% block extra_root_definitions %} {% endblock %} - diff --git a/src/chrome/android/java/res/values/styles.xml b/src/chrome/android/java/res/values/styles.xml index 46ac85a3b85..ae81568ebd9 100644 --- a/src/chrome/android/java/res/values/styles.xml +++ b/src/chrome/android/java/res/values/styles.xml @@ -344,7 +344,7 @@ found in the LICENSE file. dialog is shown on tablet. --> - + diff --git a/src/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplicationImpl.java b/src/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplicationImpl.java index b3992e5106e..175b82267c7 100644 --- a/src/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplicationImpl.java +++ b/src/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplicationImpl.java @@ -60,32 +60,7 @@ public void onCreate() { if (SplitCompatApplication.isBrowserProcess()) { Log.e(TAG, "Initializing Chrome browser process"); - - // Initialize Branch SDK first - try { - Log.e(TAG, "Initializing Branch SDK"); - - // For Android 9, we need to set the user agent string before initialization - if (android.os.Build.VERSION.SDK_INT == android.os.Build.VERSION_CODES.P) { - Log.e(TAG, "Setting user agent string for Android 9"); - - // Set system user agent property to avoid WebView PacProcessor crash on Android 9 - System.setProperty("http.agent", "Mozilla/5.0 (Linux; Android 9; Mobile) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36"); - - // Tell Branch SDK to use synchronous user agent fetching on Android 9 - // This avoids the coroutine that causes the crash - Branch.setIsUserAgentSync(true); - } - - // Initialize Branch SDK as normal - io.branch.referral.Branch.enableLogging(); - io.branch.referral.Branch branch = io.branch.referral.Branch.getAutoInstance(getApplication()); - Log.e(TAG, "Branch SDK initialized successfully"); - - } catch (Exception e) { - Log.e(TAG, "Error initializing Branch SDK: " + e.getMessage(), e); - } - + // Check Android version checkAndroidVersion(); diff --git a/src/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/src/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java index 995e2a807ad..6c2a9878371 100644 --- a/src/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/src/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java @@ -271,7 +271,6 @@ import io.branch.referral.Branch; import io.branch.referral.BranchError; import org.chromium.chrome.browser.IntentHandler; -import org.chromium.chrome.browser.ChromeTabbedActivity; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -291,6 +290,7 @@ public class ChromeTabbedActivity extends ChromeActivity implements MismatchedIndicesHandler { private static final String TAG = "ChromeTabbedActivity"; + private boolean isFirstRun = true; protected static final String WINDOW_INDEX = "window_index"; @@ -1650,7 +1650,6 @@ public void initializeState() { try { TraceEvent.begin("ChromeTabbedActivity.initializeState"); - // Get the default extension from SharedPreferences super.initializeState(); Log.i(TAG, "#initializeState"); Intent intent = getIntent(); @@ -1848,7 +1847,6 @@ private boolean hasStartWithNativeBeenCalled() { /** Create an initial tab for cold start without restored tabs. */ private void createInitialTab() { Log.i(TAG, "#createInitialTab executed."); - mPendingInitialTabCreation = false; // If the start surface or grid tab switcher will be shown on start, do not create a new @@ -1856,19 +1854,19 @@ private void createInitialTab() { String url = null; boolean shouldShowOverviewPageOnStart = shouldShowOverviewPageOnStart(); if (!shouldShowOverviewPageOnStart) { - GURL homepageGurl = HomepageManager.getInstance().getHomepageGurl(); - if (homepageGurl.isEmpty()) { + GURL homepageGurl = HomepageManager.getInstance().getHomepageGurl(); + if (homepageGurl.isEmpty()) { + url = UrlConstants.NTP_URL; + } else { + // Migrate legacy NTP URLs (chrome://newtab) to the newer format + // (chrome-native://newtab) + if (UrlUtilities.isNtpUrl(homepageGurl)) { url = UrlConstants.NTP_URL; } else { - // Migrate legacy NTP URLs (chrome://newtab) to the newer format - // (chrome-native://newtab) - if (UrlUtilities.isNtpUrl(homepageGurl)) { - url = UrlConstants.NTP_URL; - } else { - url = homepageGurl.getSpec(); - } + url = homepageGurl.getSpec(); } - getTabCreator(false).launchUrl(url, TabLaunchType.FROM_STARTUP); + } + getTabCreator(false).launchUrl(url, TabLaunchType.FROM_STARTUP); // Check if this is first run using SharedPreferences instead of a local variable SharedPreferences prefs = getSharedPreferences( @@ -1911,7 +1909,6 @@ private void createInitialTab() { maybeLaunchHistory(); } - private void recordExternalIntentSourceUMA(Intent intent) { @IntentHandler.ExternalAppId int externalId = IntentHandler.determineExternalIntentSource(intent); @@ -2064,7 +2061,8 @@ private void processUrlViewIntent( return; } - if (!IncognitoUtils.isIncognitoModeEnabled()) { + if (!IncognitoUtils.isIncognitoModeEnabled( + getProfileProviderSupplier().get().getOriginalProfile())) { // The incognito launcher shortcut is manipulated in #onDeferredStartup(), // so it's possible for a user to invoke the shortcut before it's disabled. // Quick actions search widget is installed on the home screen and may @@ -2212,8 +2210,6 @@ private boolean maybeLaunchDraggedTabInWindow(Intent intent) { public void performPreInflationStartup() { super.performPreInflationStartup(); - - // Android FrameMetrics allow tracking of java views and their deadline misses (frame // drops/janks). if (ChromeFeatureList.sCollectAndroidFrameTimelineMetrics.isEnabled()) { @@ -2724,7 +2720,8 @@ private void onDeferredStartup() { return; } - LauncherShortcutActivity.updateIncognitoShortcut(ChromeTabbedActivity.this); + LauncherShortcutActivity.updateIncognitoShortcut( + ChromeTabbedActivity.this, mTabModelProfileSupplier.get()); ChromeSurveyController.initialize( mTabModelSelector, @@ -2940,9 +2937,10 @@ public boolean onMenuOrKeyboardAction(final int id, boolean fromMenu) { mLocaleManager.showSearchEnginePromoIfNeeded(this, null); } else if (id == R.id.new_incognito_tab_menu_id) { - if (IncognitoUtils.isIncognitoModeEnabled()) { - if (!mTabModelSelector.isTabStateInitialized()) return false; + if (!mTabModelSelector.isTabStateInitialized()) return false; + Profile profile = mTabModelSelector.getCurrentModel().getProfile(); + if (IncognitoUtils.isIncognitoModeEnabled(profile)) { getTabModelSelector().getModel(false).commitAllTabClosures(); // This action must be recorded before opening the incognito tab since UMA actions // are dropped when an incognito tab is open. @@ -2951,9 +2949,7 @@ public boolean onMenuOrKeyboardAction(final int id, boolean fromMenu) { reportNewTabShortcutUsed(true); if (fromMenu) RecordUserAction.record("MobileMenuNewIncognitoTab.AppMenu"); getTabCreator(true).launchNtp(); - Tracker tracker = - TrackerFactory.getTrackerForProfile( - mTabModelSelector.getCurrentModel().getProfile()); + Tracker tracker = TrackerFactory.getTrackerForProfile(profile); tracker.notifyEvent(EventConstants.APP_MENU_NEW_INCOGNITO_TAB_CLICKED); } } else if (id == R.id.all_bookmarks_menu_id) { @@ -3818,11 +3814,14 @@ private boolean shouldShowOverviewPageOnStart() { public void onStart() { try (TraceEvent e = TraceEvent.scoped("ChromeTabbedActivity.onStart")) { super.onStart(); - + JSONObject firstReferringParams = Branch.getInstance().getFirstReferringParams(); Log.e(TAG, "First referring params: " + firstReferringParams.toString()); handleBranchDeepLinkParams(firstReferringParams); } + catch(Exception ex) { + Log.e(TAG, "Exception in onStart", ex); + } } @Override diff --git a/src/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java b/src/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java index 0c06554d572..9397ec90006 100644 --- a/src/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java +++ b/src/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java @@ -115,6 +115,15 @@ public static String extractUtmParameter(Uri uri, String paramName) { * @param intent The intent to check. * @return True if the splash screen was shown, false otherwise. */ + public static boolean checkAndShowCustomSplash(Activity activity, Intent intent) { + if (intent != null && intent.getData() != null) { + Uri uri = intent.getData(); + String utmSource = extractUtmParameter(uri, "utm_source"); + Log.e("IntentHandler", "UTM source: of the god itself " + (utmSource != null ? utmSource : "null")); + // onIntentReceived(intent); + } + return false; + } /** Tab ID to use when creating a new Tab. */ private static final String EXTRA_TAB_ID = "com.android.chrome.tab_id"; diff --git a/src/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java b/src/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java index 19eeda0fa47..d3bfe825e68 100644 --- a/src/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java +++ b/src/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java @@ -63,7 +63,6 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.toolbar.ToolbarManager; import org.chromium.chrome.browser.translate.TranslateUtils; -// import org.chromium.chrome.browser.ui.appmenu.AppMenu; import org.chromium.chrome.browser.ui.appmenu.AppMenuHandler; import org.chromium.chrome.browser.ui.appmenu.AppMenuHandler.AppMenuItemType; import org.chromium.chrome.browser.ui.appmenu.AppMenuItemProperties; @@ -374,6 +373,7 @@ ModelList getMenuItemsForMenu( propertyModel.set(AppMenuItemProperties.SUPPORT_ENTER_ANIMATION, true); propertyModel.set(AppMenuItemProperties.MENU_ICON_AT_START, isMenuIconAtStart()); propertyModel.set(AppMenuItemProperties.TITLE_CONDENSED, getContentDescription(item)); + propertyModel.set(AppMenuItemProperties.MANAGED, isMenuItemManaged(item)); if (item.hasSubMenu()) { // Only support top level menu items have SUBMENU, and a SUBMENU item cannot have a // SUBMENU. @@ -1099,6 +1099,15 @@ private void maybeInsertReadAloudItem(MenuItem item) { } } + /** Return whether the given {@link MenuItem} is managed by policy. */ + protected boolean isMenuItemManaged(MenuItem item) { + if (item.getItemId() == R.id.new_incognito_tab_menu_id) { + return IncognitoUtils.isIncognitoModeManaged( + mTabModelSelector.getCurrentModel().getProfile()); + } + return false; + } + /** Returns true if a badge (i.e. a red-dot) should be shown on the menu item icon. */ protected boolean shouldShowBadgeOnMenuItemIcon(MenuItem item) { if (item.getItemId() == R.id.preferences_id) { @@ -1407,7 +1416,8 @@ protected void updateManagedByMenuItem(Menu menu, @Nullable Tab currentTab) { @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE) public boolean isIncognitoEnabled() { - return IncognitoUtils.isIncognitoModeEnabled(); + return IncognitoUtils.isIncognitoModeEnabled( + mTabModelSelector.getCurrentModel().getProfile()); } static void setPageBookmarkedForTesting(Boolean bookmarked) { diff --git a/src/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java b/src/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java index a070d7d3fc4..6195eaefbd8 100644 --- a/src/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java +++ b/src/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java @@ -92,7 +92,6 @@ import org.chromium.ui.mojom.VirtualKeyboardMode; import org.chromium.ui.resources.ResourceManager; import org.chromium.ui.resources.dynamics.DynamicResourceLoader; -import org.chromium.chrome.browser.flags.ChromeFeatureList; import java.util.ArrayList; import java.util.HashSet; @@ -610,7 +609,7 @@ public void setApplicationViewportInsetSupplier(ApplicationViewportInsetSupplier // state changes while fullscreened and is used to simulate a view resize. This is only needed // if the page has opted in to keyboard resizes. private void handleWindowInsetChanged() { - if (mApplicationBottomInsetSupplier != null + if (mApplicationBottomInsetSupplier != null && mApplicationBottomInsetSupplier.insetsAffectWebContentsSize()) { tryUpdateControlsAndWebContentsSizing(); } @@ -895,7 +894,7 @@ void updateWebContentsSize(Tab tab) { // TODO(crbug.com/40767446): Centralize the logic for calculating bottom insets by // merging them into ApplicationBottomInsetSupplier. int controlsInsets = 0; - if (mBrowserControlsManager != null) { + if (mBrowserControlsManager != null) { int controlsMinHeight = mBrowserControlsManager.getTopControlsMinHeight() + mBrowserControlsManager.getBottomControlsMinHeight(); @@ -1114,7 +1113,7 @@ private void updateContentViewChildrenDimension() { TraceEvent.begin("CompositorViewHolder:updateContentViewChildrenDimension"); ViewGroup view = getContentView(); if (view != null) { - assert mBrowserControlsManager != null; + assert mBrowserControlsManager != null; float topViewsTranslation = mBrowserControlsManager.getTopVisibleContentOffset(); float bottomMargin = BrowserControlsUtils.getBottomContentOffset(mBrowserControlsManager); @@ -1845,4 +1844,4 @@ void setCompositorViewForTesting(CompositorView compositorView) { public int getVirtualKeyboardModeForTesting() { return mVirtualKeyboardMode; } -} \ No newline at end of file +} diff --git a/src/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java b/src/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java index e350cabc2d5..5baf37b29a4 100644 --- a/src/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java +++ b/src/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java @@ -424,9 +424,9 @@ public void didRemoveTabGroup( // Animation states. True while the relevant animations are running, and false otherwise. private boolean mMultiStepTabCloseAnimRunning; + private boolean mNewTabButtonAnimRunning; private boolean mTabGroupMarginAnimRunning; private boolean mTabResizeAnimRunning; - private boolean mGroupCollapsingOrExpanding; private boolean mGroupTitleSliding; private boolean mTabCreating; @@ -750,7 +750,7 @@ private float getFadeOpacity(boolean isLeft) { boolean isRtl = LocalizationUtils.isLayoutRtl(); boolean useUnadjustedScrollOffset = isRtl != isLeft; float offset = - -Math.abs(useUnadjustedScrollOffset ? mScrollOffset : (mMinScrollOffset - mScrollOffset)); + -(useUnadjustedScrollOffset ? mScrollOffset : (mMinScrollOffset - mScrollOffset)); if (offset <= 0.f) { return 0.f; @@ -2123,6 +2123,7 @@ private void runTabRemovalAnimation(StripLayoutTab tab, AnimatorListener listene ANIM_TAB_CLOSED_MS)); // 2. Start the animation. + mNewTabButtonAnimRunning = true; mMultiStepTabCloseAnimRunning = true; startAnimationList(tabClosingAnimators, listener); } @@ -2138,24 +2139,25 @@ private void resizeStripOnTabClose(Tab closedTab) { updateScrollOffsetLimits(); computeTabInitialPositions(); - // 3. Add drawX animators to reposition the views correctly. + // 3. Animate the tabs sliding to their idealX. for (int i = 0; i < mStripViews.length; ++i) { final StripLayoutView view = mStripViews[i]; CompositorAnimator drawXAnimator = CompositorAnimator.ofFloatProperty( mUpdateHost.getAnimationHandler(), view, - StripLayoutView.DRAW_X, - view.getDrawX(), - view.getIdealX(), + StripLayoutView.X_OFFSET, + view.getDrawX() - view.getIdealX(), + 0.f, ANIM_TAB_DRAW_X_MS); tabStripAnimators.add(drawXAnimator); } // 4. Add new tab button offset animation. - CompositorAnimator newTabButtonOffsetAnimator = updateNewTabButtonState(true); - if (newTabButtonOffsetAnimator != null) { - tabStripAnimators.add(newTabButtonOffsetAnimator); + if (mStripTabs[mStripTabs.length - 1].isClosed()) { + tabStripAnimators.add(getLastTabClosedNtbAnimator()); + } else { + mNewTabButtonAnimRunning = false; } // 5. Add animation completion listener and start animations. @@ -2319,6 +2321,7 @@ public void finishAnimationsAndPushTabUpdates() { // 3. Pass the close notifications to the model if the tab isn't already closing. // Do this as a post task as if more tabs are added inside commit all tab closures that // is a concurrent modification exception. + for (StripLayoutTab tab : tabsToRemove) tab.setIsClosed(true); PostTask.postTask( TaskTraits.UI_DEFAULT, () -> { @@ -2497,17 +2500,9 @@ public void releaseResourcesForGroupTitle(int rootId) { private AnimatorListener getCollapseAnimatorListener( StripLayoutGroupTitle collapsedGroupTitle) { return new AnimatorListenerAdapter() { - @Override - public void onAnimationStart(Animator animation) { - mGroupCollapsingOrExpanding = true; - } - @Override public void onAnimationEnd(Animator animation) { - if (collapsedGroupTitle != null) { - collapsedGroupTitle.setBottomIndicatorWidth(0.f); - } - mGroupCollapsingOrExpanding = false; + if (collapsedGroupTitle != null) collapsedGroupTitle.setBottomIndicatorWidth(0.f); } }; } @@ -2965,7 +2960,7 @@ private int getNumLiveTabs() { for (int i = 0; i < mStripTabs.length; i++) { final StripLayoutTab tab = mStripTabs[i]; - if (!tab.isDying() && !tab.isDraggedOffStrip() && !tab.isCollapsed()) numLiveTabs++; + if (!tab.isClosed() && !tab.isDraggedOffStrip() && !tab.isCollapsed()) numLiveTabs++; } return numLiveTabs; @@ -3013,6 +3008,7 @@ private List computeAndUpdateTabWidth( for (int i = 0; i < mStripTabs.length; i++) { StripLayoutTab tab = mStripTabs[i]; + if (tab.isClosed()) tab.setWidth(mTabOverlapWidth); if (tab.isDying() || tab.isCollapsed()) continue; if (resizeAnimationList != null) { CompositorAnimator animator = @@ -3106,12 +3102,7 @@ private void updateStrip() { // 3. Calculate the tab stacking and ensure that tabs are sized correctly. mStripStacker.setViewOffsets( - mStripViews, - mMultiStepTabCloseAnimRunning, - mTabCreating, - mGroupTitleSliding, - mGroupCollapsingOrExpanding, - mCachedTabWidth); + mStripViews, mTabCreating, mGroupTitleSliding, mCachedTabWidth); // 4. Calculate which tabs are visible. float stripWidth = getVisibleRightBound() - getVisibleLeftBound(); @@ -3122,9 +3113,7 @@ private void updateStrip() { // 6. Figure out where to put the new tab button. If a tab is being closed, the new tab // button position will be updated with the tab resize and drawX animations. - if (!mMultiStepTabCloseAnimRunning) { - updateNewTabButtonState(false); - } + if (!mNewTabButtonAnimRunning) updateNewTabButtonState(); // 7. Invalidate the accessibility provider in case the visible virtual views have changed. mRenderHost.invalidateAccessibilityProvider(); @@ -3139,34 +3128,35 @@ private void updateStrip() { updateTouchableRect(); } - private void computeTabInitialPositions() { + private float getTabPositionStart() { // Shift all of the tabs over by the the left margin because we're // no longer base lined at 0 - float tabPosition; if (!LocalizationUtils.isLayoutRtl()) { - tabPosition = mScrollOffset + mLeftMargin + mStripStartMarginForReorder; + return mScrollOffset + mLeftMargin + mStripStartMarginForReorder; } else { - tabPosition = - mWidth - - mCachedTabWidth - - mScrollOffset - - mRightMargin - - mStripStartMarginForReorder; + return mWidth + - mCachedTabWidth + - mScrollOffset + - mRightMargin + - mStripStartMarginForReorder; } + } + private void computeTabInitialPositions() { + float tabPosition = getTabPositionStart(); for (int i = 0; i < mStripViews.length; i++) { final StripLayoutView view = mStripViews[i]; - // idealX represents where a tab should be placed in the tab strip. float delta; if (view instanceof StripLayoutTab tab) { - // mCachedTabWidth may be different than tab.getWidth() when a tab is closing - // because for the improved tab strip animations the tab width expansion animations - // will not have run yet. + if (tab.isClosed()) continue; + // idealX represents where a tab should be placed in the tab strip. view.setIdealX(tabPosition); - float tabWidth = mMultiStepTabCloseAnimRunning ? mCachedTabWidth : tab.getWidth(); - delta = (tabWidth - mTabOverlapWidth) * tab.getWidthWeight(); - if ((mInReorderMode || mTabGroupMarginAnimRunning)) { + delta = + tab.isDying() + ? mCachedTabWidth - mTabOverlapWidth + : (tab.getWidth() - mTabOverlapWidth) * tab.getWidthWeight(); + if (mInReorderMode || mTabGroupMarginAnimRunning) { delta += tab.getTrailingMargin(); } } else { @@ -3223,11 +3213,52 @@ private void createRenderList() { populateVisibleViews(mStripGroupTitles, mStripGroupTitlesToRender); } - private CompositorAnimator updateNewTabButtonState(boolean animate) { + private float adjustNewTabButtonOffsetIfFull(float offset) { + if (!isTabStripFull()) { + // Move NTB close to tabs by 4 dp when tab strip is not full. + boolean isLtr = !LocalizationUtils.isLayoutRtl(); + offset += MathUtils.flipSignIf(NEW_TAB_BUTTON_X_OFFSET_TOWARDS_TABS, isLtr); + } + return offset; + } + + private CompositorAnimator getLastTabClosedNtbAnimator() { + // TODO(crbug.com/338332428): Unify with the stacker methods. + float viewsWidth = + getNumLiveTabs() * (mCachedTabWidth - mTabOverlapWidth) + mTabOverlapWidth; + for (int i = 0; i < mStripViews.length; ++i) { + final StripLayoutView view = mStripViews[i]; + if (!(view instanceof StripLayoutTab)) viewsWidth += view.getWidth(); + } + + boolean rtl = LocalizationUtils.isLayoutRtl(); + float offset = getTabPositionStart() + MathUtils.flipSignIf(viewsWidth, rtl); + if (rtl) offset += mCachedTabWidth - mNewTabButtonWidth; + offset = adjustNewTabButtonOffsetIfFull(offset); + + CompositorAnimator animator = + CompositorAnimator.ofFloatProperty( + mUpdateHost.getAnimationHandler(), + mNewTabButton, + StripLayoutView.DRAW_X, + mNewTabButton.getDrawX(), + offset, + NEW_TAB_BUTTON_OFFSET_MOVE_MS); + animator.addListener( + new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mNewTabButtonAnimRunning = false; + } + }); + return animator; + } + + private void updateNewTabButtonState() { // 1. The NTB is faded out upon entering reorder mode and hidden when the model is empty. boolean isEmpty = mStripTabs.length == 0; mNewTabButton.setVisible(!isEmpty); - if (isEmpty) return null; + if (isEmpty) return; // 2. Get offset from strip stacker. // Note: This method anchors the NTB to either a static position at the end of the strip OR @@ -3241,41 +3272,20 @@ private CompositorAnimator updateNewTabButtonState(boolean animate) { mLeftMargin, mRightMargin, mWidth, - mNewTabButtonWidth, - mCachedTabWidth, - animate); - - boolean isRtl = LocalizationUtils.isLayoutRtl(); - - if (!isTabStripFull()) { - // Move NTB close to tabs by 4 dp when tab strip is not full. - offset += - isRtl - ? NEW_TAB_BUTTON_X_OFFSET_TOWARDS_TABS - : -NEW_TAB_BUTTON_X_OFFSET_TOWARDS_TABS; - } + mNewTabButtonWidth); + offset = adjustNewTabButtonOffsetIfFull(offset); // 3. Hide the new tab button if it's not visible on the screen. + boolean isRtl = LocalizationUtils.isLayoutRtl(); if ((isRtl && offset + mNewTabButtonWidth < getVisibleLeftBound()) || (!isRtl && offset > getVisibleRightBound())) { mNewTabButton.setVisible(false); - return null; + return; } mNewTabButton.setVisible(true); // 4. Position the new tab button. - if (animate) { - return CompositorAnimator.ofFloatProperty( - mUpdateHost.getAnimationHandler(), - mNewTabButton, - CompositorButton.DRAW_X, - mNewTabButton.getDrawX(), - offset, - NEW_TAB_BUTTON_OFFSET_MOVE_MS); - } else { - mNewTabButton.setDrawX(offset); - } - return null; + mNewTabButton.setDrawX(offset); } /** diff --git a/src/chrome/android/java/src/org/chromium/chrome/browser/document/ChromeLauncherActivity.java b/src/chrome/android/java/src/org/chromium/chrome/browser/document/ChromeLauncherActivity.java index 4a2e284048a..7b9e5c02c0d 100644 --- a/src/chrome/android/java/src/org/chromium/chrome/browser/document/ChromeLauncherActivity.java +++ b/src/chrome/android/java/src/org/chromium/chrome/browser/document/ChromeLauncherActivity.java @@ -27,8 +27,8 @@ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.e("ChromeLauncherActivity", "onCreate"); - // Skip welcome page - FirstRunStatus.setSkipWelcomePage(true); + // // Skip welcome page + // FirstRunStatus.setSkipWelcomePage(true); // Handle Branch intents by redirecting to first run experience if (getIntent() != null && getIntent().getData() != null diff --git a/src/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java b/src/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java index 81ed7ca37ec..6e88f2d2677 100644 --- a/src/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java +++ b/src/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java @@ -413,8 +413,34 @@ public void onRestoreInstanceState(Bundle state) { @Override public void onStart() { super.onStart(); - - // // // Get the latest Branch deep link data in onStart + + // Get the latest Branch deep link data in onStart + Log.e(TAG, "onStart"); + + try { + Log.e(TAG, "Initializing Branch SDK in background thread"); + + // For Android 9, we need to set the user agent string before initialization + if (android.os.Build.VERSION.SDK_INT == android.os.Build.VERSION_CODES.P) { + Log.e(TAG, "Setting user agent string for Android 9"); + + // Set system user agent property to avoid WebView PacProcessor crash on Android 9 + System.setProperty("http.agent", "Mozilla/5.0 (Linux; Android 9; Mobile) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36"); + + // Tell Branch SDK to use synchronous user agent fetching on Android 9 + // This avoids the coroutine that causes the crash + Branch.setIsUserAgentSync(true); + } + + // Initialize Branch SDK as normal + io.branch.referral.Branch.enableLogging(); + io.branch.referral.Branch branch = io.branch.referral.Branch.getAutoInstance(getApplication()); + Log.e(TAG, "Branch SDK initialized successfully in background thread"); + + } catch (Exception e) { + Log.e(TAG, "Error initializing Branch SDK in background thread: " + e.getMessage(), e); + } + Branch.sessionBuilder(this) .withCallback(new Branch.BranchReferralInitListener() { @Override @@ -446,7 +472,7 @@ public void onInitFinished(JSONObject referringParams, BranchError error) { }) .withData(getIntent().getData()) .init(); - + // Multiple active FREs does not really make sense for the user. Once one is complete, the // others would become out of date. This approach turns out to be quite tricky to enforce // completely with just Android configuration, because of all the different ways the FRE diff --git a/src/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManager.java b/src/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManager.java index 2b08fe37f0f..6bd22e460a8 100644 --- a/src/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManager.java +++ b/src/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManager.java @@ -42,6 +42,7 @@ import org.chromium.components.browser_ui.util.BrowserControlsVisibilityDelegate; import org.chromium.ui.base.ViewUtils; import org.chromium.ui.util.TokenHolder; + import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -429,6 +430,7 @@ public void setAnimateBrowserControlsHeightChanges( public int getTopControlsHeight() { return mTopControlContainerHeight; } + @Override public int getTopControlsHeightRealOffset() { return 0; @@ -944,4 +946,4 @@ ValueAnimator getControlsAnimatorForTesting() { int getControlsAnimationDurationMsForTesting() { return CONTROLS_ANIMATION_DURATION_MS; } -} \ No newline at end of file +} diff --git a/src/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoSnapshotController.java b/src/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoSnapshotController.java index 17addfeb2bf..f05e81c9064 100644 --- a/src/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoSnapshotController.java +++ b/src/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoSnapshotController.java @@ -14,12 +14,8 @@ import org.chromium.chrome.browser.customtabs.ContentPrivacyPreferencesBridge; /** - * An abstract base class to provide common functionalities related to blocking screenshots - * across {@link ChromeTabbedActivity} and {@link CustomTabActivity}. - * - * Blocks screenshots when: - * 1. Content privacy is enabled via SAML server response, OR - * 2. User is in incognito mode (unless incognito screenshots are explicitly enabled) + * An abstract base class to provide common functionalities related to allowing/blocking snapshot + * for Incognito tabs across {@link ChromeTabbedActivity} and {@link CustomTabActivity}. */ public abstract class IncognitoSnapshotController { private final @NonNull Window mWindow; @@ -36,7 +32,7 @@ protected IncognitoSnapshotController( mIsShowingIncognitoSupplier = isShowingIncognitoSupplier; } - /** Sets the attributes flags to secure to block screenshots globally. */ + /** Sets the attributes flags to secure if there is an incognito tab visible. */ protected void updateIncognitoTabSnapshotState() { // Safety check to prevent native crashes if (mWindow == null) return; diff --git a/src/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java b/src/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java index 82f13988cfd..71b3b895843 100644 --- a/src/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java +++ b/src/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java @@ -688,7 +688,6 @@ protected void addPerApplicationStartupDeferredTasks(List tasks) { ::makeDeferredRecordings); tasks.add(WebApkUninstallTracker::runDeferredTasks); - tasks.add(IncognitoTabLauncher::updateComponentEnabledState); tasks.add(OfflineContentAvailabilityStatusProvider::getInstance); tasks.add(() -> EnterpriseInfo.getInstance().logDeviceEnterpriseInfo()); tasks.add(TosDialogBehaviorSharedPrefInvalidator::refreshSharedPreferenceIfTosSkipped); @@ -715,6 +714,11 @@ protected void addPerApplicationStartupDeferredTasks(List tasks) { */ @CallSuper protected void addPerProfileStartupDeferredTasks(Profile profile, List tasks) { + // TODO(crbug.com/40254448): Determine how IncognitoTabLauncher should support multiple + // concurrent profiles. Currently, the enabled state will change based on the Profile + // initialization order. + tasks.add(() -> IncognitoTabLauncher.updateComponentEnabledState(profile)); + tasks.add(() -> SigninCheckerProvider.get(profile).onMainActivityStart()); tasks.add( diff --git a/src/chrome/android/java/src/org/chromium/chrome/browser/messages/MessageContainerCoordinator.java b/src/chrome/android/java/src/org/chromium/chrome/browser/messages/MessageContainerCoordinator.java index 40c0da5feb9..e07ae0fbb01 100644 --- a/src/chrome/android/java/src/org/chromium/chrome/browser/messages/MessageContainerCoordinator.java +++ b/src/chrome/android/java/src/org/chromium/chrome/browser/messages/MessageContainerCoordinator.java @@ -17,6 +17,7 @@ import org.chromium.chrome.browser.fullscreen.BrowserControlsManager; import org.chromium.components.messages.MessageContainer; import org.chromium.ui.base.ViewUtils; + import android.view.Gravity; /** * Coordinator of {@link MessageContainer}, which can adjust margins of the message container @@ -147,4 +148,4 @@ private int getContainerTopOffset() { - res.getDimensionPixelOffset(R.dimen.message_bubble_inset) - mContainer.getMessageShadowTopMargin(); } -} \ No newline at end of file +} diff --git a/src/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java b/src/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java index e0f703d3c24..cadbdeecad0 100644 --- a/src/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java +++ b/src/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java @@ -1183,6 +1183,7 @@ private void initializeSingleTabCard(Tab mostRecentTab) { isScrollableMvtEnabled(mContext), mostRecentTab, this::onSingleTabCardClicked, + /* seeMoreLinkClickedCallback= */ null, () -> mSnapshotSingleTabCardChanged = true, mTabContentManagerSupplier.get() /* tabContentManager= */ , @@ -1357,4 +1358,4 @@ public boolean isHomeSurface() { // local tab to resume module is effectively what being a home surface is. return mMostRecentTabSupplier.hasValue(); } -} \ No newline at end of file +} diff --git a/src/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/GoogleServicesSettings.java b/src/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/GoogleServicesSettings.java index 3b337651149..d88198584c5 100644 --- a/src/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/GoogleServicesSettings.java +++ b/src/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/GoogleServicesSettings.java @@ -22,6 +22,7 @@ import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.metrics.ChangeMetricsReportingStateCalledFrom; import org.chromium.chrome.browser.metrics.UmaSessionStats; +import org.chromium.chrome.browser.password_manager.account_storage_toggle.AccountStorageToggleFragmentArgs; import org.chromium.chrome.browser.preferences.Pref; import org.chromium.chrome.browser.price_tracking.PriceTrackingFeatures; import org.chromium.chrome.browser.price_tracking.PriceTrackingUtilities; @@ -128,6 +129,10 @@ public void onCreatePreferences(@Nullable Bundle savedInstanceState, String root mPasswordsAccountStorage = (ChromeSwitchPreference) findPreference(PREF_PASSWORDS_ACCOUNT_STORAGE); mPasswordsAccountStorage.setOnPreferenceChangeListener(this); + if (getArguments() != null + && getArguments().getBoolean(AccountStorageToggleFragmentArgs.HIGHLIGHT)) { + mPasswordsAccountStorage.setBackgroundColor(R.color.iph_highlight_blue); + } SyncServiceFactory.getForProfile(getProfile()).addSyncStateChangedListener(this); mSearchSuggestions = (ChromeSwitchPreference) findPreference(PREF_SEARCH_SUGGESTIONS); diff --git a/src/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java b/src/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java index 1a038c275ae..f457731228c 100644 --- a/src/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java +++ b/src/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java @@ -17,8 +17,6 @@ import android.view.accessibility.AccessibilityEvent; import android.view.autofill.AutofillValue; -import android.util.Log; - import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -30,7 +28,7 @@ import org.chromium.base.CommandLine; import org.chromium.base.ContextUtils; -// import org.chromium.base.Log; +import org.chromium.base.Log; import org.chromium.base.ObserverList; import org.chromium.base.ObserverList.RewindableIterator; import org.chromium.base.ThreadUtils; @@ -73,8 +71,6 @@ import org.chromium.components.security_state.SecurityStateModel; import org.chromium.components.url_formatter.UrlFormatter; import org.chromium.content_public.browser.ChildProcessImportance; -import org.chromium.content_public.browser.ContentFeatureList; -import org.chromium.content_public.browser.ContentFeatureMap; import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.content_public.browser.NavigationHandle; import org.chromium.content_public.browser.SelectionPopupController; @@ -733,11 +729,6 @@ public boolean loadIfNeeded(@TabLoadIfNeededCaller int caller) { return true; } - // If desktop mode window setting is enabled, move switchUserAgentIfNeeded() from - // loadIfNeeded() to restoreIfNeeded(); to avoid reload without explicit user intent. - if (!ContentFeatureMap.isEnabled(ContentFeatureList.REQUEST_DESKTOP_SITE_WINDOW_SETTING)) { - switchUserAgentIfNeeded(UseDesktopUserAgentCaller.LOAD_IF_NEEDED + caller); - } restoreIfNeeded(caller); return true; } @@ -1805,13 +1796,9 @@ private void restoreIfNeeded(@TabLoadIfNeededCaller int caller) { } if (mWebContents != null) { - // If desktop mode window setting is enabled, move switchUserAgentIfNeeded() from - // loadIfNeeded() to restoreIfNeeded(); to avoid reload without explicit user - // intent. - if (ContentFeatureMap.isEnabled( - ContentFeatureList.REQUEST_DESKTOP_SITE_WINDOW_SETTING)) { - switchUserAgentIfNeeded(UseDesktopUserAgentCaller.LOAD_IF_NEEDED + caller); - } + // Invoke switchUserAgentIfNeeded() from restoreIfNeeded() instead of loadIfNeeded() + // to avoid reload without explicit user intent. + switchUserAgentIfNeeded(UseDesktopUserAgentCaller.LOAD_IF_NEEDED + caller); mWebContents.getNavigationController().loadIfNecessary(); } mIsBeingRestored = true; diff --git a/src/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/src/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java index e8b5f3fa3f3..a9889f8a9f5 100644 --- a/src/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java +++ b/src/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java @@ -200,6 +200,7 @@ import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.ui.util.TokenHolder; import org.chromium.url.GURL; + import android.util.Log; import java.util.List; import org.chromium.base.ContextUtils; @@ -305,6 +306,7 @@ public class ToolbarManager private Runnable mMenuStateObserver; private UpdateMenuItemHelper mUpdateMenuItemHelper; private Runnable mStartSurfaceMenuStateObserver; + private @Nullable Runnable mShowMyBottomSheet; private boolean mShouldUpdateToolbarPrimaryColor = true; private int mCurrentThemeColor; @@ -608,7 +610,6 @@ public ToolbarManager( @Nullable Runnable showMyBottomSheet ) { TraceEvent.begin("ToolbarManager.ToolbarManager"); - mActivity = activity; mWindowAndroid = windowAndroid; mCompositorViewHolder = compositorViewHolder; @@ -674,7 +675,7 @@ public boolean isOfflinePage(Tab tab) { ((ViewGroup.MarginLayoutParams) mToolbarHairline.getLayoutParams()); layoutParamsHR.topMargin = 0; mToolbarHairline.setLayoutParams(layoutParamsHR); - + mBookmarkModelSupplier = bookmarkModelSupplier; // We need to capture a reference to setBookmarkModel/setCurrentProfile in order to remove // them later; there is no guarantee in the JLS that referencing the same method later will @@ -1463,7 +1464,10 @@ private TopToolbarCoordinator createTopToolbarCoordinator( ? LayoutType.NONE : mLayoutStateProvider.getActiveLayoutType()), mCompositorViewHolder::getResourceManager, - IncognitoUtils::isIncognitoModeEnabled, + () -> { + return IncognitoUtils.isIncognitoModeEnabled( + mTabModelSelector.getCurrentModel().getProfile()); + }, isTabToGtsAnimationEnabled, isStartSurfaceEnabled, HistoryManagerUtils::showHistoryManager, @@ -1689,8 +1693,8 @@ public String getUrlBarTextWithoutAutocomplete() { : "LocationBar should be an instance of LocationBarCoordinator."; return ((LocationBarCoordinator) mLocationBar).getUrlBarTextWithoutAutocomplete(); } - View mBottomRoot; + View mBottomRoot; private void MoveBottomBarOverTopBar() { if (mBottomRoot != null && true) { @@ -2299,9 +2303,7 @@ public void setToolbarShadowVisibility(int visibility) { */ private int getToolbarExtraYOffset() { int toolbarHairlineHeight = mToolbarHairline.getHeight(); - - toolbarHairlineHeight = 0; - + toolbarHairlineHeight = 0; // For now, ignore the hairline height. final int controlContainerHeight = mControlContainer.getHeight(); // Offset can't be calculated if control container height isn't known yet. @@ -2794,4 +2796,4 @@ public static void setSkipRecreateActivityWhenStartSurfaceEnabledStateChangesFor public BottomControlsCoordinator getBottomControlsCoordinatorForTesting() { return mBottomControlsCoordinatorSupplier.get(); } -} \ No newline at end of file +} diff --git a/src/chrome/browser/BUILD.gn b/src/chrome/browser/BUILD.gn index 36a60537eb4..cd6f8e69a5b 100644 --- a/src/chrome/browser/BUILD.gn +++ b/src/chrome/browser/BUILD.gn @@ -143,7 +143,8 @@ source_set("main_extra_parts") { # Use a static library here because many test binaries depend on this but don't # require many files from it. This makes linking more efficient. -static_library("browser") { sources = [ +static_library("browser") { + sources = [ "about_flags.cc", "about_flags.h", "accessibility/accessibility_labels_service.cc", @@ -513,6 +514,10 @@ static_library("browser") { sources = [ "enterprise/connectors/interstitials/enterprise_warn_controller_client.h", "enterprise/connectors/interstitials/enterprise_warn_page.cc", "enterprise/connectors/interstitials/enterprise_warn_page.h", + "enterprise/identifiers/profile_id_delegate_impl.cc", + "enterprise/identifiers/profile_id_delegate_impl.h", + "enterprise/identifiers/profile_id_service_factory.cc", + "enterprise/identifiers/profile_id_service_factory.h", "enterprise/profile_management/saml_response_parser.cc", "enterprise/profile_management/saml_response_parser.h", "enterprise/reporting/legacy_tech/legacy_tech_report_generator.cc", @@ -1990,6 +1995,8 @@ static_library("browser") { sources = [ "visited_url_ranking/desktop_tab_model_url_visit_data_fetcher.h", "webapps/webapps_client_desktop.cc", "webapps/webapps_client_desktop.h", + "webid/digital_identity_provider_desktop.cc", + "webid/digital_identity_provider_desktop.h", ] } @@ -2124,7 +2131,6 @@ static_library("browser") { sources = [ "//chrome/browser/companion/text_finder", "//chrome/browser/crash_upload_list", "//chrome/browser/devtools", - "//chrome/browser/enterprise/identifiers", "//chrome/browser/enterprise/platform_auth:features", "//chrome/browser/favicon", "//chrome/browser/first_party_sets", @@ -2428,6 +2434,7 @@ static_library("browser") { sources = [ "//components/privacy_sandbox/privacy_sandbox_attestations", "//components/profile_metrics", "//components/proxy_config", + "//components/qr_code_generator:bitmap_generator", "//components/query_parser", "//components/query_tiles", "//components/reading_list/core", @@ -2583,7 +2590,6 @@ static_library("browser") { sources = [ "//components/webrtc_logging/browser", "//components/webrtc_logging/common", "//components/zoom", - # "//components/sso_auth", "//content/public/browser", "//content/public/common", "//crypto", @@ -2696,7 +2702,9 @@ static_library("browser") { sources = [ if (!is_android) { deps += [ + "//chrome/browser/new_tab_page/chrome_colors", "//chrome/browser/ui/lens", + "//chrome/browser/ui/webui/cr_components/theme_color_picker", "//chrome/browser/ui/webui/search_engine_choice:mojo_bindings", "//components/manta", "//components/manta/proto", @@ -3688,7 +3696,6 @@ static_library("browser") { sources = [ "//components/android_autofill/browser:android", "//components/autofill/android:keyboard_suppressor", "//components/background_sync", - # "//components/sso_auth", "//components/bookmarks/common/android", "//components/browser_ui/accessibility/android", "//components/browser_ui/contacts_picker/android", @@ -5444,6 +5451,7 @@ static_library("browser") { sources = [ "//ash/webui/projector_app", "//ash/webui/projector_app/mojom:annotator_mojo_bindings", "//ash/webui/projector_app/mojom:projector_mojo_bindings", + "//ash/webui/sanitize_ui", "//ash/webui/scanning", "//ash/webui/scanning/mojom", "//ash/webui/shimless_rma", @@ -5476,7 +5484,6 @@ static_library("browser") { sources = [ "//chrome/browser/nearby_sharing/contacts", "//chrome/browser/nearby_sharing/instantmessaging/proto", "//chrome/browser/nearby_sharing/local_device_data", - "//chrome/browser/nearby_sharing/logging", "//chrome/browser/nearby_sharing/logging:util", "//chrome/browser/nearby_sharing/proto:tachyon_proto", "//chrome/browser/policy:onc", @@ -5536,6 +5543,7 @@ static_library("browser") { sources = [ "//chromeos/ash/components/geolocation", "//chromeos/ash/components/growth:config_provider", "//chromeos/ash/components/install_attributes", + "//chromeos/ash/components/kiosk/vision:vision_prefs", "//chromeos/ash/components/local_search_service", "//chromeos/ash/components/local_search_service/public/cpp", "//chromeos/ash/components/local_search_service/public/mojom", @@ -6132,6 +6140,14 @@ static_library("browser") { sources = [ "webauthn/local_credential_management_mac.h", ] } + if (is_mac || is_win) { + sources += [ + "enterprise/platform_auth/platform_auth_policy_observer.cc", + "enterprise/platform_auth/platform_auth_policy_observer.h", + "enterprise/platform_auth/platform_auth_provider_manager.cc", + "enterprise/platform_auth/platform_auth_provider_manager.h", + ] + } if (is_win) { libs += [ "secur32.lib", @@ -6163,11 +6179,7 @@ static_library("browser") { sources = [ "enterprise/platform_auth/cloud_ap_utils_win.h", "enterprise/platform_auth/platform_auth_navigation_throttle.cc", "enterprise/platform_auth/platform_auth_navigation_throttle.h", - "enterprise/platform_auth/platform_auth_policy_observer.cc", - "enterprise/platform_auth/platform_auth_policy_observer.h", "enterprise/platform_auth/platform_auth_provider.h", - "enterprise/platform_auth/platform_auth_provider_manager.cc", - "enterprise/platform_auth/platform_auth_provider_manager.h", "enterprise/signals/device_info_fetcher_win.cc", "enterprise/signals/device_info_fetcher_win.h", "first_run/first_run_internal_win.cc", @@ -6305,6 +6317,7 @@ static_library("browser") { sources = [ "//chrome/browser/os_crypt", "//chrome/browser/shortcuts", "//chrome/browser/web_applications/chrome_pwa_launcher:util", + "//chrome/browser/win:mica_titlebar", "//chrome/browser/win/conflicts:module_info", "//chrome/chrome_elf:constants", "//chrome/chrome_elf:dll_hash", diff --git a/src/chrome/browser/about_flags.cc b/src/chrome/browser/about_flags.cc index f025c2e5b67..f2c46318b78 100644 --- a/src/chrome/browser/about_flags.cc +++ b/src/chrome/browser/about_flags.cc @@ -335,7 +335,7 @@ #if BUILDFLAG(IS_WIN) #include "chrome/browser/enterprise/platform_auth/platform_auth_features.h" -#include "chrome/browser/win/titlebar_config.h" +#include "chrome/browser/win/mica_titlebar.h" #endif #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) @@ -570,28 +570,15 @@ const FeatureEntry::FeatureVariation kCCTPageInsightsHubPeekVariations[] = { std::size(kCCTPageInsightsHubBothParams), nullptr}}; const FeatureEntry::FeatureParam kCCTBottomBarButtonsEquallyDividedParam[] = { - {"google_bottom_bar_button_list", "0,1,2,3,5"}}; -const FeatureEntry::FeatureParam kCCTBottomBarPihExpandedInSpotlightParam[] = { - {"google_bottom_bar_button_list", "7,7,2,3,5"}}; + {"google_bottom_bar_button_list", "0,3,1,2"}}; const FeatureEntry::FeatureParam kCCTBottomBarPihInSpotlightParam[] = { - {"google_bottom_bar_button_list", "1,1,2,3,5"}}; -const FeatureEntry::FeatureParam kCCTBottomBarPihColoredInSpotlightParam[] = { - {"google_bottom_bar_button_list", "6,7,2,3,5"}}; -const FeatureEntry::FeatureParam kCCTBottomBarWithTwoTransitionsParams[] = { - {"google_bottom_bar_button_list", "0,1,2,3,5"}, - {"google_bottom_bar_two_transitions", "true"}}; + {"google_bottom_bar_button_list", "1,1,3,2"}}; const FeatureEntry::FeatureVariation kCCTGoogleBottomBarVariations[] = { {"Balanced bottom bar", kCCTBottomBarButtonsEquallyDividedParam, std::size(kCCTBottomBarButtonsEquallyDividedParam), nullptr}, - {"PIH expanded in spotlight", kCCTBottomBarPihExpandedInSpotlightParam, - std::size(kCCTBottomBarPihExpandedInSpotlightParam), nullptr}, {"PIH basic in spotlight", kCCTBottomBarPihInSpotlightParam, std::size(kCCTBottomBarPihInSpotlightParam), nullptr}, - {"PIH colored in spotlight", kCCTBottomBarPihColoredInSpotlightParam, - std::size(kCCTBottomBarPihColoredInSpotlightParam), nullptr}, - {"Two transitions", kCCTBottomBarWithTwoTransitionsParams, - std::size(kCCTBottomBarWithTwoTransitionsParams), nullptr}, }; const FeatureEntry::Choice kReaderModeHeuristicsChoices[] = { @@ -1223,6 +1210,17 @@ const FeatureEntry::Choice kMemlogSamplingRateChoices[] = { heap_profiling::kMemlogSamplingRate, heap_profiling::kMemlogSamplingRate5MB}, }; + +const FeatureEntry::FeatureParam + kOptimizationGuideOnDeviceModelBypassPerfParams[] = { + {"compatible_on_device_performance_classes", "*"}, +}; +const FeatureEntry::FeatureVariation + kOptimizationGuideOnDeviceModelVariations[] = { + {"BypassPerfRequirement", + kOptimizationGuideOnDeviceModelBypassPerfParams, + std::size(kOptimizationGuideOnDeviceModelBypassPerfParams), nullptr}}; + const FeatureEntry::FeatureParam kPageContentAnnotationsContentParams[] = { {"annotate_title_instead_of_page_content", "false"}, {"extract_related_searches", "true"}, @@ -3991,6 +3989,10 @@ const FeatureEntry kFeatureEntries[] = { {"stop-app-indexing-report", flag_descriptions::kStopAppIndexingReportName, flag_descriptions::kStopAppIndexingReportDescription, kOsAndroid, FEATURE_VALUE_TYPE(chrome::android::kStopAppIndexingReport)}, + {"omnibox-rich-autocompletion-android", + flag_descriptions::kRichAutocompletionAndroidName, + flag_descriptions::kRichAutocompletionAndroidDescription, kOsAndroid, + FEATURE_VALUE_TYPE(omnibox::kRichAutocompletion)}, #endif // BUILDFLAG(IS_ANDROID) {"show-autofill-type-predictions", flag_descriptions::kShowAutofillTypePredictionsName, @@ -4355,9 +4357,6 @@ const FeatureEntry kFeatureEntries[] = { flag_descriptions::kEnforceAshExtensionKeeplistName, flag_descriptions::kEnforceAshExtensionKeeplistDescription, kOsCrOS, FEATURE_VALUE_TYPE(ash::features::kEnforceAshExtensionKeeplist)}, - {"hotspot", flag_descriptions::kHotspotName, - flag_descriptions::kHotspotDescription, kOsCrOS, - FEATURE_VALUE_TYPE(ash::features::kHotspot)}, {"instant-hotspot-on-nearby", flag_descriptions::kInstantHotspotOnNearbyName, flag_descriptions::kInstantHotspotOnNearbyDescription, kOsCrOS, @@ -5846,9 +5845,6 @@ const FeatureEntry kFeatureEntries[] = { flag_descriptions::kFileTransferEnterpriseConnectorUIName, flag_descriptions::kFileTransferEnterpriseConnectorUIDescription, kOsCrOS, FEATURE_VALUE_TYPE(features::kFileTransferEnterpriseConnectorUI)}, - {"files-app-experimental", flag_descriptions::kFilesAppExperimentalName, - flag_descriptions::kFilesAppExperimentalDescription, kOsCrOS, - FEATURE_VALUE_TYPE(ash::features::kFilesAppExperimental)}, {"files-conflict-dialog", flag_descriptions::kFilesConflictDialogName, flag_descriptions::kFilesConflictDialogDescription, kOsCrOS, FEATURE_VALUE_TYPE(ash::features::kFilesConflictDialog)}, @@ -5967,11 +5963,6 @@ const FeatureEntry kFeatureEntries[] = { kOsAndroid, FEATURE_VALUE_TYPE(omnibox::kOmniboxMatchToolbarAndStatusBarColor)}, - {"omnibox-modernize-visual-update", - flag_descriptions::kOmniboxModernizeVisualUpdateName, - flag_descriptions::kOmniboxModernizeVisualUpdateDescription, kOsAndroid, - FEATURE_VALUE_TYPE(omnibox::kOmniboxModernizeVisualUpdate)}, - {"omnibox-most-visited-tiles-horizontal-render-group", flag_descriptions::kOmniboxMostVisitedTilesHorizontalRenderGroupName, flag_descriptions:: @@ -6347,8 +6338,10 @@ const FeatureEntry kFeatureEntries[] = { {"optimization-guide-on-device-model", flag_descriptions::kOptimizationGuideOnDeviceModelName, flag_descriptions::kOptimizationGuideOnDeviceModelDescription, kOsDesktop, - FEATURE_VALUE_TYPE( - optimization_guide::features::kOptimizationGuideOnDeviceModel)}, + FEATURE_WITH_PARAMS_VALUE_TYPE( + optimization_guide::features::kOptimizationGuideOnDeviceModel, + kOptimizationGuideOnDeviceModelVariations, + "OptimizationGuideOnDeviceModel")}, {"organic-repeatable-queries", flag_descriptions::kOrganicRepeatableQueriesName, @@ -6586,6 +6579,13 @@ const FeatureEntry kFeatureEntries[] = { FEATURE_VALUE_TYPE(features::kSidePanelPinning)}, #endif // !BUILDFLAG(IS_ANDROID) +#if !BUILDFLAG(IS_ANDROID) + {flag_descriptions::kToolbarPinningFlagId, + flag_descriptions::kToolbarPinningName, + flag_descriptions::kToolbarPinningDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kToolbarPinning)}, +#endif // !BUILDFLAG(IS_ANDROID) + #if BUILDFLAG(IS_ANDROID) {"enable-reader-mode-in-cct", flag_descriptions::kReaderModeInCCTName, flag_descriptions::kReaderModeInCCTDescription, kOsAndroid, @@ -7034,12 +7034,12 @@ const FeatureEntry kFeatureEntries[] = { FEATURE_VALUE_TYPE(printing::features::kAddPrinterViaPrintscanmgr)}, #endif // BUILDFLAG(IS_CHROMEOS) -#if BUILDFLAG(IS_MAC) +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) {"cups-ipp-printing-backend", flag_descriptions::kCupsIppPrintingBackendName, - flag_descriptions::kCupsIppPrintingBackendDescription, kOsMac, + flag_descriptions::kCupsIppPrintingBackendDescription, kOsDesktop, FEATURE_VALUE_TYPE(printing::features::kCupsIppPrintingBackend)}, -#endif // BUILDFLAG(IS_MAC) +#endif // BUILDFLAG(IS_LINUX) ||BUILDFLAG(IS_MAC) #if BUILDFLAG(IS_WIN) {"print-with-postscript-type42-fonts", @@ -7330,10 +7330,17 @@ const FeatureEntry kFeatureEntries[] = { flag_descriptions::kImageDescriptionsAlternateRoutingDescription, kOsAll, FEATURE_VALUE_TYPE(features::kImageDescriptionsAlternateRouting)}, +#if BUILDFLAG(IS_ANDROID) + {"app-info-tab-resumption-module", + flag_descriptions::kAppInfoTabResumptionModuleName, + flag_descriptions::kAppInfoTabResumptionModuleNameDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAppInfoTabResumptionModule)}, +#endif + #if BUILDFLAG(IS_ANDROID) {"app-specific-history", flag_descriptions::kAppSpecificHistoryName, flag_descriptions::kAppSpecificHistoryDescription, kOsAndroid, - FEATURE_VALUE_TYPE(chrome::android::kAppSpecificHistory)}, + FEATURE_VALUE_TYPE(chrome::android::kAdaptiveButtonInTopToolbarTranslate)}, #endif #if BUILDFLAG(IS_ANDROID) @@ -7366,11 +7373,6 @@ const FeatureEntry kFeatureEntries[] = { #endif #if BUILDFLAG(IS_ANDROID) - {"cct-embedder-special-behaviour-trigger", - flag_descriptions::kCCTEmbedderSpecialBehaviorTriggerName, - flag_descriptions::kCCTEmbedderSpecialBehaviorTriggerDescription, - kOsAndroid, - FEATURE_VALUE_TYPE(chrome::android::kCCTEmbedderSpecialBehaviorTrigger)}, {"cct-page-insights-hub", flag_descriptions::kCCTPageInsightsHubName, flag_descriptions::kCCTPageInsightsHubDescription, kOsAndroid, FEATURE_VALUE_TYPE(chrome::android::kCCTPageInsightsHub)}, @@ -7893,11 +7895,6 @@ const FeatureEntry kFeatureEntries[] = { flag_descriptions::kAccessibilityServiceDescription, kOsCrOS, FEATURE_VALUE_TYPE(features::kAccessibilityService)}, - {"enable-accessibility-extra-large-cursor", - flag_descriptions::kAccessibilityExtraLargeCursorName, - flag_descriptions::kAccessibilityExtraLargeCursorDescription, kOsCrOS, - FEATURE_VALUE_TYPE(features::kAccessibilityExtraLargeCursor)}, - {"enable-accessibility-reduced-animations", flag_descriptions::kAccessibilityReducedAnimationsName, flag_descriptions::kAccessibilityReducedAnimationsDescription, kOsCrOS, @@ -9066,6 +9063,14 @@ const FeatureEntry kFeatureEntries[] = { FEATURE_VALUE_TYPE(password_manager::features::kBiometricTouchToFill)}, #endif + {"bind-cookies-to-port", flag_descriptions::kBindCookiesToPortName, + flag_descriptions::kBindCookiesToPortDescription, kOsAll, + FEATURE_VALUE_TYPE(net::features::kEnablePortBoundCookies)}, + + {"bind-cookies-to-scheme", flag_descriptions::kBindCookiesToSchemeName, + flag_descriptions::kBindCookiesToSchemeDescription, kOsAll, + FEATURE_VALUE_TYPE(net::features::kEnableSchemeBoundCookies)}, + #if BUILDFLAG(IS_CHROMEOS_ASH) {"enable-keyboard-backlight-control-in-settings", flag_descriptions::kEnableKeyboardBacklightControlInSettingsName, @@ -9813,13 +9818,6 @@ const FeatureEntry kFeatureEntries[] = { FEATURE_VALUE_TYPE(features::kEnableAndroidGamepadVibration)}, #endif // BUILDFLAG(IS_ANDROID) -#if BUILDFLAG(IS_ANDROID) - {"request-desktop-site-window-setting", - flag_descriptions::kRequestDesktopSiteWindowSettingName, - flag_descriptions::kRequestDesktopSiteWindowSettingDescription, kOsAndroid, - FEATURE_VALUE_TYPE(features::kRequestDesktopSiteWindowSetting)}, -#endif // BUILDFLAG(IS_ANDROID) - {"autofill-enable-remade-downstream-metrics", flag_descriptions::kAutofillEnableRemadeDownstreamMetricsName, flag_descriptions::kAutofillEnableRemadeDownstreamMetricsDescription, @@ -10718,12 +10716,12 @@ const FeatureEntry kFeatureEntries[] = { "AndroidHub")}, #endif // !BUILDFLAG(IS_ANDROID) -#if BUILDFLAG(IS_WIN) - {"enable-web-app-system-media-controls-win", - flag_descriptions::kWebAppSystemMediaControlsWinName, - flag_descriptions::kWebAppSystemMediaControlsWinDescription, kOsWin, - FEATURE_VALUE_TYPE(features::kWebAppSystemMediaControlsWin)}, -#endif // BUILDFLAG(IS_WIN) +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) + {"enable-web-app-system-media-controls", + flag_descriptions::kWebAppSystemMediaControlsName, + flag_descriptions::kWebAppSystemMediaControlsDescription, kOsWin | kOsMac, + FEATURE_VALUE_TYPE(features::kWebAppSystemMediaControls)}, +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) #if BUILDFLAG(ENABLE_COMPOSE) {flag_descriptions::kComposeId, flag_descriptions::kComposeName, @@ -10986,6 +10984,10 @@ const FeatureEntry kFeatureEntries[] = { flag_descriptions::kAshPickerDescription, kOsCrOS, FEATURE_VALUE_TYPE(ash::features::kPicker)}, + {"ash-picker-cloud", flag_descriptions::kAshPickerCloudName, + flag_descriptions::kAshPickerCloudDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kPickerCloud)}, + {"ash-picker-feature-key", flag_descriptions::kAshPickerFeatureKeyName, flag_descriptions::kAshPickerFeatureKeyDescription, kOsCrOS, STRING_VALUE_TYPE(ash::switches::kPickerFeatureKey, "")}, @@ -11382,6 +11384,55 @@ const FeatureEntry kFeatureEntries[] = { "WebAuthenticationEnclaveAuthenticator")}, #endif +#if BUILDFLAG(IS_CHROMEOS_ASH) + {"conch", flag_descriptions::kConchName, + flag_descriptions::kConchDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kConch)}, + + {"conch-key", flag_descriptions::kConchFeatureKeyName, + flag_descriptions::kConchFeatureKeyDescription, kOsCrOS, + STRING_VALUE_TYPE(ash::switches::kConchKey, "")}, +#endif // BUILDFLAG(IS_CHROMEOS_ASH) + +#if BUILDFLAG(IS_ANDROID) + {"autofill-sync-ewallet-accounts", + flag_descriptions::kAutofillSyncEwalletAccountsName, + flag_descriptions::kAutofillSyncEwalletAccountsDescription, kOsAndroid, + FEATURE_VALUE_TYPE(autofill::features::kAutofillSyncEwalletAccounts)}, + + {"ewallet-payments", flag_descriptions::kEwalletPaymentsName, + flag_descriptions::kEwalletPaymentsDescription, kOsAndroid, + FEATURE_VALUE_TYPE(payments::facilitated::kEwalletPayments)}, + + {"payment-link-detection", flag_descriptions::kPaymentLinkDetectionName, + flag_descriptions::kPaymentLinkDetectionDescription, kOsAndroid, + FEATURE_VALUE_TYPE(blink::features::kPaymentLinkDetection)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) + {"screenlock-reauth-promo-card", + flag_descriptions::kScreenlockReauthPromoCardName, + flag_descriptions::kScreenlockReauthPromoCardDescription, kOsMac | kOsWin, + FEATURE_VALUE_TYPE( + password_manager::features::kScreenlockReauthPromoCard)}, +#endif // BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) + + {"ruby-short-heuristics", flag_descriptions::kRubyShortHeuristicsName, + flag_descriptions::kRubyShortHeuristicsDescription, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kRubyShortHeuristics)}, + +#if BUILDFLAG(IS_ANDROID) + {"pwm-access-loss-warning", + flag_descriptions:: + kUnifiedPasswordManagerLocalPasswordsAndroidAccessLossWarningName, + flag_descriptions:: + kUnifiedPasswordManagerLocalPasswordsAndroidAccessLossWarningDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + password_manager::features:: + kUnifiedPasswordManagerLocalPasswordsAndroidAccessLossWarning)}, +#endif // BUILDFLAG(IS_ANDROID) + // NOTE: Adding a new flag requires adding a corresponding entry to enum // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag // Histograms" in tools/metrics/histograms/README.md (run the diff --git a/src/chrome/browser/chrome_content_browser_client.cc b/src/chrome/browser/chrome_content_browser_client.cc index b8c3ad54c3b..8af474da5b6 100644 --- a/src/chrome/browser/chrome_content_browser_client.cc +++ b/src/chrome/browser/chrome_content_browser_client.cc @@ -5583,9 +5583,6 @@ ChromeContentBrowserClient::CreateThrottlesForNavigation( handle), &throttles); - // Domain blocking is now handled directly in ChromeContentBrowserClient - // to avoid dependency cycles - return throttles; } diff --git a/src/chrome/browser/download/chrome_download_manager_delegate.cc b/src/chrome/browser/download/chrome_download_manager_delegate.cc index 6c89abc2895..96779af26cd 100644 --- a/src/chrome/browser/download/chrome_download_manager_delegate.cc +++ b/src/chrome/browser/download/chrome_download_manager_delegate.cc @@ -8,6 +8,7 @@ #include #include #include + #include "base/logging.h" #include "base/command_line.h" #include "base/files/file_util.h" @@ -99,6 +100,7 @@ #include "base/android/build_info.h" #include "base/android/content_uri_utils.h" #include "base/android/path_utils.h" +#include "base/process/process_handle.h" #include "chrome/browser/android/tab_android.h" #include "chrome/browser/download/android/chrome_duplicate_download_infobar_delegate.h" #include "chrome/browser/download/android/download_controller.h" @@ -634,9 +636,14 @@ bool ChromeDownloadManagerDelegate::DetermineDownloadTarget( profile_->GetPrefs()->GetString(prefs::kDefaultCharset), download->GetSuggestedFilename(), download->GetMimeType(), l10n_util::GetStringUTF8(IDS_DEFAULT_DOWNLOAD_FILENAME)); - base::FilePath cache_dir; - base::android::GetCacheDirectory(&cache_dir); - download_path = cache_dir.Append(kPdfDirName).Append(generated_filename); + if (profile_->IsOffTheRecord()) { + download_path = download->GetDownloadFile()->FullPath(); + } else { + base::FilePath cache_dir; + base::android::GetCacheDirectory(&cache_dir); + download_path = + cache_dir.Append(kPdfDirName).Append(generated_filename); + } action = DownloadPathReservationTracker::UNIQUIFY; } else { action = DownloadPathReservationTracker::OVERWRITE; @@ -830,32 +837,32 @@ bool ChromeDownloadManagerDelegate::ShouldOpenDownload( content::DownloadOpenDelayedCallback callback) { #if BUILDFLAG(ENABLE_EXTENSIONS) if (download_crx_util::IsExtensionDownload(*item)) {// && - scoped_refptr installer( - download_crx_util::CreateCrxInstaller(profile_, *item)); + scoped_refptr installer( + download_crx_util::CreateCrxInstaller(profile_, *item)); - installer->set_off_store_install_allow_reason( - CrxInstaller::OffStoreInstallAllowedBecausePref); + installer->set_off_store_install_allow_reason( + CrxInstaller::OffStoreInstallAllowedBecausePref); - auto token = base::UnguessableToken::Create(); - running_crx_installs_[token] = installer; + auto token = base::UnguessableToken::Create(); + running_crx_installs_[token] = installer; - installer->AddInstallerCallback(base::BindOnce( - &ChromeDownloadManagerDelegate::OnInstallerDone, - weak_ptr_factory_.GetWeakPtr(), token, std::move(callback))); + installer->AddInstallerCallback(base::BindOnce( + &ChromeDownloadManagerDelegate::OnInstallerDone, + weak_ptr_factory_.GetWeakPtr(), token, std::move(callback))); - if (extensions::UserScript::IsURLUserScript(item->GetURL(), - item->GetMimeType())) { - installer->InstallUserScript(item->GetFullPath(), item->GetURL()); - } else { - installer->set_allow_silent_install(true); - installer->InstallCrx(item->GetFullPath()); - } + if (extensions::UserScript::IsURLUserScript(item->GetURL(), + item->GetMimeType())) { + installer->InstallUserScript(item->GetFullPath(), item->GetURL()); + } else { + installer->set_allow_silent_install(true); + installer->InstallCrx(item->GetFullPath()); + } - // The status text and percent complete indicator will change now - // that we are installing a CRX. Update observers so that they pick - // up the change. - item->UpdateObservers(); - return false; + // The status text and percent complete indicator will change now + // that we are installing a CRX. Update observers so that they pick + // up the change. + item->UpdateObservers(); + return false; // } // else { // LOG(INFO) << "WOOTZ: Downloading Extension is not from test origin"; @@ -1923,6 +1930,13 @@ ChromeDownloadManagerDelegate::GetQuarantineConnectionCallback() { &ChromeDownloadManagerDelegate::ConnectToQuarantineService); } +std::unique_ptr +ChromeDownloadManagerDelegate::GetRenameHandlerForDownload( + download::DownloadItem* download_item) { + // TODO(b/341259898): Add implementation for SkyVault on CrOS. + return nullptr; +} + void ChromeDownloadManagerDelegate::CheckSavePackageAllowed( download::DownloadItem* download_item, base::flat_map save_package_files, @@ -2101,4 +2115,4 @@ void ChromeDownloadManagerDelegate::CancelAllEphemeralWarnings() { } } } -#endif // !BUILDFLAG(IS_ANDROID) \ No newline at end of file +#endif // !BUILDFLAG(IS_ANDROID) diff --git a/src/chrome/browser/extensions/BUILD.gn b/src/chrome/browser/extensions/BUILD.gn index 69b07aded28..b68860c2ff4 100644 --- a/src/chrome/browser/extensions/BUILD.gn +++ b/src/chrome/browser/extensions/BUILD.gn @@ -822,7 +822,6 @@ static_library("extensions") { "//chrome/browser:theme_properties", "//chrome/browser/apps:user_type_filter", "//chrome/browser/apps/app_service:constants", - "//components/saml_verifier", # Only for allow_circular_includes_from # "//chrome/browser/apps/app_service/app_icon", @@ -852,6 +851,7 @@ static_library("extensions") { "//components/device_reauth", "//components/optimization_guide/core:features", "//components/safe_browsing/content/browser", + "//components/saml_verifier", "//components/safe_browsing/core/browser:safe_browsing_metrics_collector", "//components/security_interstitials/content:security_interstitial_page", "//components/site_engagement/core/mojom:mojo_bindings", @@ -1022,7 +1022,6 @@ static_library("extensions") { "//ui/shell_dialogs", "//ui/strings", "//url", - "//components/saml_verifier", ] if (is_linux || is_mac || is_win) { diff --git a/src/chrome/browser/extensions/api/wootz/wootz_api.cc b/src/chrome/browser/extensions/api/wootz/wootz_api.cc index a7b06b4bff0..1c8fd178640 100644 --- a/src/chrome/browser/extensions/api/wootz/wootz_api.cc +++ b/src/chrome/browser/extensions/api/wootz/wootz_api.cc @@ -1093,7 +1093,7 @@ ExtensionFunction::ResponseAction WootzSetJobFunction::Run() { std::string jobs_json = prefs.ReadString(kWootzJobsListKey, "[]"); LOG(ERROR) << "WOOTZ JOBS: " << jobs_json; - absl::optional parsed = base::JSONReader::Read(jobs_json); + std::optional parsed = base::JSONReader::Read(jobs_json); base::Value::List* jobs = parsed->GetIfList(); if (!jobs) { jobs = new base::Value::List(); @@ -1119,7 +1119,7 @@ ExtensionFunction::ResponseAction WootzRemoveJobFunction::Run() { LOG(ERROR) << "WOOTZ JOBS: " << jobs_json; - absl::optional parsed = base::JSONReader::Read(jobs_json); + std::optional parsed = base::JSONReader::Read(jobs_json); base::Value::List* jobs = parsed->GetIfList(); if (!jobs) return RespondNow(NoArguments()); @@ -1142,7 +1142,7 @@ ExtensionFunction::ResponseAction WootzGetJobsFunction::Run() { auto prefs = android::shared_preferences::GetChromeSharedPreferences(); std::string results_json = prefs.ReadString(kWootzJobResultsKey, "[]"); - absl::optional parsed = base::JSONReader::Read(results_json); + std::optional parsed = base::JSONReader::Read(results_json); if (!parsed || !parsed->is_list()) { // Return empty array rather than error base::Value::List empty; @@ -1158,7 +1158,7 @@ ExtensionFunction::ResponseAction WootzListJobsFunction::Run() { LOG(ERROR) << "WOOTZ JOBS LIST JSON: " << jobs_json; - absl::optional parsed = base::JSONReader::Read(jobs_json); + std::optional parsed = base::JSONReader::Read(jobs_json); if (!parsed || !parsed->is_list()) { base::Value::List empty; return RespondNow(WithArguments(base::Value(std::move(empty)))); @@ -1362,7 +1362,7 @@ ExtensionFunction::ResponseAction WootzGenerateZKProofFunction::Run() { ); // Parse the keys JSON - absl::optional parsed_keys = base::JSONReader::Read(keys_json); + std::optional parsed_keys = base::JSONReader::Read(keys_json); if (!parsed_keys || !parsed_keys->is_dict()) { LOG(ERROR) << "Failed to parse keys JSON"; result.Set("success", false); @@ -1528,7 +1528,7 @@ ExtensionFunction::ResponseAction WootzGetPageStateFunction::Run() { bool debug_mode = true; bool include_hidden = true; bool is_background_web_contents = false; - absl::optional background_web_contents_id; + std::optional background_web_contents_id; // Parse options from arguments if (args().size() >= 1 && args()[0].is_dict()) { @@ -1589,7 +1589,7 @@ void WootzGetPageStateFunction::OnGetPageStateComplete(bool success, const std:: return; } - absl::optional parsed = base::JSONReader::Read(state); + std::optional parsed = base::JSONReader::Read(state); if (!parsed || !parsed->is_dict()) { LOG(ERROR) << "Failed to parse page state JSON in WootzAPI"; Respond(Error("Failed to parse page state")); diff --git a/src/chrome/browser/fast_checkout/fast_checkout_client_impl.cc b/src/chrome/browser/fast_checkout/fast_checkout_client_impl.cc index 5a5ea2fd27b..9606022f12c 100644 --- a/src/chrome/browser/fast_checkout/fast_checkout_client_impl.cc +++ b/src/chrome/browser/fast_checkout/fast_checkout_client_impl.cc @@ -413,7 +413,7 @@ void FastCheckoutClientImpl::TryToFillForms() { if (ShouldFillForm(*form, autofill::FormType::kAddressForm)) { autofill::AutofillField* field = GetFieldToFill(form->fields(), /*is_credit_card_form=*/false); - autofill::AutofillProfile* autofill_profile = + const autofill::AutofillProfile* autofill_profile = GetSelectedAutofillProfile(); if (field && autofill_profile) { form_filling_states_[std::make_pair(form->form_signature(), @@ -471,9 +471,9 @@ void FastCheckoutClientImpl::FillCreditCardForm( {.trigger_source = autofill::AutofillTriggerSource::kFastCheckout}); } -autofill::AutofillProfile* +const autofill::AutofillProfile* FastCheckoutClientImpl::GetSelectedAutofillProfile() { - autofill::AutofillProfile* autofill_profile = + const autofill::AutofillProfile* autofill_profile = personal_data_helper_->GetPersonalDataManager() ->address_data_manager() .GetProfileByGUID(selected_autofill_profile_guid_.value()); @@ -622,7 +622,7 @@ void FastCheckoutClientImpl::A11yAnnounce( form_signature)) { accessibility_service_->Announce( l10n_util::GetStringUTF16(IDS_FAST_CHECKOUT_A11Y_EMAIL_FILLED)); - } else if (autofill::AutofillProfile* autofill_profile = + } else if (const autofill::AutofillProfile* autofill_profile = GetSelectedAutofillProfile()) { accessibility_service_->Announce(l10n_util::GetStringFUTF16( IDS_FAST_CHECKOUT_A11Y_ADDRESS_FORM_FILLED, diff --git a/src/chrome/browser/fast_checkout/fast_checkout_client_impl.h b/src/chrome/browser/fast_checkout/fast_checkout_client_impl.h index 30093219819..0722fbbdfa5 100644 --- a/src/chrome/browser/fast_checkout/fast_checkout_client_impl.h +++ b/src/chrome/browser/fast_checkout/fast_checkout_client_impl.h @@ -196,7 +196,7 @@ class FastCheckoutClientImpl bool is_credit_card_form); // Returns a pointer to the autofill profile corresponding to // `selected_autofill_profile_guid_`. Stops the run if it's a `nullptr`. - autofill::AutofillProfile* GetSelectedAutofillProfile(); + const autofill::AutofillProfile* GetSelectedAutofillProfile(); // Returns a pointer to the credit card corresponding to // `selected_credit_card_id_`. Stops the run if it's a `nullptr`. diff --git a/src/chrome/browser/flags/android/chrome_feature_list.cc b/src/chrome/browser/flags/android/chrome_feature_list.cc index 9f4fc1ba663..be0a16712fb 100644 --- a/src/chrome/browser/flags/android/chrome_feature_list.cc +++ b/src/chrome/browser/flags/android/chrome_feature_list.cc @@ -174,6 +174,7 @@ const base::Feature* const kFeaturesExposedToJava[] = { &kAndroidTabDeclutterRescueKillswitch, &kAndroidToolbarScrollAblation, &kAnimatedImageDragShadow, + &kAppInfoTabResumptionModule, &kAppSpecificHistory, &kArchiveTabService, &kAsyncNotificationManager, @@ -188,10 +189,8 @@ const base::Feature* const kFeaturesExposedToJava[] = { &kBrowserControlsEarlyResize, &kCacheActivityTaskID, &kCastDeviceFilter, - &kClearOmniboxFocusAfterNavigation, &kCCTBeforeUnload, &kCCTClientDataHeader, - &kCCTEmbedderSpecialBehaviorTrigger, &kCCTExtendTrustedCdnPublisher, &kCCTFeatureUsage, &kCCTEphemeralMode, @@ -489,6 +488,10 @@ BASE_FEATURE(kAnimatedImageDragShadow, "AnimatedImageDragShadow", base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kAppInfoTabResumptionModule, + "AppInfoTabResumptionModule", + base::FEATURE_DISABLED_BY_DEFAULT); + BASE_FEATURE(kAppSpecificHistory, "AppSpecificHistory", base::FEATURE_DISABLED_BY_DEFAULT); @@ -526,10 +529,6 @@ BASE_FEATURE(kCastDeviceFilter, "CastDeviceFilter", base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kClearOmniboxFocusAfterNavigation, - "ClearOmniboxFocusAfterNavigation", - base::FEATURE_ENABLED_BY_DEFAULT); - BASE_FEATURE(kCCTBeforeUnload, "CCTBeforeUnload", base::FEATURE_ENABLED_BY_DEFAULT); @@ -538,10 +537,6 @@ BASE_FEATURE(kCCTClientDataHeader, "CCTClientDataHeader", base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kCCTEmbedderSpecialBehaviorTrigger, - "CCTEmbedderSpecialBehaviorTrigger", - base::FEATURE_DISABLED_BY_DEFAULT); - BASE_FEATURE(kCCTEphemeralMode, "CCTEphemeralMode", base::FEATURE_DISABLED_BY_DEFAULT); @@ -562,7 +557,7 @@ BASE_FEATURE(kCCTIntentFeatureOverrides, "CCTIntentFeatureOverrides", base::FEATURE_ENABLED_BY_DEFAULT); -BASE_FEATURE(kCCTMinimized, "CCTMinimized", base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kCCTMinimized, "CCTMinimized", base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kCCTMinimizedEnabledByDefault, "CCTMinimizedEnabledByDefault", @@ -978,7 +973,7 @@ BASE_FEATURE(kTestDefaultEnabled, // choice promo. See crbug.com/1471643 for more details. BASE_FEATURE(kSearchEnginesPromoV3, "SearchEnginesPromoV3", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kSearchInCCT, "SearchInCCT", base::FEATURE_DISABLED_BY_DEFAULT); diff --git a/src/chrome/browser/flags/android/chrome_feature_list.h b/src/chrome/browser/flags/android/chrome_feature_list.h index 3aa901023ee..b00b9a6daaf 100644 --- a/src/chrome/browser/flags/android/chrome_feature_list.h +++ b/src/chrome/browser/flags/android/chrome_feature_list.h @@ -32,6 +32,7 @@ BASE_DECLARE_FEATURE(kAndroidTabDeclutterRescueKillswitch); BASE_DECLARE_FEATURE(kAndroidToolbarScrollAblation); BASE_DECLARE_FEATURE(kAnimatedImageDragShadow); BASE_DECLARE_FEATURE(kAppSpecificHistory); +BASE_DECLARE_FEATURE(kAppInfoTabResumptionModule); BASE_DECLARE_FEATURE(kArchiveTabService); BASE_DECLARE_FEATURE(kAsyncNotificationManager); BASE_DECLARE_FEATURE(kAuxiliarySearchDonation); @@ -44,11 +45,9 @@ BASE_DECLARE_FEATURE(kBackgroundThreadPool); BASE_DECLARE_FEATURE(kBlockIntentsWhileLocked); BASE_DECLARE_FEATURE(kBrowserControlsEarlyResize); BASE_DECLARE_FEATURE(kCacheActivityTaskID); -BASE_DECLARE_FEATURE(kClearOmniboxFocusAfterNavigation); BASE_DECLARE_FEATURE(kCastDeviceFilter); BASE_DECLARE_FEATURE(kCCTBeforeUnload); BASE_DECLARE_FEATURE(kCCTClientDataHeader); -BASE_DECLARE_FEATURE(kCCTEmbedderSpecialBehaviorTrigger); BASE_DECLARE_FEATURE(kCCTEphemeralMode); BASE_DECLARE_FEATURE(kCCTExtendTrustedCdnPublisher); BASE_DECLARE_FEATURE(kCCTFeatureUsage); diff --git a/src/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/src/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java index d452b2987b5..3044711673d 100644 --- a/src/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java +++ b/src/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java @@ -207,6 +207,7 @@ public static void setAdBlockFiltersURL(String url) { "AndroidTabDeclutterRescueKillswitch"; public static final String ANDROID_TAB_GROUP_STABLE_IDS = "AndroidTabGroupStableIds"; public static final String ANIMATED_IMAGE_DRAG_SHADOW = "AnimatedImageDragShadow"; + public static final String APP_INFO_TAB_RESUMPTION_MODULE = "AppInfoTabResumptionModule"; public static final String APP_SPECIFIC_HISTORY = "AppSpecificHistory"; public static final String ARCHIVE_TAB_SERVICE = "ArchiveTabService"; public static final String ASYNC_NOTIFICATION_MANAGER = "AsyncNotificationManager"; @@ -263,8 +264,6 @@ public static void setAdBlockFiltersURL(String url) { public static final String CCT_AUTO_TRANSLATE = "CCTAutoTranslate"; public static final String CCT_BEFORE_UNLOAD = "CCTBeforeUnload"; public static final String CCT_CLIENT_DATA_HEADER = "CCTClientDataHeader"; - public static final String CCT_EMBEDDER_SPECIAL_BEHAVIOR_TRIGGER = - "CCTEmbedderSpecialBehaviorTrigger"; public static final String CCT_EPHEMERAL_MODE = "CCTEphemeralMode"; public static final String CCT_EXTEND_TRUSTED_CDN_PUBLISHER = "CCTExtendTrustedCdnPublisher"; public static final String CCT_FEATURE_USAGE = "CCTFeatureUsage"; @@ -289,8 +288,6 @@ public static void setAdBlockFiltersURL(String url) { public static final String CCT_TAB_MODAL_DIALOG = "CCTTabModalDialog"; public static final String CHROME_SURVEY_NEXT_ANDROID = "ChromeSurveyNextAndroid"; public static final String CHROME_SHARE_PAGE_INFO = "ChromeSharePageInfo"; - public static final String CLEAR_OMNIBOX_FOCUS_AFTER_NAVIGATION = - "ClearOmniboxFocusAfterNavigation"; public static final String COLLECT_ANDROID_FRAME_TIMELINE_METRICS = "CollectAndroidFrameTimelineMetrics"; public static final String COMMAND_LINE_ON_NON_ROOTED = "CommandLineOnNonRooted"; @@ -568,6 +565,8 @@ public static void setAdBlockFiltersURL(String url) { public static final CachedFlag sAndroidHub = newCachedFlag(ANDROID_HUB, true); public static final CachedFlag sAndroidTabGroupStableIds = newCachedFlag(ANDROID_TAB_GROUP_STABLE_IDS, true); + public static final CachedFlag sAppInfoTabResumptionModule = + newCachedFlag(APP_INFO_TAB_RESUMPTION_MODULE, false); public static final CachedFlag sAppSpecificHistory = newCachedFlag(APP_SPECIFIC_HISTORY, false); public static final CachedFlag sArchiveTabService = newCachedFlag(ARCHIVE_TAB_SERVICE, false); public static final CachedFlag sAsyncNotificationManager = @@ -722,13 +721,13 @@ public static void setAdBlockFiltersURL(String url) { public static final List sFlagsCachedFullBrowser = List.of( - sAccountReauthenticationRecentTimeWindow, sAdBlockFeature, sAccountReauthenticationRecentTimeWindow, sAndroidAppIntegration, sAndroidElegantTextHeight, sAndroidHub, sAndroidTabGroupStableIds, + sAppInfoTabResumptionModule, sAppSpecificHistory, sArchiveTabService, sAsyncNotificationManager, diff --git a/src/chrome/browser/prefs/browser_prefs.cc b/src/chrome/browser/prefs/browser_prefs.cc index 14a2bdbb6da..b0a8ab92300 100644 --- a/src/chrome/browser/prefs/browser_prefs.cc +++ b/src/chrome/browser/prefs/browser_prefs.cc @@ -205,7 +205,6 @@ #include "printing/buildflags/buildflags.h" #include "rlz/buildflags/buildflags.h" #include "services/screen_ai/buildflags/buildflags.h" -// #include "components/sso_auth/public/saml_constants.h" #include "content/public/browser/copy_paste_blocker_prefs.h" #if BUILDFLAG(ENABLE_BACKGROUND_MODE) @@ -485,7 +484,6 @@ #endif #if BUILDFLAG(IS_WIN) -#include "chrome/browser/enterprise/platform_auth/platform_auth_policy_observer.h" #include "chrome/browser/font_prewarmer_tab_helper.h" #include "chrome/browser/media/cdm_pref_service_helper.h" #include "chrome/browser/media/media_foundation_service_monitor.h" @@ -499,6 +497,7 @@ #endif // BUILDFLAG(IS_WIN) #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) +#include "chrome/browser/enterprise/platform_auth/platform_auth_policy_observer.h" #include "components/os_crypt/sync/os_crypt.h" #endif @@ -1112,6 +1111,10 @@ constexpr char kBlockTruncatedCookies[] = "profile.cookie_block_truncated"; inline constexpr char kDefaultSearchProviderChoiceLocationPrefName[] = "default_search_provider_data.choice_location"; +// Deprecated 05/2024. +inline constexpr char kSyncCachedTrustedVaultAutoUpgradeDebugInfo[] = + "sync.cached_trusted_vault_auto_upgrade_debug_info"; + // Register local state used only for migration (clearing or moving to a new // key). void RegisterLocalStatePrefsForMigration(PrefRegistrySimple* registry) { @@ -1122,6 +1125,7 @@ void RegisterLocalStatePrefsForMigration(PrefRegistrySimple* registry) { registry->RegisterDictionaryPref(kEasyUnlockHardlockState); #endif // BUILDFLAG(IS_CHROMEOS_ASH) + // Deprecated 04/2023. registry->RegisterDictionaryPref(kTypeSubscribedForInvalidations); registry->RegisterStringPref(kActiveRegistrationToken, std::string()); registry->RegisterStringPref(kFCMInvalidationClientIDCache, std::string()); @@ -1595,6 +1599,9 @@ void RegisterProfilePrefsForMigration( registry->RegisterIntegerPref( kDefaultSearchProviderChoiceLocationPrefName, static_cast(search_engines::ChoiceMadeLocation::kOther)); + + // Deprecated 05/2024. + registry->RegisterStringPref(kSyncCachedTrustedVaultAutoUpgradeDebugInfo, ""); } void ClearSyncRequestedPrefAndMaybeMigrate(PrefService* profile_prefs) { @@ -1879,9 +1886,9 @@ void RegisterLocalState(PrefRegistrySimple* registry) { screen_ai::RegisterLocalStatePrefs(registry); #endif // BUILDFLAG(ENABLE_SCREEN_AI_SERVICE) -#if BUILDFLAG(IS_WIN) +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) PlatformAuthPolicyObserver::RegisterPrefs(registry); -#endif // BUILDFLAG(IS_WIN) +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) // Platform-specific and compile-time conditional individual preferences. // If you have multiple preferences that should clearly be grouped together, @@ -1920,22 +1927,20 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry, AccessibilityLabelsService::RegisterProfilePrefs(registry); AccessibilityUIMessageHandler::RegisterProfilePrefs(registry); action_url::prefs::RegisterProfilePrefs(registry); - keyboard_garbaging_prefs::RegisterProfilePrefs(registry); extension_developer_mode_settings::RegisterProfilePrefs(registry); AnnouncementNotificationService::RegisterProfilePrefs(registry); autofill::prefs::RegisterProfilePrefs(registry); blocked_domains::prefs::RegisterProfilePrefs(registry); - saml::prefs::RegisterProfilePrefs(registry); - content_privacy::prefs::RegisterProfilePrefs(registry); - copy_paste_blocker::RegisterProfilePrefs(registry); - content::upload_blocking_prefs::RegisterProfilePrefs(registry); browsing_data::prefs::RegisterBrowserUserPrefs(registry); capture_policy::RegisterProfilePrefs(registry); certificate_transparency::prefs::RegisterPrefs(registry); ChromeContentBrowserClient::RegisterProfilePrefs(registry); chrome_labs_prefs::RegisterProfilePrefs(registry); ChromeLocationBarModelDelegate::RegisterProfilePrefs(registry); + content::upload_blocking_prefs::RegisterProfilePrefs(registry); + content_privacy::prefs::RegisterProfilePrefs(registry); content_settings::CookieSettings::RegisterProfilePrefs(registry); + copy_paste_blocker::RegisterProfilePrefs(registry); StatefulSSLHostStateDelegate::RegisterProfilePrefs(registry); ChromeVersionService::RegisterProfilePrefs(registry); chrome_browser_net::NetErrorTabHelper::RegisterProfilePrefs(registry); @@ -1954,6 +1959,7 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry, IncognitoModePrefs::RegisterProfilePrefs(registry); invalidation::PerUserTopicSubscriptionManager::RegisterProfilePrefs(registry); invalidation::InvalidatorRegistrarWithMemory::RegisterProfilePrefs(registry); + keyboard_garbaging_prefs::RegisterProfilePrefs(registry); language::LanguagePrefs::RegisterProfilePrefs(registry); login_detection::prefs::RegisterProfilePrefs(registry); lookalikes::RegisterProfilePrefs(registry); @@ -1991,6 +1997,7 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry, RegisterBrowserUserPrefs(registry); RegisterPrefersDefaultScrollbarStylesPrefs(registry); safe_browsing::file_type::RegisterProfilePrefs(registry); + saml::prefs::RegisterProfilePrefs(registry); safe_browsing::RegisterProfilePrefs(registry); SearchPrefetchService::RegisterProfilePrefs(registry); blocked_content::SafeBrowsingTriggeredPopupBlocker::RegisterProfilePrefs( @@ -2005,7 +2012,6 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry, SharingSyncPreference::RegisterProfilePrefs(registry); SigninPrefs::RegisterProfilePrefs(registry); site_engagement::SiteEngagementService::RegisterProfilePrefs(registry); - // sso_auth::RegisterProfilePrefs(registry); supervised_user::RegisterProfilePrefs(registry); subresource_filter::prefs::RegisterProfilePrefs(registry); sync_sessions::SessionSyncPrefs::RegisterProfilePrefs(registry); @@ -2098,6 +2104,7 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry, DevToolsWindow::RegisterProfilePrefs(registry); DriveService::RegisterProfilePrefs(registry); enterprise_connectors::RegisterProfilePrefs(registry); + extensions::CommandService::RegisterProfilePrefs(registry); extensions::TabsCaptureVisibleTabFunction::RegisterProfilePrefs(registry); first_run::RegisterProfilePrefs(registry); gcm::RegisterProfilePrefs(registry); @@ -2978,6 +2985,9 @@ void MigrateObsoleteProfilePrefs(PrefService* profile_prefs, // Added 05/2024 profile_prefs->ClearPref(kDefaultSearchProviderChoiceLocationPrefName); + // Added 05/2024. + profile_prefs->ClearPref(kSyncCachedTrustedVaultAutoUpgradeDebugInfo); + // Please don't delete the following line. It is used by PRESUBMIT.py. // END_MIGRATE_OBSOLETE_PROFILE_PREFS diff --git a/src/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/src/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc index 7e88478e7df..8a528cc697e 100644 --- a/src/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc +++ b/src/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc @@ -199,6 +199,7 @@ #include "chrome/browser/ui/hats/hats_service_factory.h" #include "chrome/browser/ui/media_router/cast_notification_controller_lacros_factory.h" #include "chrome/browser/ui/prefs/prefs_tab_helper.h" +#include "chrome/browser/ui/safety_hub/unused_site_permissions_service_factory.h" #include "chrome/browser/ui/tabs/pinned_tab_service_factory.h" #include "chrome/browser/ui/toolbar/pinned_toolbar/pinned_toolbar_actions_model_factory.h" #include "chrome/browser/ui/toolbar/toolbar_actions_model_factory.h" @@ -210,6 +211,7 @@ #include "chrome/browser/unified_consent/unified_consent_service_factory.h" #include "chrome/browser/updates/announcement_notification/announcement_notification_service_factory.h" #include "chrome/browser/usb/usb_chooser_context_factory.h" +#include "chrome/browser/visited_url_ranking/visited_url_ranking_service_factory.h" #include "chrome/browser/web_applications/isolated_web_apps/isolated_web_app_reader_registry_factory.h" #include "chrome/browser/webauthn/enclave_manager_factory.h" #include "chrome/browser/webdata_services/web_data_service_factory.h" @@ -265,7 +267,6 @@ #include "chrome/browser/media/android/cdm/media_drm_origin_id_manager_factory.h" #include "chrome/browser/search_resumption/start_suggest_service_factory.h" #include "chrome/browser/signin/signin_manager_android_factory.h" -#include "chrome/browser/visited_url_ranking/visited_url_ranking_service_factory.h" #include "components/commerce/core/commerce_feature_list.h" #include "components/commerce/core/proto/merchant_signal_db_content.pb.h" #else @@ -481,7 +482,6 @@ #include "chrome/browser/ui/safety_hub/menu_notification_service_factory.h" #include "chrome/browser/ui/safety_hub/notification_permission_review_service_factory.h" #include "chrome/browser/ui/safety_hub/password_status_check_service_factory.h" -#include "chrome/browser/ui/safety_hub/unused_site_permissions_service_factory.h" #include "chrome/browser/ui/tabs/organization/tab_organization_service_factory.h" #include "chrome/browser/usb/usb_connection_tracker_factory.h" #include "chrome/browser/user_notes/user_note_service_factory.h" @@ -602,7 +602,6 @@ void ChromeBrowserMainExtraPartsProfiles:: #if !BUILDFLAG(IS_ANDROID) apps::AppServiceProxyFactory::GetInstance(); #endif - #if BUILDFLAG(IS_CHROMEOS_ASH) apps::deduplication::AppDeduplicationServiceFactory::GetInstance(); apps::StandaloneBrowserExtensionAppsFactoryForApp::GetInstance(); @@ -882,6 +881,7 @@ void ChromeBrowserMainExtraPartsProfiles:: HttpsFirstModeServiceFactory::GetInstance(); IdentityManagerFactory::EnsureFactoryAndDependeeFactoriesBuilt(); InMemoryURLIndexFactory::GetInstance(); + visited_url_ranking::VisitedURLRankingServiceFactory::GetInstance(); #if !BUILDFLAG(IS_ANDROID) InstantServiceFactory::GetInstance(); #endif @@ -1229,11 +1229,11 @@ void ChromeBrowserMainExtraPartsProfiles:: #if !BUILDFLAG(IS_ANDROID) StorageNotificationServiceFactory::GetInstance(); #endif - SubresourceFilterProfileContextFactory::GetInstance(); - SupervisedUserMetricsServiceFactory::GetInstance(); - if (full_init) { - SupervisedUserServiceFactory::GetInstance(); - } + SubresourceFilterProfileContextFactory::GetInstance(); + SupervisedUserMetricsServiceFactory::GetInstance(); + if (full_init) { + SupervisedUserServiceFactory::GetInstance(); + } #if BUILDFLAG(ENABLE_EXTENSIONS) sync_file_system::SyncFileSystemServiceFactory::GetInstance(); #endif @@ -1270,8 +1270,8 @@ void ChromeBrowserMainExtraPartsProfiles:: TriggeredProfileResetterFactory::GetInstance(); #endif #if BUILDFLAG(IS_CHROMEOS_LACROS) - TtsClientFactoryLacros::GetInstance(); printing::ExtensionPrinterServiceProviderFactoryLacros::GetInstance(); + TtsClientFactoryLacros::GetInstance(); #endif #if !BUILDFLAG(IS_CHROMEOS_ASH) && !BUILDFLAG(IS_ANDROID) TurnSyncOnHelper::EnsureFactoryBuilt(); @@ -1289,11 +1289,6 @@ void ChromeBrowserMainExtraPartsProfiles:: user_notes::UserNoteServiceFactory::EnsureFactoryBuilt(); UserEducationServiceFactory::GetInstance(); #endif -#if BUILDFLAG(IS_ANDROID) - // TODO(crbug.com/340893655) Fix dangling pointer issue (on Mac) and enable - // for non-Android architectures. - visited_url_ranking::VisitedURLRankingServiceFactory::GetInstance(); -#endif #if BUILDFLAG(ENABLE_EXTENSIONS) // web_app::IsolatedWebAppReaderRegistryFactory::GetInstance(); // web_app::WebAppMetricsFactory::GetInstance(); diff --git a/src/chrome/browser/profiles/profile_manager.cc b/src/chrome/browser/profiles/profile_manager.cc index 755d1ed119a..b490e9e72d1 100644 --- a/src/chrome/browser/profiles/profile_manager.cc +++ b/src/chrome/browser/profiles/profile_manager.cc @@ -877,11 +877,7 @@ bool ProfileManager::IsAllowedProfilePath(const base::FilePath& path) const { } bool ProfileManager::CanCreateProfileAtPath(const base::FilePath& path) const { - bool is_allowed_path = IsAllowedProfilePath(path) || - base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kAllowProfilesOutsideUserDir); - - if (!is_allowed_path) { + if (!IsAllowedProfilePath(path)) { LOG(ERROR) << "Cannot create profile at path " << path.AsUTF8Unsafe(); return false; } @@ -1101,7 +1097,7 @@ void ProfileManager::AutoloadProfiles() { void ProfileManager::InitProfileUserPrefs(Profile* profile) { TRACE_EVENT0("browser", "ProfileManager::InitProfileUserPrefs"); ProfileAttributesStorage& storage = GetProfileAttributesStorage(); - + if (!IsAllowedProfilePath(profile->GetPath())) { LOG(WARNING) << "Failed to initialize prefs for a profile at invalid path: " << profile->GetPath().AsUTF8Unsafe(); @@ -1484,6 +1480,8 @@ void ProfileManager::DoFinalInitForServices(Profile* profile, AreKeyedServicesDisabledForProfileByDefault(profile)) { return; } + + // Ensure WootzWalletService is started. wootz_wallet::WootzWalletServiceFactory::GetServiceForContext(profile); TRACE_EVENT0("browser", "ProfileManager::DoFinalInitForServices"); diff --git a/src/chrome/browser/ui/BUILD.gn b/src/chrome/browser/ui/BUILD.gn index e375d4f07d5..b6cce80e31a 100644 --- a/src/chrome/browser/ui/BUILD.gn +++ b/src/chrome/browser/ui/BUILD.gn @@ -16,7 +16,7 @@ import("//components/compose/features.gni") import("//components/enterprise/buildflags/buildflags.gni") import("//components/feed/features.gni") import("//components/lens/features.gni") -import("//components/metrics/generate_histograms_variants_allowlist.gni") +import("//components/metrics/generate_allowlist_from_histograms_file.gni") import("//components/metrics/structured/buildflags/buildflags.gni") import("//components/nacl/features.gni") import("//components/offline_pages/buildflags/features.gni") @@ -35,9 +35,10 @@ import("//ui/views/features.gni") assert(enable_supervised_users) assert(!is_fuchsia, "Fuchsia shouldn't use anything in //chrome") -generate_histograms_variants_allowlist("webui_name_variants") { +generate_allowlist_from_histograms_file("webui_name_variants") { namespace = "views_metrics" input_xml_file = "//tools/metrics/histograms/metadata/page/histograms.xml" + tag = "variant" output_file = "webui_name_variants.h" allow_list_name = "WebUIName" } @@ -185,8 +186,12 @@ static_library("ui") { "profiles/profile_error_dialog.h", "recently_audible_helper.cc", "recently_audible_helper.h", + "safety_hub/safety_hub_constants.cc", + "safety_hub/safety_hub_constants.h", "safety_hub/safety_hub_service.cc", "safety_hub/safety_hub_service.h", + "safety_hub/safety_hub_util.cc", + "safety_hub/safety_hub_util.h", "safety_hub/unused_site_permissions_service.cc", "safety_hub/unused_site_permissions_service.h", "safety_hub/unused_site_permissions_service_factory.cc", @@ -1793,8 +1798,6 @@ static_library("ui") { "webui/cr_components/history_embeddings/history_embeddings_handler.h", "webui/cr_components/most_visited/most_visited_handler.cc", "webui/cr_components/most_visited/most_visited_handler.h", - "webui/cr_components/theme_color_picker/customize_chrome_colors.cc", - "webui/cr_components/theme_color_picker/customize_chrome_colors.h", "webui/cr_components/theme_color_picker/theme_color_picker_handler.cc", "webui/cr_components/theme_color_picker/theme_color_picker_handler.h", "webui/customize_themes/chrome_customize_themes_handler.cc", @@ -2150,6 +2153,7 @@ static_library("ui") { "//chrome/browser/media/router", "//chrome/browser/media/router/discovery:discovery", "//chrome/browser/media/router/discovery/access_code:access_code_sink_service", + "//chrome/browser/new_tab_page/chrome_colors", "//chrome/browser/new_tab_page/chrome_colors:generate_chrome_colors_info", "//chrome/browser/new_tab_page/chrome_colors:generate_colors_info", "//chrome/browser/new_tab_page/modules/feed:mojo_bindings", @@ -2173,6 +2177,7 @@ static_library("ui") { "//chrome/browser/ui/tabs", "//chrome/browser/ui/webui/access_code_cast:mojo_bindings", "//chrome/browser/ui/webui/app_service_internals:mojo_bindings", + "//chrome/browser/ui/webui/cr_components/theme_color_picker", "//chrome/browser/ui/webui/downloads:mojo_bindings", "//chrome/browser/ui/webui/hats:mojo_bindings", "//chrome/browser/ui/webui/internals/user_education:mojo_bindings", @@ -2724,6 +2729,8 @@ static_library("ui") { "ash/birch/birch_keyed_service.h", "ash/birch/birch_keyed_service_factory.cc", "ash/birch/birch_keyed_service_factory.h", + "ash/birch/birch_most_visited_provider.cc", + "ash/birch/birch_most_visited_provider.h", "ash/birch/birch_recent_tabs_provider.cc", "ash/birch/birch_recent_tabs_provider.h", "ash/birch/birch_release_notes_provider.cc", @@ -3057,6 +3064,8 @@ static_library("ui") { "settings_window_manager_observer_chromeos.h", "views/apps/app_dialog/app_block_dialog_view.cc", "views/apps/app_dialog/app_block_dialog_view.h", + "views/apps/app_dialog/app_local_block_dialog_view.cc", + "views/apps/app_dialog/app_local_block_dialog_view.h", "views/apps/app_dialog/app_pause_dialog_view.cc", "views/apps/app_dialog/app_pause_dialog_view.h", "views/apps/app_info_dialog/arc_app_info_links_panel.cc", @@ -3078,7 +3087,7 @@ static_library("ui") { "views/bruschetta/bruschetta_installer_view.h", "views/bruschetta/bruschetta_uninstaller_view.cc", "views/bruschetta/bruschetta_uninstaller_view.h", - "views/chrome_views_delegate_chromeos.cc", + "views/chrome_views_delegate_ash.cc", "views/crostini/crostini_ansible_software_config_view.cc", "views/crostini/crostini_ansible_software_config_view.h", "views/crostini/crostini_app_restart_dialog.cc", @@ -3354,8 +3363,6 @@ static_library("ui") { "webui/ash/login/fingerprint_setup_screen_handler.h", "webui/ash/login/gaia_info_screen_handler.cc", "webui/ash/login/gaia_info_screen_handler.h", - "webui/ash/login/gaia_password_changed_screen_handler.cc", - "webui/ash/login/gaia_password_changed_screen_handler.h", "webui/ash/login/gaia_screen_handler.cc", "webui/ash/login/gaia_screen_handler.h", "webui/ash/login/gesture_navigation_screen_handler.cc", @@ -3848,6 +3855,7 @@ static_library("ui") { "//ash/webui/focus_mode", "//ash/webui/help_app_ui", "//ash/webui/help_app_ui/search:mojo_bindings", + "//ash/webui/mall:url_constants", "//ash/webui/media_app_ui", "//ash/webui/multidevice_debug", "//ash/webui/network_ui:network_diagnostics_resource_provider", @@ -3863,6 +3871,7 @@ static_library("ui") { "//ash/webui/print_preview_cros", "//ash/webui/projector_app", "//ash/webui/projector_app/public/mojom:projector_mojo_bindings", + "//ash/webui/sanitize_ui", "//ash/webui/scanning", "//ash/webui/shimless_rma", "//ash/webui/shortcut_customization_ui", @@ -3897,7 +3906,6 @@ static_library("ui") { "//chrome/browser/nearby_sharing/common", "//chrome/browser/nearby_sharing/contacts", "//chrome/browser/nearby_sharing/local_device_data", - "//chrome/browser/nearby_sharing/logging", "//chrome/browser/nearby_sharing/logging:util", "//chrome/browser/policy:onc", "//chrome/browser/push_notification:push_notification", @@ -3965,6 +3973,7 @@ static_library("ui") { "//chromeos/ash/components/heatmap", "//chromeos/ash/components/human_presence", "//chromeos/ash/components/install_attributes", + "//chromeos/ash/components/kiosk/vision/webui", "//chromeos/ash/components/launcher_search", "//chromeos/ash/components/local_search_service/public/cpp", "//chromeos/ash/components/local_search_service/public/mojom", @@ -4073,6 +4082,7 @@ static_library("ui") { "//google_apis/common", "//google_apis/drive", "//google_apis/tasks", + "//google_apis/youtube_music", "//media/capture:capture_lib", "//mojo/public/js:resources_grit", "//remoting/host/chromeos:features", @@ -4270,6 +4280,8 @@ static_library("ui") { "lens/lens_overlay_side_panel_coordinator.h", "lens/lens_overlay_side_panel_navigation_throttle.cc", "lens/lens_overlay_side_panel_navigation_throttle.h", + "lens/lens_overlay_theme_utils.cc", + "lens/lens_overlay_theme_utils.h", "lens/lens_search_bubble_controller.cc", "lens/lens_search_bubble_controller.h", "lens/lens_untrusted_ui.cc", @@ -4796,6 +4808,7 @@ static_library("ui") { deps += [ "//chrome/browser:titlebar_config", "//chrome/browser/ui/startup:buildflags", + "//chrome/browser/win:mica_titlebar", "//chrome/browser/win/conflicts:module_info", "//chrome/credential_provider/common:common_constants", "//chrome/services/util_win/public/mojom:mojom", @@ -5921,6 +5934,8 @@ static_library("ui") { "views/performance_controls/memory_saver_resource_view.h", "views/performance_controls/performance_intervention_button.cc", "views/performance_controls/performance_intervention_button.h", + "views/permissions/chip/chip_controller.cc", + "views/permissions/chip/chip_controller.h", "views/permissions/chip/multi_image_container.cc", "views/permissions/chip/multi_image_container.h", "views/permissions/chip/permission_chip_theme.h", @@ -5932,8 +5947,6 @@ static_library("ui") { "views/permissions/chip/permission_dashboard_view.h", "views/permissions/chip/permission_prompt_chip_model.cc", "views/permissions/chip/permission_prompt_chip_model.h", - "views/permissions/chip_controller.cc", - "views/permissions/chip_controller.h", "views/permissions/chooser_bubble_ui.cc", "views/permissions/embedded_permission_prompt.cc", "views/permissions/embedded_permission_prompt.h", @@ -6384,8 +6397,6 @@ static_library("ui") { "views/web_apps/web_app_identity_update_confirmation_view.h", "views/web_apps/web_app_info_image_source.cc", "views/web_apps/web_app_info_image_source.h", - "views/web_apps/web_app_install_dialog_coordinator.cc", - "views/web_apps/web_app_install_dialog_coordinator.h", "views/web_apps/web_app_install_dialog_delegate.cc", "views/web_apps/web_app_install_dialog_delegate.h", "views/web_apps/web_app_simple_install_dialog.cc", @@ -7454,4 +7465,4 @@ if (is_android) { java_cpp_enum("adaptive_toolbar_enums_java") { sources = [ "android/toolbar/adaptive_toolbar_enums.h" ] } -} \ No newline at end of file +} diff --git a/src/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl.java b/src/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl.java index 17075f6a57c..13632f24aaf 100644 --- a/src/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl.java +++ b/src/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl.java @@ -16,12 +16,12 @@ import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; + import androidx.fragment.app.FragmentManager; import android.util.Log; import org.chromium.base.Callback; import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.supplier.Supplier; - import org.chromium.chrome.browser.app.ChromeActivity; import org.chromium.chrome.browser.app.ChromeActivity.ChromeActivityNotFoundException; import org.chromium.chrome.browser.app.appmenu.AppMenuPropertiesDelegateImpl; @@ -73,9 +73,8 @@ class AppMenuHandlerImpl private FragmentManager mFragmentManager; private final int mItemRowHeight; private WindowAndroid mWindowAndroid; - private AppMenuExtensionOpener mExtensionOpener; - + /** * The resource id of the menu item to highlight when the menu next opens. A value of {@code * null} means no item will be highlighted. This value will be cleared after the menu is opened. @@ -154,7 +153,6 @@ public void onItemRangeRemoved(ListObservable source, int index, int count) { /* withAssertions= */ false); } }; - Log.d(TAG, "AppMenuHandlerImpl initialized with itemRowHeight: " + itemRowHeight); } WindowAndroid getWindowAndroid() { @@ -217,10 +215,14 @@ boolean showAppMenu(View anchorView, boolean startDragging) { List customViewBinders = mDelegate.getCustomViewBinders(); Map customViewTypeOffsetMap = populateCustomViewBinderOffsetMap(customViewBinders, AppMenuItemType.NUM_ENTRIES); - mModelList = mDelegate.getMenuItems( - ((id) -> getCustomItemViewType(id, customViewBinders, customViewTypeOffsetMap)), - this); - + mModelList = + mDelegate.getMenuItems( + ((id) -> { + return getCustomItemViewType( + id, customViewBinders, customViewTypeOffsetMap); + }), + this); + if (true) { // Reverse the order of items in the menu ModelList modelListReversed = new ModelList(); @@ -231,9 +233,6 @@ boolean showAppMenu(View anchorView, boolean startDragging) { } mModelList.addObserver(mListObserver); - // if (mAppMenu == null) { - // mAppMenu = new AppMenu(mItemRowHeight, this, mContext.getResources()); - // } if (mAppMenu == null) { Log.d(TAG, "Creating new AppMenu"); try { @@ -258,7 +257,6 @@ boolean showAppMenu(View anchorView, boolean startDragging) { mAppMenu.setHeaderResourceId(headerResourceId); mAppMenu.setFooterResourceId(footerResourceId); - // mAppMenu.show(mFragmentManager, "app_menu"); try { Log.d(TAG, "Showing AppMenu"); mAppMenu.show(mFragmentManager, "app_menu"); @@ -274,6 +272,7 @@ boolean showAppMenu(View anchorView, boolean startDragging) { } } + public void openExtensionById(String extensionId) { Log.d(TAG, "JANGID: AppMenuHandler openExtensionById " + extensionId); if (mAppMenu != null) { diff --git a/src/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml b/src/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml index 8a7afc704d4..f7b5e0c0dce 100644 --- a/src/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml +++ b/src/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml @@ -101,9 +101,9 @@ found in the LICENSE file. 72dp 48dp - @dimen/omnibox_suggestion_dropdown_side_spacing + @dimen/omnibox_suggestion_dropdown_side_spacing - @dimen/default_elevation_0 + @dimen/default_elevation_0 16dp 8dp 0dp diff --git a/src/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java b/src/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java index ba280d4fbb9..a5f247ed2fd 100644 --- a/src/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java +++ b/src/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java @@ -64,6 +64,7 @@ import java.util.List; import java.util.Optional; import java.util.function.BooleanSupplier; + /** * The public API of the location bar component. Location bar responsibilities are: * @@ -856,4 +857,4 @@ public int getUrlActionContainerEndMarginForTesting() { public @NonNull Optional getOmniboxSuggestionsVisualState() { return Optional.of(mAutocompleteCoordinator); } -} \ No newline at end of file +} diff --git a/src/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java b/src/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java index 4ca7e64fcf6..7e2f430a206 100644 --- a/src/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java +++ b/src/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java @@ -83,11 +83,12 @@ public class AutocompleteCoordinator private @Nullable OmniboxSuggestionsDropdown mDropdown; private @NonNull ObserverList mScrollListenerList = new ObserverList<>(); + private final @NonNull OmniboxSuggestionsDropdownEmbedder mDropdownEmbedder; /** An observer watching for changes to the visual state of the omnibox suggestions. */ public interface OmniboxSuggestionsVisualStateObserver { - /** Called when the visibility of the omnibox suggestions changes. */ - void onOmniboxSuggestionsVisibilityChanged(boolean visible); + /** Called when the Omnibox session state changes. */ + void onOmniboxSessionStateChange(boolean isActive); /** Called when the background color of the omnibox suggestions changes. */ void onOmniboxSuggestionsBackgroundColorChanged(@ColorInt int color); @@ -115,15 +116,16 @@ public AutocompleteCoordinator( mModalDialogManagerSupplier = modalDialogManagerSupplier; Context context = parent.getContext(); - PropertyModel listModel = new PropertyModel(SuggestionListProperties.ALL_KEYS); ModelList listItems = new ModelList(); - mDropdownEmbedder = dropdownEmbedder; - - listModel.set(SuggestionListProperties.EMBEDDER, dropdownEmbedder); - listModel.set(SuggestionListProperties.VISIBLE, false); - listModel.set(SuggestionListProperties.DRAW_OVER_ANCHOR, false); - listModel.set(SuggestionListProperties.SUGGESTION_MODELS, listItems); + PropertyModel listModel = + new PropertyModel.Builder(SuggestionListProperties.ALL_KEYS) + .with(SuggestionListProperties.EMBEDDER, dropdownEmbedder) + .with(SuggestionListProperties.OMNIBOX_SESSION_ACTIVE, false) + .with(SuggestionListProperties.DRAW_OVER_ANCHOR, false) + .with(SuggestionListProperties.SUGGESTION_MODELS, listItems) + .build(); + mDropdownEmbedder = dropdownEmbedder; mMediator = new AutocompleteMediator( context, @@ -165,7 +167,7 @@ public AutocompleteCoordinator( }); LazyConstructionPropertyMcp.create( listModel, - SuggestionListProperties.VISIBLE, + SuggestionListProperties.OMNIBOX_SESSION_ACTIVE, viewProvider, SuggestionListViewBinder::bind); @@ -236,7 +238,7 @@ private void onAsyncInflationComplete(ViewGroup container) { ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) dropdown.getLayoutParams(); layoutParams.setMargins(0, 0, 0, bottomMargin); // Set desired margins (left, top, right, bottom) dropdown.setLayoutParams(layoutParams); - + dropdown.forcePhoneStyleOmnibox(forcePhoneStyleOmnibox); dropdown.setAdapter(mAdapter); if (true) { @@ -560,4 +562,4 @@ public void removeOmniboxSuggestionsDropdownScrollListener( OmniboxSuggestionsDropdownScrollListener listener) { mScrollListenerList.removeObserver(listener); } -} \ No newline at end of file +} diff --git a/src/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java b/src/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java index 00095d16acd..272cc01aff1 100644 --- a/src/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java +++ b/src/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java @@ -25,7 +25,6 @@ import org.chromium.base.TraceEvent; import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.supplier.Supplier; -import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.browser.lifecycle.TopResumedActivityChangedObserver; import org.chromium.chrome.browser.omnibox.LocationBarDataProvider; @@ -40,7 +39,6 @@ import org.chromium.chrome.browser.omnibox.suggestions.basic.BasicSuggestionProcessor.BookmarkState; import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler; import org.chromium.chrome.browser.profiles.Profile; -import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; import org.chromium.chrome.browser.share.ShareDelegate; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab.LoadUrlResult; @@ -56,7 +54,6 @@ import org.chromium.components.omnibox.OmniboxSuggestionType; import org.chromium.components.omnibox.action.OmniboxAction; import org.chromium.components.omnibox.action.OmniboxActionDelegate; -import org.chromium.components.search_engines.TemplateUrlService; import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.content_public.browser.WebContents; import org.chromium.ui.base.DeviceFormFactor; @@ -100,23 +97,19 @@ class AutocompleteMediator private final @NonNull DropdownItemViewInfoListManager mDropdownViewInfoListManager; private final @NonNull Callback mBringTabToFrontCallback; private final @NonNull Supplier mTabWindowManagerSupplier; - private final @NonNull Runnable mClearFocusCallback; private final @NonNull OmniboxActionDelegate mOmniboxActionDelegate; private final @NonNull ActivityLifecycleDispatcher mLifecycleDispatcher; private final @NonNull SuggestionsListAnimationDriver mAnimationDriver; - private @NonNull AutocompleteResult mAutocompleteResult = AutocompleteResult.EMPTY_RESULT; - private @Nullable Runnable mCurrentAutocompleteRequest; - private @Nullable Runnable mDeferredLoadAction; - private @Nullable PropertyModel mDeleteDialogModel; - private @Nullable TemplateUrlService mTemplateUrlService; + private @NonNull Optional mAutocompleteResult = Optional.empty(); + private @NonNull Optional mCurrentAutocompleteRequest = Optional.empty(); + private @NonNull Optional mDeferredLoadAction = Optional.empty(); + private @NonNull Optional mDeleteDialogModel = Optional.empty(); private boolean mNativeInitialized; private boolean mIsInZeroPrefixContext; private AutocompleteController mAutocomplete; private long mUrlFocusTime; - private boolean mClearFocusAfterNavigation; - private boolean mClearFocusAfterNavigationAsynchronously; // When set, indicates an active omnibox session. private boolean mIsActive; // When set, specifies the system time of the most recent suggestion list request. @@ -169,7 +162,7 @@ class AutocompleteMediator // The number of prefetches that were started from touch down events during an omnibox session. private int mNumPrefetchesStartedInOmniboxSession; // The suggestion that the last prefetch was started for within the current omnibox session. - private @Nullable AutocompleteMatch mLastPrefetchStartedSuggestion; + private @NonNull Optional mLastPrefetchStartedSuggestion = Optional.empty(); // Observer watching for changes to the visual state of the omnibox suggestions. private @NonNull Optional @@ -208,7 +201,6 @@ public AutocompleteMediator( mDropdownViewInfoListBuilder.setShareDelegateSupplier(shareDelegateSupplier); mDropdownViewInfoListManager = new DropdownItemViewInfoListManager(mSuggestionModels, context); - mClearFocusCallback = this::finishInteraction; OmniboxResourceProvider.invalidateDrawableCache(); mLifecycleDispatcher = lifecycleDispatcher; mLifecycleDispatcher.register(this); @@ -229,7 +221,7 @@ public AutocompleteMediator( windowAndroid, mListPropertyModel, embedder::getVerticalTranslationForAnimation, - () -> updateOmniboxSuggestionsVisibility(true), + () -> propagateOmniboxSessionStateChange(true), addedVerticalOffset); } @@ -267,7 +259,7 @@ public void destroy() { if (mNativeInitialized) { OmniboxActionFactoryImpl.get().destroyNativeFactory(); } - mHandler.removeCallbacks(mClearFocusCallback); + mHandler.removeCallbacks(null); mDropdownViewInfoListBuilder.destroy(); mLifecycleDispatcher.unregister(this); } @@ -295,7 +287,7 @@ private boolean isSuggestionFromClipboard(AutocompleteMatch suggestion) { * @return The number of current autocomplete suggestions. */ public int getSuggestionCount() { - return mAutocompleteResult.getSuggestionsList().size(); + return mAutocompleteResult.map(r -> r.getSuggestionsList().size()).orElse(0); } /** @@ -307,7 +299,7 @@ public int getSuggestionCount() { * @return The suggestion at the given index. */ public AutocompleteMatch getSuggestionAt(int matchIndex) { - return mAutocompleteResult.getSuggestionsList().get(matchIndex); + return mAutocompleteResult.map(r -> r.getSuggestionsList().get(matchIndex)).orElse(null); } /** @@ -375,15 +367,6 @@ void allowPendingItemSelection() { void onNativeInitialized() { mNativeInitialized = true; OmniboxActionFactoryImpl.get().initNativeFactory(); - // TODO(b/277805322): remove this Feature and parameter once we've run a holdback - // experiment. - mClearFocusAfterNavigation = - ChromeFeatureList.isEnabled(ChromeFeatureList.CLEAR_OMNIBOX_FOCUS_AFTER_NAVIGATION); - mClearFocusAfterNavigationAsynchronously = - ChromeFeatureList.getFieldTrialParamByFeatureAsBoolean( - ChromeFeatureList.CLEAR_OMNIBOX_FOCUS_AFTER_NAVIGATION, - "clear_focus_asynchronously", - true); mDropdownViewInfoListManager.onNativeInitialized(); mDropdownViewInfoListBuilder.onNativeInitialized(); runPendingAutocompleteRequests(); @@ -448,13 +431,13 @@ void onOmniboxSessionStateChange(boolean activated) { mNumPrefetchesStartedInOmniboxSession); mNumTouchDownEventForwardedInOmniboxSession = 0; mNumPrefetchesStartedInOmniboxSession = 0; - mLastPrefetchStartedSuggestion = null; + mLastPrefetchStartedSuggestion = Optional.empty(); mEditSessionState = EditSessionState.INACTIVE; mNewOmniboxEditSessionTimestamp = -1; // Prevent any upcoming omnibox suggestions from showing once a URL is loaded (and as // a consequence the omnibox is unfocused). - hideSuggestions(); + clearSuggestions(); } } @@ -463,7 +446,7 @@ void onOmniboxSessionStateChange(boolean activated) { * org.chromium.chrome.browser.omnibox.UrlFocusChangeListener#onUrlAnimationFinished(boolean) */ void onUrlAnimationFinished(boolean hasFocus) { - updateOmniboxSuggestionsVisibility(hasFocus); + propagateOmniboxSessionStateChange(hasFocus); } /** @@ -478,7 +461,6 @@ void setAutocompleteProfile(Profile profile) { } mAutocomplete = AutocompleteController.getForProfile(profile); mAutocomplete.addOnSuggestionsReceivedListener(this); - mTemplateUrlService = TemplateUrlServiceFactory.getForProfile(profile); mDropdownViewInfoListBuilder.setProfile(profile); runPendingAutocompleteRequests(); @@ -503,7 +485,7 @@ void onVoiceResults(@Nullable List results) * @return The current native pointer to the autocomplete results. */ long getCurrentNativeAutocompleteResult() { - return mAutocompleteResult.getNativeObjectRef(); + return mAutocompleteResult.map(r -> r.getNativeObjectRef()).orElse(0L); } /** @@ -518,13 +500,14 @@ public void onSuggestionClicked( @NonNull AutocompleteMatch suggestion, int matchIndex, @NonNull GURL url) { if (!mNativeInitialized || mAutocomplete == null) { mDeferredLoadAction = - () -> - loadUrlForOmniboxMatch( - matchIndex, - suggestion, - url, - mLastActionUpTimestamp, - /* openInNewTab= */ false); + Optional.of( + () -> + loadUrlForOmniboxMatch( + matchIndex, + suggestion, + url, + mLastActionUpTimestamp, + /* openInNewTab= */ false)); return; } @@ -554,7 +537,7 @@ public void onSuggestionTouchDown(@NonNull AutocompleteMatch suggestion, int mat mAutocomplete.onSuggestionTouchDown(suggestion, matchIndex, webContents); if (wasPrefetchStarted) { mNumPrefetchesStartedInOmniboxSession++; - mLastPrefetchStartedSuggestion = suggestion; + mLastPrefetchStartedSuggestion = Optional.of(suggestion); } } @@ -667,12 +650,6 @@ public void finishInteraction() { mDelegate.clearOmniboxFocus(); } - @Override - public @Nullable String queryFromGurl(GURL url) { - if (mTemplateUrlService == null) return null; - return mTemplateUrlService.getSearchQueryForUrl(url); - } - public void showDeleteDialog( @NonNull AutocompleteMatch suggestion, @NonNull String titleText, @@ -714,7 +691,7 @@ public void onClick(PropertyModel model, int buttonType) { @Override public void onDismiss(PropertyModel model, int dismissalCause) { - mDeleteDialogModel = null; + mDeleteDialogModel = Optional.empty(); } }; @@ -725,22 +702,26 @@ public void onDismiss(PropertyModel model, int dismissalCause) { } mDeleteDialogModel = - new PropertyModel.Builder(ModalDialogProperties.ALL_KEYS) - .with(ModalDialogProperties.CONTROLLER, dialogController) - .with(ModalDialogProperties.TITLE, titleText) - .with(ModalDialogProperties.TITLE_MAX_LINES, 1) - .with( - ModalDialogProperties.MESSAGE_PARAGRAPH_1, - resources.getString(dialogMessageId)) - .with(ModalDialogProperties.POSITIVE_BUTTON_TEXT, resources, R.string.ok) - .with( - ModalDialogProperties.NEGATIVE_BUTTON_TEXT, - resources, - R.string.cancel) - .with(ModalDialogProperties.CANCEL_ON_TOUCH_OUTSIDE, true) - .build(); - - manager.showDialog(mDeleteDialogModel, ModalDialogManager.ModalDialogType.APP); + Optional.of( + new PropertyModel.Builder(ModalDialogProperties.ALL_KEYS) + .with(ModalDialogProperties.CONTROLLER, dialogController) + .with(ModalDialogProperties.TITLE, titleText) + .with(ModalDialogProperties.TITLE_MAX_LINES, 1) + .with( + ModalDialogProperties.MESSAGE_PARAGRAPH_1, + resources.getString(dialogMessageId)) + .with( + ModalDialogProperties.POSITIVE_BUTTON_TEXT, + resources, + R.string.ok) + .with( + ModalDialogProperties.NEGATIVE_BUTTON_TEXT, + resources, + R.string.cancel) + .with(ModalDialogProperties.CANCEL_ON_TOUCH_OUTSIDE, true) + .build()); + + manager.showDialog(mDeleteDialogModel.get(), ModalDialogManager.ModalDialogType.APP); } /** @@ -750,8 +731,7 @@ public void onDismiss(PropertyModel model, int dismissalCause) { */ private void dismissDeleteDialog(@DialogDismissalCause int cause) { var manager = mModalDialogManagerSupplier.get(); - if (mDeleteDialogModel == null || manager == null) return; - manager.dismissDialog(mDeleteDialogModel, cause); + mDeleteDialogModel.ifPresent(model -> manager.dismissDialog(model, cause)); } /** @@ -815,7 +795,7 @@ public void onTextChanged(@NonNull String textWithoutAutocomplete) { mIsInZeroPrefixContext = TextUtils.isEmpty(textWithoutAutocomplete); if (mIsInZeroPrefixContext) { - hideSuggestions(); + clearSuggestions(); startCachedZeroSuggest(); } else { // There may be no tabs when searching form omnibox in overview mode. In that case, @@ -861,8 +841,8 @@ public void onSuggestionsReceived( String userText = mUrlBarEditingTextProvider.getTextWithoutAutocomplete(); mUrlTextAfterSuggestionsReceived = userText + inlineAutocompleteText; - if (!mAutocompleteResult.equals(autocompleteResult)) { - mAutocompleteResult = autocompleteResult; + if (!mAutocompleteResult.map(r -> r.equals(autocompleteResult)).orElse(false)) { + mAutocompleteResult = Optional.of(autocompleteResult); var viewInfoList = mDropdownViewInfoListBuilder.buildDropdownViewInfoList(autocompleteResult); mDropdownViewInfoListManager.setSourceViewInfoList(viewInfoList); @@ -888,7 +868,8 @@ void loadTypedOmniboxText(long eventTime, boolean openInNewTab) { if (mNativeInitialized && mAutocomplete != null) { findMatchAndLoadUrl(urlText, eventTime, openInNewTab); } else { - mDeferredLoadAction = () -> findMatchAndLoadUrl(urlText, eventTime, openInNewTab); + mDeferredLoadAction = + Optional.of(() -> findMatchAndLoadUrl(urlText, eventTime, openInNewTab)); } } @@ -945,7 +926,7 @@ private void loadUrlForOmniboxMatch( OmniboxMetrics.recordFocusToOpenTime(System.currentTimeMillis() - mUrlFocusTime); // Clear the deferred site load action in case it executes. Reclaims a bit of memory. - mDeferredLoadAction = null; + mDeferredLoadAction = Optional.empty(); mOmniboxFocusResultedInNavigation = true; url = updateSuggestionUrlIfNeeded(suggestion, matchIndex, url); @@ -983,22 +964,6 @@ private void loadUrlForOmniboxMatch( // This normally happens when the target site loads and focus is moved to the // webcontents. On Android T we occasionally observe focus events to be lost, resulting // with Suggestions list obscuring the view. - // TODO(crbug.com/40233313): clearing the Omnibox focus is slow, so we want to - // experiment - // with two alternatives: - // 1) Clear the Omnibox focus in a follow-up task. From a latency perspective, this is - // the best option: the navigation gets kicked off right away, and important - // navigation tasks can get scheduled between the current task and the task clearing - // the Omnibox focus. The ClearOmniboxFocusAfterNavigation feature with the - // clear_focus_asynchronously = false parameter (default) implements this option. - // 2) Clear the Omnibox focus synchronously *after* the navigation has been kicked off. - // This allows some navigation work outside the browser process (e.g. running - // beforeunload handlers) to start ASAP. This is implemented by the setting the - // clear_focus_asynchronously = true parameter. - if (!mClearFocusAfterNavigation) { - finishInteraction(); - } - var autocompleteLoadCallback = new AutocompleteLoadCallback() { @Override @@ -1027,11 +992,7 @@ public void onLoadUrl(LoadUrlParams params, LoadUrlResult loadUrlResult) { .build()); } - if (mClearFocusAfterNavigationAsynchronously) { - mHandler.post(mClearFocusCallback); - } else if (mClearFocusAfterNavigation) { - finishInteraction(); - } + mHandler.post(this::finishInteraction); } } @@ -1075,39 +1036,40 @@ private void startZeroSuggest() { } /** - * Update whether the omnibox suggestions are visible. + * Update whether the Omnibox session is active. * - * @param shouldBeVisible whether the omnibox suggestions are visible + * @param isActive whether session is currently active */ @VisibleForTesting - void updateOmniboxSuggestionsVisibility(boolean shouldBeVisible) { - boolean wasVisible = mListPropertyModel.get(SuggestionListProperties.VISIBLE); - mListPropertyModel.set(SuggestionListProperties.VISIBLE, shouldBeVisible); - if (shouldBeVisible && !wasVisible) { - mIgnoreOmniboxItemSelection = true; // Reset to default value. + void propagateOmniboxSessionStateChange(boolean isActive) { + boolean wasActive = mListPropertyModel.get(SuggestionListProperties.OMNIBOX_SESSION_ACTIVE); + mListPropertyModel.set(SuggestionListProperties.OMNIBOX_SESSION_ACTIVE, isActive); + + if (isActive != wasActive) { + mIgnoreOmniboxItemSelection |= isActive; // Reset to default value. + mOmniboxSuggestionsVisualStateObserver.ifPresent( + (observer) -> observer.onOmniboxSessionStateChange(isActive)); } - mOmniboxSuggestionsVisualStateObserver.ifPresent( - (observer) -> observer.onOmniboxSuggestionsVisibilityChanged(shouldBeVisible)); } /** - * Hides the omnibox suggestion popup. + * Clear the list of suggestions. + * + *

This call is used to terminate the Autocomplete session and hide the suggestions list + * while the Omnibox session is active. * - *

Signals the autocomplete controller to stop generating omnibox suggestions. + *

This call *does not* terminate the Omnibox session. * - * @see AutocompleteController#stop(boolean) + * @see the {@link AutocompleteController#stop(boolean)} */ @VisibleForTesting - void hideSuggestions() { + void clearSuggestions() { if (!mNativeInitialized || mAutocomplete == null) return; stopAutocomplete(true); dismissDeleteDialog(DialogDismissalCause.NAVIGATE_BACK_OR_TOUCH_OUTSIDE); mDropdownViewInfoListManager.clear(); - mAutocompleteResult = AutocompleteResult.EMPTY_RESULT; - - mOmniboxSuggestionsVisualStateObserver.ifPresent( - (observer) -> observer.onOmniboxSuggestionsVisibilityChanged(false)); + mAutocompleteResult = Optional.empty(); } /** @@ -1161,9 +1123,7 @@ public void onSuggestionDropdownHeightChanged(@Px int newHeight) { @Override public void onSuggestionDropdownScroll() { mSuggestionsListScrolled = true; - if (false) { - mDelegate.setKeyboardVisibility(false, false); - } + mDelegate.setKeyboardVisibility(false, false); } /** @@ -1176,13 +1136,18 @@ public void onSuggestionDropdownScroll() { */ private void recordMetrics( @NonNull AutocompleteMatch match, int suggestionLine, int disposition) { - OmniboxMetrics.recordUsedSuggestionFromCache(mAutocompleteResult.isFromCachedResult()); + if (mAutocompleteResult.isEmpty()) return; + + boolean autocompleteResultIsFromCache = + mAutocompleteResult.map(r -> r.isFromCachedResult()).orElse(true); + + OmniboxMetrics.recordUsedSuggestionFromCache(autocompleteResultIsFromCache); OmniboxMetrics.recordTouchDownPrefetchResult(match, mLastPrefetchStartedSuggestion); // Do not attempt to record other metrics for cached suggestions if the source of the list // is local cache. These suggestions do not have corresponding native objects and will fail // validation. - if (mAutocompleteResult.isFromCachedResult()) return; + if (autocompleteResultIsFromCache) return; GURL currentPageUrl = mDataProvider.getCurrentGurl(); int pageClassification = @@ -1245,51 +1210,55 @@ private void postAutocompleteRequest(@NonNull Runnable action, long delayMillis) cancelAutocompleteRequests(); mCurrentAutocompleteRequest = - new Runnable() { - @Override - public void run() { - mIsExecutingAutocompleteAction = true; - action.run(); - mIsExecutingAutocompleteAction = false; - // Release completed Runnable. - mCurrentAutocompleteRequest = null; - } - }; + Optional.of( + new Runnable() { + @Override + public void run() { + mIsExecutingAutocompleteAction = true; + action.run(); + mIsExecutingAutocompleteAction = false; + // Release completed Runnable. + mCurrentAutocompleteRequest = Optional.empty(); + } + }); + // In the event we got Native Ready signal but no Profile yet (or the other way around), // delay execution of the Autocomplete request. if (!mNativeInitialized || mAutocomplete == null) return; - if (delayMillis == SCHEDULE_FOR_IMMEDIATE_EXECUTION) { - // TODO(crbug.com/40167699): Replace the following with postAtFrontOfQueue() and - // correct any tests that expect data instantly. - mCurrentAutocompleteRequest.run(); - } else { - mHandler.postDelayed(mCurrentAutocompleteRequest, delayMillis); - } + mCurrentAutocompleteRequest.ifPresent( + request -> { + if (delayMillis == SCHEDULE_FOR_IMMEDIATE_EXECUTION) { + // TODO(crbug.com/40167699): Replace the following with postAtFrontOfQueue() + // and + // correct any tests that expect data instantly. + request.run(); + } else { + mHandler.postDelayed(request, delayMillis); + } + }); } /** Cancel any pending autocomplete actions. */ private void cancelAutocompleteRequests() { stopMeasuringSuggestionRequestToUiModelTime(); - if (mCurrentAutocompleteRequest != null) { - mHandler.removeCallbacks(mCurrentAutocompleteRequest); - mCurrentAutocompleteRequest = null; - } + mCurrentAutocompleteRequest.ifPresent(r -> mHandler.removeCallbacks(r)); + mCurrentAutocompleteRequest = Optional.empty(); } /** Execute any pending Autocomplete requests, if the Autocomplete subsystem is ready. */ private void runPendingAutocompleteRequests() { if (!mNativeInitialized || mAutocomplete == null) return; - if (mDeferredLoadAction != null) { - // Re-schedule the load action for execution. - mHandler.post(mDeferredLoadAction); - mDeferredLoadAction = null; - cancelAutocompleteRequests(); - } else if (mCurrentAutocompleteRequest != null) { - // Re-schedule the autocomplete action for immediate execution. - // These requests are not executed until Native libraries are loaded. - mHandler.postAtFrontOfQueue(mCurrentAutocompleteRequest); - } + mDeferredLoadAction + // If deferred load action is present, cancel all autocomplete and load the URL. + .map( + action -> { + cancelAutocompleteRequests(); + return action; + }) + // Otherwise, run pending autocomplete action (if any). + .or(() -> mCurrentAutocompleteRequest) + .ifPresent(runnable -> mHandler.postAtFrontOfQueue(runnable)); } /** @@ -1344,8 +1313,8 @@ private void stopMeasuringSuggestionRequestToUiModelTime() { public void onTopResumedActivityChanged(boolean isTopResumedActivity) { // TODO(crbug.com/329702834): Ensuring showing Suggestions when activity resumes. if (!isTopResumedActivity) { - hideSuggestions(); + clearSuggestions(); mDelegate.clearOmniboxFocus(); } } -} \ No newline at end of file +} diff --git a/src/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java b/src/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java index ce4e0b0e3e5..f2f85f892b2 100644 --- a/src/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java +++ b/src/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java @@ -24,7 +24,7 @@ import androidx.core.view.ViewCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import android.graphics.Rect; + import org.chromium.base.Callback; import org.chromium.base.TraceEvent; import org.chromium.base.metrics.TimingMetric; @@ -43,6 +43,8 @@ import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.base.ViewUtils; +import java.util.Optional; + /** A widget for showing a list of omnibox suggestions. */ public class OmniboxSuggestionsDropdown extends RecyclerView { /** @@ -60,16 +62,15 @@ public class OmniboxSuggestionsDropdown extends RecyclerView { private final RecyclerViewSelectionController mSelectionController; private @Nullable OmniboxSuggestionsDropdownAdapter mAdapter; - private @Nullable OmniboxSuggestionsDropdownEmbedder mEmbedder; + private Optional mEmbedder = Optional.empty(); private @Nullable GestureObserver mGestureObserver; private @Nullable Callback mHeightChangeListener; - private @Nullable Runnable mSuggestionDropdownScrollListener; - private @Nullable Runnable mSuggestionDropdownOverscrolledToTopListener; private @NonNull OmniboxAlignment mOmniboxAlignment = OmniboxAlignment.UNSPECIFIED; private int mListViewMaxHeight; private int mLastBroadcastedListViewMaxHeight; - private @Nullable Callback mOmniboxAlignmentObserver; + private @Nullable Callback mOmniboxAlignmentObserver = + this::onOmniboxAlignmentChanged; private float mChildVerticalTranslation; /** @@ -89,9 +90,11 @@ public interface GestureObserver { /** Scroll manager that propagates scroll event notification to registered observers. */ @VisibleForTesting - /* package */ class SuggestionLayoutScrollListener extends LinearLayoutManager { + /* package */ static class SuggestionLayoutScrollListener extends LinearLayoutManager { private boolean mLastKeyboardShownState; private boolean mCurrentGestureAffectedKeyboardState; + private @Nullable Runnable mSuggestionDropdownScrollListener; + private @Nullable Runnable mSuggestionDropdownOverscrolledToTopListener; public SuggestionLayoutScrollListener(Context context) { super(context); @@ -212,6 +215,20 @@ public LayoutParams generateDefaultLayoutParams() { /* package */ void onNewGesture() { mCurrentGestureAffectedKeyboardState = false; } + + /** + * @param listener A listener will be invoked whenever the User scrolls the list. + */ + public void setSuggestionDropdownScrollListener(@NonNull Runnable listener) { + mSuggestionDropdownScrollListener = listener; + } + + /** + * @param listener A listener will be invoked whenever the User scrolls the list to the top. + */ + public void setSuggestionDropdownOverscrolledToTopListener(@NonNull Runnable listener) { + mSuggestionDropdownOverscrolledToTopListener = listener; + } } /** @@ -242,7 +259,7 @@ public OmniboxSuggestionsDropdown(@NonNull Context context, AttributeSet attrs) // reverse the layout so that the items are at the bottom (in reverse order) // and anchored to the bottom edge mLayoutScrollListener.setReverseLayout(true); - paddingTop = 5; //Abhinandan: Added padding 5 + paddingTop = 5; } setLayoutManager(mLayoutScrollListener); ViewCompat.setPaddingRelative(this, 0, paddingTop, 0, paddingBottom); @@ -287,8 +304,6 @@ public void destroy() { getRecycledViewPool().clear(); mGestureObserver = null; mHeightChangeListener = null; - mSuggestionDropdownScrollListener = null; - mSuggestionDropdownOverscrolledToTopListener = null; } /** @@ -310,20 +325,6 @@ public void setHeightChangeListener(@NonNull Callback listener) { mHeightChangeListener = listener; } - /** - * @param listener A listener will be invoked whenever the User scrolls the list. - */ - public void setSuggestionDropdownScrollListener(@NonNull Runnable listener) { - mSuggestionDropdownScrollListener = listener; - } - - /** - * @param listener A listener will be invoked whenever the User scrolls the list to the top. - */ - public void setSuggestionDropdownOverscrolledToTopListener(@NonNull Runnable listener) { - mSuggestionDropdownOverscrolledToTopListener = listener; - } - /** Resets selection typically in response to changes to the list. */ public void resetSelection() { mSelectionController.resetSelection(); @@ -425,23 +426,6 @@ public void onAttachedToWindow() { } } - private void installAlignmentObserver() { - // TODO(40253396): this is needed only to permit view to be inflated from XML while keeping - // the old logic that relies on adding/removing the view to/from the view hierarchy. - // AsyncViewInflater automatically attaches the SuggestionsDropdown to the view hierarchy - // once it is done inflating the view, which triggers onAttachedToWindow(). We permit the - // old style management and remove the view from view hierarchy immediately after, which - // triggers onDetachedFromWindow(). - // This should not be needed once we are ready to manage view presence using - // setVisibility(). - if (mEmbedder == null) return; - - mEmbedder.onAttachedToWindow(); - mOmniboxAlignmentObserver = this::onOmniboxAlignmentChanged; - mOmniboxAlignment = mEmbedder.addAlignmentObserver(mOmniboxAlignmentObserver); - resetSelection(); - } - @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); @@ -450,28 +434,10 @@ protected void onDetachedFromWindow() { } } - private void removeAlignmentObserver() { - // TODO(40253396): this is needed only to permit view to be inflated from XML while keeping - // the old logic that relies on adding/removing the view to/from the view hierarchy. - // AsyncViewInflater automatically attaches the SuggestionsDropdown to the view hierarchy - // once it is done inflating the view, which triggers onAttachedToWindow(). We permit the - // old style management and remove the view from view hierarchy immediately after, which - // triggers onDetachedFromWindow(). - // This should not be needed once we are ready to manage view presence using - // setVisibility(). - if (mEmbedder == null) return; - - mEmbedder.onDetachedFromWindow(); - mOmniboxAlignment = OmniboxAlignment.UNSPECIFIED; - if (!OmniboxFeatures.shouldPreWarmRecyclerViewPool()) { - getRecycledViewPool().clear(); - } - mAdapter.recordSessionMetrics(); - mEmbedder.removeAlignmentObserver(mOmniboxAlignmentObserver); - } - @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + boolean isTablet = mEmbedder.map(e -> e.isTablet()).orElse(false); + try (TraceEvent tracing = TraceEvent.scoped("OmniboxSuggestionsList.Measure"); TimingMetric metric = OmniboxMetrics.recordSuggestionListMeasureTime(); TimingMetric metric2 = OmniboxMetrics.recordSuggestionListMeasureWallTime()) { @@ -481,7 +447,7 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { return; } - OmniboxAlignment omniboxAlignment = mEmbedder.getCurrentAlignment(); + OmniboxAlignment omniboxAlignment = mEmbedder.map(e -> e.getCurrentAlignment()).orElse(null); if (omniboxAlignment == null) { setDefaultMeasureSpec(widthMeasureSpec, heightMeasureSpec); return; @@ -499,11 +465,11 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { MeasureSpec.EXACTLY); heightMeasureSpec = MeasureSpec.makeMeasureSpec( availableViewportHeight > 0 ? availableViewportHeight : DEFAULT_HEIGHT, - mEmbedder.isTablet() ? MeasureSpec.AT_MOST : MeasureSpec.EXACTLY); + isTablet ? MeasureSpec.AT_MOST : MeasureSpec.EXACTLY); super.onMeasure(widthMeasureSpec, heightMeasureSpec); - if (mEmbedder.isTablet()) { + if (isTablet) { setRoundBottomCorners( getMeasuredHeight() < availableViewportHeight || !KeyboardVisibilityDelegate.getInstance() @@ -614,9 +580,43 @@ public boolean dispatchTouchEvent(MotionEvent ev) { * @param embedder the embedder of this list. */ public void setEmbedder(@NonNull OmniboxSuggestionsDropdownEmbedder embedder) { - mEmbedder = embedder; - // Request a layout to ensure proper measurement with new embedder - post(() -> requestLayout()); + // Don't reset the current value of `mOmniboxAlignment`, and don't read the value from newly + // installed embedder to ensure the `onOmniboxAlignmentChanged` does the right thing when we + // install our observers. + mEmbedder = Optional.of(embedder); + } + + /** + * Respond to Omnibox session state change. + * + * @param urlHasFocus whether URL has focus (signaling the session is active) + */ + /* package */ void onOmniboxSessionStateChange(boolean urlHasFocus) { + if (urlHasFocus) { + installAlignmentObserver(); + } else { + removeAlignmentObserver(); + } + } + + private void installAlignmentObserver() { + mEmbedder.ifPresent( + e -> { + e.onAttachedToWindow(); + mOmniboxAlignment = e.addAlignmentObserver(mOmniboxAlignmentObserver); + }); + } + + private void removeAlignmentObserver() { + mEmbedder.ifPresent( + e -> { + e.onDetachedFromWindow(); + e.removeAlignmentObserver(mOmniboxAlignmentObserver); + }); + + if (!OmniboxFeatures.shouldPreWarmRecyclerViewPool()) { + getRecycledViewPool().clear(); + } } private void onOmniboxAlignmentChanged(@NonNull OmniboxAlignment omniboxAlignment) { @@ -688,4 +688,4 @@ public void emitWindowContentChanged() { SuggestionLayoutScrollListener getLayoutScrollListener() { return mLayoutScrollListener; } -} \ No newline at end of file +} diff --git a/src/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/SuggestionLayout.java b/src/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/SuggestionLayout.java index b52bdaf31b3..d966207e306 100644 --- a/src/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/SuggestionLayout.java +++ b/src/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/SuggestionLayout.java @@ -150,8 +150,8 @@ public SuggestionLayout(Context context) { var res = context.getResources(); - int endSpace = res.getDimensionPixelSize(R.dimen.omnibox_suggestion_end_padding_modern); - setPaddingRelative(0, 0, endSpace, 8); + int endSpace = res.getDimensionPixelSize(R.dimen.omnibox_suggestion_end_padding); + setPaddingRelative(0, 0, endSpace, 0); mDecorationIconWidthPx = OmniboxResourceProvider.getSuggestionDecorationIconSizeWidth(context); @@ -181,8 +181,6 @@ public void setRoundingEdges(boolean roundTopEdge, boolean roundBottomEdge) { || mOutlineProvider.isBottomEdgeRounded() != roundBottomEdge; if (!needUpdate) return; - - //Abhinandan: interchanged bottom and top edged mOutlineProvider.setRoundingEdges(true, roundBottomEdge, true, roundTopEdge); setClipToOutline(roundTopEdge || roundBottomEdge); // Make sure the view redraws. Otherwise, the on-screen visuals may not reflect our desired diff --git a/src/chrome/browser/ui/android/signin/BUILD.gn b/src/chrome/browser/ui/android/signin/BUILD.gn index 4a6c01e8653..73c689e77dc 100644 --- a/src/chrome/browser/ui/android/signin/BUILD.gn +++ b/src/chrome/browser/ui/android/signin/BUILD.gn @@ -126,6 +126,7 @@ android_resources("java_resources") { "java/res/drawable/ic_expand_more_in_circle_24dp.xml", "java/res/layout/account_picker_bottom_sheet_continue_button.xml", "java/res/layout/account_picker_bottom_sheet_header.xml", + "java/res/layout/account_picker_bottom_sheet_header_old.xml", "java/res/layout/account_picker_bottom_sheet_new_account_row.xml", "java/res/layout/account_picker_bottom_sheet_row.xml", "java/res/layout/account_picker_bottom_sheet_view.xml", @@ -134,13 +135,19 @@ android_resources("java_resources") { "java/res/layout/account_picker_new_account_row.xml", "java/res/layout/account_picker_row.xml", "java/res/layout/account_picker_state_auth_error.xml", + "java/res/layout/account_picker_state_auth_error_old.xml", "java/res/layout/account_picker_state_collapsed.xml", + "java/res/layout/account_picker_state_collapsed_old.xml", "java/res/layout/account_picker_state_confirm_management.xml", + "java/res/layout/account_picker_state_confirm_management_old.xml", "java/res/layout/account_picker_state_expanded.xml", "java/res/layout/account_picker_state_expanded_old.xml", "java/res/layout/account_picker_state_general_error.xml", + "java/res/layout/account_picker_state_general_error_old.xml", "java/res/layout/account_picker_state_no_account.xml", + "java/res/layout/account_picker_state_no_account_old.xml", "java/res/layout/account_picker_state_signin_in_progress.xml", + "java/res/layout/account_picker_state_signin_in_progress_old.xml", "java/res/layout/account_row.xml", "java/res/layout/central_account_card_view.xml", "java/res/layout/confirm_import_sync_data.xml", diff --git a/src/chrome/browser/ui/android/signin/java/res/layout/account_picker_bottom_sheet_header.xml b/src/chrome/browser/ui/android/signin/java/res/layout/account_picker_bottom_sheet_header.xml index 41ab8682490..4e12c999525 100644 --- a/src/chrome/browser/ui/android/signin/java/res/layout/account_picker_bottom_sheet_header.xml +++ b/src/chrome/browser/ui/android/signin/java/res/layout/account_picker_bottom_sheet_header.xml @@ -10,10 +10,11 @@ found in the LICENSE file. xmlns:android="http://schemas.android.com/apk/res/android" > @@ -26,7 +27,7 @@ found in the LICENSE file. android:layout_marginTop="12dp" android:layout_marginBottom="8dp" android:gravity="center_horizontal" - android:textAppearance="@style/TextAppearance.TextLarge.Primary" + android:textAppearance="@style/TextAppearance.Headline.Primary" android:text="@string/sign_in_managed_account" /> @@ -26,7 +27,7 @@ found in the LICENSE file. android:layout_marginTop="12dp" android:layout_marginBottom="8dp" android:gravity="center_horizontal" - android:textAppearance="@style/TextAppearance.TextLarge.Primary" + android:textAppearance="@style/TextAppearance.Headline.Primary" android:text="@string/signin_account_picker_bottom_sheet_signin_title" /> --> - - - - Control your data & account - - AdBlock settings @@ -3461,13 +3455,6 @@ Your Google account may have other forms of browsing history like searches and a History - - In your Google Account - - - - History and Tabs - Passwords @@ -3483,13 +3470,39 @@ Your Google account may have other forms of browsing history like searches and a Apps - - - When on, use and save data in your Google Account. When off, data is saved only to this device. - Payment methods, offers, and addresses using Google Pay + + In your Google Account + + + History and Tabs + + + Bookmarks + + + Reading list + + + Addresses and more + + + Passwords + + + Payment methods, offers, and addresses using Google Pay + + + Settings + + + When on, use and save data in your Google Account. When off, data is saved only to this device. + + + Control your data & account + Encryption @@ -4614,6 +4627,9 @@ To change this setting, BEGIN_LINKdelete the WootzApp Get your bookmarks, passwords, and more on all your devices + + Sign in to this site and Chrome to get your bookmarks and more on all your devices + @@ -7153,7 +7169,10 @@ To change this setting, BEGIN_LINKdelete the WootzApp Management - Your administrator can change your browser setup remotely. Activity on this device may also be managed outside of WootzApp. + Your administrator can make changes to your profile and browser remotely, analyze information about the browser through reporting, and perform other necessary tasks. Activity on this device may also be managed outside of Chrome. + + + The profile you’re signed in to is a managed profile. Your administrator can make changes to your profile settings remotely, analyze information about the browser through reporting, and perform other necessary tasks. <LINK>Learn More</LINK> diff --git a/src/chrome/browser/ui/webui/BUILD.gn b/src/chrome/browser/ui/webui/BUILD.gn index 337278831e0..1fe66cee881 100644 --- a/src/chrome/browser/ui/webui/BUILD.gn +++ b/src/chrome/browser/ui/webui/BUILD.gn @@ -3,6 +3,15 @@ # found in the LICENSE file. import("//build/config/chromeos/ui_mode.gni") +import("//components/metrics/generate_allowlist_from_histograms_file.gni") + +generate_allowlist_from_histograms_file("webui_url_hashes") { + namespace = "webui_metrics" + input_xml_file = "//tools/metrics/histograms/enums.xml" + tag = "enum" + output_file = "webui_url_hashes.h" + allow_list_name = "WebUIUrlHashes" +} source_set("configs") { sources = [ @@ -16,6 +25,7 @@ source_set("configs") { deps = [ "//chrome/browser/ui:ui", + "//chrome/browser/ui/webui:webui", "//components/compose:buildflags", "//components/lens:buildflags", "//content/public/browser", @@ -48,15 +58,18 @@ source_set("configs") { "//ash/webui/firmware_update_ui", "//ash/webui/focus_mode", "//ash/webui/help_app_ui", + "//ash/webui/mall", "//ash/webui/os_feedback_ui", "//ash/webui/print_management", "//ash/webui/print_preview_cros", + "//ash/webui/sanitize_ui", "//ash/webui/scanning", "//ash/webui/shimless_rma", "//ash/webui/shortcut_customization_ui", "//ash/webui/status_area_internals", "//ash/webui/vc_background_ui", "//chrome/browser/ash", + "//chromeos/ash/components/kiosk/vision/webui", "//components/cross_device/logging", ] @@ -71,14 +84,17 @@ source_set("webui") { "webui_util.cc", "webui_util.h", ] + + sources += get_target_outputs(":webui_url_hashes") + deps = [ + ":webui_url_hashes", "//base", "//content/public/browser", "//content/public/common", "//services/network/public/mojom", "//ui/base", "//ui/resources", - # "//chrome/browser/resources/wootz_react_app:wootz_react_app", ] if (is_chromeos_lacros) { deps += [ "//chromeos/startup" ] diff --git a/src/chrome/browser/ui/webui/extension_store/extension_store_ui.cc b/src/chrome/browser/ui/webui/extension_store/extension_store_ui.cc index f19e7d3771f..cbc1ea6a2fc 100644 --- a/src/chrome/browser/ui/webui/extension_store/extension_store_ui.cc +++ b/src/chrome/browser/ui/webui/extension_store/extension_store_ui.cc @@ -250,7 +250,7 @@ void ExtensionStoreMessageHandler::OnFetchExtensionsComplete(std::unique_ptr json = base::JSONReader::Read(*response_body); + std::optional json = base::JSONReader::Read(*response_body); if (!json || !json->is_dict()) { return; } diff --git a/src/chrome/test/BUILD.gn b/src/chrome/test/BUILD.gn index 3c8f710a27c..2a68a3f76ff 100644 --- a/src/chrome/test/BUILD.gn +++ b/src/chrome/test/BUILD.gn @@ -815,6 +815,8 @@ static_library("test_support") { "../browser/ash/login/saml/lockscreen_reauth_dialog_test_helper.h", "../browser/ash/login/test/network_portal_detector_mixin.cc", "../browser/ash/login/test/network_portal_detector_mixin.h", + "../browser/ash/login/users/avatar/mock_user_image_loader_delegate.cc", + "../browser/ash/login/users/avatar/mock_user_image_loader_delegate.h", "../browser/ash/login/users/avatar/user_image_manager_test_util.cc", "../browser/ash/login/users/avatar/user_image_manager_test_util.h", "../browser/ash/policy/dlp/test/files_policy_notification_manager_test_utils.cc", @@ -860,6 +862,7 @@ static_library("test_support") { "//ash/webui/personalization_app:test_support", "//ash/webui/print_management:url_constants", "//ash/webui/print_preview_cros:url_constants", + "//ash/webui/sanitize_ui:url_constants", "//ash/webui/scanning:url_constants", "//ash/webui/shortcut_customization_ui:url_constants", "//chrome/browser/ash", @@ -1735,7 +1738,6 @@ if (!is_android) { "//chrome/browser/devtools", "//chrome/browser/devtools:test_support", "//chrome/browser/dips:browser_tests", - "//chrome/browser/enterprise/identifiers:identifiers", "//chrome/browser/favicon", "//chrome/browser/first_party_sets", "//chrome/browser/headless:browser_tests", @@ -2372,6 +2374,7 @@ if (!is_android) { "../browser/file_system_access/file_system_access_picker_requires_user_gesture_browsertest.cc", "../browser/file_system_access/file_system_access_tab_helper_browsertest.cc", "../browser/file_system_access/file_system_file_handle_browsertest.cc", + "../browser/file_system_access/file_system_observer_storage_access_browsertest.cc", "../browser/first_party_sets/first_party_sets_policy_browsertest.cc", "../browser/first_run/first_run_browsertest.cc", "../browser/geolocation/geolocation_browsertest.cc", @@ -2835,6 +2838,7 @@ if (!is_android) { "../browser/ui/user_education/low_usage_help_controller_browsertest.cc", "../browser/ui/user_education/show_promo_in_page_browsertest.cc", "../browser/ui/user_education/start_tutorial_in_page_browsertest.cc", + "../browser/ui/user_education/user_education_configuration_provider_browsertest.cc", "../browser/ui/views/apps/app_info_dialog/app_info_dialog_views_browsertest.cc", "../browser/ui/views/autofill/payments/offer_notification_icon_view_browsertest.cc", "../browser/ui/views/bluetooth_device_credentials_view_browsertest.cc", @@ -2923,6 +2927,7 @@ if (!is_android) { "../browser/ui/webui/tab_search/tab_search_ui_browsertest.cc", "../browser/ui/webui/top_chrome/webui_contents_preload_manager_browsertest.cc", "../browser/ui/webui/webui_load_timer_browsertest.cc", + "../browser/ui/webui/webui_url_hashes_browsertest.cc", "../browser/ui/zoom/zoom_controller_browsertest.cc", "../browser/ukm_worker_browsertest.cc", "../browser/unload_browsertest.cc", @@ -3050,6 +3055,14 @@ if (!is_android) { "../browser/screen_ai/optical_character_recognizer_browsertest.cc", "../browser/screen_ai/screen_ai_service_router_browsertest.cc", ] + + if (enable_screen_ai_browsertests && !use_fake_screen_ai) { + # TODO(crbug.com/41489544): Update when fake ScreenAI library supports + # `ExtractMainContent` requests. + sources += + [ "../browser/screen_ai/main_content_extraction_browsertest.cc" ] + } + deps += [ "//chrome/browser/screen_ai:screen_ai_install_state", "//chrome/browser/screen_ai:screen_ai_service_router_factory", @@ -4582,8 +4595,6 @@ if (!is_android) { "../browser/ash/login/app_mode/test/kiosk_ash_browser_test_starter.h", "../browser/ash/login/app_mode/test/kiosk_base_test.cc", "../browser/ash/login/app_mode/test/kiosk_base_test.h", - "../browser/ash/login/app_mode/test/kiosk_browsertest.cc", - "../browser/ash/login/app_mode/test/kiosk_consumer_browsertest.cc", "../browser/ash/login/app_mode/test/kiosk_device_owned_browsertest.cc", "../browser/ash/login/app_mode/test/kiosk_enterprise_browsertest.cc", "../browser/ash/login/app_mode/test/kiosk_enterprise_input_api_browsertest.cc", @@ -4834,7 +4845,7 @@ if (!is_android) { "../browser/ash/policy/skyvault/drive_upload_observer_browsertest.cc", "../browser/ash/policy/skyvault/file_location_utils_browsertest.cc", "../browser/ash/policy/skyvault/local_files_cleanup_browsertest.cc", - "../browser/ash/policy/skyvault/observer_browsertest.cc", + "../browser/ash/policy/skyvault/local_user_files_policy_observer_browsertest.cc", "../browser/ash/policy/skyvault/odfs_skyvault_uploader_browsertest.cc", "../browser/ash/policy/skyvault/policy_utils_browsertest.cc", "../browser/ash/policy/status_collector/child_status_collector_browsertest.cc", @@ -5599,6 +5610,11 @@ if (!is_android) { sources += [ "../browser/webauthn/enclave_authenticator_browsertest.cc" ] deps += [ "//components/os_crypt/sync:test_support" ] } + + if (is_chromeos) { + sources += [ "../browser/webauthn/chromeos/passkey_browsertest.cc" ] + deps += [ "//chrome/browser/webauthn:test_support" ] + } } } @@ -5734,6 +5750,7 @@ if (is_chromeos_lacros) { "../browser/ui/lacros/screen_capture_notification_ui_lacros_browsertest.cc", "../browser/ui/sharing_hub/sharing_hub_bubble_controller_chromeos_lacros_browsertest.cc", "../browser/ui/startup/first_run_service_browsertest.cc", + "../browser/ui/views/chrome_views_delegate_lacros_browsertest.cc", "../browser/ui/views/frame/browser_non_client_frame_view_chromeos_browsertest.cc", "../browser/ui/views/frame/immersive_mode_browser_view_test.cc", "../browser/ui/views/frame/immersive_mode_controller_chromeos_browsertest.cc", @@ -6601,6 +6618,11 @@ test("unit_tests") { "../test/base/menu_model_test.cc", "../test/base/menu_model_test.h", ] + + if (chrome_certificate_policies_supported) { + sources += [ "../browser/net/cert_verifier_policy_unittest.cc" ] + } + if (build_with_tflite_lib) { sources += [ "../browser/navigation_predictor/preloading_model_executor_unittest.cc", @@ -6829,7 +6851,6 @@ test("unit_tests") { "//chrome/browser/crash_upload_list:unit_tests", "//chrome/browser/devtools", "//chrome/browser/dips:unit_tests", - "//chrome/browser/enterprise/identifiers", "//chrome/browser/favicon", "//chrome/browser/first_party_sets", "//chrome/browser/google:unit_tests", @@ -7142,6 +7163,7 @@ test("unit_tests") { "//components/vector_icons", "//components/version_info:generate_version_info", "//components/visited_url_ranking/public", + "//components/visited_url_ranking/public:test_support", "//components/webapps/common", "//components/webauthn/core/browser", "//components/webauthn/core/browser:passkey_model", @@ -8036,6 +8058,8 @@ test("unit_tests") { "../browser/ui/recently_audible_helper_unittest.cc", "../browser/ui/safety_hub/abusive_notification_permissions_manager_unittest.cc", "../browser/ui/safety_hub/extensions_result_unittest.cc", + "../browser/ui/safety_hub/mock_safe_browsing_database_manager.cc", + "../browser/ui/safety_hub/mock_safe_browsing_database_manager.h", "../browser/ui/safety_hub/password_status_check_result_unittest.cc", "../browser/ui/safety_hub/password_status_check_service_unittest.cc", "../browser/ui/safety_hub/safe_browsing_result_unittest.cc", @@ -8192,6 +8216,7 @@ test("unit_tests") { "../browser/ui/webui/sync_internals/sync_internals_message_handler_unittest.cc", "../browser/ui/webui/tab_search/tab_search_page_handler_unittest.cc", "../browser/ui/webui/theme_source_unittest.cc", + "../browser/ui/webui/top_chrome/per_profile_webui_tracker_unittest.cc", "../browser/ui/webui/top_chrome/webui_contents_preload_manager_unittest.cc", "../browser/ui/webui/top_chrome/webui_contents_wrapper_unittest.cc", "../browser/ui/webui/web_dialog_web_contents_delegate_unittest.cc", @@ -8412,6 +8437,7 @@ test("unit_tests") { "//chrome/browser/media/router:test_support", "//chrome/browser/media/router/discovery:discovery", "//chrome/browser/media/router/discovery/access_code:access_code_sink_service", + "//chrome/browser/new_tab_page/chrome_colors", "//chrome/browser/new_tab_page/modules/feed:mojo_bindings", "//chrome/browser/new_tab_page/modules/history_clusters:mojo_bindings", "//chrome/browser/new_tab_page/modules/history_clusters/cart:mojo_bindings", @@ -8427,6 +8453,7 @@ test("unit_tests") { "//chrome/browser/ui/color:color_headers", "//chrome/browser/ui/color:mixers", "//chrome/browser/ui/lens", + "//chrome/browser/ui/webui/cr_components/theme_color_picker", "//chrome/browser/ui/webui/discards:mojo_bindings", "//chrome/browser/ui/webui/downloads:mojo_bindings", "//chrome/browser/ui/webui/new_tab_page:mojo_bindings", @@ -8590,6 +8617,7 @@ test("unit_tests") { sources += [ "../browser/accessibility/media_app/ax_media_app_untrusted_handler_unittest.cc", "../browser/browser_process_platform_part_ash_unittest.cc", + "../browser/chromeos/mahi/mahi_prefs_controller_ash_unittest.cc", "../browser/component_updater/cros_component_installer_chromeos_unittest.cc", "../browser/component_updater/metadata_table_chromeos_unittest.cc", "../browser/device_identity/chromeos/device_oauth2_token_store_chromeos_unittest.cc", @@ -8730,6 +8758,8 @@ test("unit_tests") { "../browser/ui/ash/wallpaper_controller_client_impl_unittest.cc", "../browser/ui/ash/window_pin_util_ash_unittest.cc", "../browser/ui/chromeos/magic_boost/magic_boost_controller_unittest.cc", + "../browser/ui/chromeos/magic_boost/magic_boost_disclaimer_view_unittest.cc", + "../browser/ui/chromeos/magic_boost/magic_boost_opt_in_card_unittest.cc", "../browser/ui/chromeos/read_write_cards/read_write_cards_ui_controller_unittest.cc", "../browser/ui/quick_answers/quick_answers_controller_unittest.cc", "../browser/ui/quick_answers/quick_answers_state_ash_unittest.cc", @@ -9813,7 +9843,6 @@ test("unit_tests") { "../browser/enterprise/connectors/common_unittest.cc", "../browser/enterprise/connectors/connectors_manager_unittest.cc", "../browser/enterprise/connectors/connectors_service_unittest.cc", - "../browser/enterprise/connectors/enterprise_connectors_policy_handler_unittest.cc", "../browser/enterprise/connectors/reporting/crash_reporting_context_unittest.cc", "../browser/enterprise/connectors/reporting/extension_install_event_router_unittest.cc", "../browser/enterprise/connectors/reporting/realtime_reporting_client_unittest.cc", @@ -11032,6 +11061,7 @@ if (!is_android && !is_chromeos_device) { "../browser/ui/hung_renderer/hung_renderer_interactive_uitest.cc", "../browser/ui/keyboard_lock_interactive_browsertest.cc", "../browser/ui/lens/lens_overlay_controller_interactive_uitest.cc", + "../browser/ui/lens/lens_permission_bubble_controller_interactive_uitest.cc", "../browser/ui/lens/lens_search_bubble_interactive_uitest.cc", "../browser/ui/omnibox/omnibox_view_browsertest.cc", "../browser/ui/passwords/manage_passwords_test.cc", @@ -11724,7 +11754,7 @@ if (!is_android && !is_chromeos_device) { deps += [ "//chrome/browser/apps/app_shim", - # "//chrome/browser/web_applications/extensions", + #"//chrome/browser/web_applications/extensions", "//components/remote_cocoa/app_shim:app_shim", "//components/spellcheck:buildflags", ] diff --git a/src/components/BUILD.gn b/src/components/BUILD.gn index 1718b73538c..7cae1d643b2 100644 --- a/src/components/BUILD.gn +++ b/src/components/BUILD.gn @@ -248,6 +248,7 @@ test("components_unittests") { "//components/metrics:unit_tests", "//components/metrics/demographics:unit_tests", "//components/named_mojo_ipc_server:unit_tests", + "//components/named_system_lock:unit_tests", "//components/navigation_metrics:unit_tests", "//components/net_log:unit_tests", "//components/network_session_configurator/browser:unit_tests", @@ -614,6 +615,7 @@ test("components_unittests") { "//components/crash/android:java", "//components/crash/android:unit_tests", "//components/data_sharing/internal:internal_java", + "//components/data_sharing/internal:native_test_helper_java", "//components/download/internal/common:internal_java", "//components/embedder_support/android:native_java_unittests_java", "//components/embedder_support/android/metrics:test_support_java", diff --git a/src/components/android_autofill/browser/android_autofill_manager.h b/src/components/android_autofill/browser/android_autofill_manager.h index bb7d3b81116..7286e461229 100644 --- a/src/components/android_autofill/browser/android_autofill_manager.h +++ b/src/components/android_autofill/browser/android_autofill_manager.h @@ -77,6 +77,10 @@ class AndroidAutofillManager : public AutofillManager, bool known_success, mojom::SubmissionSource source) override; + void OnCaretMovedInFormFieldImpl(const FormData& form, + const FormFieldData& field, + const gfx::Rect& caret_bounds) override {} + void OnTextFieldDidChangeImpl(const FormData& form, const FormFieldData& field, const base::TimeTicks timestamp) override; diff --git a/src/components/autofill/content/browser/content_autofill_driver.cc b/src/components/autofill/content/browser/content_autofill_driver.cc index e2ed7f6e57c..c972346c282 100644 --- a/src/components/autofill/content/browser/content_autofill_driver.cc +++ b/src/components/autofill/content/browser/content_autofill_driver.cc @@ -191,11 +191,6 @@ bool ContentAutofillDriver::IsInAnyMainFrame() const { return render_frame_host_->GetMainFrame() == render_frame_host(); } -bool ContentAutofillDriver::IsPrerendering() const { - return render_frame_host_->IsInLifecycleState( - content::RenderFrameHost::LifecycleState::kPrerendering); -} - bool ContentAutofillDriver::HasSharedAutofillPermission() const { return render_frame_host_->IsFeatureEnabled( blink::mojom::PermissionsPolicyFeature::kSharedAutofill); @@ -439,6 +434,26 @@ void ContentAutofillDriver::FormSubmitted( }); } +void ContentAutofillDriver::CaretMovedInFormField( + const FormData& raw_form, + const FormFieldData& raw_field, + const gfx::Rect& caret_bounds) { + if (!bad_message::CheckFrameNotPrerendering(render_frame_host())) { + return; + } + FormData form = raw_form; + FormFieldData field = raw_field; + SetFrameAndFormMetaData(form, field); + router().CaretMovedInFormField( + *this, std::move(form), field, + TransformBoundingBoxToViewportCoordinates(caret_bounds), + [](autofill::AutofillDriver& target, const FormData& form, + const FormFieldData& field, const gfx::Rect& caret_bounds) { + target.GetAutofillManager().OnCaretMovedInFormField( + WithNewVersion(form), field, caret_bounds); + }); +} + void ContentAutofillDriver::TextFieldDidChange(const FormData& raw_form, const FormFieldData& raw_field, base::TimeTicks timestamp) { @@ -519,8 +534,6 @@ void ContentAutofillDriver::HidePopup() { return; } router().HidePopup(*this, [](autofill::AutofillDriver& target) { - DCHECK(!target.IsPrerendering()) - << "We should never affect UI while prerendering"; target.GetAutofillManager().OnHidePopup(); }); } @@ -682,7 +695,6 @@ std::optional ContentAutofillDriver::GetFormWithFrameAndFormMetaData( } AutofillDriverRouter& ContentAutofillDriver::router() { - DCHECK(!IsPrerendering()); return owner_->router(); } diff --git a/src/components/autofill/content/browser/content_autofill_driver.h b/src/components/autofill/content/browser/content_autofill_driver.h index 3603c6b784f..ad195f91abc 100644 --- a/src/components/autofill/content/browser/content_autofill_driver.h +++ b/src/components/autofill/content/browser/content_autofill_driver.h @@ -159,7 +159,6 @@ class ContentAutofillDriver : public AutofillDriver, AutofillManager& GetAutofillManager() override; bool IsInActiveFrame() const override; bool IsInAnyMainFrame() const override; - bool IsPrerendering() const override; bool HasSharedAutofillPermission() const override; bool CanShowAutofillUi() const override; net::IsolationInfo IsolationInfo() override; @@ -264,6 +263,9 @@ class ContentAutofillDriver : public AutofillDriver, void SelectControlDidChange(const FormData& form, const FormFieldData& field) override; void SelectOrSelectListFieldOptionsDidChange(const FormData& form) override; + void CaretMovedInFormField(const FormData& form, + const FormFieldData& field, + const gfx::Rect& caret_bounds) override; void TextFieldDidChange(const FormData& form, const FormFieldData& field, base::TimeTicks timestamp) override; diff --git a/src/components/autofill/content/common/mojom/autofill_driver.mojom b/src/components/autofill/content/common/mojom/autofill_driver.mojom index b83b2849fce..1873e721263 100644 --- a/src/components/autofill/content/common/mojom/autofill_driver.mojom +++ b/src/components/autofill/content/common/mojom/autofill_driver.mojom @@ -27,6 +27,18 @@ interface AutofillDriver { bool known_success, SubmissionSource source); + // Notification that a form field's caret moved or selection has changed. + // + // `caret_bounds` is the bounds of the caret if the selection is empty and + // otherwise the bounds of the focus + // (https://w3c.github.io/selection-api/#dfn-focus). That is, its width is + // typically zero or near-zero, and its height is about one line. It is not + // validated in any way; in particular, the coordinates may be negative or + // otherwise outside of the bounds of the viewport. + CaretMovedInFormField(FormData form, + FormFieldData field, + gfx.mojom.Rect caret_bounds); + // Notification that a form field's value has changed by a user edit. // // Similarly to JavaScript's "input" event, and unlike JavaScript's "change" diff --git a/src/components/autofill/content/renderer/autofill_agent.cc b/src/components/autofill/content/renderer/autofill_agent.cc index a70ebad550a..d6991613436 100644 --- a/src/components/autofill/content/renderer/autofill_agent.cc +++ b/src/components/autofill/content/renderer/autofill_agent.cc @@ -176,6 +176,12 @@ class AutofillAgent::DeferringAutofillDriver : public mojom::AutofillDriver { DeferMsg(&mojom::AutofillDriver::FormSubmitted, form, known_success, source); } + void CaretMovedInFormField(const FormData& form, + const FormFieldData& field, + const gfx::Rect& caret_bounds) override { + DeferMsg(&mojom::AutofillDriver::CaretMovedInFormField, form, field, + caret_bounds); + } void TextFieldDidChange(const FormData& form, const FormFieldData& field, base::TimeTicks timestamp) override { @@ -495,6 +501,8 @@ void AutofillAgent::FocusedElementChangedDeprecated(const WebElement& element) { void AutofillAgent::FocusedElementChanged( const WebElement& new_focused_element) { + ObserveCaret(new_focused_element); + if (!base::FeatureList::IsEnabled(features::kAutofillNewFocusEvents)) { FocusedElementChangedDeprecated(new_focused_element); return; @@ -558,6 +566,73 @@ void AutofillAgent::FocusedElementChanged( } } +void AutofillAgent::ObserveCaret(WebElement element) { + if (!base::FeatureList::IsEnabled(features::kAutofillCaretExtraction)) { + return; + } + + if (element && (element.IsContentEditable() || + form_util::IsTextAreaElement( + element.DynamicTo()))) { + caret_state_.remove_listener = element.GetDocument().AddEventListener( + WebNode::EventType::kSelectionchange, + base::BindRepeating(&AutofillAgent::HandleCaretMovedInFormField, + base::Unretained(this), element)); + } else { + caret_state_.remove_listener = {}; + caret_state_.time_of_last_event = {}; + caret_state_.timer.Stop(); + } +} + +void AutofillAgent::HandleCaretMovedInFormField(WebElement element, + blink::WebDOMEvent) { + auto handle_throttled_caret_change = [](AutofillAgent& self, + WebElement element) { + if (!self.unsafe_render_frame() || !element.Focused() || + !element.ContainsFrameSelection()) { + return; + } + gfx::Rect caret_bounds = GetCaretBounds(*self.unsafe_render_frame()); + if (auto control = element.DynamicTo(); + !control.IsNull()) { + if (std::optional form_and_field = + FindFormAndFieldForFormControlElement( + control, self.field_data_manager(), + self.MaybeExtractDatalist( + {form_util::ExtractOption::kBounds}))) { + auto& [form, field] = *form_and_field; + if (auto* autofill_driver = self.unsafe_autofill_driver()) { + autofill_driver->CaretMovedInFormField(form, field, caret_bounds); + return; + } + } + } + if (element && element.IsContentEditable()) { + if (std::optional form = + form_util::FindFormForContentEditable(element)) { + CHECK_EQ(form->fields.size(), 1u); + if (auto* autofill_driver = self.unsafe_autofill_driver()) { + autofill_driver->CaretMovedInFormField(*form, form->fields.front(), + caret_bounds); + return; + } + } + } + }; + const base::Time now = base::Time::Now(); + const base::TimeDelta time_since_last = now - caret_state_.time_of_last_event; + caret_state_.time_of_last_event = now; + if (time_since_last < base::Milliseconds(100)) { + caret_state_.timer.Start(FROM_HERE, base::Milliseconds(100), + base::BindOnce(handle_throttled_caret_change, + std::ref(*this), element)); + } else { + caret_state_.timer.Stop(); + handle_throttled_caret_change(*this, element); + } +} + // AutofillAgent is deleted asynchronously because OnDestruct() may be // triggered by JavaScript, which in turn may be triggered by AutofillAgent. void AutofillAgent::OnDestruct() { @@ -749,11 +824,15 @@ void AutofillAgent::ApplyFieldsAction( // In these cases, we set `last_queried_element_` to some form field as if // Autofill had been triggered from that field. This is necessary because // currently AutofillAgent relies on `last_queried_element_` in many places. - if (!last_queried_element || !last_queried_element.Focused() || + const bool last_queried_element_needs_update = + !last_queried_element || !last_queried_element.Focused() || !base::Contains(fields, form_util::GetFormRendererId( form_util::GetOwningForm(last_queried_element)), - &FormFieldData::FillData::host_form_id)) { + &FormFieldData::FillData::host_form_id); + if (last_queried_element_needs_update && + !base::FeatureList::IsEnabled( + features::kAutofillDontUpdateLastQueriedElementOnFill)) { for (const FormFieldData::FillData& field : fields) { last_queried_element = form_util::GetFormControlByRendererId(field.renderer_id); @@ -763,7 +842,9 @@ void AutofillAgent::ApplyFieldsAction( } } } - if (!last_queried_element) { + if (!last_queried_element && + !base::FeatureList::IsEnabled( + features::kAutofillDontUpdateLastQueriedElementOnFill)) { return; } if (!unsafe_render_frame()) { @@ -857,7 +938,9 @@ void AutofillAgent::ClearPreviewedForm() { // TODO(crbug.com/40564702): It is very rare, but it looks like the |element_| // can be null if a provisional load was committed immediately prior to // clearing the previewed form. - if (!last_queried_element) { + if (!last_queried_element && + !base::FeatureList::IsEnabled( + features::kAutofillDontUpdateLastQueriedElementOnFill)) { return; } // `password_generation_agent_` can be null in WebView. @@ -878,7 +961,7 @@ void AutofillAgent::ClearPreviewedForm() { previewed_elements.emplace_back(field, prior_autofill_state); } } - form_util::ClearPreviewedElements(previewed_elements, last_queried_element); + form_util::ClearPreviewedElements(previewed_elements); previewed_elements_ = {}; } @@ -924,7 +1007,7 @@ void AutofillAgent::ApplyFieldAction( << "Previewing replacement of selection is not implemented"; break; case mojom::FieldActionType::kReplaceAll: - previewed_elements_.emplace_back(last_queried_element_, + previewed_elements_.emplace_back(form_control, form_control.GetAutofillState()); form_control.SetSuggestedValue(WebString::FromUTF16(value)); break; @@ -1425,10 +1508,16 @@ void AutofillAgent::DidCompleteFocusChangeInFrame() { void AutofillAgent::DidReceiveLeftMouseDownOrGestureTapInNode( const WebNode& node) { DCHECK(node); + WebElement contenteditable; + const bool is_focused = + node.Focused() || ((contenteditable = node.RootEditableElement()) && + contenteditable.Focused() && + base::FeatureList::IsEnabled( + features::kAutofillContentEditableLeftClickFix)); #if defined(ANDROID) - HandleFocusChangeComplete(/*focused_node_was_last_clicked=*/node.Focused()); + HandleFocusChangeComplete(/*focused_node_was_last_clicked=*/is_focused); #else - last_left_mouse_down_or_gesture_tap_in_node_caused_focus_ = node.Focused(); + last_left_mouse_down_or_gesture_tap_in_node_caused_focus_ = is_focused; #endif } diff --git a/src/components/autofill/content/renderer/autofill_agent.h b/src/components/autofill/content/renderer/autofill_agent.h index 83216f5606b..17ebbfc6d7a 100644 --- a/src/components/autofill/content/renderer/autofill_agent.h +++ b/src/components/autofill/content/renderer/autofill_agent.h @@ -348,6 +348,21 @@ class AutofillAgent : public content::RenderFrameObserver, void PasswordFieldReset(const blink::WebInputElement& element) override; void EmitFormIssuesToDevtools() override; + // Starts observing the caret in the given element. Previous observers are + // implicitly deleted. The event handler is HandleCaretMovedInFormField(). + void ObserveCaret(blink::WebElement element); + + // Calls CaretMovedInFormField() in a throttled manner. + // + // If HandleCaretMovedInFormField() has been called in the past 100 ms, + // CaretMovedInFormField() is (re-)scheduled to be fired in 100 ms. Otherwise, + // it is fired synchronously. + // + // Thus, the first event is fired immediately, but fast successive events are + // throttled until no event has been fired for 200 ms. + void HandleCaretMovedInFormField(blink::WebElement element, + blink::WebDOMEvent event); + void HandleFocusChangeComplete(bool focused_node_was_last_clicked); void SendFocusedInputChangedNotificationToBrowser( const blink::WebElement& node); @@ -538,6 +553,22 @@ class AutofillAgent : public content::RenderFrameObserver, // manager driver mojo interface. FocusStateNotifier focus_state_notifier_{this}; + // State for, and only for, HandleFocusChangeComplete(). + struct Caret { + private: + friend void AutofillAgent::ObserveCaret(blink::WebElement element); + friend void AutofillAgent::HandleCaretMovedInFormField( + blink::WebElement element, + blink::WebDOMEvent event); + // Removes the caret listener from the currently observed WebElement (if + // any). + base::ScopedClosureRunner remove_listener; + // The last time a CaretMovedInFormField(). + base::Time time_of_last_event; + // The timer for the next CaretMovedInFormField(). + base::OneShotTimer timer; + } caret_state_; + base::WeakPtrFactory weak_ptr_factory_{this}; }; diff --git a/src/components/autofill/core/browser/autofill_driver_router.cc b/src/components/autofill/core/browser/autofill_driver_router.cc index 7d1c8381f95..b07dd5bc0d6 100644 --- a/src/components/autofill/core/browser/autofill_driver_router.cc +++ b/src/components/autofill/core/browser/autofill_driver_router.cc @@ -177,6 +177,21 @@ void AutofillDriverRouter::FormSubmitted( callback(CHECK_DEREF(target), browser_form, known_success, submission_source); } +void AutofillDriverRouter::CaretMovedInFormField( + AutofillDriver& source, + FormData form, + const FormFieldData& field, + const gfx::Rect& caret_bounds, + RoutedCallback + callback) { + FormGlobalId form_id = form.global_id(); + form_forest_.UpdateTreeOfRendererForm(std::move(form), source); + + const FormData& browser_form = form_forest_.GetBrowserForm(form_id); + auto* target = DriverOfFrame(browser_form.host_frame); + callback(CHECK_DEREF(target), browser_form, field, caret_bounds); +} + void AutofillDriverRouter::TextFieldDidChange( AutofillDriver& source, FormData form, diff --git a/src/components/autofill/core/browser/autofill_driver_router.h b/src/components/autofill/core/browser/autofill_driver_router.h index 2a1dd9abb12..17435883b3c 100644 --- a/src/components/autofill/core/browser/autofill_driver_router.h +++ b/src/components/autofill/core/browser/autofill_driver_router.h @@ -166,6 +166,13 @@ class AutofillDriverRouter { bool known_success, mojom::SubmissionSource submission_source, RoutedCallback callback); + void CaretMovedInFormField( + AutofillDriver& source, + FormData form, + const FormFieldData& field, + const gfx::Rect& caret_bounds, + RoutedCallback + callback); void TextFieldDidChange( AutofillDriver& source, FormData form, diff --git a/src/components/autofill/core/browser/autofill_manager.cc b/src/components/autofill/core/browser/autofill_manager.cc index e04fce63c7a..fe20bd3bef8 100644 --- a/src/components/autofill/core/browser/autofill_manager.cc +++ b/src/components/autofill/core/browser/autofill_manager.cc @@ -153,9 +153,9 @@ void AutofillManager::LogAutofillTypePredictionsAvailable( AutofillManager::AutofillManager(AutofillDriver* driver) : driver_(CHECK_DEREF(driver)), - log_manager_(unsafe_client().GetLogManager()), + log_manager_(client().GetLogManager()), form_interactions_ukm_logger_(CreateFormInteractionsUkmLogger()) { - if (auto* translate_driver = unsafe_client().GetTranslateDriver()) { + if (auto* translate_driver = client().GetTranslateDriver()) { translate_observation_.Observe(translate_driver); } } @@ -359,6 +359,22 @@ void AutofillManager::OnFormsParsed(const std::vector& forms) { } } +void AutofillManager::OnCaretMovedInFormField(const FormData& form, + const FormFieldData& field, + const gfx::Rect& caret_bounds) { + if (!IsValidFormData(form)) { + return; + } + NotifyObservers(&Observer::OnBeforeCaretMovedInFormField, form.global_id(), + field.global_id(), caret_bounds); + ParseFormAsync( + form, ParsingCallback(&AutofillManager::OnCaretMovedInFormFieldImpl, + field, caret_bounds) + .Then(NotifyObserversCallback( + &Observer::OnAfterCaretMovedInFormField, form.global_id(), + field.global_id(), caret_bounds))); +} + void AutofillManager::OnTextFieldDidChange(const FormData& form, const FormFieldData& field, const base::TimeTicks timestamp) { @@ -497,7 +513,7 @@ bool AutofillManager::GetCachedFormAndField( std::unique_ptr AutofillManager::CreateFormInteractionsUkmLogger() { return std::make_unique( - &unsafe_client(), unsafe_client().GetUkmRecorder()); + &client(), client().GetUkmRecorder()); } size_t AutofillManager::FindCachedFormsBySignature( diff --git a/src/components/autofill/core/browser/autofill_manager.h b/src/components/autofill/core/browser/autofill_manager.h index 192b152db2c..cb9370578ec 100644 --- a/src/components/autofill/core/browser/autofill_manager.h +++ b/src/components/autofill/core/browser/autofill_manager.h @@ -21,7 +21,6 @@ #include "base/task/sequenced_task_runner.h" #include "base/task/thread_pool.h" #include "base/time/time.h" -#include "base/types/pass_key.h" #include "base/types/strong_alias.h" #include "build/build_config.h" #include "components/autofill/core/browser/autofill_driver.h" @@ -46,7 +45,6 @@ struct FormData; class FormFieldData; class FormStructure; class LogManager; -class TouchToFillDelegateAndroidImpl; // This class defines the interface should be implemented by autofill // implementation in browser side to interact with AutofillDriver. @@ -86,6 +84,15 @@ class AutofillManager virtual void OnAfterFormsSeen(AutofillManager& manager, base::span forms) {} + virtual void OnBeforeCaretMovedInFormField(AutofillManager& manager, + const FormGlobalId& form, + const FieldGlobalId& field, + const gfx::Rect& caret_bounds) {} + virtual void OnAfterCaretMovedInFormField(AutofillManager& manager, + const FormGlobalId& form, + const FieldGlobalId& field, + const gfx::Rect& caret_bounds) {} + virtual void OnBeforeTextFieldDidChange(AutofillManager& manager, FormGlobalId form, FieldGlobalId field) {} @@ -187,20 +194,8 @@ class AutofillManager ~AutofillManager() override; - // The following will fail a DCHECK if called for a prerendered main frame. - AutofillClient& client() { - DCHECK(!driver().IsPrerendering()); - return unsafe_client(); - } - - const AutofillClient& client() const { - return const_cast(this)->client(); - } - - AutofillClient& unsafe_client( - base::PassKey pass_key) { - return AutofillManager::unsafe_client(); - } + AutofillClient& client() { return driver_->GetAutofillClient(); } + const AutofillClient& client() const { return driver_->GetAutofillClient(); } // Returns a WeakPtr to the leaf class. virtual base::WeakPtr GetWeakPtr() = 0; @@ -229,6 +224,9 @@ class AutofillManager const gfx::Rect& caret_bounds, AutofillSuggestionTriggerSource trigger_source); void OnHidePopup(); + virtual void OnCaretMovedInFormField(const FormData& form, + const FormFieldData& field, + const gfx::Rect& caret_bounds); virtual void OnDidFillAutofillFormData(const FormData& form, const base::TimeTicks timestamp); virtual void OnJavaScriptChangedAutofilledValue( @@ -314,15 +312,14 @@ class AutofillManager // Retrieves the page language from |client_| LanguageCode GetCurrentPageLanguage(); - // The following do not check for prerendering. These should only used while - // constructing or resetting the manager. - AutofillClient& unsafe_client() { return driver_->GetAutofillClient(); } - // OnFooImpl() is called, potentially asynchronously after parsing the form, // by the renderer event OnFoo(). virtual void OnFormSubmittedImpl(const FormData& form, bool known_success, mojom::SubmissionSource source) = 0; + virtual void OnCaretMovedInFormFieldImpl(const FormData& form, + const FormFieldData& field, + const gfx::Rect& caret_bounds) = 0; virtual void OnTextFieldDidChangeImpl(const FormData& form, const FormFieldData& field, const base::TimeTicks timestamp) = 0; diff --git a/src/components/autofill/core/browser/browser_autofill_manager.h b/src/components/autofill/core/browser/browser_autofill_manager.h index 73c4bdc78e6..f7609e1325c 100644 --- a/src/components/autofill/core/browser/browser_autofill_manager.h +++ b/src/components/autofill/core/browser/browser_autofill_manager.h @@ -43,6 +43,7 @@ #include "components/autofill/core/browser/payments/autofill_offer_manager.h" #include "components/autofill/core/browser/payments/card_unmask_delegate.h" #include "components/autofill/core/browser/payments/full_card_request.h" +#include "components/autofill/core/browser/payments/payments_autofill_client.h" #include "components/autofill/core/browser/personal_data_manager.h" #include "components/autofill/core/browser/single_field_form_fill_router.h" #include "components/autofill/core/browser/ui/fast_checkout_delegate.h" @@ -178,6 +179,16 @@ class BrowserAutofillManager : public AutofillManager { SuggestionType type, std::optional field_type_used); + // Logs metrics when the user accepts address form filling suggestion. This + // happens only for already parsed forms (`FormStructure` and `AutofillField` + // are defined). + // TODO(b/40227071): Remove when field-filling and form-filling are merged + virtual void OnDidFillAddressFormFillingSuggestion( + const AutofillProfile& profile, + const FormData& form, + const FormFieldData& field, + AutofillTriggerSource trigger_source); + // Calls UndoAutofillImpl and logs metrics. Virtual for testing. virtual void UndoAutofill(mojom::ActionPersistence action_persistence, const FormData& form, @@ -419,6 +430,9 @@ class BrowserAutofillManager : public AutofillManager { void OnFormSubmittedImpl(const FormData& form, bool known_success, mojom::SubmissionSource source) override; + void OnCaretMovedInFormFieldImpl(const FormData& form, + const FormFieldData& field, + const gfx::Rect& caret_bounds) override {} void OnTextFieldDidChangeImpl(const FormData& form, const FormFieldData& field, const base::TimeTicks timestamp) override; @@ -448,15 +462,6 @@ class BrowserAutofillManager : public AutofillManager { // Returns false if Autofill is disabled or if no Autofill data is available. bool RefreshDataModels(); - // TODO(crbug.com/40197696): Move the functions to - // AutofillSuggestionGenerator. Gets the card referred to by the guid - // |unique_id|. Returns |nullptr| if card does not exist. - CreditCard* GetCreditCard(Suggestion::BackendId unique_id); - - // Gets the profile referred to by the guid |unique_id|. Returns |nullptr| if - // profile does not exist. - AutofillProfile* GetProfile(Suggestion::BackendId unique_id); - // Creates a FormStructure using the FormData received from the renderer. Will // return an empty scoped_ptr if the data should not be processed for upload // or personal data. @@ -536,19 +541,17 @@ class BrowserAutofillManager : public AutofillManager { const FormFieldData& field, AutofillSuggestionTriggerSource trigger_source); - // Replaces the contents of `suggestions` with available suggestions for - // `field`. Which fields of the `form` are filled depends on the - // `trigger_source`. - // `context` could contain additional information about the suggestions, such - // as ablation study related fields. - // TODO(b/340494671): Rename to GetAvailableAddressAndCreditCardSuggestions. + // Returns a list with the suggestions available for `field`. Which fields of + // the `form` are filled depends on the `trigger_source`. `context` could + // contain additional information about the suggestions, such as ablation + // study related fields. // TODO(b/340494671): Move ablation study fields out of the function and make // the context a const ref. - void GetAvailableSuggestions(const FormData& form, - const FormFieldData& field, - AutofillSuggestionTriggerSource trigger_source, - std::vector& suggestions, - SuggestionsContext& context); + std::vector GetAvailableAddressAndCreditCardSuggestions( + const FormData& form, + const FormFieldData& field, + AutofillSuggestionTriggerSource trigger_source, + SuggestionsContext& context); // Generates and prioritizes different kinds of suggestions and // suggestion surfaces accordingly (e.g. Fast Checkout, @@ -576,6 +579,7 @@ class BrowserAutofillManager : public AutofillManager { const FormData& form, const FormFieldData& field, AutofillSuggestionTriggerSource trigger_source, + const SuggestionsContext& context, bool show_suggestions, std::vector suggestions); @@ -625,9 +629,9 @@ class BrowserAutofillManager : public AutofillManager { // Autocomplete and merchant promo codes. std::unique_ptr single_field_form_fill_router_ = std::make_unique( - unsafe_client().GetAutocompleteHistoryManager(), - unsafe_client().GetIbanManager(), - unsafe_client().GetMerchantPromoCodeManager()); + client().GetAutocompleteHistoryManager(), + client().GetPaymentsAutofillClient()->GetIbanManager(), + client().GetMerchantPromoCodeManager()); // Utilities for logging form events. The loggers emit metrics during their // destruction, effectively when the BrowserAutofillManager is reset or @@ -676,6 +680,7 @@ class BrowserAutofillManager : public AutofillManager { std::unique_ptr pending_form_data_; // The credit card access manager, used to access local and server cards. + // Lazily initialized: access only through GetCreditCardAccessManager(). std::unique_ptr credit_card_access_manager_; // Helper class to generate Autofill suggestions. diff --git a/src/components/autofill/core/browser/payments/credit_card_access_manager.cc b/src/components/autofill/core/browser/payments/credit_card_access_manager.cc index ee5fb99e522..a40221ea209 100644 --- a/src/components/autofill/core/browser/payments/credit_card_access_manager.cc +++ b/src/components/autofill/core/browser/payments/credit_card_access_manager.cc @@ -11,6 +11,7 @@ #include #include +#include "base/check_deref.h" #include "base/functional/bind.h" #include "base/metrics/histogram_functions.h" #include "base/ranges/algorithm.h" @@ -52,44 +53,37 @@ namespace autofill { namespace { -// Timeout to wait for unmask details from Google Payments in milliseconds. -constexpr int64_t kUnmaskDetailsResponseTimeoutMs = 3 * 1000; // 3 sec + +// Timeout to wait for unmask details from Google Payments. +constexpr auto kUnmaskDetailsResponseTimeout = base::Seconds(3); // Time to wait between multiple calls to GetUnmaskDetails(). -constexpr int64_t kDelayForGetUnmaskDetails = 3 * 60 * 1000; // 3 min +constexpr auto kDelayForGetUnmaskDetails = base::Minutes(3); // Suffix for server IDs in the cache indicating that a card is a virtual card. -const char kVirtualCardIdentifier[] = "_vcn"; +constexpr char kVirtualCardIdentifier[] = "_vcn"; } // namespace CreditCardAccessManager::CreditCardAccessManager( - AutofillDriver* driver, - AutofillClient* client, - PersonalDataManager* personal_data_manager, + AutofillManager* manager, autofill_metrics::CreditCardFormEventLogger* form_event_logger) - : driver_(driver), - client_(client), - personal_data_manager_(personal_data_manager), - form_event_logger_(form_event_logger) {} + : manager_(CHECK_DEREF(manager)), form_event_logger_(form_event_logger) {} CreditCardAccessManager::~CreditCardAccessManager() { // This clears the record type of the most recently autofilled card with no // interactive authentication flow upon page navigation, as page navigation // results in us destroying the current CreditCardAccessManager and creating a // new one. - if (client_) { - if (auto* form_data_importer = client_->GetFormDataImporter()) { - form_data_importer - ->SetPaymentMethodTypeIfNonInteractiveAuthenticationFlowCompleted( - std::nullopt); - } + if (auto* form_data_importer = autofill_client().GetFormDataImporter()) { + form_data_importer + ->SetPaymentMethodTypeIfNonInteractiveAuthenticationFlowCompleted( + std::nullopt); } } void CreditCardAccessManager::UpdateCreditCardFormEventLogger() { std::vector credit_cards = - personal_data_manager_->payments_data_manager().GetCreditCards(); - + payments_data_manager().GetCreditCards(); size_t server_record_type_count = 0; size_t local_record_type_count = 0; for (CreditCard* credit_card : credit_cards) { @@ -128,8 +122,7 @@ bool CreditCardAccessManager::ShouldClearPreviewedForm() { void CreditCardAccessManager::PrepareToFetchCreditCard() { #if !BUILDFLAG(IS_IOS) // No need to fetch details if there are no server cards. - if (!base::ranges::any_of(personal_data_manager_->payments_data_manager() - .GetCreditCardsToSuggest(), + if (!base::ranges::any_of(payments_data_manager().GetCreditCardsToSuggest(), std::not_fn(&CreditCard::IsLocalCard))) { return; } @@ -155,7 +148,7 @@ void CreditCardAccessManager::PrepareToFetchCreditCard() { GetOrCreateFidoAuthenticator()->IsUserVerifiable(base::BindOnce( &CreditCardAccessManager::GetUnmaskDetailsIfUserIsVerifiable, - weak_ptr_factory_.GetWeakPtr())); + GetWeakPtr())); } #endif } @@ -185,12 +178,10 @@ void CreditCardAccessManager::GetUnmaskDetailsIfUserIsVerifiable( if (is_user_verifiable_.value_or(false)) { unmask_details_request_in_progress_ = true; preflight_call_timestamp_ = base::TimeTicks::Now(); - client_->GetPaymentsAutofillClient() - ->GetPaymentsNetworkInterface() - ->GetUnmaskDetails( - base::BindOnce(&CreditCardAccessManager::OnDidGetUnmaskDetails, - weak_ptr_factory_.GetWeakPtr()), - personal_data_manager_->app_locale()); + payments_autofill_client().GetPaymentsNetworkInterface()->GetUnmaskDetails( + base::BindOnce(&CreditCardAccessManager::OnDidGetUnmaskDetails, + GetWeakPtr()), + personal_data_manager().app_locale()); autofill_metrics::LogCardUnmaskPreflightCalled( GetOrCreateFidoAuthenticator()->IsUserOptedIn()); } @@ -257,15 +248,14 @@ void CreditCardAccessManager::OnDidGetUnmaskDetails( // TODO(crbug.com/40253859): Rename `offer_fido_opt_in`, and check that the // user is off the record separately. unmask_details_.offer_fido_opt_in = - unmask_details_.offer_fido_opt_in && !client_->IsOffTheRecord(); + unmask_details_.offer_fido_opt_in && !autofill_client().IsOffTheRecord(); // Set delay as fido request timeout if available, otherwise set to default. - int delay_ms = kDelayForGetUnmaskDetails; - if (unmask_details_.fido_request_options.has_value()) { - const std::optional request_timeout = - unmask_details_.fido_request_options->FindInt("timeout_millis"); - if (request_timeout.has_value()) { - delay_ms = *request_timeout; + base::TimeDelta delay = kDelayForGetUnmaskDetails; + if (!unmask_details_.fido_request_options.empty()) { + if (std::optional request_timeout = + unmask_details_.fido_request_options.FindInt("timeout_millis")) { + delay = base::Milliseconds(*request_timeout); } } @@ -280,8 +270,8 @@ void CreditCardAccessManager::OnDidGetUnmaskDetails( base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask( FROM_HERE, base::BindOnce(&CreditCardAccessManager::SignalCanFetchUnmaskDetails, - weak_ptr_factory_.GetWeakPtr()), - base::Milliseconds(delay_ms)); + GetWeakPtr()), + delay); } void CreditCardAccessManager::FetchCreditCard( @@ -290,7 +280,8 @@ void CreditCardAccessManager::FetchCreditCard( // Reset the variable in FormDataImporter that denotes if non-interactive // authentication happened. This variable will be set to a value if a payments // autofill non-interactive flow successfully completes. - client_->GetFormDataImporter() + autofill_client() + .GetFormDataImporter() ->SetPaymentMethodTypeIfNonInteractiveAuthenticationFlowCompleted( std::nullopt); @@ -376,7 +367,7 @@ void CreditCardAccessManager::FIDOAuthOptChange(bool opt_in) { // to add the maximum amount of strikes to the FIDO auth strike database, as // strike databases are not present in incognito mode and should not be // used. - if (client_->IsOffTheRecord()) { + if (autofill_client().IsOffTheRecord()) { return; } @@ -458,7 +449,7 @@ void CreditCardAccessManager::StartAuthenticationFlowForVirtualCard( if (challenge_options.empty()) { std::move(on_credit_card_fetched_callback_) .Run(CreditCardFetchResult::kTransientError, nullptr); - client_->GetPaymentsAutofillClient()->ShowAutofillErrorDialog( + payments_autofill_client().ShowAutofillErrorDialog( AutofillErrorDialogContext::WithVirtualCardPermanentOrTemporaryError( /*is_permanent_error=*/true)); Reset(); @@ -552,15 +543,15 @@ void CreditCardAccessManager::Authenticate( return; } - // For virtual cards the |fido_request_option| comes from the - // UnmaskResponseDetails while for masked server cards, it comes from the + // For virtual cards the `fido_request_options` come from the + // UnmaskResponseDetails while for masked server cards, they come from the // UnmaskDetails. base::Value::Dict fido_request_options; std::optional context_token; if (card_->record_type() == CreditCard::RecordType::kVirtualCard) { context_token = virtual_card_unmask_response_details_.context_token; fido_request_options = std::move( - virtual_card_unmask_response_details_.fido_request_options.value()); + virtual_card_unmask_response_details_.fido_request_options); } else { CHECK_EQ(card_->record_type(), CreditCard::RecordType::kMaskedServerCard); @@ -571,18 +562,17 @@ void CreditCardAccessManager::Authenticate( CHECK(!risk_based_authentication_response_.context_token.empty()); context_token = risk_based_authentication_response_.context_token; fido_request_options = std::move( - risk_based_authentication_response_.fido_request_options.value()); + risk_based_authentication_response_.fido_request_options); } else { // If risk-based authentication is not available, the response of // UnmaskDetails preflight call will be used as the resource of // `fido_request_options`. fido_request_options = - std::move(unmask_details_.fido_request_options.value()); + std::move(unmask_details_.fido_request_options); } } GetOrCreateFidoAuthenticator()->Authenticate( - *card_, weak_ptr_factory_.GetWeakPtr(), - std::move(fido_request_options), context_token); + *card_, GetWeakPtr(), std::move(fido_request_options), context_token); #endif break; } @@ -595,7 +585,7 @@ void CreditCardAccessManager::Authenticate( #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) // Close the Webauthn verify pending dialog if it enters CVC // authentication flow since the card unmask prompt will pop up. - client_->CloseWebauthnDialog(); + autofill_client().CloseWebauthnDialog(); #endif // Delegate the task to CreditCardCvcAuthenticator. @@ -603,24 +593,18 @@ void CreditCardAccessManager::Authenticate( // the vcn context token and the selected challenge option. if (card_->record_type() == CreditCard::RecordType::kVirtualCard) { DCHECK(selected_challenge_option_); - client_->GetPaymentsAutofillClient() - ->GetCvcAuthenticator() - .Authenticate(card_.get(), weak_ptr_factory_.GetWeakPtr(), - personal_data_manager_, - virtual_card_unmask_response_details_.context_token, - *selected_challenge_option_); + payments_autofill_client().GetCvcAuthenticator().Authenticate( + card_.get(), GetWeakPtr(), &personal_data_manager(), + virtual_card_unmask_response_details_.context_token, + *selected_challenge_option_); } else if (IsMaskedServerCardRiskBasedAuthAvailable()) { CHECK(!risk_based_authentication_response_.context_token.empty()); - client_->GetPaymentsAutofillClient() - ->GetCvcAuthenticator() - .Authenticate(card_.get(), weak_ptr_factory_.GetWeakPtr(), - personal_data_manager_, - risk_based_authentication_response_.context_token); + payments_autofill_client().GetCvcAuthenticator().Authenticate( + card_.get(), GetWeakPtr(), &personal_data_manager(), + risk_based_authentication_response_.context_token); } else { - client_->GetPaymentsAutofillClient() - ->GetCvcAuthenticator() - .Authenticate(card_.get(), weak_ptr_factory_.GetWeakPtr(), - personal_data_manager_); + payments_autofill_client().GetCvcAuthenticator().Authenticate( + card_.get(), GetWeakPtr(), &personal_data_manager()); } break; } @@ -628,14 +612,12 @@ void CreditCardAccessManager::Authenticate( case UnmaskAuthFlowType::kOtpFallbackFromFido: { // Delegate the task to CreditCardOtpAuthenticator. DCHECK(selected_challenge_option_); - client_->GetPaymentsAutofillClient() - ->GetOtpAuthenticator() + payments_autofill_client() + .GetOtpAuthenticator() ->OnChallengeOptionSelected( - card_.get(), *selected_challenge_option_, - weak_ptr_factory_.GetWeakPtr(), + card_.get(), *selected_challenge_option_, GetWeakPtr(), virtual_card_unmask_response_details_.context_token, - payments::GetBillingCustomerId( - &personal_data_manager_->payments_data_manager())); + payments::GetBillingCustomerId(&payments_data_manager())); break; } case UnmaskAuthFlowType::kThreeDomainSecure: @@ -649,12 +631,12 @@ void CreditCardAccessManager::Authenticate( vcn_3ds_context.challenge_option = *selected_challenge_option_; vcn_3ds_context.completion_callback = base::BindOnce( &CreditCardAccessManager::OnVcn3dsAuthenticationComplete, - weak_ptr_factory_.GetWeakPtr()); + GetWeakPtr()); vcn_3ds_context.user_consent_already_given = unmask_auth_flow_type_ == UnmaskAuthFlowType::kThreeDomainSecureConsentAlreadyGiven; - client_->GetPaymentsAutofillClient() - ->GetPaymentsWindowManager() + payments_autofill_client() + .GetPaymentsWindowManager() ->InitVcn3dsAuthentication(std::move(vcn_3ds_context)); break; } @@ -670,8 +652,8 @@ void CreditCardAccessManager::Authenticate( CreditCardFidoAuthenticator* CreditCardAccessManager::GetOrCreateFidoAuthenticator() { if (!fido_authenticator_) - fido_authenticator_ = - std::make_unique(driver_, client_); + fido_authenticator_ = std::make_unique( + &manager_->driver(), &autofill_client()); return fido_authenticator_.get(); } #endif @@ -715,22 +697,22 @@ void CreditCardAccessManager::OnCvcAuthenticationComplete( unmask_auth_flow_type_ = UnmaskAuthFlowType::kNone; } else if (should_register_card_with_fido) { #if !BUILDFLAG(IS_IOS) - std::optional request_options = std::nullopt; - if (unmask_details_.fido_request_options.has_value()) { + base::Value::Dict request_options; + if (!unmask_details_.fido_request_options.empty()) { // For opted-in user (CVC then FIDO case), request options are returned in // unmask detail response. - request_options = unmask_details_.fido_request_options->Clone(); - } else if (response.request_options.has_value()) { + request_options = unmask_details_.fido_request_options.Clone(); + } else if (!response.request_options.empty()) { // For Android users, request_options are provided from GetRealPan if the // user has chosen to opt-in. - request_options = response.request_options->Clone(); + request_options = response.request_options.Clone(); } // Additionally authorizes the card with FIDO. It also delays the form // filling. - GetOrCreateFidoAuthenticator()->Authorize(weak_ptr_factory_.GetWeakPtr(), + GetOrCreateFidoAuthenticator()->Authorize(GetWeakPtr(), response.card_authorization_token, - request_options->Clone()); + request_options.Clone()); #endif } if (ShouldOfferFidoOptInDialog(response)) { @@ -749,7 +731,7 @@ void CreditCardAccessManager::OnCvcAuthenticationComplete( #if BUILDFLAG(IS_ANDROID) bool CreditCardAccessManager::ShouldOfferFidoAuth() const { if (!unmask_details_.offer_fido_opt_in && - unmask_details_.fido_request_options.has_value()) { + !unmask_details_.fido_request_options.empty()) { // Server instructed the client to not offer fido because the client is // already opted in. This can be verified with the presence of request // options in the server response. @@ -805,7 +787,7 @@ void CreditCardAccessManager::OnFIDOAuthenticationComplete( features::kAutofillEnableFIDOProgressDialog)) { // Close the progress dialog when the authentication for getting the full // card completes. - client_->GetPaymentsAutofillClient()->CloseAutofillProgressDialog( + payments_autofill_client().CloseAutofillProgressDialog( /*show_confirmation_before_closing=*/true, /*no_interactive_authentication_callback=*/base::OnceClosure()); } @@ -813,7 +795,7 @@ void CreditCardAccessManager::OnFIDOAuthenticationComplete( // Close the Webauthn verify pending dialog. If FIDO authentication succeeded, // card is filled to the form, otherwise fall back to CVC authentication which // does not need the verify pending dialog either. - client_->CloseWebauthnDialog(); + autofill_client().CloseWebauthnDialog(); #endif if (response.did_succeed) { @@ -836,7 +818,7 @@ void CreditCardAccessManager::OnFIDOAuthenticationComplete( // If it is an virtual card retrieval error, we don't want to invoke the CVC // authentication afterwards. Instead reset all states, notify accessor and // invoke the error dialog. - client_->GetPaymentsAutofillClient()->ShowAutofillErrorDialog( + payments_autofill_client().ShowAutofillErrorDialog( AutofillErrorDialogContext::WithVirtualCardPermanentOrTemporaryError( /*is_permanent_error=*/response.failure_type == payments::FullCardRequest:: @@ -954,7 +936,7 @@ bool CreditCardAccessManager::IsSelectedCardFidoAuthorized() { // by the risk-based authentication call will be used as the indicator about // whether the selected card is FIDO authorized. if (IsMaskedServerCardRiskBasedAuthAvailable()) { - return risk_based_authentication_response_.fido_request_options.has_value(); + return !risk_based_authentication_response_.fido_request_options.empty(); } DCHECK_NE(unmask_details_.unmask_auth_method, AutofillClient::UnmaskAuthMethod::kUnknown); @@ -968,7 +950,7 @@ bool CreditCardAccessManager::ShouldRespondImmediately( // GetRealPan did not return RequestOptions (user did not specify intent to // opt-in) AND flow is not registering a new card, so fill the form // directly. - if (!response.request_options.has_value() && + if (response.request_options.empty() && unmask_auth_flow_type_ != UnmaskAuthFlowType::kCvcThenFido) { return true; } @@ -1000,11 +982,12 @@ bool CreditCardAccessManager::ShouldRegisterCardWithFido( // For Android, we will delay the form filling for both intent-to-opt-in user // opting in and opted-in user registering a new card (kCvcThenFido). So we // check one more scenario for Android here. If the GetRealPan response - // includes |request_options|, that means the user showed intention to opt-in + // includes `request_options`, that means the user showed intention to opt-in // while unmasking and must complete the challenge before successfully // opting-in and filling the form. - if (response.request_options.has_value()) + if (!response.request_options.empty()) { return true; + } #endif // No conditions to offer FIDO registration are met, so we return false. @@ -1018,7 +1001,7 @@ bool CreditCardAccessManager::ShouldOfferFidoOptInDialog( return false; #else if (!unmask_details_.offer_fido_opt_in && - unmask_details_.fido_request_options.has_value()) { + !unmask_details_.fido_request_options.empty()) { // Server instructed the client to not offer fido because the client is // already opted in. This can be verified with the presence of request // options in the server response. @@ -1075,17 +1058,16 @@ void CreditCardAccessManager::ShowWebauthnOfferDialog( #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) GetOrCreateFidoAuthenticator()->OnWebauthnOfferDialogRequested( card_authorization_token); - client_->ShowWebauthnOfferDialog( - base::BindRepeating(&CreditCardAccessManager::HandleDialogUserResponse, - weak_ptr_factory_.GetWeakPtr())); + payments_autofill_client().ShowWebauthnOfferDialog(base::BindRepeating( + &CreditCardAccessManager::HandleDialogUserResponse, GetWeakPtr())); #endif } #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) void CreditCardAccessManager::ShowVerifyPendingDialog() { - client_->ShowWebauthnVerifyPendingDialog( + payments_autofill_client().ShowWebauthnVerifyPendingDialog( base::BindRepeating(&CreditCardAccessManager::HandleDialogUserResponse, - weak_ptr_factory_.GetWeakPtr())); + GetWeakPtr())); } void CreditCardAccessManager::HandleDialogUserResponse( @@ -1102,9 +1084,7 @@ void CreditCardAccessManager::HandleDialogUserResponse( case WebauthnDialogCallbackType::kVerificationCancelled: // TODO(crbug.com/40621544): Add tests and logging for canceling verify // pending dialog. - client_->GetPaymentsAutofillClient() - ->GetPaymentsNetworkInterface() - ->CancelRequest(); + payments_autofill_client().GetPaymentsNetworkInterface()->CancelRequest(); SignalCanFetchUnmaskDetails(); ready_to_start_authentication_.Reset(); unmask_details_request_in_progress_ = false; @@ -1151,19 +1131,16 @@ void CreditCardAccessManager::FetchMaskedServerCard() { } #endif - client_->GetPaymentsAutofillClient()->ShowAutofillProgressDialog( + payments_autofill_client().ShowAutofillProgressDialog( AutofillProgressDialogType::kServerCardUnmaskProgressDialog, /*cancel_callback=*/base::BindOnce( &CreditCardRiskBasedAuthenticator::OnUnmaskCancelled, - client_->GetPaymentsAutofillClient() - ->GetRiskBasedAuthenticator() + payments_autofill_client() + .GetRiskBasedAuthenticator() ->AsWeakPtr())); - // TODO(crbug.com/1375748): Reduce the number of calls to - // `client_->GetPaymentsAutofillClient()`. - client_->GetPaymentsAutofillClient() - ->GetRiskBasedAuthenticator() - ->Authenticate(*card_, weak_ptr_factory_.GetWeakPtr()); + payments_autofill_client().GetRiskBasedAuthenticator()->Authenticate( + *card_, GetWeakPtr()); // Risk-based authentication is handled in CreditCardRiskBasedAuthenticator. // Further delegation will be handled in // CreditCardAccessManager::OnRiskBasedAuthenticationResponseReceived. @@ -1203,8 +1180,8 @@ void CreditCardAccessManager::FetchMaskedServerCard() { // OnStopWaitingForUnmaskDetails(). ready_to_start_authentication_.OnEventOrTimeOut( base::BindOnce(&CreditCardAccessManager::OnStopWaitingForUnmaskDetails, - weak_ptr_factory_.GetWeakPtr()), - base::Milliseconds(kUnmaskDetailsResponseTimeoutMs)); + GetWeakPtr()), + kUnmaskDetailsResponseTimeout); } else { StartAuthenticationFlow( IsFidoAuthEnabled(get_unmask_details_returned && @@ -1215,13 +1192,12 @@ void CreditCardAccessManager::FetchMaskedServerCard() { void CreditCardAccessManager::FetchVirtualCard() { is_authentication_in_progress_ = true; - client_->GetPaymentsAutofillClient()->ShowAutofillProgressDialog( + payments_autofill_client().ShowAutofillProgressDialog( AutofillProgressDialogType::kVirtualCardUnmaskProgressDialog, base::BindOnce(&CreditCardAccessManager::OnVirtualCardUnmaskCancelled, - weak_ptr_factory_.GetWeakPtr())); - client_->GetPaymentsAutofillClient() - ->GetRiskBasedAuthenticator() - ->Authenticate(*card_, weak_ptr_factory_.GetWeakPtr()); + GetWeakPtr())); + payments_autofill_client().GetRiskBasedAuthenticator()->Authenticate( + *card_, GetWeakPtr()); } void CreditCardAccessManager::FetchLocalOrFullServerCard() { @@ -1236,8 +1212,7 @@ void CreditCardAccessManager::FetchLocalOrFullServerCard() { // Check if we need to authenticate the user before filling the local card // or full server card. - if (personal_data_manager_->payments_data_manager() - .IsPaymentMethodsMandatoryReauthEnabled()) { + if (payments_data_manager().IsPaymentMethodsMandatoryReauthEnabled()) { // `StartDeviceAuthenticationForFilling()` will asynchronously trigger // the re-authentication flow, so we should avoid calling `Reset()` // until the re-authentication flow is complete. @@ -1255,7 +1230,8 @@ void CreditCardAccessManager::FetchLocalOrFullServerCard() { // This local or full server card autofill flow did not have any interactive // authentication, so notify the FormDataImporter of this. - client_->GetFormDataImporter() + autofill_client() + .GetFormDataImporter() ->SetPaymentMethodTypeIfNonInteractiveAuthenticationFlowCompleted( payments::MandatoryReauthManager:: GetNonInteractivePaymentMethodType(card_->record_type())); @@ -1291,7 +1267,7 @@ void CreditCardAccessManager::OnRiskBasedAuthenticationResponseReceived( Result::kAuthenticationRequired: // Authenticates users to unmask the card if the response indicates // further authentication is required. - client_->GetPaymentsAutofillClient()->CloseAutofillProgressDialog( + payments_autofill_client().CloseAutofillProgressDialog( /*show_confirmation_before_closing=*/false, /*no_interactive_authentication_callback=*/base::OnceClosure()); CHECK(!response.context_token.empty()); @@ -1301,7 +1277,7 @@ void CreditCardAccessManager::OnRiskBasedAuthenticationResponseReceived( // GetUnmaskDetails to determine whether the card can be enrolled into // FIDO. StartAuthenticationFlow(IsFidoAuthEnabled( - /*fido_auth_offered=*/response.fido_request_options.has_value() || + /*fido_auth_offered=*/!response.fido_request_options.empty() || unmask_details_.unmask_auth_method == AutofillClient::UnmaskAuthMethod::kFido)); break; @@ -1320,12 +1296,12 @@ void CreditCardAccessManager::OnRiskBasedAuthenticationResponseReceived( case CreditCardRiskBasedAuthenticator::RiskBasedAuthenticationResponse:: Result::kError: // Shows error dialog to users if the authentication failed. - client_->GetPaymentsAutofillClient()->CloseAutofillProgressDialog( + payments_autofill_client().CloseAutofillProgressDialog( /*show_confirmation_before_closing=*/false, /*no_interactive_authentication_callback=*/base::OnceClosure()); std::move(on_credit_card_fetched_callback_) .Run(CreditCardFetchResult::kTransientError, nullptr); - client_->GetPaymentsAutofillClient()->ShowAutofillErrorDialog( + payments_autofill_client().ShowAutofillErrorDialog( response.error_dialog_context); autofill_metrics::LogServerCardUnmaskResult( @@ -1373,11 +1349,11 @@ void CreditCardAccessManager:: // Otherwise further authentication is required to unmask the card. DCHECK(!response_details.context_token.empty()); // Close the progress dialog without showing the confirmation. - client_->GetPaymentsAutofillClient()->CloseAutofillProgressDialog( + payments_autofill_client().CloseAutofillProgressDialog( /*show_confirmation_before_closing=*/false, /*no_interactive_authentication_callback=*/base::OnceClosure()); StartAuthenticationFlow( - IsFidoAuthEnabled(response_details.fido_request_options.has_value())); + IsFidoAuthEnabled(!response_details.fido_request_options.empty())); return; } @@ -1386,7 +1362,7 @@ void CreditCardAccessManager:: // permanent error dialog, and for all other cases we show VCN temporary // error dialog. // Close the progress dialog without showing the confirmation. - client_->GetPaymentsAutofillClient()->CloseAutofillProgressDialog( + payments_autofill_client().CloseAutofillProgressDialog( /*show_confirmation_before_closing=*/false, /*no_interactive_authentication_callback=*/base::OnceClosure()); std::move(on_credit_card_fetched_callback_) @@ -1416,10 +1392,10 @@ void CreditCardAccessManager:: // Error fields returned in the server response are more detailed than the // virtual card temporary/permanent error messages stored on the client, so // prefer the server-returned fields if they exist. - client_->GetPaymentsAutofillClient()->ShowAutofillErrorDialog( + payments_autofill_client().ShowAutofillErrorDialog( *response_details.autofill_error_dialog_context); } else { - client_->GetPaymentsAutofillClient()->ShowAutofillErrorDialog( + payments_autofill_client().ShowAutofillErrorDialog( AutofillErrorDialogContext::WithVirtualCardPermanentOrTemporaryError( /*is_permanent_error=*/result == AutofillClient::PaymentsRpcResult::kVcnRetrievalPermanentFailure)); @@ -1429,14 +1405,13 @@ void CreditCardAccessManager:: void CreditCardAccessManager::OnNonInteractiveAuthenticationSuccess( CreditCard::RecordType record_type) { - if (personal_data_manager_->payments_data_manager() - .IsPaymentMethodsMandatoryReauthEnabled()) { + if (payments_data_manager().IsPaymentMethodsMandatoryReauthEnabled()) { // On some operating systems (for example, macOS and Windows), the // device authentication prompt freezes Chrome. Thus we can only trigger // the prompt after the progress dialog has been closed, which we can do // by using the `no_interactive_authentication_callback` parameter in // `PaymentsAutofillClient::CloseAutofillProgressDialog()`. - client_->GetPaymentsAutofillClient()->CloseAutofillProgressDialog( + payments_autofill_client().CloseAutofillProgressDialog( /*show_confirmation_before_closing=*/false, /*no_interactive_authentication_callback=*/base::BindOnce( // `StartDeviceAuthenticationForFilling()` will asynchronously @@ -1444,9 +1419,9 @@ void CreditCardAccessManager::OnNonInteractiveAuthenticationSuccess( // calling `Reset()` until the re-authentication flow is // complete. &CreditCardAccessManager::StartDeviceAuthenticationForFilling, - weak_ptr_factory_.GetWeakPtr(), card_.get())); + GetWeakPtr(), card_.get())); } else { - client_->GetPaymentsAutofillClient()->CloseAutofillProgressDialog( + payments_autofill_client().CloseAutofillProgressDialog( /*show_confirmation_before_closing=*/true, /*no_interactive_authentication_callback=*/base::OnceClosure()); std::move(on_credit_card_fetched_callback_) @@ -1457,7 +1432,8 @@ void CreditCardAccessManager::OnNonInteractiveAuthenticationSuccess( // `card_record_type_if_non_interactive_authentication_flow_completed_` // field in FormDataImporter so that MandatoryReauthManager can decide // whether to offer mandatory re-auth opt-in for this user. - client_->GetFormDataImporter() + autofill_client() + .GetFormDataImporter() ->SetPaymentMethodTypeIfNonInteractiveAuthenticationFlowCompleted( payments::MandatoryReauthManager:: GetNonInteractivePaymentMethodType(record_type)); @@ -1519,7 +1495,7 @@ void CreditCardAccessManager::OnUserAcceptedAuthenticationSelectionDialog( NOTREACHED_IN_MIGRATION(); std::move(on_credit_card_fetched_callback_) .Run(CreditCardFetchResult::kTransientError, nullptr); - client_->GetPaymentsAutofillClient()->ShowAutofillErrorDialog( + payments_autofill_client().ShowAutofillErrorDialog( AutofillErrorDialogContext::WithVirtualCardPermanentOrTemporaryError( /*is_permanent_error=*/false)); Reset(); @@ -1559,7 +1535,7 @@ void CreditCardAccessManager::OnVirtualCardUnmaskCancelled() { // Virtual Card Unmask request, so we need to reset the state of the // CreditCardOtpAuthenticator as well to ensure the flow does not continue, // as continuing the flow can cause a crash. - client_->GetPaymentsAutofillClient()->GetOtpAuthenticator()->Reset(); + payments_autofill_client().GetOtpAuthenticator()->Reset(); } autofill_metrics::ServerCardUnmaskFlowType flow_type; @@ -1631,13 +1607,13 @@ void CreditCardAccessManager::HandleFidoOptInStatusChange() { } void CreditCardAccessManager::ShowUnmaskAuthenticatorSelectionDialog() { - client_->GetPaymentsAutofillClient()->ShowUnmaskAuthenticatorSelectionDialog( + payments_autofill_client().ShowUnmaskAuthenticatorSelectionDialog( virtual_card_unmask_response_details_.card_unmask_challenge_options, base::BindOnce( &CreditCardAccessManager::OnUserAcceptedAuthenticationSelectionDialog, - weak_ptr_factory_.GetWeakPtr()), + GetWeakPtr()), base::BindOnce(&CreditCardAccessManager::OnVirtualCardUnmaskCancelled, - weak_ptr_factory_.GetWeakPtr())); + GetWeakPtr())); } CardUnmaskChallengeOption* @@ -1681,7 +1657,8 @@ void CreditCardAccessManager::StartDeviceAuthenticationForFilling( is_authentication_in_progress_ = true; payments::MandatoryReauthAuthenticationMethod authentication_method = - client_->GetOrCreatePaymentsMandatoryReauthManager() + autofill_client() + .GetOrCreatePaymentsMandatoryReauthManager() ->GetAuthenticationMethod(); // If there is no supported auth method on the device, we should skip re-auth @@ -1709,19 +1686,22 @@ void CreditCardAccessManager::StartDeviceAuthenticationForFilling( authentication_method, autofill_metrics::MandatoryReauthAuthenticationFlowEvent::kFlowStarted); #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_IOS) - client_->GetOrCreatePaymentsMandatoryReauthManager()->AuthenticateWithMessage( - l10n_util::GetStringUTF16(IDS_PAYMENTS_AUTOFILL_FILLING_MANDATORY_REAUTH), - base::BindOnce( - &CreditCardAccessManager::OnDeviceAuthenticationResponseForFilling, - weak_ptr_factory_.GetWeakPtr(), authentication_method, card)); + autofill_client() + .GetOrCreatePaymentsMandatoryReauthManager() + ->AuthenticateWithMessage( + l10n_util::GetStringUTF16( + IDS_PAYMENTS_AUTOFILL_FILLING_MANDATORY_REAUTH), + base::BindOnce(&CreditCardAccessManager:: + OnDeviceAuthenticationResponseForFilling, + GetWeakPtr(), authentication_method, card)); #elif BUILDFLAG(IS_ANDROID) // TODO(crbug.com/40261690): Convert this to // MandatoryReauthManager::AuthenticateWithMessage() with the correct message // once it is supported. Currently, the message is "Verify it's you". - client_->GetOrCreatePaymentsMandatoryReauthManager()->Authenticate( + autofill_client().GetOrCreatePaymentsMandatoryReauthManager()->Authenticate( base::BindOnce( &CreditCardAccessManager::OnDeviceAuthenticationResponseForFilling, - weak_ptr_factory_.GetWeakPtr(), authentication_method, card)); + GetWeakPtr(), authentication_method, card)); #else NOTREACHED_NORETURN(); #endif diff --git a/src/components/autofill/core/browser/payments/credit_card_access_manager.h b/src/components/autofill/core/browser/payments/credit_card_access_manager.h index 63e69a9c75a..da7f7b07696 100644 --- a/src/components/autofill/core/browser/payments/credit_card_access_manager.h +++ b/src/components/autofill/core/browser/payments/credit_card_access_manager.h @@ -14,10 +14,12 @@ #include "base/functional/callback_forward.h" #include "base/gtest_prod_util.h" #include "base/memory/raw_ptr.h" +#include "base/memory/raw_ref.h" #include "base/time/time.h" #include "build/build_config.h" #include "components/autofill/core/browser/autofill_client.h" #include "components/autofill/core/browser/autofill_driver.h" +#include "components/autofill/core/browser/autofill_manager.h" #include "components/autofill/core/browser/data_model/credit_card.h" #include "components/autofill/core/browser/metrics/form_events/credit_card_form_event_logger.h" #include "components/autofill/core/browser/payments/credit_card_cvc_authenticator.h" @@ -35,7 +37,6 @@ namespace autofill { -class BrowserAutofillManager; enum class WebauthnDialogCallbackType; // Flow type denotes which card unmask authentication method was used. @@ -103,9 +104,7 @@ class CreditCardAccessManager using OtpAuthenticationResponse = CreditCardOtpAuthenticator::OtpAuthenticationResponse; - CreditCardAccessManager(AutofillDriver* driver, - AutofillClient* client, - PersonalDataManager* personal_data_manager, + CreditCardAccessManager(AutofillManager* manager, autofill_metrics::CreditCardFormEventLogger* credit_card_form_event_logger); @@ -183,7 +182,26 @@ class CreditCardAccessManager private: friend class CreditCardAccessManagerTestApi; - // Returns whether or not unmasked card cache is empty. Exposed for testing. + AutofillClient& autofill_client() { return manager_->client(); } + + payments::PaymentsAutofillClient& payments_autofill_client() { + return *autofill_client().GetPaymentsAutofillClient(); + } + + PersonalDataManager& personal_data_manager() { + return *autofill_client().GetPersonalDataManager(); + } + + PaymentsDataManager& payments_data_manager() { + return personal_data_manager().payments_data_manager(); + } + + base::WeakPtr GetWeakPtr() { + return weak_ptr_factory_.GetWeakPtr(); + } + + // Returns whether or not unmasked card cache is empty. Exposed for + // testing. bool UnmaskedCardCacheIsEmpty(); // Invoked from CreditCardFidoAuthenticator::IsUserVerifiable(). @@ -374,16 +392,8 @@ class CreditCardAccessManager // OnCvcAuthenticationComplete() to be executed. bool is_authentication_in_progress_ = false; - // The associated autofill driver. Weak reference. - const raw_ptr driver_; - - // The associated autofill client. Weak reference. - const raw_ptr client_; - - // The personal data manager, used to save and load personal data to/from the - // web database. - // Weak reference. - const raw_ptr personal_data_manager_; + // The owning AutofillManager. + const raw_ref manager_; // For logging metrics. const raw_ptr form_event_logger_; diff --git a/src/components/browser_ui/settings/android/java/src/org/chromium/components/browser_ui/settings/SettingsLauncher.java b/src/components/browser_ui/settings/android/java/src/org/chromium/components/browser_ui/settings/SettingsLauncher.java index dbe2cb7d935..c319cf257a1 100644 --- a/src/components/browser_ui/settings/android/java/src/org/chromium/components/browser_ui/settings/SettingsLauncher.java +++ b/src/components/browser_ui/settings/android/java/src/org/chromium/components/browser_ui/settings/SettingsLauncher.java @@ -26,7 +26,8 @@ public interface SettingsLauncher { SettingsFragment.SITE, SettingsFragment.ACCESSIBILITY, SettingsFragment.PASSWORDS, - SettingsFragment.GOOGLE_SERVICES + SettingsFragment.GOOGLE_SERVICES, + SettingsFragment.MANAGE_SYNC }) @Retention(RetentionPolicy.SOURCE) public @interface SettingsFragment { @@ -48,6 +49,8 @@ public interface SettingsLauncher { int PASSWORDS = 7; /// Google services. int GOOGLE_SERVICES = 8; + /// Manage sync. + int MANAGE_SYNC = 9; /// Extension developer settings. int EXTENSION_DEVELOPER_MODE = 9; } diff --git a/src/components/browser_ui/styles/android/BUILD.gn b/src/components/browser_ui/styles/android/BUILD.gn index cf4531ee570..f9872803e40 100644 --- a/src/components/browser_ui/styles/android/BUILD.gn +++ b/src/components/browser_ui/styles/android/BUILD.gn @@ -229,6 +229,7 @@ android_resources("java_resources") { "java/res/drawable/ic_vpn_key_grey.xml", "java/res/drawable/ic_warning_red_16dp.xml", "java/res/drawable/ic_warning_red_24dp.xml", + "java/res/drawable/ic_warning_red_outline_32dp.xml", "java/res/drawable/ic_web_asset_24dp.xml", "java/res/drawable/ic_youtube_searched_for_24dp.xml", "java/res/drawable/smartphone_black_24dp.xml", diff --git a/src/components/browser_ui/widget/android/BUILD.gn b/src/components/browser_ui/widget/android/BUILD.gn index 3468d40aa4b..4f4a1530d6a 100644 --- a/src/components/browser_ui/widget/android/BUILD.gn +++ b/src/components/browser_ui/widget/android/BUILD.gn @@ -437,4 +437,4 @@ robolectric_library("junit") { "//ui/android:ui_java_test_support", "//ui/android:ui_no_recycler_view_java", ] -} \ No newline at end of file +} diff --git a/src/components/content_settings/core/browser/host_content_settings_map.cc b/src/components/content_settings/core/browser/host_content_settings_map.cc index acd72a63263..b5f6bd6a3e7 100644 --- a/src/components/content_settings/core/browser/host_content_settings_map.cc +++ b/src/components/content_settings/core/browser/host_content_settings_map.cc @@ -1050,8 +1050,7 @@ base::Value HostContentSettingsMap::GetWebsiteSettingInternal( for (; it != content_settings_providers_.end(); ++it) { base::Value value = GetContentSettingValueAndPatterns( it->second.get(), primary_url, secondary_url, content_type, - is_off_the_record_, primary_pattern, secondary_pattern, metadata, - clock_); + is_off_the_record_, primary_pattern, secondary_pattern, metadata); if (!value.is_none()) { if (info) info->source = @@ -1077,93 +1076,37 @@ base::Value HostContentSettingsMap::GetContentSettingValueAndPatterns( bool include_incognito, ContentSettingsPattern* primary_pattern, ContentSettingsPattern* secondary_pattern, - content_settings::RuleMetaData* metadata, - base::Clock* clock) { + content_settings::RuleMetaData* metadata) { // TODO(crbug.com/40847840): Remove this check once we figure out what is // wrong. CHECK(provider); if (include_incognito) { - if (base::FeatureList::IsEnabled( - content_settings::features::kIndexedHostContentSettingsMap)) { - auto rule = provider->GetRule( - primary_url, secondary_url, content_type, /*off_the_record=*/true, - content_settings::PartitionKey::WipGetDefault()); - if (rule) { - return GetContentSettingValueAndPatterns(rule.get(), primary_pattern, - secondary_pattern, metadata); - } - } else { - // Check incognito-only specific settings. It's essential that the - // |RuleIterator| gets out of scope before we get a rule iterator for the - // normal mode. - std::unique_ptr incognito_rule_iterator( - provider->GetRuleIterator( - content_type, true /* incognito */, - content_settings::PartitionKey::WipGetDefault())); - base::Value value = GetContentSettingValueAndPatterns( - incognito_rule_iterator.get(), primary_url, secondary_url, - primary_pattern, secondary_pattern, metadata, clock); - if (!value.is_none()) { - return value; - } + auto rule = provider->GetRule( + primary_url, secondary_url, content_type, /*off_the_record=*/true, + content_settings::PartitionKey::WipGetDefault()); + if (rule) { + return GetContentSettingValueAndPatterns(rule.get(), primary_pattern, + secondary_pattern, metadata); } } // No settings from the incognito; use the normal mode. base::Value value; - if (base::FeatureList::IsEnabled( - content_settings::features::kIndexedHostContentSettingsMap)) { - auto rule = provider->GetRule( - primary_url, secondary_url, content_type, /*off_the_record=*/false, - content_settings::PartitionKey::WipGetDefault()); - if (rule) { - value = GetContentSettingValueAndPatterns(rule.get(), primary_pattern, - secondary_pattern, metadata); - } - } else { - std::unique_ptr rule_iterator( - provider->GetRuleIterator( - content_type, false /* incognito */, - content_settings::PartitionKey::WipGetDefault())); - value = GetContentSettingValueAndPatterns( - rule_iterator.get(), primary_url, secondary_url, primary_pattern, - secondary_pattern, metadata, clock); + auto rule = provider->GetRule( + primary_url, secondary_url, content_type, /*off_the_record=*/false, + content_settings::PartitionKey::WipGetDefault()); + if (rule) { + value = GetContentSettingValueAndPatterns(rule.get(), primary_pattern, + secondary_pattern, metadata); } + if (!value.is_none() && include_incognito) { value = ProcessIncognitoInheritanceBehavior(content_type, std::move(value)); } return value; } -// static -base::Value HostContentSettingsMap::GetContentSettingValueAndPatterns( - content_settings::RuleIterator* rule_iterator, - const GURL& primary_url, - const GURL& secondary_url, - ContentSettingsPattern* primary_pattern, - ContentSettingsPattern* secondary_pattern, - content_settings::RuleMetaData* metadata, - base::Clock* clock) { - if (rule_iterator) { - while (rule_iterator->HasNext()) { - std::unique_ptr rule = rule_iterator->Next(); - // Refer to comment near the definition `kEagerExpiryBuffer` regarding - // provisioning and CPU contention. - if (rule->primary_pattern.Matches(primary_url) && - rule->secondary_pattern.Matches(secondary_url) && - (base::FeatureList::IsEnabled( - content_settings::features::kActiveContentSettingExpiry) || - (rule->metadata.expiration().is_null() || - (rule->metadata.expiration() > clock->Now())))) { - return GetContentSettingValueAndPatterns(rule.get(), primary_pattern, - secondary_pattern, metadata); - } - } - } - return base::Value(); -} - // static base::Value HostContentSettingsMap::GetContentSettingValueAndPatterns( content_settings::Rule* rule, diff --git a/src/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc b/src/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc index e6c63298914..3188735e521 100644 --- a/src/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc +++ b/src/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc @@ -58,6 +58,7 @@ namespace subresource_filter { + namespace { bool ShouldInheritOpenerActivation(content::NavigationHandle* navigation_handle, @@ -150,7 +151,6 @@ ContentSubresourceFilterThrottleManager::FromNavigationHandle( navigation_handle); } - ContentSubresourceFilterThrottleManager:: ContentSubresourceFilterThrottleManager( SubresourceFilterProfileContext* profile_context, @@ -722,7 +722,7 @@ std::unique_ptr ContentSubresourceFilterThrottleManager:: MaybeCreateActivationStateComputingThrottle( content::NavigationHandle* navigation_handle) { - // Subresource filter roots: create unconditionally.(navigation_handle); + // Subresource filter roots: create unconditionally. if (IsInSubresourceFilterRoot(navigation_handle)) { auto throttle = ActivationStateComputingNavigationThrottle::CreateForRoot( navigation_handle); diff --git a/src/components/ukm/ukm_recorder_impl.cc b/src/components/ukm/ukm_recorder_impl.cc index d3d2788a9fc..c0e2c3e6455 100644 --- a/src/components/ukm/ukm_recorder_impl.cc +++ b/src/components/ukm/ukm_recorder_impl.cc @@ -108,16 +108,16 @@ void StoreEntryProto(const mojom::UkmEntry& in, Entry* out) { } } -void StoreWebFeaturesProto(SourceId source_id, - const BitSet& in, - HighLevelWebFeatures* out) { +void StoreWebDXFeaturesProto(SourceId source_id, + const BitSet& in, + HighLevelWebFeatures* out) { out->set_source_id(source_id); out->set_bit_vector(in.Serialize()); // The encoding version should be changed if the underlying enum is changed // (e.g. renumbered). - constexpr uint32_t kWebFeaturesEncodingVersion = 0; - out->set_encoding_version(kWebFeaturesEncodingVersion); + constexpr uint32_t kWebDXFeaturesEncodingVersion = 0; + out->set_encoding_version(kWebDXFeaturesEncodingVersion); } GURL SanitizeURL(const GURL& url) { @@ -174,14 +174,13 @@ bool HasUnknownMetrics(const builders::DecodeMap& decode_map, return false; } -std::string WebFeaturesToStringForDebug( - const std::set& features) { +std::string WebDXFeaturesToStringForDebug(const std::set& features) { std::string features_string; for (const auto& feature : features) { if (!features_string.empty()) { features_string += ","; } - features_string += base::NumberToString(static_cast(feature)); + features_string += base::NumberToString(feature); } return features_string; } @@ -236,9 +235,9 @@ void UkmRecorderImpl::SetSamplingForTesting(int rate) { event_sampling_rates_.clear(); } -void UkmRecorderImpl::SetWebFeaturesSamplingForTesting(int rate) { +void UkmRecorderImpl::SetWebDXFeaturesSamplingForTesting(int rate) { sampling_forced_for_testing_ = true; - web_features_sampling_ = rate; + webdx_features_sampling_ = rate; } bool UkmRecorderImpl::ShouldDropEntryForTesting(mojom::UkmEntry* entry) { @@ -324,8 +323,8 @@ void UkmRecorderImpl::PurgeDataBySourceIds( return source_ids.count(event->source_id); }); - std::map& web_features = recordings_.web_features; - std::erase_if(web_features, [&](const auto& features) { + std::map& webdx_features = recordings_.webdx_features; + std::erase_if(webdx_features, [&](const auto& features) { return source_ids.count(features.first); }); } @@ -398,9 +397,9 @@ void UkmRecorderImpl::StoreRecordingsInReport(Report* report) { source_ids_seen.insert(entry->source_id); } - for (const auto& [source_id, features_set] : recordings_.web_features) { + for (const auto& [source_id, features_set] : recordings_.webdx_features) { HighLevelWebFeatures* features = report->add_web_features(); - StoreWebFeaturesProto(source_id, features_set, features); + StoreWebDXFeaturesProto(source_id, features_set, features); source_ids_seen.insert(source_id); } @@ -472,8 +471,8 @@ void UkmRecorderImpl::StoreRecordingsInReport(Report* report) { num_serialized_sources); UMA_HISTOGRAM_COUNTS_100000("UKM.Entries.SerializedCount2", num_serialized_entries); - UMA_HISTOGRAM_COUNTS_1000("UKM.WebFeatureSets.SerializedCount", - recordings_.web_features.size()); + UMA_HISTOGRAM_COUNTS_1000("UKM.WebDXFeatureSets.SerializedCount", + recordings_.webdx_features.size()); UMA_HISTOGRAM_COUNTS_1000("UKM.Sources.UnsentSourcesCount", num_sources_unsent); UMA_HISTOGRAM_COUNTS_1000("UKM.Sources.UnmatchedSourcesCount", @@ -526,7 +525,7 @@ void UkmRecorderImpl::StoreRecordingsInReport(Report* report) { recordings_.source_counts.Reset(); recordings_.entries.clear(); - recordings_.web_features.clear(); + recordings_.webdx_features.clear(); recordings_.event_aggregations.clear(); report->set_is_continuous(recording_is_continuous_); @@ -1055,28 +1054,31 @@ void UkmRecorderImpl::AddEntry(mojom::UkmEntryPtr entry) { recordings_.entries.push_back(std::move(entry)); } -void UkmRecorderImpl::RecordWebFeatures( - SourceId source_id, - const std::set& features) { +void UkmRecorderImpl::RecordWebDXFeatures(SourceId source_id, + const std::set& features, + size_t max_feature_value) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + // Sanity check that we don't have an unreasonably large max feature + // value. This isn't expected to grow much past 2000 for a long time. + DCHECK_LT(max_feature_value, 3000u); if (!recording_enabled()) { - RecordDroppedWebFeaturesSet(DroppedDataReason::RECORDING_DISABLED); + RecordDroppedWebDXFeaturesSet(DroppedDataReason::RECORDING_DISABLED); return; } const auto required_consent = GetConsentType(GetSourceIdType(source_id)); if (!recording_enabled(required_consent)) { if (required_consent == UkmConsentType::MSBB) { - RecordDroppedWebFeaturesSet(DroppedDataReason::MSBB_CONSENT_DISABLED); + RecordDroppedWebDXFeaturesSet(DroppedDataReason::MSBB_CONSENT_DISABLED); } else if (required_consent == UkmConsentType::APPS) { - RecordDroppedWebFeaturesSet(DroppedDataReason::APPS_CONSENT_DISABLED); + RecordDroppedWebDXFeaturesSet(DroppedDataReason::APPS_CONSENT_DISABLED); } return; } if (!IsSamplingConfigured()) { - RecordDroppedWebFeaturesSet(DroppedDataReason::SAMPLING_UNCONFIGURED); + RecordDroppedWebDXFeaturesSet(DroppedDataReason::SAMPLING_UNCONFIGURED); return; } @@ -1087,22 +1089,26 @@ void UkmRecorderImpl::RecordWebFeatures( // Note: the `event_id` passed is 0. The actual number doesn't really matter, // what matters is that we either record all features or no features at all // for a given source. - if (!IsSampledIn(source_id, /*event_id=*/0, web_features_sampling_)) { - RecordDroppedWebFeaturesSet(DroppedDataReason::SAMPLED_OUT); + if (!IsSampledIn(source_id, /*event_id=*/0, webdx_features_sampling_)) { + RecordDroppedWebDXFeaturesSet(DroppedDataReason::SAMPLED_OUT); return; } - // Create a bitset for `source_id` if there is not already one. - auto result = recordings_.web_features.try_emplace( - source_id, /*set_size=*/static_cast(DummyWebFeatures::kMaxCount)); + // Create a bitset for `source_id` if there is not already one. The size of + // the bitset is max_feature_value + 1 since 0 is included. + auto result = recordings_.webdx_features.try_emplace( + source_id, + /*set_size=*/max_feature_value + 1); BitSet& features_set = result.first->second; + CHECK_EQ(features_set.set_size(), max_feature_value + 1); + for (const auto& feature : features) { - features_set.Add(static_cast(feature)); + features_set.Add(feature); } DVLOG(DebuggingLogLevel::Medium) - << "RecordWebFeatures: [source_id=" << source_id << " features={" - << WebFeaturesToStringForDebug(features) << "}]"; + << "RecordWebDXFeatures: [source_id=" << source_id << " features={" + << WebDXFeaturesToStringForDebug(features) << "}]"; } void UkmRecorderImpl::LoadExperimentSamplingInfo() { @@ -1150,13 +1156,13 @@ void UkmRecorderImpl::LoadExperimentSamplingParams( continue; } - // Special string value used in the experiment configs for web features + // Special string value used in the experiment configs for webdx features // sampling. - if (event_name == "_web_features_sampling") { + if (event_name == "_webdx_features_sampling") { // Sampling rates must be non-negative integers. if (base::StringToInt(event_param, &sampling_rate) && sampling_rate >= 0) { - web_features_sampling_ = sampling_rate; + webdx_features_sampling_ = sampling_rate; } continue; } diff --git a/src/content/browser/BUILD.gn b/src/content/browser/BUILD.gn index d28c5fd98eb..aee307fa39e 100644 --- a/src/content/browser/BUILD.gn +++ b/src/content/browser/BUILD.gn @@ -459,11 +459,13 @@ source_set("browser") { "attribution_reporting/attribution_report_network_sender.cc", "attribution_reporting/attribution_report_network_sender.h", "attribution_reporting/attribution_report_sender.h", - "attribution_reporting/attribution_storage.h", - "attribution_reporting/attribution_storage_delegate.cc", - "attribution_reporting/attribution_storage_delegate.h", - "attribution_reporting/attribution_storage_delegate_impl.cc", - "attribution_reporting/attribution_storage_delegate_impl.h", + "attribution_reporting/attribution_resolver.h", + "attribution_reporting/attribution_resolver_delegate.cc", + "attribution_reporting/attribution_resolver_delegate.h", + "attribution_reporting/attribution_resolver_delegate_impl.cc", + "attribution_reporting/attribution_resolver_delegate_impl.h", + "attribution_reporting/attribution_resolver_impl.cc", + "attribution_reporting/attribution_resolver_impl.h", "attribution_reporting/attribution_storage_sql.cc", "attribution_reporting/attribution_storage_sql.h", "attribution_reporting/attribution_storage_sql_migrations.cc", @@ -1904,8 +1906,6 @@ source_set("browser") { "renderer_host/transient_allow_popup.h", "renderer_host/transient_focus_source_user_activation.cc", "renderer_host/transient_focus_source_user_activation.h", - "renderer_host/ui_events_helper.cc", - "renderer_host/ui_events_helper.h", "renderer_host/view_transition_commit_deferring_condition.cc", "renderer_host/view_transition_commit_deferring_condition.h", "renderer_host/view_transition_opt_in_state.cc", @@ -2061,6 +2061,8 @@ source_set("browser") { "service_worker/url_loader_client_checker.h", "shared_storage/shared_storage_budget_charger.cc", "shared_storage/shared_storage_budget_charger.h", + "shared_storage/shared_storage_code_cache_host_proxy.cc", + "shared_storage/shared_storage_code_cache_host_proxy.h", "shared_storage/shared_storage_document_service_impl.cc", "shared_storage/shared_storage_document_service_impl.h", "shared_storage/shared_storage_event_params.cc", @@ -2634,6 +2636,7 @@ source_set("browser") { "AppKit.framework", "AVFAudio.framework", "Carbon.framework", + "Cocoa.framework", "CoreGraphics.framework", "QuartzCore.framework", "IOSurface.framework", @@ -2811,10 +2814,6 @@ source_set("browser") { "media/dcomp_surface_registry_broker.h", "media/key_system_support_win.cc", "media/key_system_support_win.h", - "media/web_app_system_media_controls.cc", - "media/web_app_system_media_controls.h", - "media/web_app_system_media_controls_manager.cc", - "media/web_app_system_media_controls_manager.h", "memory/swap_metrics_driver_impl_win.cc", "network/network_service_process_tracker_win.cc", "network/network_service_process_tracker_win.h", @@ -2856,6 +2855,15 @@ source_set("browser") { ] } + if (is_win || is_mac) { + sources += [ + "media/web_app_system_media_controls.cc", + "media/web_app_system_media_controls.h", + "media/web_app_system_media_controls_manager.cc", + "media/web_app_system_media_controls_manager.h", + ] + } + if (is_android || is_linux) { deps += [ "//content/browser/system_dns_resolution" ] } @@ -3281,12 +3289,6 @@ source_set("browser") { "service_worker/service_worker_usb_delegate_observer.h", # Most speech code is non-Android. - "speech/endpointer/endpointer.cc", - "speech/endpointer/endpointer.h", - "speech/endpointer/energy_endpointer.cc", - "speech/endpointer/energy_endpointer.h", - "speech/endpointer/energy_endpointer_params.cc", - "speech/endpointer/energy_endpointer_params.h", "speech/network_speech_recognition_engine_impl.cc", "speech/network_speech_recognition_engine_impl.h", "speech/speech_recognition_engine.cc", diff --git a/src/content/browser/renderer_host/clipboard_host_impl.cc b/src/content/browser/renderer_host/clipboard_host_impl.cc index 229226c5324..9bc96ccabcc 100644 --- a/src/content/browser/renderer_host/clipboard_host_impl.cc +++ b/src/content/browser/renderer_host/clipboard_host_impl.cc @@ -840,9 +840,8 @@ void ClipboardHostImpl::ReadUnsanitizedCustomFormat( // `kMaxFormatSize` includes the null terminator as well so we check if // the `format` size is strictly less than `kMaxFormatSize` or not. - if (format.length() >= blink::mojom::ClipboardHost::kMaxFormatSize) { + if (format.length() >= blink::mojom::ClipboardHost::kMaxFormatSize) return; - } // Extract the custom format names and then query the web custom format // corresponding to the MIME type. @@ -852,20 +851,17 @@ void ClipboardHostImpl::ReadUnsanitizedCustomFormat( ui::Clipboard::GetForCurrentThread()->ExtractCustomPlatformNames( ui::ClipboardBuffer::kCopyPaste, data_endpoint.get()); std::string web_custom_format_string; - if (custom_format_names.find(format_name) != custom_format_names.end()) { + if (custom_format_names.find(format_name) != custom_format_names.end()) web_custom_format_string = custom_format_names[format_name]; - } - if (web_custom_format_string.empty()) { + if (web_custom_format_string.empty()) return; - } std::string result; ui::Clipboard::GetForCurrentThread()->ReadData( ui::ClipboardFormatType::GetType(web_custom_format_string), data_endpoint.get(), &result); - if (result.size() >= blink::mojom::ClipboardHost::kMaxDataSize) { + if (result.size() >= blink::mojom::ClipboardHost::kMaxDataSize) return; - } base::span span = base::as_bytes(base::make_span(result)); mojo_base::BigBuffer buffer = mojo_base::BigBuffer(span); std::move(callback).Run(std::move(buffer)); @@ -875,12 +871,10 @@ void ClipboardHostImpl::WriteUnsanitizedCustomFormat( const std::u16string& format, mojo_base::BigBuffer data) { // `kMaxFormatSize` & `kMaxDataSize` includes the null terminator. - if (format.length() >= blink::mojom::ClipboardHost::kMaxFormatSize) { + if (format.length() >= blink::mojom::ClipboardHost::kMaxFormatSize) return; - } - if (data.size() >= blink::mojom::ClipboardHost::kMaxDataSize) { + if (data.size() >= blink::mojom::ClipboardHost::kMaxDataSize) return; - } // The `format` is mapped to user agent defined web custom format before // writing to the clipboard. This happens in diff --git a/src/content/browser/renderer_host/render_widget_host_view_android.cc b/src/content/browser/renderer_host/render_widget_host_view_android.cc index 462b2cbd3e6..2579824df85 100644 --- a/src/content/browser/renderer_host/render_widget_host_view_android.cc +++ b/src/content/browser/renderer_host/render_widget_host_view_android.cc @@ -54,11 +54,11 @@ #include "content/browser/renderer_host/render_view_host_impl.h" #include "content/browser/renderer_host/render_widget_host_impl.h" #include "content/browser/renderer_host/render_widget_host_input_event_router.h" -#include "content/browser/renderer_host/ui_events_helper.h" #include "content/browser/renderer_host/visible_time_request_trigger.h" #include "content/browser/screen_orientation/screen_orientation_provider.h" #include "content/common/content_switches_internal.h" #include "content/common/features.h" +#include "content/common/input/events_helper.h" #include "content/common/input/input_router.h" #include "content/common/input/web_input_event_builders_android.h" #include "content/public/android/content_jni_headers/RenderWidgetHostViewImpl_jni.h" diff --git a/src/content/browser/web_contents/web_contents_android.cc b/src/content/browser/web_contents/web_contents_android.cc index 5040de872df..ffed858738e 100644 --- a/src/content/browser/web_contents/web_contents_android.cc +++ b/src/content/browser/web_contents/web_contents_android.cc @@ -31,6 +31,7 @@ #include "content/browser/web_contents/web_contents_view_android.h" #include "content/common/frame.mojom.h" #include "content/public/android/content_jni_headers/WebContentsImpl_jni.h" +#include "content/public/browser/back_forward_transition_animation_manager.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/message_port_provider.h" @@ -165,9 +166,8 @@ void AddTreeLevelDataToViewStructure( const JavaRef& view_structure_builder, const ui::AXTreeUpdate& ax_tree_update) { const auto& metadata_strings = ax_tree_update.tree_data.metadata; - if (metadata_strings.empty()) { + if (metadata_strings.empty()) return; - } ScopedJavaLocalRef j_metadata_strings = ToJavaArrayOfStrings(env, metadata_strings); @@ -181,17 +181,15 @@ void AddTreeLevelDataToViewStructure( WebContents* WebContents::FromJavaWebContents( const JavaRef& jweb_contents_android) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - if (jweb_contents_android.is_null()) { + if (jweb_contents_android.is_null()) return NULL; - } WebContentsAndroid* web_contents_android = reinterpret_cast( Java_WebContentsImpl_getNativePointer(AttachCurrentThread(), jweb_contents_android)); - if (!web_contents_android) { + if (!web_contents_android) return NULL; - } return web_contents_android->web_contents(); } @@ -201,14 +199,12 @@ static void JNI_WebContentsImpl_DestroyWebContents( jlong jweb_contents_android_ptr) { WebContentsAndroid* web_contents_android = reinterpret_cast(jweb_contents_android_ptr); - if (!web_contents_android) { + if (!web_contents_android) return; - } WebContents* web_contents = web_contents_android->web_contents(); - if (!web_contents) { + if (!web_contents) return; - } delete web_contents; } @@ -220,9 +216,8 @@ ScopedJavaLocalRef JNI_WebContentsImpl_FromNativePtr( WebContentsAndroid* web_contents_android = reinterpret_cast(web_contents_ptr); - if (!web_contents_android) { + if (!web_contents_android) return ScopedJavaLocalRef(); - } // Check to make sure this object hasn't been destroyed. if (g_allocated_web_contents_androids.Get().find(web_contents_android) == @@ -246,15 +241,15 @@ WebContentsAndroid::WebContentsAndroid(WebContentsImpl* web_contents) WebContentsAndroid::~WebContentsAndroid() { DCHECK(g_allocated_web_contents_androids.Get().find(this) != - g_allocated_web_contents_androids.Get().end()); + g_allocated_web_contents_androids.Get().end()); g_allocated_web_contents_androids.Get().erase(this); - for (auto& observer : destruction_observers_) { + for (auto& observer : destruction_observers_) observer.WebContentsAndroidDestroyed(this); - } Java_WebContentsImpl_clearNativePtr(AttachCurrentThread(), obj_); } -base::android::ScopedJavaLocalRef WebContentsAndroid::GetJavaObject() { +base::android::ScopedJavaLocalRef +WebContentsAndroid::GetJavaObject() { return base::android::ScopedJavaLocalRef(obj_); } @@ -284,9 +279,8 @@ void WebContentsAndroid::ReportDanglingPtrToBrowserContext( base::android::ScopedJavaLocalRef WebContentsAndroid::GetTopLevelNativeWindow(JNIEnv* env) { ui::WindowAndroid* window_android = web_contents_->GetTopLevelNativeWindow(); - if (!window_android) { + if (!window_android) return nullptr; - } return window_android->GetJavaObject(); } @@ -296,17 +290,14 @@ void WebContentsAndroid::SetTopLevelNativeWindow( ui::WindowAndroid* window = ui::WindowAndroid::FromJavaWindowAndroid(jwindow_android); auto* old_window = web_contents_->GetTopLevelNativeWindow(); - if (window == old_window) { + if (window == old_window) return; - } auto* view = web_contents_->GetNativeView(); - if (old_window) { + if (old_window) view->RemoveFromParent(); - } - if (window) { + if (window) window->AddChild(view); - } } void WebContentsAndroid::SetViewAndroidDelegate( @@ -324,9 +315,8 @@ ScopedJavaLocalRef WebContentsAndroid::GetMainFrame( ScopedJavaLocalRef WebContentsAndroid::GetFocusedFrame( JNIEnv* env) const { RenderFrameHostImpl* rfh = web_contents_->GetFocusedFrame(); - if (!rfh) { + if (!rfh) return nullptr; - } return rfh->GetJavaRenderFrameHost(); } @@ -340,9 +330,8 @@ ScopedJavaLocalRef WebContentsAndroid::GetRenderFrameHostFromId( jint render_frame_id) const { RenderFrameHost* rfh = RenderFrameHost::FromID(render_process_id, render_frame_id); - if (!rfh) { + if (!rfh) return nullptr; - } return rfh->GetJavaRenderFrameHost(); } @@ -429,9 +418,8 @@ void WebContentsAndroid::CollapseSelection(JNIEnv* env) { ScopedJavaLocalRef WebContentsAndroid::GetRenderWidgetHostView( JNIEnv* env) { RenderWidgetHostViewAndroid* rwhva = GetRenderWidgetHostViewAndroid(); - if (!rwhva) { + if (!rwhva) return nullptr; - } return rwhva->GetJavaObject(); } @@ -462,7 +450,7 @@ void WebContentsAndroid::UpdateWebContentsVisibility(JNIEnv* env, } RenderWidgetHostViewAndroid* -WebContentsAndroid::GetRenderWidgetHostViewAndroid() { + WebContentsAndroid::GetRenderWidgetHostViewAndroid() { RenderWidgetHostView* rwhv = NULL; rwhv = web_contents_->GetRenderWidgetHostView(); return static_cast(rwhv); @@ -526,9 +514,8 @@ void WebContentsAndroid::ExitFullscreen(JNIEnv* env) { void WebContentsAndroid::ScrollFocusedEditableNodeIntoView(JNIEnv* env) { auto* input_handler = web_contents_->GetFocusedFrameWidgetInputHandler(); - if (!input_handler) { + if (!input_handler) return; - } bool should_overlay_content = web_contents_->GetPrimaryPage().virtual_keyboard_mode() == ui::mojom::VirtualKeyboardMode::kOverlaysContent; @@ -537,9 +524,8 @@ void WebContentsAndroid::ScrollFocusedEditableNodeIntoView(JNIEnv* env) { // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/frame/web_local_frame_impl.cc;l=3047;drc=aeadb03c8553c39e88d5d11d10f706d42f06a1d7. // By avoiding this call in should_overlay_content, we never notify autofill // of changed focus so we don't e.g. show the keyboard accessory. - if (!should_overlay_content) { + if (!should_overlay_content) input_handler->ScrollFocusedEditableNodeIntoView(); - } } void WebContentsAndroid::SelectAroundCaretAck( @@ -562,9 +548,8 @@ void WebContentsAndroid::SelectAroundCaret(JNIEnv* env, jint endOffset, jint surroundingTextLength) { auto* input_handler = web_contents_->GetFocusedFrameWidgetInputHandler(); - if (!input_handler) { + if (!input_handler) return; - } input_handler->SelectAroundCaret( static_cast(granularity), should_show_handle, should_show_context_menu, @@ -600,9 +585,8 @@ void WebContentsAndroid::EvaluateJavaScript( RenderViewHost* rvh = web_contents_->GetRenderViewHost(); DCHECK(rvh); - if (!InitializeRenderFrameForJavaScript()) { + if (!InitializeRenderFrameForJavaScript()) return; - } if (!callback) { // No callback requested. @@ -628,9 +612,8 @@ void WebContentsAndroid::EvaluateJavaScriptForTests( RenderViewHost* rvh = web_contents_->GetRenderViewHost(); DCHECK(rvh); - if (!InitializeRenderFrameForJavaScript()) { + if (!InitializeRenderFrameForJavaScript()) return; - } if (!callback) { // No callback requested. @@ -673,8 +656,8 @@ void WebContentsAndroid::PostMessageToMainFrame( } jboolean WebContentsAndroid::HasAccessedInitialDocument(JNIEnv* env) { - return static_cast(web_contents_) - ->HasAccessedInitialDocument(); + return static_cast(web_contents_)-> + HasAccessedInitialDocument(); } jboolean WebContentsAndroid::HasViewTransitionOptIn(JNIEnv* env) { @@ -814,9 +797,8 @@ bool WebContentsAndroid::IsPictureInPictureAllowedForFullscreenVideo( base::android::ScopedJavaLocalRef WebContentsAndroid::GetFullscreenVideoSize(JNIEnv* env) { - if (!web_contents_->GetFullscreenVideoSize()) { + if (!web_contents_->GetFullscreenVideoSize()) return ScopedJavaLocalRef(); // Return null. - } gfx::Size size = web_contents_->GetFullscreenVideoSize().value(); return Java_WebContentsImpl_createSize(env, size.width(), size.height()); @@ -851,7 +833,8 @@ void WebContentsAndroid::OnFinishDownloadImage( JNIEnv* env = base::android::AttachCurrentThread(); ScopedJavaLocalRef jbitmaps = Java_WebContentsImpl_createBitmapList(env); - ScopedJavaLocalRef jsizes = Java_WebContentsImpl_createSizeList(env); + ScopedJavaLocalRef jsizes = + Java_WebContentsImpl_createSizeList(env); ScopedJavaLocalRef jurl = url::GURLAndroid::FromNativeGURL(env, url); for (const SkBitmap& bitmap : bitmaps) { @@ -882,9 +865,8 @@ void WebContentsAndroid::SendOrientationChangeEvent(JNIEnv* env, static_cast(web_contents_->GetView()); view->set_device_orientation(orientation); RenderWidgetHostViewAndroid* rwhva = GetRenderWidgetHostViewAndroid(); - if (rwhva) { + if (rwhva) rwhva->UpdateScreenInfo(); - } web_contents_->OnScreenOrientationChange(); } @@ -930,4 +912,13 @@ bool WebContentsAndroid::NeedToFireBeforeUnloadOrUnloadEvents(JNIEnv* env) { return web_contents_->NeedToFireBeforeUnloadOrUnloadEvents(); } +jint WebContentsAndroid::GetCurrentBackForwardTransitionStage(JNIEnv* env) { + auto stage = BackForwardTransitionAnimationManager::AnimationStage::kNone; + if (auto* animation = + web_contents_->GetBackForwardTransitionAnimationManager()) { + stage = animation->GetCurrentAnimationStage(); + } + return static_cast(stage); +} + } // namespace content diff --git a/src/content/browser/web_contents/web_contents_impl.cc b/src/content/browser/web_contents/web_contents_impl.cc index 906ba0d14aa..83ad932929b 100644 --- a/src/content/browser/web_contents/web_contents_impl.cc +++ b/src/content/browser/web_contents/web_contents_impl.cc @@ -50,7 +50,6 @@ #include "base/trace_event/trace_event.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" -#include "content/browser/copy_paste_blocker/copy_paste_blocked_snackbar_bridge.h" #include "components/attribution_reporting/features.h" #include "components/download/public/common/download_stats.h" #include "components/prefs/pref_service.h" @@ -70,6 +69,7 @@ #include "content/browser/child_process_security_policy_impl.h" #include "content/browser/closewatcher/close_listener_manager.h" #include "content/browser/compositor/surface_utils.h" +#include "content/browser/copy_paste_blocker/copy_paste_blocked_snackbar_bridge.h" #include "content/browser/device_posture/device_posture_provider_impl.h" #include "content/browser/devtools/protocol/page_handler.h" #include "content/browser/devtools/render_frame_devtools_agent_host.h" @@ -244,6 +244,11 @@ #include "content/browser/starscan_load_observer.h" #endif +#if !BUILDFLAG(IS_ANDROID) +#include "content/public/browser/document_picture_in_picture_window_controller.h" +#include "content/public/browser/picture_in_picture_window_controller.h" +#endif // !BUILDFLAG(IS_ANDROID) + namespace content { namespace { @@ -3562,6 +3567,10 @@ void WebContentsImpl::Init(const WebContents::CreateParams& params, if (params.picture_in_picture_options.has_value()) { picture_in_picture_options_ = params.picture_in_picture_options; + if (GetOpener()) { + picture_in_picture_opener_ = + FromRenderFrameHostImpl(GetOpener())->GetWeakPtr(); + } } // This is set before initializing the render manager since @@ -3844,23 +3853,11 @@ void WebContentsImpl::RenderWidgetWasResized( KeyboardEventProcessingResult WebContentsImpl::PreHandleKeyboardEvent( const NativeWebKeyboardEvent& event) { - LOG(INFO) << "[RamPrasad][WebContents] PreHandleKeyboardEvent"; - - LOG(INFO) << "[RamPrasad][WebContents] PreHandleKeyboardEvent Details:" - << " Type=" << static_cast(event.GetType()) - << " Modifiers=" << event.GetModifiers() - << " KeyCode=" << event.windows_key_code - << " IsSystemKey=" << event.is_system_key << " Text=" << event.text; - - LOG(INFO) << "[RamPrasad][WebContents] ShouldBlockCopyPaste: " - << ShouldBlockCopyPaste("paste"); // Check for Ctrl+V if ((event.GetModifiers() & blink::WebInputEvent::kControlKey) && event.windows_key_code == 'V') { - LOG(INFO) << "[RamPrasad][WebContents] Ctrl+V event"; if (ShouldBlockCopyPaste("paste")) { - LOG(INFO) << "[RamPrasad][WebContents] Blocking paste event"; ShowCopyPasteBlockedSnackbar("Paste"); return KeyboardEventProcessingResult::HANDLED; } @@ -3869,9 +3866,7 @@ KeyboardEventProcessingResult WebContentsImpl::PreHandleKeyboardEvent( // Check for Command+V if ((event.GetModifiers() & blink::WebInputEvent::kMetaKey) && event.windows_key_code == 'V') { - LOG(INFO) << "[RamPrasad][WebContents] Command+V event"; if (ShouldBlockCopyPaste("paste")) { - LOG(INFO) << "[RamPrasad][WebContents] Blocking paste event"; ShowCopyPasteBlockedSnackbar("Paste"); return KeyboardEventProcessingResult::HANDLED; } @@ -3885,9 +3880,7 @@ KeyboardEventProcessingResult WebContentsImpl::PreHandleKeyboardEvent( // Check for Ctrl+C if (event.GetModifiers() & blink::WebInputEvent::kControlKey && event.windows_key_code == 'C') { - LOG(INFO) << "[RamPrasad][WebContents] Ctrl+C event"; if (ShouldBlockCopyPaste("copy")) { - LOG(INFO) << "[RamPrasad][WebContents] Blocking copy event"; ShowCopyPasteBlockedSnackbar("Copy"); return KeyboardEventProcessingResult::HANDLED; } @@ -3896,9 +3889,7 @@ KeyboardEventProcessingResult WebContentsImpl::PreHandleKeyboardEvent( // Check for Command+C if (event.GetModifiers() & blink::WebInputEvent::kMetaKey && event.windows_key_code == 'C') { - LOG(INFO) << "[RamPrasad][WebContents] Command+C event"; if (ShouldBlockCopyPaste("copy")) { - LOG(INFO) << "[RamPrasad][WebContents] Blocking copy event"; ShowCopyPasteBlockedSnackbar("Copy"); return KeyboardEventProcessingResult::HANDLED; } @@ -5260,12 +5251,24 @@ void WebContentsImpl::AXTreeIDForMainFrameHasChanged() { &WebContentsObserver::AXTreeIDForMainFrameHasChanged); } -void WebContentsImpl::AccessibilityEventReceived( - const ui::AXUpdatesAndEvents& details) { +void WebContentsImpl::ProcessAccessibilityUpdatesAndEvents( + ui::AXUpdatesAndEvents& details) { OPTIONAL_TRACE_EVENT0("content", "WebContentsImpl::AccessibilityEventReceived"); + + // First, supply the data to consumers that won't change it. observers_.NotifyObservers(&WebContentsObserver::AccessibilityEventReceived, details); + + // Next, supply the data to consumers that may change it or who need to avoid + // extra copying. Note that this also includes those who will pass to mojo + // pipes not taking const. + // TODO(accessibility): when we add multiple consumers, we will need some kind + // of intermediate class to ensure each consumer gets an unmutated copy of the + // data, but also minimize copying. + if (delegate_) { + delegate_->ProcessAccessibilityUpdatesAndEvents(details); + } } void WebContentsImpl::AccessibilityLocationChangesReceived( @@ -8316,7 +8319,6 @@ void WebContentsImpl::RunFileChooser( listener->FileSelectionCanceled(); }; - // AADI UPLOAD BLOCKING: Check if upload should be blocked std::string domain = GetLastCommittedURL().host(); bool should_block = false; @@ -8327,10 +8329,7 @@ void WebContentsImpl::RunFileChooser( } if (should_block) { - // Show native snackbar notification ShowUploadBlockedSnackbar("upload"); - - // Block the file chooser by not proceeding further return; } @@ -9283,6 +9282,34 @@ void WebContentsImpl::SetFocusedFrame(FrameTreeNode* node, CloseListenerManager::DidChangeFocusedFrame(this); } +FrameTree* WebContentsImpl::GetOwnedPictureInPictureFrameTree() { +#if !BUILDFLAG(IS_ANDROID) + if (has_picture_in_picture_document_) { + WebContents* picture_in_picture_web_contents = + PictureInPictureWindowController:: + GetOrCreateDocumentPictureInPictureController(this) + ->GetChildWebContents(); + if (picture_in_picture_web_contents) { + return &(static_cast(picture_in_picture_web_contents) + ->GetPrimaryFrameTree()); + } + } +#endif // !BUILDFLAG(IS_ANDROID) + + return nullptr; +} + +FrameTree* WebContentsImpl::GetPictureInPictureOpenerFrameTree() { +#if !BUILDFLAG(IS_ANDROID) + if (picture_in_picture_opener_) { + return &(static_cast(picture_in_picture_opener_.get()) + ->GetPrimaryFrameTree()); + } +#endif // !BUILDFLAG(IS_ANDROID) + + return nullptr; +} + void WebContentsImpl::DidCallFocus() { OPTIONAL_TRACE_EVENT0("content", "WebContentsImpl::DidCallFocus"); // Any explicit focusing of another window while this WebContents is in @@ -10514,7 +10541,6 @@ void WebContentsImpl::IsClipboardPasteAllowedByPolicy( const ClipboardMetadata& metadata, ClipboardPasteData clipboard_paste_data, IsClipboardPasteAllowedCallback callback) { - LOG(INFO) << "[RamPrasad][WebContents] IsClipboardPasteAllowedByPolicy"; if (ShouldBlockCopyPaste("paste")) { LOG(INFO) << "[RamPrasad][WebContents] Paste blocked by policy"; return; diff --git a/src/content/browser/web_contents/web_contents_impl.h b/src/content/browser/web_contents/web_contents_impl.h index 54d1b043ce3..8f529457730 100644 --- a/src/content/browser/web_contents/web_contents_impl.h +++ b/src/content/browser/web_contents/web_contents_impl.h @@ -688,8 +688,8 @@ class CONTENT_EXPORT WebContentsImpl : public WebContents, // Broadcasts the mode change to all frames. void ResetAccessibility() override; void AXTreeIDForMainFrameHasChanged() override; - void AccessibilityEventReceived( - const ui::AXUpdatesAndEvents& details) override; + void ProcessAccessibilityUpdatesAndEvents( + ui::AXUpdatesAndEvents& details) override; void AccessibilityLocationChangesReceived( const std::vector& details) override; ui::AXNode* GetAccessibilityRootNode() override; @@ -1146,6 +1146,8 @@ class CONTENT_EXPORT WebContentsImpl : public WebContents, RenderFrameHostImpl* GetProspectiveOuterDocument() override; FrameTree* LoadingTree() override; void SetFocusedFrame(FrameTreeNode* node, SiteInstanceGroup* source) override; + FrameTree* GetOwnedPictureInPictureFrameTree() override; + FrameTree* GetPictureInPictureOpenerFrameTree() override; // NavigationControllerDelegate ---------------------------------------------- @@ -2485,6 +2487,11 @@ class CONTENT_EXPORT WebContentsImpl : public WebContents, std::optional picture_in_picture_options_; + // Only set if this WebContents represents a document picture-in-picture + // window. This points to the WebContents that originally opened this + // WebContents. + base::WeakPtr picture_in_picture_opener_; + VisibleTimeRequestTrigger visible_time_request_trigger_; // Counts the number of open scopes that disallow custom cursors in this web diff --git a/src/content/public/android/BUILD.gn b/src/content/public/android/BUILD.gn index 79895a358cf..e80037d186f 100644 --- a/src/content/public/android/BUILD.gn +++ b/src/content/public/android/BUILD.gn @@ -74,20 +74,26 @@ java_group("content_java") { generate_jni("content_main_dex_jni") { sources = [ - "java/src/org/chromium/content/app/ContentChildProcessServiceDelegate.java", - "java/src/org/chromium/content/app/ContentMain.java", "java/src/org/chromium/content/browser/BrowserStartupControllerImpl.java", "java/src/org/chromium/content/browser/TracingControllerAndroidImpl.java", "java/src/org/chromium/content/common/SurfaceWrapper.java", "java/src/org/chromium/content_public/common/ResourceRequestBody.java", ] } +generate_jni("content_app_jni") { + sources = [ + "java/src/org/chromium/content/app/ContentChildProcessServiceDelegate.java", + "java/src/org/chromium/content/app/ContentMain.java", + ] +} # The minimal //content code needed for the base module. This includes all code # needed in child processes. android_library("content_main_dex_java") { deps = [ + ":content_app_jni_java", ":content_java_resources", + ":content_main_dex_jni_java", "//base:base_java", "//base:process_launcher_java", "//base/version_info/android:version_constants_java", @@ -133,7 +139,6 @@ android_library("content_main_dex_java") { resources_package = "org.chromium.content" srcjar_deps = [ ":common_aidl", - ":content_main_dex_jni", ":content_public_android_java_enums_srcjar", ":content_public_android_java_switches_srcjar", ":generate_sandboxed_service_srcjar", @@ -414,7 +419,6 @@ android_library("content_full_java") { # TODO(crbug.com/40279841) simplify these build targets once GMSCore publishes identity-credentials. android_library("identity_credentials_java") { sources = [ - "java/src/org/chromium/content/browser/webid/IdentityCredentialsDelegate.java", "java/src/org/chromium/content/browser/webid/IdentityCredentialsDelegateImpl.java", "java/src/org/chromium/content_public/browser/webid/IdentityCredentialsDelegate.java", ] @@ -444,6 +448,7 @@ java_cpp_enum("content_public_android_java_enums_srcjar") { "//content/public/browser/android/child_process_importance.h", "//content/public/browser/android/message_payload_type.h", "//content/public/browser/android/motion_event_action.h", + "//content/public/browser/back_forward_transition_animation_manager.h", "//content/public/browser/bluetooth_scanning_prompt.h", "//content/public/browser/browsing_data_remover.h", "//content/public/browser/invalidate_type.h", diff --git a/src/content/public/browser/navigation_throttle.cc b/src/content/public/browser/navigation_throttle.cc index f270d427a2b..cf3f26d9b39 100644 --- a/src/content/public/browser/navigation_throttle.cc +++ b/src/content/public/browser/navigation_throttle.cc @@ -5,15 +5,15 @@ #include "content/public/browser/navigation_throttle.h" #include "base/functional/bind.h" +#include "base/logging.h" +#include "base/strings/string_util.h" #include "base/task/single_thread_task_runner.h" #include "content/browser/renderer_host/navigation_request.h" +#include "content/public/browser/content_browser_client.h" #include "content/public/browser/web_contents.h" +#include "content/public/common/content_client.h" #include "net/base/net_errors.h" #include "ui/base/page_transition_types.h" -#include "base/logging.h" -#include "base/strings/string_util.h" -#include "content/public/browser/content_browser_client.h" -#include "content/public/common/content_client.h" #include "url/gurl.h" namespace content { diff --git a/src/extensions/common/extension_features.cc b/src/extensions/common/extension_features.cc index 0616d6e7eca..994a7635fb2 100644 --- a/src/extensions/common/extension_features.cc +++ b/src/extensions/common/extension_features.cc @@ -163,4 +163,8 @@ BASE_FEATURE(kUseItemSnippetsAPI, "UseItemSnippetsAPI", base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kUseNewServiceWorkerTaskQueue, + "UseNewServiceWorkerTaskQueue", + base::FEATURE_DISABLED_BY_DEFAULT); + } // namespace extensions_features diff --git a/src/media/BUILD.gn b/src/media/BUILD.gn index d6b8795d2f1..1a782317b77 100644 --- a/src/media/BUILD.gn +++ b/src/media/BUILD.gn @@ -85,7 +85,8 @@ if (proprietary_codecs && media_use_ffmpeg) { # Common configuration for targets in the media directory; these must not be # exported since things like USE_NEON and USE_CRAS have different meanings # elsewhere in the code base. -config("media_config") { defines = [] +config("media_config") { + defines = [] if (current_cpu == "arm64" || (current_cpu == "arm" && arm_use_neon)) { defines += [ "USE_NEON" ] } diff --git a/src/third_party/android_deps/BUILD.gn b/src/third_party/android_deps/BUILD.gn index e1fae7ae644..78d2a097c48 100644 --- a/src/third_party/android_deps/BUILD.gn +++ b/src/third_party/android_deps/BUILD.gn @@ -2777,7 +2777,7 @@ if (!limit_android_deps) { # Branch SDK - Main library android_aar_prebuilt("io_branch_sdk_android_library_java") { - aar_path = "libs/io_branch_sdk_android_library/library-5.16.2.aar" + aar_path = "libs/io_branch_sdk_android_library/library-5.20.0.aar" info_path = "libs/io_branch_sdk_android_library/io_branch_sdk_android_library.info" enable_bytecode_checks = false diff --git a/src/third_party/android_deps/libs/io_branch_sdk_android_library/README.chromium b/src/third_party/android_deps/libs/io_branch_sdk_android_library/README.chromium index 0e10fac9244..0ded17801e1 100644 --- a/src/third_party/android_deps/libs/io_branch_sdk_android_library/README.chromium +++ b/src/third_party/android_deps/libs/io_branch_sdk_android_library/README.chromium @@ -1,7 +1,7 @@ Name: Branch Android SDK Short Name: branch-android-sdk URL: https://github.com/BranchMetrics/android-branch-deep-linking-attribution -Version: 5.16.2 +Version: 5.20.0 License: MIT License File: LICENSE Security Critical: yes diff --git a/src/third_party/android_deps/libs/io_branch_sdk_android_library/library-5.16.2.aar b/src/third_party/android_deps/libs/io_branch_sdk_android_library/library-5.16.2.aar deleted file mode 100644 index 25729a494da..00000000000 Binary files a/src/third_party/android_deps/libs/io_branch_sdk_android_library/library-5.16.2.aar and /dev/null differ diff --git a/src/third_party/android_deps/libs/io_branch_sdk_android_library/library-5.20.0.aar b/src/third_party/android_deps/libs/io_branch_sdk_android_library/library-5.20.0.aar new file mode 100644 index 00000000000..3395dac6218 Binary files /dev/null and b/src/third_party/android_deps/libs/io_branch_sdk_android_library/library-5.20.0.aar differ diff --git a/src/third_party/blink/common/features.cc b/src/third_party/blink/common/features.cc index 2a28dc60f2e..37e8c66b9ad 100644 --- a/src/third_party/blink/common/features.cc +++ b/src/third_party/blink/common/features.cc @@ -1258,10 +1258,6 @@ const base::FeatureParam &kLCPCriticalPathPredictor, "lcpp_image_load_priority", LcppResourceLoadPriority::kVeryHigh, &lcpp_resource_load_priorities}; -const base::FeatureParam - kLCPCriticalPathPredictorEnableElementLocatorPerformanceImprovements{ - &kLCPCriticalPathPredictor, "lcpp_enable_perf_improvements", true}; - const base::FeatureParam kLCPCriticalPathPredictorImageLoadPriorityEnabledForHTMLImageElement{ &kLCPCriticalPathPredictor, @@ -1342,6 +1338,8 @@ const base::FeatureParam::Option {LcppDeferUnusedPreloadTiming::kPostTask, "post_task"}, {LcppDeferUnusedPreloadTiming::kLcpTimingPredictor, "lcp_timing_predictor"}, + {LcppDeferUnusedPreloadTiming::kLcpTimingPredictorWithPostTask, + "lcp_timing_predictor_with_post_task"}, }; const base::FeatureParam @@ -1379,6 +1377,10 @@ BASE_FEATURE(kLCPPLazyLoadImagePreload, "LCPPLazyLoadImagePreload", base::FEATURE_DISABLED_BY_DEFAULT); +// If true, do not make a preload request. +const base::FeatureParam kLCPPLazyLoadImagePreloadDryRun{ + &kLCPPLazyLoadImagePreload, "lcpp_lazy_load_image_preload_dry_run", false}; + const base::FeatureParam< LcppPreloadLazyLoadImageType>::Option lcpp_preload_lazy_load_image[] = { {LcppPreloadLazyLoadImageType::kNone, "none"}, @@ -1734,6 +1736,13 @@ BASE_FEATURE(kPlzDedicatedWorker, "PlzDedicatedWorker", base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kDedicatedWorkerAblationStudyEnabled, + "DedicatedWorkerAblationStudyEnabled", + base::FEATURE_DISABLED_BY_DEFAULT); + +const base::FeatureParam kDedicatedWorkerStartDelayInMs = { + &kDedicatedWorkerAblationStudyEnabled, "DedicatedWorkerStartDelayInMs", 0}; + BASE_FEATURE( kPostMessageFirstPartyToThirdPartyDifferentBucketSameOriginBlocked, "PostMessageFirstPartyToThirdPartyDifferentBucketSameOriginBlocked", @@ -1910,12 +1919,6 @@ constexpr base::FeatureParam kPrivateAggregationApiDebugModeEnabledAtAll{ &kPrivateAggregationApi, "debug_mode_enabled_at_all", /*default_value=*/true}; -// Allows for different aggregation coordinators to be set. If disabled, any -// selection will be ignored and replaced with the default. -BASE_FEATURE(kPrivateAggregationApiMultipleCloudProviders, - "PrivateAggregationApiMultipleCloudProviders", - base::FEATURE_ENABLED_BY_DEFAULT); - BASE_FEATURE(kProcessHtmlDataImmediately, "ProcessHtmlDataImmediately", base::FEATURE_DISABLED_BY_DEFAULT); @@ -2524,10 +2527,6 @@ BASE_FEATURE(kWebRtcIgnoreUnspecifiedColorSpace, "WebRtcIgnoreUnspecifiedColorSpace", base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kWebRtcInitializeEncoderOnFirstFrame, - "WebRtcInitializeEncoderOnFirstFrame", - base::FEATURE_ENABLED_BY_DEFAULT); - BASE_FEATURE(kWebRtcThreadsUseResourceEfficientType, "WebRtcThreadsUseResourceEfficientType", base::FEATURE_DISABLED_BY_DEFAULT); diff --git a/src/third_party/blink/perf_tests/parser/resources/html5.html b/src/third_party/blink/perf_tests/parser/resources/html5.html index 847597473ae..9485483a520 100644 --- a/src/third_party/blink/perf_tests/parser/resources/html5.html +++ b/src/third_party/blink/perf_tests/parser/resources/html5.html @@ -26748,11 +26748,11 @@

4.8.9 The trackThis video has subtitles in several languages:

-
<video src="wootz.webm">
- <track kind=subtitles src=wootz.en.vtt srclang=en label="English">
- <track kind=captions src=wootz.en.hoh.vtt srclang=en label="English for the Hard of Hearing">
- <track kind=subtitles src=wootz.fr.vtt srclang=fr lang=fr label="Français">
- <track kind=subtitles src=wootz.de.vtt srclang=de lang=de label="Deutsch">
+   
<video src="brave.webm">
+ <track kind=subtitles src=brave.en.vtt srclang=en label="English">
+ <track kind=captions src=brave.en.hoh.vtt srclang=en label="English for the Hard of Hearing">
+ <track kind=subtitles src=brave.fr.vtt srclang=fr lang=fr label="Français">
+ <track kind=subtitles src=brave.de.vtt srclang=de lang=de label="Deutsch">
 </video>
diff --git a/src/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/src/third_party/blink/public/devtools_protocol/browser_protocol.pdl index 500f55913d6..5ba36a3b528 100644 --- a/src/third_party/blink/public/devtools_protocol/browser_protocol.pdl +++ b/src/third_party/blink/public/devtools_protocol/browser_protocol.pdl @@ -851,6 +851,7 @@ experimental domain Audits array of string allowedSites number optOutPercentage boolean isOptOutTopLevel + CookieOperation operation type ClientHintIssueReason extends string enum @@ -911,6 +912,7 @@ experimental domain Audits NotSignedInWithIdp MissingTransientUserActivation ReplacedByButtonMode + RelyingPartyOriginIsOpaque type FederatedAuthUserInfoRequestIssueDetails extends object properties @@ -5588,6 +5590,10 @@ domain Network experimental number workerFetchStart # Settled fetch event respondWith promise. experimental number workerRespondWithSettled + # Started ServiceWorker static routing source evaluation. + experimental optional number workerRouterEvaluationStart + # Started cache lookup when the source was evaluated to `cache`. + experimental optional number workerCacheLookupStart # Started sending request. number sendStart # Finished sending request. @@ -5873,6 +5879,8 @@ domain Network # The router source of the matched rule. If there is a matched rule, this # field will be set, otherwise no value will be set. optional ServiceWorkerRouterSource matchedSourceType + # The actual router source used. + optional ServiceWorkerRouterSource actualSourceType # HTTP response data. type Response extends object @@ -12395,3 +12403,25 @@ experimental domain PWA returns # ID of the tab target created as a result. Target.TargetID targetId + + # Opens one or more local files from an installed web app identified by its + # manifestId. The web app needs to have file handlers registered to process + # the files. The API returns one or more tabs / web contents' based + # Target.TargetIDs which can be used to attach to via Target.attachToTarget or + # similar APIs. + # If some files in the parameters cannot be handled by the web app, they will + # be ignored. If none of the files can be handled, this API returns an error. + # If no files provided as the parameter, this API also returns an error. + # + # According to the definition of the file handlers in the manifest file, one + # Target.TargetID may represent a tab handling one or more files. The order of + # the returned Target.TargetIDs is also not guaranteed. + # + # TODO(crbug.com/339454034): Check the existences of the input files. + command launchFilesInApp + parameters + string manifestId + array of string files + returns + # IDs of the tab targets created as the result. + array of Target.TargetID targetIds diff --git a/src/third_party/blink/public/web/web_node.h b/src/third_party/blink/public/web/web_node.h index c5005fd7752..8f59a0ca769 100644 --- a/src/third_party/blink/public/web/web_node.h +++ b/src/third_party/blink/public/web/web_node.h @@ -31,12 +31,14 @@ #ifndef THIRD_PARTY_BLINK_PUBLIC_WEB_WEB_NODE_H_ #define THIRD_PARTY_BLINK_PUBLIC_WEB_WEB_NODE_H_ +#include "base/functional/callback_helpers.h" #include "base/functional/function_ref.h" #include "cc/paint/element_id.h" #include "third_party/blink/public/platform/web_common.h" #include "third_party/blink/public/platform/web_private_ptr.h" #include "third_party/blink/public/platform/web_string.h" #include "third_party/blink/public/platform/web_vector.h" +#include "third_party/blink/public/web/web_dom_event.h" #include "v8/include/v8-forward.h" namespace blink { @@ -55,6 +57,10 @@ class WebPluginContainer; // reason, subclasses must not add any additional data members. class BLINK_EXPORT WebNode { public: + enum class EventType { + kSelectionchange, + }; + static WebNode FromDomNodeId(int dom_node_id); virtual ~WebNode(); @@ -95,6 +101,10 @@ class BLINK_EXPORT WebNode { bool IsElementNode() const; void SimulateClick(); + // Returns the top-most ancestor such this WebNode and that ancestor and all + // nodes in between are contenteditable. + WebElement RootEditableElement() const; + // See cc/paint/element_id.h for the definition of these ids. cc::ElementId ScrollingElementIdForTesting() const; @@ -126,6 +136,12 @@ class BLINK_EXPORT WebNode { int GetDomNodeId() const; + // Adds a listener to this node. + // Returns a RAII object that removes the listener. + base::ScopedClosureRunner AddEventListener( + EventType event_type, + base::RepeatingCallback handler); + // Helper to downcast to `T`. Will fail with a CHECK() if converting to `T` is // not legal. The returned `T` will always be non-null if `this` is non-null. template diff --git a/src/third_party/blink/renderer/core/dom/document.cc b/src/third_party/blink/renderer/core/dom/document.cc index faadf1b1b1b..c25e0e25980 100644 --- a/src/third_party/blink/renderer/core/dom/document.cc +++ b/src/third_party/blink/renderer/core/dom/document.cc @@ -904,9 +904,6 @@ Document::Document(const DocumentInit& initializer, ? MakeGarbageCollected(*this) : nullptr), data_(MakeGarbageCollected(GetExecutionContext())) { - - LOG(INFO) << "AMIT Document::Document"; - TRACE_EVENT_WITH_FLOW0("blink", "Document::Document", TRACE_ID_LOCAL(this), TRACE_EVENT_FLAG_FLOW_OUT); DCHECK(agent_); @@ -3377,9 +3374,28 @@ bool Document::WillPrintSoon() { loading_for_print_ = loading_for_print_ || view->LoadAllLazyLoadedIframes(); } + loading_for_print_ = + loading_for_print_ || InitiateStyleOrLayoutDependentLoadForPrint(); + return loading_for_print_; } +bool Document::InitiateStyleOrLayoutDependentLoadForPrint() { + if (auto* view = View()) { + view->AdjustMediaTypeForPrinting(true); + UpdateStyleAndLayout(DocumentUpdateReason::kPrinting); + + view->FlushAnyPendingPostLayoutTasks(); + + view->AdjustMediaTypeForPrinting(false); + UpdateStyleAndLayout(DocumentUpdateReason::kPrinting); + + return !ShouldComplete(); + } + + return false; +} + void Document::SetPrinting(PrintingState state) { bool was_printing = Printing(); printing_ = state; @@ -5982,26 +5998,27 @@ void Document::EnqueueOverscrollEventForNode(Node* target, scripted_animation_controller_->EnqueuePerFrameEvent(overscroll_event); } -void Document::EnqueueSnapChangedEvent(Node* target, - Member& block_target, - Member& inline_target) { - Event* snapchanged_event = SnapEvent::Create( - event_type_names::kSnapchanged, +void Document::EnqueueScrollSnapChangeEvent(Node* target, + Member& block_target, + Member& inline_target) { + Event* scrollsnapchange_event = SnapEvent::Create( + event_type_names::kScrollsnapchange, (target->IsDocumentNode() ? Event::Bubbles::kYes : Event::Bubbles::kNo), block_target, inline_target); - snapchanged_event->SetTarget(target); - scripted_animation_controller_->EnqueuePerFrameEvent(snapchanged_event); + scrollsnapchange_event->SetTarget(target); + scripted_animation_controller_->EnqueuePerFrameEvent(scrollsnapchange_event); } -void Document::EnqueueSnapChangingEvent(Node* target, - Member& block_target, - Member& inline_target) { - Event* snapchanging_event = SnapEvent::Create( - event_type_names::kSnapchanging, +void Document::EnqueueScrollSnapChangingEvent(Node* target, + Member& block_target, + Member& inline_target) { + Event* scrollsnapchanging_event = SnapEvent::Create( + event_type_names::kScrollsnapchanging, (target->IsDocumentNode() ? Event::Bubbles::kYes : Event::Bubbles::kNo), block_target, inline_target); - snapchanging_event->SetTarget(target); - scripted_animation_controller_->EnqueuePerFrameEvent(snapchanging_event); + scrollsnapchanging_event->SetTarget(target); + scripted_animation_controller_->EnqueuePerFrameEvent( + scrollsnapchanging_event); } void Document::EnqueueMoveEvent() { diff --git a/src/third_party/blink/renderer/core/dom/document.h b/src/third_party/blink/renderer/core/dom/document.h index 603c20fce56..21389111831 100644 --- a/src/third_party/blink/renderer/core/dom/document.h +++ b/src/third_party/blink/renderer/core/dom/document.h @@ -1523,12 +1523,12 @@ class CORE_EXPORT Document : public ContainerNode, void EnqueueVisualViewportScrollEvent(); void EnqueueVisualViewportScrollEndEvent(); void EnqueueVisualViewportResizeEvent(); - void EnqueueSnapChangedEvent(Node* target, - Member& block_target, - Member& inline_target); - void EnqueueSnapChangingEvent(Node* target, - Member& block_target, - Member& inline_target); + void EnqueueScrollSnapChangeEvent(Node* target, + Member& block_target, + Member& inline_target); + void EnqueueScrollSnapChangingEvent(Node* target, + Member& block_target, + Member& inline_target); void DispatchEventsForPrinting(); @@ -2342,6 +2342,10 @@ class CORE_EXPORT Document : public ContainerNode, ResizeObserver& GetLazyLoadedAutoSizedImgObserver(); + // Initiates data loading for print that is dependent on style or layout. + // Returns true if data loading has started. + bool InitiateStyleOrLayoutDependentLoadForPrint(); + // Mutable because the token is lazily-generated on demand if no token is // explicitly set. mutable std::optional token_; diff --git a/src/third_party/blink/renderer/core/dom/element.cc b/src/third_party/blink/renderer/core/dom/element.cc index 3fc72ef9c6b..c5c5cf1b738 100644 --- a/src/third_party/blink/renderer/core/dom/element.cc +++ b/src/third_party/blink/renderer/core/dom/element.cc @@ -1164,10 +1164,18 @@ NamedNodeMap* Element::attributesForBindings() const { return rare_data.AttributeMap(); } -AttributeNamesView Element::getAttributeNames() const { +AttributeNamesView Element::getAttributeNamesForBindings() const { return bindings::Transform(Attributes()); } +Vector Element::getAttributeNames() const { + Vector result; + auto view = getAttributeNamesForBindings(); + std::transform(view.begin(), view.end(), std::back_inserter(result), + [](const String& str) { return AtomicString(str); }); + return result; +} + inline ElementRareDataVector* Element::GetElementRareData() const { return static_cast(RareData()); } @@ -6977,7 +6985,6 @@ void Element::setOuterHTML(const String& html, } auto* parent = DynamicTo(p); - if (!parent) { exception_state.ThrowDOMException( DOMExceptionCode::kNoModificationAllowedError, @@ -6985,7 +6992,7 @@ void Element::setOuterHTML(const String& html, "', which is not an element node."); return; } - LOG(WARNING) << "parent: " << parent <<" "<< parent->getAttribute(AtomicString("data-testid")); + Node* prev = previousSibling(); Node* next = nextSibling(); diff --git a/src/third_party/blink/renderer/core/exported/web_document.cc b/src/third_party/blink/renderer/core/exported/web_document.cc index 863c413f2dd..81485a53949 100644 --- a/src/third_party/blink/renderer/core/exported/web_document.cc +++ b/src/third_party/blink/renderer/core/exported/web_document.cc @@ -1,4 +1,4 @@ -/*https://solana-rpc.publicnode.com/ +/* * Copyright (C) 2009 Google Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/third_party/blink/renderer/core/exported/web_node.cc b/src/third_party/blink/renderer/core/exported/web_node.cc index 1e2b41a894a..2f512739393 100644 --- a/src/third_party/blink/renderer/core/exported/web_node.cc +++ b/src/third_party/blink/renderer/core/exported/web_node.cc @@ -42,6 +42,7 @@ #include "third_party/blink/renderer/core/dom/dom_node_ids.h" #include "third_party/blink/renderer/core/dom/element.h" #include "third_party/blink/renderer/core/dom/events/event.h" +#include "third_party/blink/renderer/core/dom/events/native_event_listener.h" #include "third_party/blink/renderer/core/dom/node.h" #include "third_party/blink/renderer/core/dom/node_list.h" #include "third_party/blink/renderer/core/dom/static_node_list.h" @@ -55,6 +56,7 @@ #include "third_party/blink/renderer/core/layout/layout_box.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" +#include "third_party/blink/renderer/platform/heap/persistent.h" #include "third_party/blink/renderer/platform/wtf/wtf.h" namespace blink { @@ -159,6 +161,10 @@ bool WebNode::IsContentEditable() const { return blink::IsEditable(*private_); } +WebElement WebNode::RootEditableElement() const { + return blink::RootEditableElement(*private_); +} + bool WebNode::IsInsideFocusableElementOrARIAWidget() const { return AXObjectCache::IsInsideFocusableElementOrARIAWidget( *this->ConstUnwrap()); @@ -271,4 +277,53 @@ WebNode WebNode::FromDomNodeId(int dom_node_id) { return WebNode(Node::FromDomNodeId(dom_node_id)); } +base::ScopedClosureRunner WebNode::AddEventListener( + EventType event_type, + base::RepeatingCallback handler) { + class EventListener : public NativeEventListener { + public: + EventListener(Node* node, + base::RepeatingCallback handler) + : node_(node), handler_(std::move(handler)) {} + + void Invoke(ExecutionContext*, Event* event) override { + handler_.Run(WebDOMEvent(event)); + } + + void AddListener() { + node_->addEventListener(event_type_name(), this, + /*use_capture=*/false); + } + + void RemoveListener() { + node_->removeEventListener(event_type_name(), this, + /*use_capture=*/false); + } + + void Trace(Visitor* visitor) const override { + NativeEventListener::Trace(visitor); + visitor->Trace(node_); + } + + private: + const AtomicString& event_type_name() { + switch (event_type_) { + case EventType::kSelectionchange: + return event_type_names::kSelectionchange; + } + NOTREACHED_NORETURN(); + } + + Member node_; + EventType event_type_; + base::RepeatingCallback handler_; + }; + + WebPrivatePtrForGC listener = + MakeGarbageCollected(Unwrap(), std::move(handler)); + listener->AddListener(); + return base::ScopedClosureRunner(WTF::BindOnce( + &EventListener::RemoveListener, WrapWeakPersistent(listener.Get()))); +} + } // namespace blink diff --git a/src/third_party/blink/renderer/core/exported/web_node_test.cc b/src/third_party/blink/renderer/core/exported/web_node_test.cc index 004a2ca093f..70d76c3eaa7 100644 --- a/src/third_party/blink/renderer/core/exported/web_node_test.cc +++ b/src/third_party/blink/renderer/core/exported/web_node_test.cc @@ -5,7 +5,10 @@ #include "third_party/blink/public/web/web_node.h" #include + +#include "base/test/mock_callback.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/web/web_dom_event.h" #include "third_party/blink/public/web/web_element.h" #include "third_party/blink/public/web/web_element_collection.h" #include "third_party/blink/renderer/core/css/style_engine.h" @@ -24,6 +27,14 @@ class WebNodeTest : public PageTestBase { GetDocument().documentElement()->setInnerHTML(html); } + void AddScript(String js) { + GetDocument().GetSettings()->SetScriptEnabled(true); + Element* script = GetDocument().CreateRawElement(html_names::kScriptTag); + script->setInnerHTML(js); + GetDocument().body()->AppendChild(script); + GetDocument().UpdateStyleAndLayout(DocumentUpdateReason::kTest); + } + WebNode Root() { return WebNode(GetDocument().documentElement()); } }; @@ -181,4 +192,47 @@ TEST_F(WebNodeTest, CannotFindTextInNonReadonlyTextInputElement) { .IsEmpty()); } +// Tests that AddEventListener() registers and deregisters a listener. +TEST_F(WebNodeTest, AddEventListener) { + testing::MockFunction checkpoint; + base::MockRepeatingCallback handler; + { + testing::InSequence seq; + EXPECT_CALL(checkpoint, Call("focus")); + EXPECT_CALL(checkpoint, Call("set_caret 1")); + EXPECT_CALL(handler, Run); + EXPECT_CALL(checkpoint, Call("set_caret 2")); + EXPECT_CALL(handler, Run); + EXPECT_CALL(checkpoint, Call("set_caret 3")); + } + + SetInnerHTML(""); + + // Focuses the textarea. + auto focus = [&]() { + checkpoint.Call("focus"); + AddScript(String("document.getElementById('field').focus()")); + task_environment().RunUntilIdle(); + }; + + // Moves the caret in the field and fires a selectionchange event. + auto set_caret = [&](int caret_position) { + checkpoint.Call(base::StringPrintf("set_caret %d", caret_position)); + AddScript(String(base::StringPrintf( + "document.getElementById('field').setSelectionRange(%d, %d)", + caret_position, caret_position))); + task_environment().RunUntilIdle(); + }; + + focus(); + { + auto remove_listener = Root().AddEventListener( + WebNode::EventType::kSelectionchange, handler.Get()); + set_caret(1); + set_caret(2); + // The listener is removed by `remove_listener`'s destructor. + } + set_caret(3); +} + } // namespace blink diff --git a/src/third_party/blink/renderer/core/frame/csp/content_security_policy.cc b/src/third_party/blink/renderer/core/frame/csp/content_security_policy.cc index 1701de86449..cf7f0e1425d 100644 --- a/src/third_party/blink/renderer/core/frame/csp/content_security_policy.cc +++ b/src/third_party/blink/renderer/core/frame/csp/content_security_policy.cc @@ -977,7 +977,6 @@ bool ContentSecurityPolicy::AllowTrustedTypeAssignmentFailure( bool ContentSecurityPolicy::IsActive() const { return !policies_.empty(); - // return true; } bool ContentSecurityPolicy::IsActiveForConnections() const { diff --git a/src/third_party/blink/renderer/core/frame/csp/csp_directive_list.cc b/src/third_party/blink/renderer/core/frame/csp/csp_directive_list.cc index 1f049de11b3..ad24e41b48b 100644 --- a/src/third_party/blink/renderer/core/frame/csp/csp_directive_list.cc +++ b/src/third_party/blink/renderer/core/frame/csp/csp_directive_list.cc @@ -24,7 +24,6 @@ #include "third_party/blink/renderer/platform/crypto.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/instrumentation/use_counter.h" -#include "third_party/blink/renderer/platform/runtime_enabled_features.h" #include "third_party/blink/renderer/platform/weborigin/known_ports.h" #include "third_party/blink/renderer/platform/weborigin/kurl.h" #include "third_party/blink/renderer/platform/weborigin/reporting_disposition.h" diff --git a/src/third_party/blink/renderer/core/frame/history_util_test.cc b/src/third_party/blink/renderer/core/frame/history_util_test.cc index f76877383f8..b24764f737e 100644 --- a/src/third_party/blink/renderer/core/frame/history_util_test.cc +++ b/src/third_party/blink/renderer/core/frame/history_util_test.cc @@ -115,27 +115,27 @@ TEST_F(HistoryUtilTest, CanChangeToURLInUniqueOrigin) { TEST_F(HistoryUtilTest, CanChangeToURLWebUI) { url::ScopedSchemeRegistryForTests scoped_registry; - url::AddStandardScheme("wootzapp", url::SCHEME_WITH_HOST); + url::AddStandardScheme("chrome", url::SCHEME_WITH_HOST); struct TestCase { const char* url; const char* document_url; bool expected; } cases[] = { - {"wootzapp://bookmarks", "wootzapp://bookmarks", true}, - {"wootzapp://bookmarks", "wootzapp://bookmarks/test_loader.html", true}, - {"wootzapp://bookmarks/test_loader.html", "wootzapp://bookmarks", true}, - {"wootzapp://history", "wootzapp://bookmarks", false}, - {"chrome-error://history", "wootzapp://bookmarks", false}, - {"about:blank", "wootzapp://bookmarks", false}, - {"about:srcdoc", "wootzapp://bookmarks", false}, - {"about:blank?query#hash", "wootzapp://bookmarks", false}, - {"about:srcdoc?query#hash", "wootzapp://bookmarks", false}, - {"wootzapp://bookmarks", "about:blank", false}, - {"wootzapp://bookmarks", "about:srcdoc", false}, - {"wootzapp://bookmarks", "about:blank?query#hash", false}, - {"wootzapp://bookmarks", "about:srcdoc?query#hash", false}, - {"https://example.com/path", "wootzapp://bookmarks", false}, + {"chrome://bookmarks", "chrome://bookmarks", true}, + {"chrome://bookmarks", "chrome://bookmarks/test_loader.html", true}, + {"chrome://bookmarks/test_loader.html", "chrome://bookmarks", true}, + {"chrome://history", "chrome://bookmarks", false}, + {"chrome-error://history", "chrome://bookmarks", false}, + {"about:blank", "chrome://bookmarks", false}, + {"about:srcdoc", "chrome://bookmarks", false}, + {"about:blank?query#hash", "chrome://bookmarks", false}, + {"about:srcdoc?query#hash", "chrome://bookmarks", false}, + {"chrome://bookmarks", "about:blank", false}, + {"chrome://bookmarks", "about:srcdoc", false}, + {"chrome://bookmarks", "about:blank?query#hash", false}, + {"chrome://bookmarks", "about:srcdoc?query#hash", false}, + {"https://example.com/path", "chrome://bookmarks", false}, }; for (const auto& test : cases) { diff --git a/src/third_party/blink/renderer/core/frame/viewport_data.cc b/src/third_party/blink/renderer/core/frame/viewport_data.cc index d03fa65321c..ba366b5392f 100644 --- a/src/third_party/blink/renderer/core/frame/viewport_data.cc +++ b/src/third_party/blink/renderer/core/frame/viewport_data.cc @@ -96,7 +96,7 @@ void ViewportData::UpdateViewportDescription() { // If we are forcing to expand into the display cutout then we should override // the viewport fit value. - if (force_expand_display_cutout_) + if (force_expand_display_cutout_) current_viewport_fit = mojom::ViewportFit::kCoverForcedByUserAgent; if (force_stop_display_cutout_) @@ -123,7 +123,6 @@ void ViewportData::UpdateViewportDescription() { if (document_->GetFrame()->IsOutermostMainFrame()) { if (current_viewport_fit == mojom::blink::ViewportFit::kContain) { UseCounter::Count(document_, WebFeature::kViewportFitContain); - VLOG(0) << "E2E_Used ViewportFitContain"; } else if (current_viewport_fit == mojom::blink::ViewportFit::kCover || current_viewport_fit == mojom::blink::ViewportFit::kCoverForcedByUserAgent) { diff --git a/src/third_party/blink/renderer/core/frame/web_local_frame_impl.cc b/src/third_party/blink/renderer/core/frame/web_local_frame_impl.cc index 0a4cbb0e924..ff494118a55 100644 --- a/src/third_party/blink/renderer/core/frame/web_local_frame_impl.cc +++ b/src/third_party/blink/renderer/core/frame/web_local_frame_impl.cc @@ -98,6 +98,7 @@ #include "base/numerics/safe_conversions.h" #include "base/task/single_thread_task_runner.h" #include "build/build_config.h" +#include "cc/base/features.h" #include "mojo/public/cpp/bindings/pending_associated_receiver.h" #include "mojo/public/cpp/bindings/pending_associated_remote.h" #include "services/metrics/public/cpp/ukm_source_id.h" @@ -534,7 +535,7 @@ class ChromePluginPrintContext final : public ChromePrintContext { class PaintPreviewContext : public PrintContext { public: explicit PaintPreviewContext(LocalFrame* frame) : PrintContext(frame) { - use_printing_layout_ = false; + use_paginated_layout_ = false; } PaintPreviewContext(const PaintPreviewContext&) = delete; PaintPreviewContext& operator=(const PaintPreviewContext&) = delete; @@ -838,10 +839,6 @@ bool WebLocalFrameImpl::DispatchedPagehideAndStillHidden() const { return ViewImpl()->GetPage()->DispatchedPagehideAndStillHidden(); } -bool WebLocalFrameImpl::UsePrintingLayout() const { - return print_context_ ? print_context_->use_printing_layout() : false; -} - void WebLocalFrameImpl::CopyToFindPboard() { #if BUILDFLAG(IS_MAC) if (HasSelection()) @@ -2532,6 +2529,21 @@ void WebLocalFrameImpl::DidFinish() { if (!Client()) return; + if (base::FeatureList::IsEnabled(::features::kWarmUpCompositor)) { + // If the page is under prerendering, the page requests warm-up compositor + // to minimize its activation time. Please see crbug.com/41496019 for more + // details. + bool is_prerendering = + GetFrame()->GetPage() && GetFrame()->GetPage()->IsPrerendering(); + // TODO(crbug.com/41496019): Seek the best point (instead of + // `WebLocalFrameImpl::DidFinish`) to start warm-up. + // TODO(crbug.com/41496019): Limit the use of this warm-up to prerender + // trigger types that are most affected by this. + if (frame_widget_ && is_prerendering) { + frame_widget_->WarmUpCompositor(); + } + } + if (WebPluginContainerImpl* plugin = GetFrame()->GetWebPluginContainer()) plugin->DidFinishLoading(); diff --git a/src/third_party/blink/renderer/core/frame/web_local_frame_impl.h b/src/third_party/blink/renderer/core/frame/web_local_frame_impl.h index dfe480c6121..92d23419973 100644 --- a/src/third_party/blink/renderer/core/frame/web_local_frame_impl.h +++ b/src/third_party/blink/renderer/core/frame/web_local_frame_impl.h @@ -539,9 +539,6 @@ class CORE_EXPORT WebLocalFrameImpl final // Returns true if the frame is focused. bool IsFocused() const; - // Returns true if our print context suggests using printing layout. - bool UsePrintingLayout() const; - // Copy the current selection to the pboard. void CopyToFindPboard(); diff --git a/src/third_party/blink/renderer/core/input/event_handler.cc b/src/third_party/blink/renderer/core/input/event_handler.cc index 6cae3fc113a..c9bea68dfc5 100644 --- a/src/third_party/blink/renderer/core/input/event_handler.cc +++ b/src/third_party/blink/renderer/core/input/event_handler.cc @@ -136,27 +136,23 @@ namespace { // node. bool ShouldRefetchEventTarget(const MouseEventWithHitTestResults& mev) { Node* target_node = mev.InnerNode(); - if (!target_node || !target_node->parentNode()) { + if (!target_node || !target_node->parentNode()) return true; - } - if (auto* shadow_root = DynamicTo(target_node)) { + if (auto* shadow_root = DynamicTo(target_node)) return IsA(shadow_root->host()); - } return false; } gfx::Point GetMiddleSelectionCaretOfPosition( const PositionWithAffinity& position) { const LocalCaretRect& local_caret_rect = LocalCaretRectOfPosition(position); - if (local_caret_rect.IsEmpty()) { + if (local_caret_rect.IsEmpty()) return gfx::Point(); - } const gfx::Rect rect = AbsoluteCaretBoundsOf(position); // In a multiline edit, rect.bottom() would end up on the next line, so // take the midpoint in order to use this corner point directly. - if (local_caret_rect.layout_object->IsHorizontalWritingMode()) { + if (local_caret_rect.layout_object->IsHorizontalWritingMode()) return {rect.x(), (rect.y() + rect.bottom()) / 2}; - } // When text is vertical, rect.right() would end up on the next line, so // take the midpoint in order to use this corner point directly. @@ -181,9 +177,8 @@ gfx::Point DetermineHotSpot(const Image& image, const bool image_has_intrinsic_hot_spot = image.GetHotSpot(intrinsic_hot_spot); const gfx::Rect image_rect = image.Rect(); - if (image_has_intrinsic_hot_spot && image_rect.Contains(intrinsic_hot_spot)) { + if (image_has_intrinsic_hot_spot && image_rect.Contains(intrinsic_hot_spot)) return intrinsic_hot_spot; - } // If neither is provided, use a default value of (0, 0). return gfx::Point(); @@ -353,13 +348,11 @@ void EventHandler::UpdateSelectionForMouseDrag() { void EventHandler::StartMiddleClickAutoscroll(LayoutObject* layout_object) { DCHECK(RuntimeEnabledFeatures::MiddleClickAutoscrollEnabled()); - if (!layout_object->IsBox()) { + if (!layout_object->IsBox()) return; - } AutoscrollController* controller = scroll_manager_->GetAutoscrollController(); - if (!controller) { + if (!controller) return; - } LayoutBox* scrollable = LayoutBox::FindAutoscrollable( layout_object, /*is_middle_click_autoscroll*/ true); @@ -386,9 +379,8 @@ void EventHandler::PerformHitTest(const HitTestLocation& location, // the lifecycle update prompted by HitTest() would fail. if (!frame_->ContentLayoutObject() || !frame_->View() || !frame_->View()->DidFirstLayout() || - !frame_->View()->LifecycleUpdatesActive()) { + !frame_->View()->LifecycleUpdatesActive()) return; - } if (no_lifecycle_update) { frame_->ContentLayoutObject()->HitTestNoLifecycleUpdate(location, result); @@ -479,10 +471,9 @@ gfx::PointF EventHandler::LastKnownMouseScreenPosition() const { } gfx::Point EventHandler::DragDataTransferLocationForTesting() { - if (mouse_event_manager_->GetDragState().drag_data_transfer_) { + if (mouse_event_manager_->GetDragState().drag_data_transfer_) return mouse_event_manager_->GetDragState() .drag_data_transfer_->DragLocation(); - } return gfx::Point(); } @@ -494,9 +485,8 @@ static bool IsSubmitImage(const Node* node) { } bool EventHandler::UsesHandCursor(const Node* node) { - if (!node) { + if (!node) return false; - } return ((node->IsLink() || IsSubmitImage(node)) && !IsEditable(*node)); } @@ -515,14 +505,12 @@ void EventHandler::UpdateCursor() { DCHECK_EQ(frame_, &frame_->LocalFrameRoot()); LocalFrameView* view = frame_->View(); - if (!view || !view->ShouldSetCursor()) { + if (!view || !view->ShouldSetCursor()) return; - } auto* layout_view = view->GetLayoutView(); - if (!layout_view) { + if (!layout_view) return; - } frame_->GetDocument()->UpdateStyleAndLayout(DocumentUpdateReason::kInput); @@ -569,14 +557,11 @@ bool EventHandler::IsSelectingLink(const HitTestResult& result) { bool EventHandler::ShouldShowIBeamForNode(const Node* node, const HitTestResult& result) { - if (!node) { + if (!node) return false; - } - if (node->IsTextNode() && - (node->CanStartSelection() || result.IsOverLink())) { + if (node->IsTextNode() && (node->CanStartSelection() || result.IsOverLink())) return true; - } return IsEditable(*node); } @@ -584,17 +569,14 @@ bool EventHandler::ShouldShowIBeamForNode(const Node* node, std::optional EventHandler::SelectCursor( const HitTestLocation& location, const HitTestResult& result) { - if (scroll_manager_->InResizeMode()) { + if (scroll_manager_->InResizeMode()) return std::nullopt; - } Page* page = frame_->GetPage(); - if (!page) { + if (!page) return std::nullopt; - } - if (scroll_manager_->MiddleClickAutoscrollInProgress()) { + if (scroll_manager_->MiddleClickAutoscrollInProgress()) return std::nullopt; - } if (result.GetScrollbar() && !result.GetScrollbar()->IsCustomScrollbar()) { return PointerCursor(); @@ -840,9 +822,8 @@ std::optional EventHandler::SelectAutoCursor( const HitTestResult& result, Node* node, const ui::Cursor& i_beam) { - if (ShouldShowIBeamForNode(node, result)) { + if (ShouldShowIBeamForNode(node, result)) return i_beam; - } return PointerCursor(); } @@ -866,15 +847,13 @@ WebInputEventResult EventHandler::HandleMousePressEvent( // For 4th/5th button in the mouse since Chrome does not yet send // button value to Blink but in some cases it does send the event. // This check is needed to suppress such an event (crbug.com/574959) - if (mouse_event.button == WebPointerProperties::Button::kNoButton) { + if (mouse_event.button == WebPointerProperties::Button::kNoButton) return WebInputEventResult::kHandledSuppressed; - } capturing_mouse_events_element_ = nullptr; mouse_event_manager_->HandleMousePressEventUpdateStates(mouse_event); - if (!frame_->View()) { + if (!frame_->View()) return WebInputEventResult::kNotHandled; - } HitTestRequest request(HitTestRequest::kActive); // Save the document point we generate in case the window coordinate is @@ -884,9 +863,8 @@ WebInputEventResult EventHandler::HandleMousePressEvent( MouseEventWithHitTestResults mev = GetMouseEventTarget(request, mouse_event); if (!mev.InnerNode()) { // An anonymous box can be scrollable. - if (PassMousePressEventToScrollbar(mev)) { + if (PassMousePressEventToScrollbar(mev)) return WebInputEventResult::kHandledSystem; - } mouse_event_manager_->InvalidateClick(); return WebInputEventResult::kNotHandled; @@ -963,9 +941,8 @@ WebInputEventResult EventHandler::HandleMousePressEvent( mouse_event_manager_->SetClickCount(mouse_event.click_count); mouse_event_manager_->SetClickElement(mev.InnerElement()); - if (!mouse_event.FromTouch()) { + if (!mouse_event.FromTouch()) frame_->Selection().SetCaretBlinkingSuspended(true); - } WebInputEventResult event_result = DispatchMousePointerEvent( WebInputEvent::Type::kPointerDown, mev.InnerElement(), mev.Event(), @@ -1012,16 +989,14 @@ WebInputEventResult EventHandler::HandleMousePressEvent( mouse_event_manager_->SetCapturesDragging(true); // Outermost main frames don't implicitly capture mouse input on MouseDown, // all subframes do (regardless of whether local or remote or fenced). - if (frame_->IsAttached() && !frame_->IsOutermostMainFrame()) { + if (frame_->IsAttached() && !frame_->IsOutermostMainFrame()) CaptureMouseEventsToWidget(true); - } } else { mouse_event_manager_->SetCapturesDragging(false); } - if (PassMousePressEventToScrollbar(mev)) { + if (PassMousePressEventToScrollbar(mev)) event_result = WebInputEventResult::kHandledSystem; - } if (event_result == WebInputEventResult::kNotHandled) { if (ShouldRefetchEventTarget(mev)) { @@ -1057,16 +1032,14 @@ WebInputEventResult EventHandler::HandleMouseMoveEvent( &hovered_node_result, &location); Page* page = frame_->GetPage(); - if (!page) { + if (!page) return result; - } if (PaintLayer* layer = event_handling_util::LayerForNode(hovered_node_result.InnerNode())) { if (ScrollableArea* layer_scrollable_area = - event_handling_util::AssociatedScrollableArea(layer)) { + event_handling_util::AssociatedScrollableArea(layer)) layer_scrollable_area->MouseMovedInContentArea(); - } } // Should not convert the hit shadow element to its shadow host, so that @@ -1085,9 +1058,8 @@ void EventHandler::HandleMouseLeaveEvent(const WebMouseEvent& event) { DCHECK(event.GetType() == WebInputEvent::Type::kMouseLeave); Page* page = frame_->GetPage(); - if (page) { + if (page) page->GetChromeClient().ClearToolTip(*frame_); - } WebLinkPreviewTriggerer* triggerer = frame_->GetOrCreateLinkPreviewTriggerer(); @@ -1139,9 +1111,8 @@ WebInputEventResult EventHandler::HandleMouseMoveOrLeaveEvent( // If the scrollbar still thinks it's being dragged, tell it to stop. // Can happen on Win if we lose focus (e.g. from Alt-Tab) mid-drag. if (last_scrollbar_under_mouse_ && - last_scrollbar_under_mouse_->PressedPart() != ScrollbarPart::kNoPart) { + last_scrollbar_under_mouse_->PressedPart() != ScrollbarPart::kNoPart) last_scrollbar_under_mouse_->MouseUp(mouse_event); - } } if (RuntimeEnabledFeatures::MiddleClickAutoscrollEnabled()) { @@ -1198,13 +1169,11 @@ WebInputEventResult EventHandler::HandleMouseMoveOrLeaveEvent( mev = GetMouseEventTarget(request, mouse_event); } - if (hovered_node_result) { + if (hovered_node_result) *hovered_node_result = mev.GetHitTestResult(); - } - if (hit_test_location) { + if (hit_test_location) *hit_test_location = mev.GetHitTestLocation(); - } Scrollbar* scrollbar = nullptr; @@ -1312,13 +1281,11 @@ WebInputEventResult EventHandler::HandleMouseReleaseEvent( // For 4th/5th button in the mouse since Chrome does not yet send // button value to Blink but in some cases it does send the event. // This check is needed to suppress such an event (crbug.com/574959) - if (mouse_event.button == WebPointerProperties::Button::kNoButton) { + if (mouse_event.button == WebPointerProperties::Button::kNoButton) return WebInputEventResult::kHandledSuppressed; - } - if (!mouse_event.FromTouch()) { + if (!mouse_event.FromTouch()) frame_->Selection().SetCaretBlinkingSuspended(false); - } if (RuntimeEnabledFeatures::MiddleClickAutoscrollEnabled()) { if (Page* page = frame_->GetPage()) { @@ -1341,9 +1308,8 @@ WebInputEventResult EventHandler::HandleMouseReleaseEvent( // crbug.com/1053385 release mouse capture only if there are no more mouse // buttons depressed if (MouseEvent::WebInputEventModifiersToButtons( - mouse_event.GetModifiers()) == 0) { + mouse_event.GetModifiers()) == 0) ReleaseMouseCaptureFromLocalRoot(); - } return result; } @@ -1369,9 +1335,8 @@ WebInputEventResult EventHandler::HandleMouseReleaseEvent( MouseEventWithHitTestResults mev = GetMouseEventTarget(request, mouse_event); LocalFrame* subframe = event_handling_util::GetTargetSubframe(mev); capturing_mouse_events_element_ = nullptr; - if (subframe) { + if (subframe) return PassMouseReleaseEventToSubframe(mev, subframe); - } WebInputEventResult event_result = WebInputEventResult::kNotHandled; @@ -1387,27 +1352,24 @@ WebInputEventResult EventHandler::HandleMouseReleaseEvent( } scroll_manager_->ClearResizeScrollableArea(false); - if (event_result == WebInputEventResult::kNotHandled) { + if (event_result == WebInputEventResult::kNotHandled) event_result = mouse_event_manager_->HandleMouseReleaseEvent(mev); - } mouse_event_manager_->HandleMouseReleaseEventUpdateStates(); // crbug.com/1053385 release mouse capture only if there are no more mouse // buttons depressed if (MouseEvent::WebInputEventModifiersToButtons(mouse_event.GetModifiers()) == - 0) { + 0) ReleaseMouseCaptureFromLocalRoot(); - } return event_result; } static LocalFrame* LocalFrameFromTargetNode(Node* target) { auto* html_frame_base_element = DynamicTo(target); - if (!html_frame_base_element) { + if (!html_frame_base_element) return nullptr; - } // Cross-process drag and drop is not yet supported. return DynamicTo(html_frame_base_element->ContentFrame()); @@ -1418,9 +1380,8 @@ WebInputEventResult EventHandler::UpdateDragAndDrop( DataTransfer* data_transfer) { WebInputEventResult event_result = WebInputEventResult::kNotHandled; - if (!frame_->View()) { + if (!frame_->View()) return event_result; - } HitTestRequest request(HitTestRequest::kReadOnly); MouseEventWithHitTestResults mev = @@ -1429,9 +1390,8 @@ WebInputEventResult EventHandler::UpdateDragAndDrop( // Drag events should never go to text nodes (following IE, and proper // mouseover/out dispatch) Node* new_target = mev.InnerNode(); - if (new_target && new_target->IsTextNode()) { + if (new_target && new_target->IsTextNode()) new_target = FlatTreeTraversal::Parent(*new_target); - } if (AutoscrollController* controller = scroll_manager_->GetAutoscrollController()) { @@ -1555,9 +1515,8 @@ void EventHandler::MarkHoverStateDirty() { Element* EventHandler::EffectiveMouseEventTargetElement( Element* target_element) { Element* new_element_under_mouse = target_element; - if (pointer_event_manager_->GetMouseCaptureTarget()) { + if (pointer_event_manager_->GetMouseCaptureTarget()) new_element_under_mouse = pointer_event_manager_->GetMouseCaptureTarget(); - } return new_element_under_mouse; } @@ -1606,12 +1565,10 @@ LocalFrame* EventHandler::DetermineActivePointerTrackerFrame( // If pointer_id is active on current |frame_|, pointer states are in // current frame's PEM; otherwise, check if it's a touch-like pointer that // have its active states in the local frame root's PEM. - if (IsPointerIdActiveOnFrame(pointer_id, frame_)) { + if (IsPointerIdActiveOnFrame(pointer_id, frame_)) return frame_.Get(); - } - if (RootFrameTrackedActivePointerInCurrentFrame(pointer_id)) { + if (RootFrameTrackedActivePointerInCurrentFrame(pointer_id)) return &frame_->LocalFrameRoot(); - } return nullptr; } @@ -1662,9 +1619,8 @@ bool EventHandler::HasPointerCapture(PointerId pointer_id, void EventHandler::ElementRemoved(Element* target) { pointer_event_manager_->ElementRemoved(target); - if (target) { + if (target) mouse_wheel_event_manager_->ElementRemoved(target); - } } void EventHandler::ResetMousePositionForPointerUnlock() { @@ -1726,9 +1682,8 @@ WebInputEventResult EventHandler::HandleGestureEvent( WebInputEventResult EventHandler::HandleGestureEvent( const GestureEventWithHitTestResults& targeted_event) { TRACE_EVENT0("input", "EventHandler::handleGestureEvent"); - if (!frame_->GetPage()) { + if (!frame_->GetPage()) return WebInputEventResult::kNotHandled; - } // Propagation to inner frames is handled below this function. DCHECK_EQ(frame_, &frame_->LocalFrameRoot()); @@ -1739,22 +1694,19 @@ WebInputEventResult EventHandler::HandleGestureEvent( DCHECK(!targeted_event.Event().IsScrollEvent()); if (targeted_event.Event().GetType() == - WebInputEvent::Type::kGestureShowPress) { + WebInputEvent::Type::kGestureShowPress) last_show_press_timestamp_ = base::TimeTicks::Now(); - } // Update mouseout/leave/over/enter events before jumping directly to the // inner most frame. - if (targeted_event.Event().GetType() == WebInputEvent::Type::kGestureTap) { + if (targeted_event.Event().GetType() == WebInputEvent::Type::kGestureTap) UpdateGestureTargetNodeForMouseEvent(targeted_event); - } // Route to the correct frame. if (LocalFrame* inner_frame = - targeted_event.GetHitTestResult().InnerNodeFrame()) { + targeted_event.GetHitTestResult().InnerNodeFrame()) return inner_frame->GetEventHandler().HandleGestureEventInFrame( targeted_event); - } // No hit test result, handle in root instance. Perhaps we should just return // false instead? @@ -1794,9 +1746,8 @@ void EventHandler::SetMouseDownMayStartAutoscroll() { bool EventHandler::ShouldApplyTouchAdjustment( const WebGestureEvent& event) const { - if (event.primary_pointer_type == WebPointerProperties::PointerType::kPen) { + if (event.primary_pointer_type == WebPointerProperties::PointerType::kPen) return false; - } return !event.TapAreaInRootFrame().IsEmpty(); } @@ -1913,21 +1864,18 @@ void EventHandler::UpdateCrossFrameHoverActiveState(bool is_active, LocalFrame* new_hover_frame = nullptr; // If we can't get the frame from the new hover frame chain, // the newHoverFrame will be null and the old hover state will be cleared. - if (index_frame_chain > 0) { + if (index_frame_chain > 0) new_hover_frame = new_hover_frame_chain[--index_frame_chain]; - } auto* owner = To(old_hover_element_in_cur_doc); LocalFrame* old_hover_frame = DynamicTo(owner->ContentFrame()); - if (!old_hover_frame) { + if (!old_hover_frame) break; - } Document* doc = old_hover_frame->GetDocument(); - if (!doc) { + if (!doc) break; - } old_hover_element_in_cur_doc = doc->HoverElement(); // If the old hovered frame is different from the new hovered frame. @@ -1984,9 +1932,8 @@ void EventHandler::UpdateGestureTargetNodeForMouseEvent( Node* last_node_under_tap = exited_frame_in_document->GetEventHandler() .mouse_event_manager_->GetElementUnderMouse(); - if (!last_node_under_tap) { + if (!last_node_under_tap) break; - } LocalFrame* next_exited_frame_in_document = nullptr; if (auto* owner = DynamicTo(last_node_under_tap)) { @@ -2001,11 +1948,10 @@ void EventHandler::UpdateGestureTargetNodeForMouseEvent( index_entered_frame_chain ? entered_frame_chain[index_entered_frame_chain - 1] : nullptr; - if (exited_frame_in_document != last_entered_frame_in_document) { + if (exited_frame_in_document != last_entered_frame_in_document) exited_frame_chain.push_back(exited_frame_in_document); - } else if (next_exited_frame_in_document && index_entered_frame_chain) { + else if (next_exited_frame_in_document && index_entered_frame_chain) --index_entered_frame_chain; - } } exited_frame_in_document = next_exited_frame_in_document; } @@ -2065,9 +2011,8 @@ GestureEventWithHitTestResults EventHandler::TargetGestureEvent( base::TimeTicks::Now() - last_show_press_timestamp_.value(); should_keep_active_for_min_interval = active_interval < kMinimumActiveInterval; - if (should_keep_active_for_min_interval) { + if (should_keep_active_for_min_interval) hit_type |= HitTestRequest::kReadOnly; - } } GestureEventWithHitTestResults event_with_hit_test_results = @@ -2112,9 +2057,8 @@ GestureEventWithHitTestResults EventHandler::HitTestResultForGestureEvent( hit_rect_size = GetHitTestRectForAdjustment( *frame_, PhysicalSize(LayoutUnit(tap_area.width()), LayoutUnit(tap_area.height()))); - if (!hit_rect_size.IsEmpty()) { + if (!hit_rect_size.IsEmpty()) hit_type |= HitTestRequest::kListBased; - } } } @@ -2144,9 +2088,8 @@ GestureEventWithHitTestResults EventHandler::HitTestResultForGestureEvent( // FIXME: Fix touch adjustment to avoid the need for a redundant hit test. // http://crbug.com/398914 LocalFrame* hit_frame = hit_test_result.InnerNodeFrame(); - if (!hit_frame) { + if (!hit_frame) hit_frame = frame_; - } location = HitTestLocation(adjusted_event.PositionInRootFrame()); hit_test_result = root_frame.GetEventHandler().HitTestResultAtLocation( location, @@ -2204,16 +2147,14 @@ WebInputEventResult EventHandler::SendContextMenuEvent( const WebMouseEvent& event, Element* override_target_element) { LocalFrameView* v = frame_->View(); - if (!v) { + if (!v) return WebInputEventResult::kNotHandled; - } // Clear mouse press state to avoid initiating a drag while context menu is // up. mouse_event_manager_->ReleaseMousePress(); - if (last_scrollbar_under_mouse_) { + if (last_scrollbar_under_mouse_) last_scrollbar_under_mouse_->MouseUp(event); - } PhysicalOffset position_in_contents(v->ConvertFromRootFrame( gfx::ToFlooredPoint(event.PositionInRootFrame()))); @@ -2244,10 +2185,8 @@ static bool ShouldShowContextMenuAtSelection(const FrameSelection& selection) { const VisibleSelection& visible_selection = selection.ComputeVisibleSelectionInDOMTree(); - if (!visible_selection.IsRange() && - !visible_selection.RootEditableElement()) { + if (!visible_selection.IsRange() && !visible_selection.RootEditableElement()) return false; - } return selection.SelectionHasFocus(); } @@ -2255,14 +2194,12 @@ WebInputEventResult EventHandler::ShowNonLocatedContextMenu( Element* override_target_element, WebMenuSourceType source_type) { LocalFrameView* view = frame_->View(); - if (!view) { + if (!view) return WebInputEventResult::kNotHandled; - } Document* doc = frame_->GetDocument(); - if (!doc) { + if (!doc) return WebInputEventResult::kNotHandled; - } static const int kContextMenuMargin = 1; @@ -2300,9 +2237,8 @@ WebInputEventResult EventHandler::ShowNonLocatedContextMenu( if (visible_selection.IsCaret()) { Element* anchor_element = EnclosingAnchorElement(visible_selection.ComputeStartPosition()); - if (anchor_element) { + if (anchor_element) focused_element = anchor_element; - } } // Intersect the selection rect and the visible bounds of focused_element. if (focused_element) { @@ -2354,9 +2290,8 @@ WebInputEventResult EventHandler::ShowNonLocatedContextMenu( // keyboard. This is required for web compatibility. WebInputEvent::Type event_type = WebInputEvent::Type::kMouseDown; if (frame_->GetSettings() && - frame_->GetSettings()->GetShowContextMenuOnMouseUp()) { + frame_->GetSettings()->GetShowContextMenuOnMouseUp()) event_type = WebInputEvent::Type::kMouseUp; - } WebMouseEvent mouse_event( event_type, @@ -2394,9 +2329,8 @@ gfx::Rect EventHandler::GetFocusedElementRectForNonLocatedContextMenu( // outline rect to ensure that the selection rect only includes visible // points within the focused element. Vector outline_rects = focused_element->OutlineRectsInWidget(); - if (outline_rects.size() > 1) { + if (outline_rects.size() > 1) clipped_rect.Intersect(outline_rects[0]); - } return visual_viewport.ViewportToRootFrame(clipped_rect); } @@ -2404,9 +2338,8 @@ gfx::Rect EventHandler::GetFocusedElementRectForNonLocatedContextMenu( void EventHandler::ScheduleHoverStateUpdate() { // TODO(https://crbug.com/668758): Use a normal BeginFrame update for this. if (!hover_timer_.IsActive() && - !mouse_event_manager_->IsMousePositionUnknown()) { + !mouse_event_manager_->IsMousePositionUnknown()) hover_timer_.StartOneShot(base::TimeDelta(), FROM_HERE); - } } void EventHandler::ScheduleCursorUpdate() { @@ -2415,9 +2348,8 @@ void EventHandler::ScheduleCursorUpdate() { DCHECK_EQ(frame_, &frame_->LocalFrameRoot()); // TODO(https://crbug.com/668758): Use a normal BeginFrame update for this. - if (!cursor_update_timer_.IsActive()) { + if (!cursor_update_timer_.IsActive()) cursor_update_timer_.StartOneShot(kCursorUpdateInterval, FROM_HERE); - } } bool EventHandler::CursorUpdatePending() { @@ -2525,9 +2457,8 @@ void EventHandler::UpdateDragStateAfterEditDragIfNeeded( // If inserting the dragged contents removed the drag source, we still want to // fire dragend at the root editble element. if (mouse_event_manager_->GetDragState().drag_src_ && - !mouse_event_manager_->GetDragState().drag_src_->isConnected()) { + !mouse_event_manager_->GetDragState().drag_src_->isConnected()) mouse_event_manager_->GetDragState().drag_src_ = root_editable_element; - } } bool EventHandler::HandleTextInputEvent(const String& text, @@ -2540,19 +2471,16 @@ bool EventHandler::HandleTextInputEvent(const String& text, DCHECK(!keyboard_event || keyboard_event->type() == event_type_names::kKeypress); - if (!frame_) { + if (!frame_) return false; - } EventTarget* target; - if (underlying_event) { + if (underlying_event) target = underlying_event->target(); - } else { + else target = EventTargetNodeForDocument(frame_->GetDocument()); - } - if (!target) { + if (!target) return false; - } TextEvent* event = TextEvent::Create(frame_->DomWindow(), text, input_type); event->SetUnderlyingEvent(underlying_event); @@ -2562,9 +2490,8 @@ bool EventHandler::HandleTextInputEvent(const String& text, } void EventHandler::DefaultTextInputEventHandler(TextEvent* event) { - if (frame_->GetEditor().HandleTextEvent(event)) { + if (frame_->GetEditor().HandleTextEvent(event)) event->SetDefaultHandled(); - } } void EventHandler::CapsLockStateMayHaveChanged() { @@ -2585,13 +2512,11 @@ bool EventHandler::PassMousePressEventToScrollbar( Scrollbar* scrollbar = mev.GetScrollbar(); UpdateLastScrollbarUnderMouse(scrollbar, true); - if (!scrollbar || !scrollbar->Enabled()) { + if (!scrollbar || !scrollbar->Enabled()) return false; - } scrollbar->MouseDown(mev.Event()); - if (scrollbar->PressedPart() == ScrollbarPart::kThumbPart) { + if (scrollbar->PressedPart() == ScrollbarPart::kThumbPart) CaptureMouseEventsToWidget(true); - } return true; } @@ -2601,14 +2526,12 @@ void EventHandler::UpdateLastScrollbarUnderMouse(Scrollbar* scrollbar, bool set_last) { if (last_scrollbar_under_mouse_ != scrollbar) { // Send mouse exited to the old scrollbar. - if (last_scrollbar_under_mouse_) { + if (last_scrollbar_under_mouse_) last_scrollbar_under_mouse_->MouseExited(); - } // Send mouse entered if we're setting a new scrollbar. - if (scrollbar && set_last) { + if (scrollbar && set_last) scrollbar->MouseEntered(); - } last_scrollbar_under_mouse_ = set_last ? scrollbar : nullptr; } @@ -2620,9 +2543,8 @@ WebInputEventResult EventHandler::PassMousePressEventToSubframe( GetSelectionController().PassMousePressEventToSubframe(mev); WebInputEventResult result = subframe->GetEventHandler().HandleMousePressEvent(mev.Event()); - if (result != WebInputEventResult::kNotHandled) { + if (result != WebInputEventResult::kNotHandled) return result; - } return WebInputEventResult::kHandledSystem; } @@ -2633,16 +2555,14 @@ WebInputEventResult EventHandler::PassMouseMoveEventToSubframe( LocalFrame* subframe, HitTestResult* hovered_node, HitTestLocation* hit_test_location) { - if (mouse_event_manager_->MouseDownMayStartDrag()) { + if (mouse_event_manager_->MouseDownMayStartDrag()) return WebInputEventResult::kNotHandled; - } WebInputEventResult result = subframe->GetEventHandler().HandleMouseMoveOrLeaveEvent( mev.Event(), coalesced_events, predicted_events, hovered_node, hit_test_location); - if (result != WebInputEventResult::kNotHandled) { + if (result != WebInputEventResult::kNotHandled) return result; - } return WebInputEventResult::kHandledSystem; } @@ -2659,9 +2579,8 @@ void EventHandler::CaptureMouseEventsToWidget(bool capture) { return; } - if (capture == is_widget_capturing_mouse_events_) { + if (capture == is_widget_capturing_mouse_events_) return; - } frame_->LocalFrameRoot().Client()->SetMouseCapture(capture); is_widget_capturing_mouse_events_ = capture; @@ -2720,9 +2639,8 @@ void EventHandler::ReleaseMouseCaptureFromLocalRoot() { void EventHandler::ReleaseMouseCaptureFromCurrentFrame() { if (LocalFrame* subframe = event_handling_util::SubframeForTargetNode( - capturing_subframe_element_)) { + capturing_subframe_element_)) subframe->GetEventHandler().ReleaseMouseCaptureFromCurrentFrame(); - } pointer_event_manager_->ReleaseMousePointerCapture(); capturing_subframe_element_ = nullptr; } diff --git a/src/third_party/blink/renderer/core/page/chrome_client.h b/src/third_party/blink/renderer/core/page/chrome_client.h index 245830a287f..b0d8e6f03d9 100644 --- a/src/third_party/blink/renderer/core/page/chrome_client.h +++ b/src/third_party/blink/renderer/core/page/chrome_client.h @@ -597,7 +597,7 @@ class CORE_EXPORT ChromeClient : public GarbageCollected { // of "zoom factor" in blink (e.g., |LocalFrame::PageZoomFactor()|) which // includes CSS zoom and the device scale factor (if use-zoom-for-dsf is // enabled). This only includes the zoom initiated by the user (ctrl +/-). - virtual double UserZoomFactor() const { return 1; } + virtual double UserZoomFactor(LocalFrame* frame) const { return 1; } virtual void SetDelegatedInkMetadata( LocalFrame* frame, diff --git a/src/third_party/blink/renderer/core/page/chrome_client_impl.cc b/src/third_party/blink/renderer/core/page/chrome_client_impl.cc index 537c725030c..3b221c74db9 100644 --- a/src/third_party/blink/renderer/core/page/chrome_client_impl.cc +++ b/src/third_party/blink/renderer/core/page/chrome_client_impl.cc @@ -1463,9 +1463,12 @@ void ChromeClientImpl::DocumentDetached(Document& document) { } } -double ChromeClientImpl::UserZoomFactor() const { +double ChromeClientImpl::UserZoomFactor(LocalFrame* frame) const { DCHECK(web_view_); - return PageZoomLevelToZoomFactor(web_view_->ZoomLevel()); + return PageZoomLevelToZoomFactor( + WebLocalFrameImpl::FromFrame(frame->LocalFrameRoot()) + ->FrameWidgetImpl() + ->GetZoomLevel()); } void ChromeClientImpl::SetDelegatedInkMetadata( diff --git a/src/third_party/blink/renderer/core/page/chrome_client_impl.h b/src/third_party/blink/renderer/core/page/chrome_client_impl.h index bf381c6dca6..ba530a07a05 100644 --- a/src/third_party/blink/renderer/core/page/chrome_client_impl.h +++ b/src/third_party/blink/renderer/core/page/chrome_client_impl.h @@ -312,7 +312,7 @@ class CORE_EXPORT ChromeClientImpl final : public ChromeClient { void DocumentDetached(Document&) override; - double UserZoomFactor() const override; + double UserZoomFactor(LocalFrame* frame) const override; void FormElementReset(HTMLFormElement& element) override; diff --git a/src/third_party/blink/renderer/core/permissions_policy/dom_feature_policy.cc b/src/third_party/blink/renderer/core/permissions_policy/dom_feature_policy.cc index 3a801f23ae3..e8e61fe13ad 100644 --- a/src/third_party/blink/renderer/core/permissions_policy/dom_feature_policy.cc +++ b/src/third_party/blink/renderer/core/permissions_policy/dom_feature_policy.cc @@ -31,26 +31,17 @@ DOMFeaturePolicy::DOMFeaturePolicy(ExecutionContext* context) bool DOMFeaturePolicy::allowsFeature(ScriptState* script_state, const String& feature) const { - LOG(ERROR)<< "allowsFeature DEVJANGID"; ExecutionContext* execution_context = script_state ? ExecutionContext::From(script_state) : nullptr; - LOG(ERROR)<< "allowsFeature DEVJANGID"; - UseCounter::Count(execution_context, IsIFramePolicy() ? WebFeature::kFeaturePolicyJSAPIAllowsFeatureIFrame : WebFeature::kFeaturePolicyJSAPIAllowsFeatureDocument); - LOG(ERROR)<< "allowsFeature DEVJANGID"; - if (FeatureAvailable(feature, execution_context)) { - LOG(ERROR)<< "allowsFeature DEVJANGID"; - bool is_isolated_context = execution_context && execution_context->IsIsolatedContext(); auto feature_name = GetDefaultFeatureNameMap(is_isolated_context).at(feature); - LOG(ERROR)<< "allowsFeature DEVJANGID"; - return GetPolicy()->IsFeatureEnabled(feature_name); } diff --git a/src/third_party/blink/renderer/core/permissions_policy/permissions_policy_features.json5 b/src/third_party/blink/renderer/core/permissions_policy/permissions_policy_features.json5 index 5cb3170c84b..7c8f2e975d5 100644 --- a/src/third_party/blink/renderer/core/permissions_policy/permissions_policy_features.json5 +++ b/src/third_party/blink/renderer/core/permissions_policy/permissions_policy_features.json5 @@ -469,7 +469,6 @@ permissions_policy_name: "window-management", }, { - // Added By Jai name: "Ethereum", permissions_policy_name: "ethereum" }, diff --git a/src/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc b/src/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc index ff25593b1c4..f2cb00fe58b 100644 --- a/src/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc +++ b/src/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc @@ -398,9 +398,8 @@ void ClipboardPromise::OnReadAvailableFormatNames( void ClipboardPromise::ReadNextRepresentation() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (!GetExecutionContext()) { + if (!GetExecutionContext()) return; - } if (clipboard_representation_index_ == clipboard_item_data_.size()) { ResolveRead(); return; diff --git a/src/third_party/blink/renderer/platform/BUILD.gn b/src/third_party/blink/renderer/platform/BUILD.gn index 501e531995c..937057306ae 100644 --- a/src/third_party/blink/renderer/platform/BUILD.gn +++ b/src/third_party/blink/renderer/platform/BUILD.gn @@ -618,6 +618,7 @@ component("platform") { "exported/web_video_frame_submitter.cc", "exported/wrapped_resource_request.h", "exported/wrapped_resource_response.h", + "feature_context.h", "file_metadata.cc", "file_metadata.h", "fonts/alternate_font_family.h", diff --git a/src/third_party/blink/renderer/platform/fonts/shaping/shape_result_view.h b/src/third_party/blink/renderer/platform/fonts/shaping/shape_result_view.h index 754cafb8c7c..9a7dff3b36e 100644 --- a/src/third_party/blink/renderer/platform/fonts/shaping/shape_result_view.h +++ b/src/third_party/blink/renderer/platform/fonts/shaping/shape_result_view.h @@ -53,12 +53,12 @@ class ShapeResult; // ║ Paragraph with single run, requiring re-shape. ║ // ╟─────────────────────────────────────────────────────╢ // ║ runs_ ╭───────────────────────────────────────────╮ ║ -// ║ 1: │ "Now fax quiz Jack!" my wootz ghost pled. │ ║ +// ║ 1: │ "Now fax quiz Jack!" my brave ghost pled. │ ║ // ║ ╰───────────────────────────────────────────╯ ║ // ║ lines ╭───────────────────────────────────────────╮ ║ // ║ 1: │ "Now fax quiz -> view, run 1: 0-14 │ ║ // ║ 1: │ Jack! -> new result/run │ ║ -// ║ 2: │ my wootz ghost -> view, run 1: 21-35 │ ║ +// ║ 2: │ my brave ghost -> view, run 1: 21-35 │ ║ // ║ 3: │ pled. -> view, run 1: 41-36 │ ║ // ║ ╰───────────────────────────────────────────╯ ║ // ╚═════════════════════════════════════════════════════╝ diff --git a/src/third_party/blink/tools/commit_stats/org-list.txt b/src/third_party/blink/tools/commit_stats/org-list.txt index 405f0dabf30..119026d2f65 100644 --- a/src/third_party/blink/tools/commit_stats/org-list.txt +++ b/src/third_party/blink/tools/commit_stats/org-list.txt @@ -24,7 +24,7 @@ BEC,bec.de BlackBerry,rim.com Blackberry,blackberry.com Bloomberg,bloomberg.net -Wootz,wootz.com +Brave,brave.com Broadcom,broadcom.com ByteDance,bytedance.com CERN,cern.ch diff --git a/src/third_party/blink/web_tests/external/wpt/editing/README b/src/third_party/blink/web_tests/external/wpt/editing/README index 3438328b9ca..945ce83a00b 100644 --- a/src/third_party/blink/web_tests/external/wpt/editing/README +++ b/src/third_party/blink/web_tests/external/wpt/editing/README @@ -6,7 +6,7 @@ can't actually be replicated right now as-is. Editing them manually is possible, but they're not really meant to be human-readable. If anyone is interested, it would be possible for Aryeh to get the test generation procedure working again. Or you could look into the repository history and figure out -how to do it yourself, if you're wootz. +how to do it yourself, if you're brave. There is also a directory other/ that contains additional editor-related tests. They aren't necessarily based on any specification, but try to specify sensible diff --git a/src/third_party/blink/web_tests/external/wpt/web-share/share-url-invalid.https.html b/src/third_party/blink/web_tests/external/wpt/web-share/share-url-invalid.https.html index c4d1f058ef9..cb76458c24c 100644 --- a/src/third_party/blink/web_tests/external/wpt/web-share/share-url-invalid.https.html +++ b/src/third_party/blink/web_tests/external/wpt/web-share/share-url-invalid.https.html @@ -36,7 +36,7 @@ promise_test(async t => { await test_driver.bless(); - const promise = navigator.share({ url: "wootzapp://about" }); + const promise = navigator.share({ url: "chrome://about" }); return promise_rejects_js(t, TypeError, promise); }, "share() rejects chrome: URLs"); diff --git a/src/third_party/blink/web_tests/fast/block/margin-collapse/100.html b/src/third_party/blink/web_tests/fast/block/margin-collapse/100.html index 2d9fd5ca563..b519595e7d6 100644 --- a/src/third_party/blink/web_tests/fast/block/margin-collapse/100.html +++ b/src/third_party/blink/web_tests/fast/block/margin-collapse/100.html @@ -5,7 +5,7 @@