diff --git a/.vpython b/.vpython new file mode 100644 index 0000000..32c1e56d --- /dev/null +++ b/.vpython
@@ -0,0 +1,428 @@ +# This is a vpython "spec" file. +# +# It describes patterns for python wheel dependencies of the python scripts in +# the chromium repo, particularly for dependencies that have compiled components +# (since pure-python dependencies can be easily vendored into third_party). +# +# When vpython is invoked, it finds this file and builds a python VirtualEnv, +# containing all of the dependencies described in this file, fetching them from +# CIPD (the "Chrome Infrastructure Package Deployer" service). Unlike `pip`, +# this never requires the end-user machine to have a working python extension +# compilation environment. All of these packages are built using: +# https://chromium.googlesource.com/infra/infra/+/main/infra/tools/dockerbuild/ +# +# All python scripts in the repo share this same spec, to avoid dependency +# fragmentation. +# +# If you have depot_tools installed in your $PATH, you can invoke python scripts +# in this repo by running them as you normally would run them, except +# substituting `vpython` instead of `python` on the command line, e.g.: +# vpython path/to/script.py some --arguments +# +# Read more about `vpython` and how to modify this file here: +# https://chromium.googlesource.com/infra/infra/+/main/doc/users/vpython.md +# +# For the definition of this spec, see: +# https://chromium.googlesource.com/infra/luci/luci-go/+/main/vpython/api/vpython/spec.proto + +python_version: "2.7" + +# The default set of platforms vpython checks does not yet include mac-arm64. +# Setting `verify_pep425_tag` to the list of platforms we explicitly must support +# allows us to ensure that vpython specs stay mac-arm64-friendly +verify_pep425_tag: [ + {python: "cp27", abi: "cp27mu", platform: "manylinux1_x86_64"}, + {python: "cp27", abi: "cp27mu", platform: "linux_arm64"}, + {python: "cp27", abi: "cp27mu", platform: "linux_armv6l"}, + + {python: "cp27", abi: "cp27m", platform: "macosx_10_10_intel"}, + {python: "cp27", abi: "cp27m", platform: "macosx_11_0_arm64"}, + + {python: "cp27", abi: "cp27m", platform: "win32"}, + {python: "cp27", abi: "cp27m", platform: "win_amd64"} +] + +# Used by: +# build/chromeos/test_runner.py +wheel: < + name: "infra/python/wheels/jsonlines-py2_py3" + version: "version:1.2.0" +> +wheel: < + name: "infra/python/wheels/subprocess32/${vpython_platform}" + version: "version:3.5.0rc1" + # Only download for linux since we shouldn't be running CrOS tests on mac/win. + match_tag: < + abi: "cp27mu" + platform: "manylinux1_i686" + > + match_tag: < + abi: "cp27mu" + platform: "manylinux1_x86_64" + > +> + +# Used by: +# build/chromeos/test_runner.py +# third_party/catapult +# +# This version must be compatible with the version range specified by +# //third_party/catapult/telemetry/telemetry/internal/util/external_modules.py +wheel: < + name: "infra/python/wheels/psutil/${vpython_platform}" + version: "version:5.8.0.chromium.3" +> + +# Used by: +# build/lacros/test_runner.py +wheel: < + name: "infra/python/wheels/parameterized-py2_py3" + version: "version:0.7.1" +> + +# Used by: +# third_party/catapult +# +# This version must be compatible with the version range specified by +# //third_party/catapult/telemetry/telemetry/internal/util/external_modules.py +# +# This version must also be compatible with the "numpy" version, as "cv2" +# depends on "numpy". In this case, OpenCV@2.4.13.2 has been built against +# numpy@1.11.3. +wheel: < + name: "infra/python/wheels/opencv_python/${vpython_platform}" + version: "version:2.4.13.2" + match_tag: < + platform: "win32" + > + match_tag: < + platform: "win_amd64" + > + match_tag: < + abi: "cp27mu" + platform: "manylinux1_i686" + > + match_tag: < + abi: "cp27mu" + platform: "manylinux1_x86_64" + > + match_tag: < + platform: "macosx_10_6_intel" + > +> + +# Used by: +# third_party/catapult +# +# This version must be compatible with the version range specified by +# //third_party/catapult/telemetry/telemetry/internal/util/external_modules.py +wheel: < + name: "infra/python/wheels/numpy/${vpython_platform}" + version: "version:1.11.3" +> + +# Used by: +# third_party/catapult +wheel: < + name: "infra/python/wheels/pypiwin32/${vpython_platform}" + version: "version:219" + match_tag: < + platform: "win32" + > + match_tag: < + platform: "win_amd64" + > +> + +# Used by: +# chrome/test/data/android/upload_download_utils_test.py +wheel: < + name: "infra/python/wheels/pyfakefs-py2_py3" + version: "version:3.7.2" +> + +# Used by: +# tools/perf/fetch_benchmark_deps.py +wheel: < + name: "infra/python/wheels/google_compute_engine-py2_py3" + version: "version:2.6.2" +> +wheel: < + name: "infra/python/wheels/boto-py2_py3" + version: "version:2.48.0" +> + +# Used by: +# testing/buildbot/generate_buildbot_json_coveragetest.py +wheel: < + name: "infra/python/wheels/coverage/${vpython_platform}" + version: "version:4.3.4" +> + +# Used by: +# build/android/pylib/local/emulator/avd.py +wheel: < + name: "infra/python/wheels/protobuf-py2_py3" + version: "version:3.6.1" +> +wheel: < + name: "infra/python/wheels/six-py2_py3" + version: "version:1.15.0" +> +wheel: < + name: "infra/python/wheels/pyftpdlib-py2_py3" + version: "version:0.7.0" +> +wheel: < + name: "infra/python/wheels/simplejson/${vpython_platform}" + version: "version:3.13.2" +> + +# Used by: +# tools/perf/core/results_dashboard.py +wheel: < + name: "infra/python/wheels/httplib2-py2_py3" + version: "version:0.10.3" +> + +# Used by: +# tools/perf/flakiness_cli +wheel: < + name: "infra/python/wheels/pandas/${vpython_platform}" + version: "version:0.23.4" + match_tag: < + platform: "win32" + > + match_tag: < + platform: "win_amd64" + > + match_tag: < + abi: "cp27mu" + platform: "manylinux1_i686" + > + match_tag: < + abi: "cp27mu" + platform: "manylinux1_x86_64" + > + match_tag: < + platform: "macosx_10_6_intel" + > +> +wheel: < + name: "infra/python/wheels/pytz-py2_py3" + version: "version:2018.4" +> +wheel: < + name: "infra/python/wheels/python-dateutil-py2_py3" + version: "version:2.7.3" +> + +# Used by: +# content/test/gpu/gpu_tests/color_profile_manager_mac.py +# Note: there's a version of this wheel for even older OS versions, +# but we don't need it for the GPU tests, and it looks like there are +# bugs in the not_match_tag implementation. +wheel: < + name: "infra/python/wheels/pyobjc/${vpython_platform}" + version: "version:4.1" + match_tag: < platform: "macosx_10_10_intel" > +> + +# Used by: +# third_party/catapult +wheel: < + name: "infra/python/wheels/six-py2_py3" + version: "version:1.15.0" +> +wheel: < + name: "infra/python/wheels/pbr-py2_py3" + version: "version:3.0.0" +> +wheel: < + name: "infra/python/wheels/funcsigs-py2_py3" + version: "version:1.0.2" +> +wheel: < + name: "infra/python/wheels/mock-py2_py3" + version: "version:2.0.0" +> + +# Used by: +# chrome/test/chromedriver/test/run_webdriver_tests.py + +wheel < + name: "infra/python/wheels/pytest-py2_py3" + version: "version:4.1.1" +> + +wheel < + name: "infra/python/wheels/attrs-py2_py3" + version: "version:18.2.0" +> + +wheel < + name: "infra/python/wheels/six-py2_py3" + version: "version:1.15.0" +> + +wheel < + name: "infra/python/wheels/more-itertools-py2_py3" + version: "version:4.1.0" +> + +wheel < + name: "infra/python/wheels/scandir/${vpython_platform}" + version: "version:1.9.0" +> + +wheel < + name: "infra/python/wheels/pluggy-py2_py3" + version: "version:0.8.1" +> + +wheel < + name: "infra/python/wheels/py-py2_py3" + version: "version:1.5.3" +> + +wheel < + name: "infra/python/wheels/funcsigs-py2_py3" + version: "version:1.0.2" +> + +# Used by: +# tools/infra +wheel: < + name: "infra/python/wheels/requests-py2_py3" + version: "version:2.13.0" +> +wheel: < + name: "infra/python/wheels/colorama-py2_py3" + version: "version:0.4.1" +> +wheel: < + name: "infra/python/wheels/mock-py2_py3" + version: "version:2.0.0" +> + +wheel: < + name: "infra/python/wheels/atomicwrites-py2_py3" + version: "version:1.3.0" +> + +wheel: < + name: "infra/python/wheels/pathlib2-py2_py3" + version: "version:2.3.3" +> + +# Used by Web Platform Tests (WPT) codebase in +# //third_party/blink/web_tests/external/wpt/tools/ +wheel: < + name: "infra/python/wheels/html5lib-py2_py3" + version: "version:1.0.1" +> +wheel: < + name: "infra/python/wheels/mozdebug-py2_py3" + version: "version:0.1.1" +> +wheel: < + name: "infra/python/wheels/mozinfo-py2_py3" + version: "version:1.1.0" +> +wheel: < + name: "infra/python/wheels/mozlog-py2_py3" + version: "version:7.1.0" +> +wheel: < + name: "infra/python/wheels/mozprocess-py2_py3" + version: "version:0.26" +> +wheel: < + name: "infra/python/wheels/urllib3-py2_py3" + version: "version:1.24.3" +> +wheel: < + name: "infra/python/wheels/blessings-py2_py3" + version: "version:1.7" +> +wheel: < + name: "infra/python/wheels/mozfile-py2_py3" + version: "version:2.0.0" +> +wheel: < + name: "infra/python/wheels/mozterm-py2_py3" + version: "version:1.0.0" +> +wheel: < + name: "infra/python/wheels/webencodings-py2_py3" + version: "version:0.5.1" +> +wheel: < + name: "infra/python/wheels/certifi-py2_py3" + version: "version:2020.11.8" +> +wheel: < + name: "infra/python/wheels/chardet-py2_py3" + version: "version:3.0.4" +> +wheel: < + name: "infra/python/wheels/idna-py2_py3" + version: "version:2.8" +> +wheel: < + name: "infra/python/wheels/pillow/${vpython_platform}" + version: "version:6.0.0" + match_tag: < + platform: "win32" + > + match_tag: < + platform: "win_amd64" + > + match_tag: < + abi: "cp27mu" + platform: "manylinux1_i686" + > + match_tag: < + abi: "cp27mu" + platform: "manylinux1_x86_64" + > + match_tag: < + platform: "macosx_10_6_intel" + > +> + +# Used by: +# //third_party/blink/tools/blinkpy/web_tests/port/server_process.py +wheel: < + name: "infra/python/wheels/pywin32/${vpython_platform}" + version: "version:227" + match_tag: < + platform: "win32" + > + match_tag: < + platform: "win_amd64" + > +> + +# Used by: +# //content/test/gpu +wheel: < + name: "infra/python/wheels/pathos/${vpython_platform}" + version: "version:0.2.7.chromium.5" + not_match_tag < + abi: "cp27mu" + platform: "manylinux1_i686" + > + not_match_tag < + abi: "cp27mu" + platform: "linux_mips64" + > + not_match_tag < + abi: "cp27mu" + platform: "linux_armv6l" + > + not_match_tag < + abi: "cp27mu" + platform: "linux_armv7l" + > +>
diff --git a/DEPS b/DEPS index fc0ed4fd..fce02ad 100644 --- a/DEPS +++ b/DEPS
@@ -297,15 +297,15 @@ # 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': '3a6e1b892c2ffd434eea7a5d36c624120d61e9df', + 'skia_revision': '5999b4e5381098e1834d5bfab453b0f1a0f73f88', # 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': 'bd7fc53b7e5bf4a21b35571e5063b4f821372cf9', + 'v8_revision': 'acd64a088d0cce09742922d5734f1342daa137ea', # 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': 'e3933465d88ffc5088c0dbdfaf416e3d828f13e7', + 'angle_revision': '4fdc37545da73405d3f00d14f3214b62b4bcc69a', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -368,7 +368,7 @@ # 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': '192679c0210b9529653073cc1d28fa47f444187d', + 'catapult_revision': '1157c80fa75f5b847d51b20e4c48fd4faadd30fb', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -376,7 +376,7 @@ # 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': 'b607ee6a69c0b8bc1c513ec7833927230d0c6209', + 'devtools_frontend_revision': '6bf92a7bd6e162df04d79878e96509ed708b90d6', # 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. @@ -412,7 +412,7 @@ # 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': 'f9a43b982d1e59213b313e0e5705bbf74818f621', + 'dawn_revision': '3b7e08857c85571e0f4f57266cd0d2d80cb47690', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -480,7 +480,7 @@ # If you change this, also update the libc++ revision in # //buildtools/deps_revisions.gni. - 'libcxx_revision': '476d5aefd9faf2ad50b09eb49b8be59b4cca97a6', + 'libcxx_revision': '6c8f712bc4430d582f00f7c341d768a38d8f9334', # GN CIPD package version. 'gn_version': 'git_revision:9ef321772ecc161937db69acb346397e0ccc484d', @@ -1584,7 +1584,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'c9aa8a4ab3b84294b6a08705d07aa7b7c200b049', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '049a4290ea53cc6797f5b1c433bbc5a21985ad77', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1754,7 +1754,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'e88fcf99da482fb22a3f90e0f74bed85d84e0f99', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '1985c0ab8f8b3bd3c2b6a96422d5284b8df9a8cd', + Var('webrtc_git') + '/src.git' + '@' + '5edefa87f74612ca07a5e2f148b373440cc57297', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1827,7 +1827,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@1fe4ac69ae7e2f1ad580533024531d88d9143be1', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@6710726aaf79426f4f373c7572035cedde4100b8', 'condition': 'checkout_src_internal', }, @@ -1879,7 +1879,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/projector_app/app', - 'version': 'vLmGzHPDuIRno3wJujAcLvPG-GoNlVbP5z3JYvE1-JUC', + 'version': 'VeFoLVxRGPYtMFxhWL2RbuIhieWqznvb3pM4G56W_qIC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -3687,6 +3687,20 @@ hooks = [ # Download and initialize "vpython" VirtualEnv environment packages for + # Python2. We do this before running any other hooks so that any other + # hooks that might use vpython don't trip over unexpected issues and + # don't run slower than they might otherwise need to. + { + 'name': 'vpython_common', + 'pattern': '.', + # TODO(https://crbug.com/1205263): Run this on mac/arm too once it works. + 'condition': 'not (host_os == "mac" and host_cpu == "arm64") and enable_vpython_common_crbug_1329052', + 'action': [ 'vpython', + '-vpython-spec', 'src/.vpython', + '-vpython-tool', 'install', + ], + }, + # Download and initialize "vpython" VirtualEnv environment packages for # Python3. We do this before running any other hooks so that any other # hooks that might use vpython don't trip over unexpected issues and # don't run slower than they might otherwise need to.
diff --git a/ash/components/login/auth/BUILD.gn b/ash/components/login/auth/BUILD.gn index bc6c772..2770990 100644 --- a/ash/components/login/auth/BUILD.gn +++ b/ash/components/login/auth/BUILD.gn
@@ -108,6 +108,8 @@ "mock_auth_performer.h", "mock_auth_status_consumer.cc", "mock_auth_status_consumer.h", + "mock_safe_mode_delegate.cc", + "mock_safe_mode_delegate.h", ] } @@ -116,6 +118,7 @@ testonly = true deps = [ ":auth", + ":test_support", "//ash/components/cryptohome", "//ash/components/login/auth", "//base", @@ -126,7 +129,9 @@ "//chromeos/ash/components/dbus/userdataauth:test_support", "//chromeos/ash/components/dbus/userdataauth:userdataauth_proto", "//chromeos/dbus/cryptohome", + "//chromeos/dbus/cryptohome:cryptohome_proto", "//components/account_id", + "//components/password_manager/core/browser:password_hash_data", "//components/prefs", "//components/prefs:test_support", "//components/user_manager", @@ -139,6 +144,7 @@ ] sources = [ "auth_performer_unittest.cc", + "auth_session_authenticator_unittest.cc", "challenge_response/cert_utils_unittest.cc", "public/key_unittest.cc", "public/operation_chain_runner_unittest.cc",
diff --git a/ash/components/login/auth/auth_performer.cc b/ash/components/login/auth/auth_performer.cc index 77bb672d..2eb8ce83c 100644 --- a/ash/components/login/auth/auth_performer.cc +++ b/ash/components/login/auth/auth_performer.cc
@@ -13,6 +13,7 @@ #include "ash/components/login/auth/public/user_context.h" #include "base/bind.h" #include "base/callback.h" +#include "base/check.h" #include "base/time/time.h" #include "chromeos/ash/components/dbus/userdataauth/userdataauth_client.h" #include "chromeos/dbus/cryptohome/UserDataAuth.pb.h" @@ -33,7 +34,9 @@ } // namespace AuthPerformer::AuthPerformer(base::raw_ptr<UserDataAuthClient> client) - : client_(client) {} + : client_(client) { + DCHECK(client_); +} AuthPerformer::~AuthPerformer() = default;
diff --git a/ash/components/login/auth/auth_session_authenticator.cc b/ash/components/login/auth/auth_session_authenticator.cc index df9bccba..99e3984 100644 --- a/ash/components/login/auth/auth_session_authenticator.cc +++ b/ash/components/login/auth/auth_session_authenticator.cc
@@ -16,6 +16,7 @@ #include "base/bind.h" #include "base/callback.h" #include "base/callback_helpers.h" +#include "base/check.h" #include "base/debug/crash_logging.h" #include "base/debug/dump_without_crashing.h" #include "base/notreached.h" @@ -39,7 +40,10 @@ auth_factor_editor_(std::make_unique<AuthFactorEditor>()), auth_performer_( std::make_unique<AuthPerformer>(UserDataAuthClient::Get())), - mount_performer_(std::make_unique<MountPerformer>()) {} + mount_performer_(std::make_unique<MountPerformer>()) { + DCHECK(safe_mode_delegate_); + DCHECK(!user_recorder_.is_null()); +} AuthSessionAuthenticator::~AuthSessionAuthenticator() = default;
diff --git a/ash/components/login/auth/auth_session_authenticator_unittest.cc b/ash/components/login/auth/auth_session_authenticator_unittest.cc new file mode 100644 index 0000000..83967d4b --- /dev/null +++ b/ash/components/login/auth/auth_session_authenticator_unittest.cc
@@ -0,0 +1,596 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/components/login/auth/auth_session_authenticator.h" + +#include <map> +#include <memory> +#include <string> +#include <utility> + +#include "ash/components/cryptohome/system_salt_getter.h" +#include "ash/components/login/auth/mock_auth_status_consumer.h" +#include "ash/components/login/auth/mock_safe_mode_delegate.h" +#include "ash/components/login/auth/public/auth_failure.h" +#include "ash/components/login/auth/public/cryptohome_key_constants.h" +#include "ash/components/login/auth/public/key.h" +#include "ash/components/login/auth/public/user_context.h" +#include "base/callback_helpers.h" +#include "base/check.h" +#include "base/memory/scoped_refptr.h" +#include "base/test/gmock_callback_support.h" +#include "base/test/task_environment.h" +#include "base/test/test_future.h" +#include "chromeos/ash/components/dbus/userdataauth/cryptohome_misc_client.h" +#include "chromeos/ash/components/dbus/userdataauth/mock_userdataauth_client.h" +#include "chromeos/ash/components/dbus/userdataauth/userdataauth_client.h" +#include "chromeos/dbus/cryptohome/UserDataAuth.pb.h" +#include "chromeos/dbus/cryptohome/key.pb.h" +#include "chromeos/dbus/cryptohome/rpc.pb.h" +#include "components/account_id/account_id.h" +#include "components/user_manager/user_type.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +using cryptohome::KeyData; +using testing::_; +using testing::AllOf; +using testing::AtMost; +using user_data_auth::AddCredentialsReply; +using user_data_auth::AUTH_SESSION_FLAGS_EPHEMERAL_USER; +using user_data_auth::AUTH_SESSION_FLAGS_NONE; +using user_data_auth::AuthenticateAuthSessionReply; +using user_data_auth::CreatePersistentUserReply; +using user_data_auth::PrepareEphemeralVaultReply; +using user_data_auth::PrepareGuestVaultReply; +using user_data_auth::PreparePersistentVaultReply; +using user_data_auth::RemoveReply; +using user_data_auth::StartAuthSessionReply; + +namespace ash { + +namespace { + +constexpr char kEmail[] = "fake-email@example.com"; +constexpr char kPassword[] = "pass"; +constexpr char kFirstAuthSessionId[] = "123"; +constexpr char kSecondAuthSessionId[] = "456"; + +// Matchers that verify the given cryptohome ...Request protobuf has the +// expected auth_session_id. +MATCHER(WithFirstAuthSessionId, "") { + return arg.auth_session_id() == kFirstAuthSessionId; +} + +MATCHER(WithSecondAuthSessionId, "") { + return arg.auth_session_id() == kSecondAuthSessionId; +} + +// Matcher for `StartAuthSessionRequest` that checks its account_id and flags. +MATCHER_P(WithAccountIdAndFlags, flags, "") { + return arg.account_id().account_id() == kEmail && + arg.flags() == static_cast<unsigned>(flags); +} + +// Matchers for `AuthenticateAuthSessionRequest` and `AddCredentialsRequest` +// that verify the key properties. +MATCHER_P(WithPasswordKey, expected_label, "") { + if (arg.authorization().key().data().type() != KeyData::KEY_TYPE_PASSWORD || + arg.authorization().key().data().label() != expected_label) { + return false; + } + // Validate the password is already hashed here. + EXPECT_NE(arg.authorization().key().secret(), ""); + EXPECT_NE(arg.authorization().key().secret(), kPassword); + return true; +} + +MATCHER(WithKioskKey, "") { + return arg.authorization().key().data().type() == KeyData::KEY_TYPE_KIOSK && + arg.authorization().key().data().label() == + kCryptohomePublicMountLabel; +} + +// GMock action that runs the callback (which is expected to be the second +// argument in the mocked function) with the given reply. +template <typename ReplyType> +auto ReplyWith(const ReplyType& reply) { + return base::test::RunOnceCallback<1>(reply); +} + +StartAuthSessionReply BuildStartReply( + const std::string& auth_session_id, + bool user_exists, + const std::map<std::string, KeyData>& keys) { + StartAuthSessionReply reply; + reply.set_auth_session_id(auth_session_id); + reply.set_user_exists(user_exists); + for (const auto& [key, data] : keys) + (*reply.mutable_key_label_data())[key] = data; + return reply; +} + +AuthenticateAuthSessionReply BuildAuthenticateSuccessReply() { + AuthenticateAuthSessionReply reply; + reply.set_authenticated(true); + return reply; +} + +AuthenticateAuthSessionReply BuildAuthenticateFailureReply() { + AuthenticateAuthSessionReply reply; + reply.set_authenticated(false); + reply.set_error(user_data_auth::CRYPTOHOME_ERROR_AUTHORIZATION_KEY_FAILED); + reply.mutable_error_info()->set_primary_action( + user_data_auth::PRIMARY_INCORRECT_AUTH); + return reply; +} + +} // namespace + +class AuthSessionAuthenticatorTest : public ::testing::Test { + protected: + const AccountId kAccountId = AccountId::FromUserEmail(kEmail); + + AuthSessionAuthenticatorTest() { + CryptohomeMiscClient::InitializeFake(); + chromeos::SystemSaltGetter::Initialize(); + EXPECT_CALL(auth_status_consumer_, OnAuthSuccess(_)) + .Times(AtMost(1)) + .WillOnce([this](const UserContext& user_context) { + on_auth_success_future_.SetValue(user_context); + }); + EXPECT_CALL(auth_status_consumer_, OnAuthFailure(_)) + .Times(AtMost(1)) + .WillOnce([this](const AuthFailure& error) { + on_auth_failure_future_.SetValue(error); + }); + EXPECT_CALL(auth_status_consumer_, OnPasswordChangeDetected(_)) + .Times(AtMost(1)) + .WillOnce([this](const UserContext& user_context) { + on_password_change_detected_future_.SetValue(user_context); + }); + EXPECT_CALL(auth_status_consumer_, OnOffTheRecordAuthSuccess()) + .Times(AtMost(1)) + .WillOnce([this]() { + on_off_the_record_auth_success_future_.SetValue(true); + }); + } + + ~AuthSessionAuthenticatorTest() override { + chromeos::SystemSaltGetter::Shutdown(); + CryptohomeMiscClient::Shutdown(); + } + + void CreateAuthenticator(bool is_ephemeral_mount_enforced) { + auto owned_safe_mode_delegate = std::make_unique<MockSafeModeDelegate>(); + safe_mode_delegate_ = owned_safe_mode_delegate.get(); + authenticator_ = base::MakeRefCounted<AuthSessionAuthenticator>( + &auth_status_consumer_, std::move(owned_safe_mode_delegate), + /*user_recorder=*/base::DoNothing(), is_ephemeral_mount_enforced); + } + + MockUserDataAuthClient& userdataauth() { return userdataauth_; } + + Authenticator& authenticator() { + DCHECK(authenticator_); + return *authenticator_; + } + + base::test::TestFuture<UserContext>& on_auth_success_future() { + return on_auth_success_future_; + } + base::test::TestFuture<AuthFailure>& on_auth_failure_future() { + return on_auth_failure_future_; + } + base::test::TestFuture<UserContext>& on_password_change_detected_future() { + return on_password_change_detected_future_; + } + base::test::TestFuture<bool>& on_off_the_record_auth_success_future() { + return on_off_the_record_auth_success_future_; + } + + private: + base::test::SingleThreadTaskEnvironment task_environment_; + base::test::TestFuture<UserContext> on_auth_success_future_; + base::test::TestFuture<AuthFailure> on_auth_failure_future_; + base::test::TestFuture<UserContext> on_password_change_detected_future_; + base::test::TestFuture<bool> on_off_the_record_auth_success_future_; + MockUserDataAuthClient userdataauth_; + MockAuthStatusConsumer auth_status_consumer_{ + /*quit_closure=*/base::DoNothing()}; + scoped_refptr<AuthSessionAuthenticator> authenticator_; + // Unowned (points to the object owned by `authenticator_`). + MockSafeModeDelegate* safe_mode_delegate_ = nullptr; +}; + +// Test the `CompleteLogin()` method in the new regular user scenario. +TEST_F(AuthSessionAuthenticatorTest, CompleteLoginRegularNew) { + // Arrange. + CreateAuthenticator(/*is_ephemeral_mount_enforced=*/false); + auto user_context = std::make_unique<UserContext>( + user_manager::USER_TYPE_REGULAR, kAccountId); + user_context->SetKey(Key(kPassword)); + EXPECT_CALL( + userdataauth(), + StartAuthSession(WithAccountIdAndFlags(AUTH_SESSION_FLAGS_NONE), _)) + .WillOnce(ReplyWith(BuildStartReply(kFirstAuthSessionId, + /*user_exists=*/false, + /*keys=*/{}))); + EXPECT_CALL(userdataauth(), CreatePersistentUser(WithFirstAuthSessionId(), _)) + .WillOnce(ReplyWith(CreatePersistentUserReply())); + EXPECT_CALL(userdataauth(), + PreparePersistentVault(WithFirstAuthSessionId(), _)) + .WillOnce(ReplyWith(PreparePersistentVaultReply())); + EXPECT_CALL(userdataauth(), + AddCredentials(AllOf(WithFirstAuthSessionId(), + WithPasswordKey(kCryptohomeGaiaKeyLabel)), + _)) + .WillOnce(ReplyWith(AddCredentialsReply())); + + // Act. + authenticator().CompleteLogin(std::move(user_context)); + const UserContext got_user_context = on_auth_success_future().Get(); + + // Assert. + EXPECT_EQ(got_user_context.GetAccountId(), kAccountId); + EXPECT_EQ(got_user_context.GetAuthSessionId(), kFirstAuthSessionId); +} + +// Test the `CompleteLogin()` method in the existing regular user scenario. +TEST_F(AuthSessionAuthenticatorTest, CompleteLoginRegularExisting) { + // Arrange. + CreateAuthenticator(/*is_ephemeral_mount_enforced=*/false); + auto user_context = std::make_unique<UserContext>( + user_manager::USER_TYPE_REGULAR, kAccountId); + user_context->SetKey(Key(kPassword)); + EXPECT_CALL( + userdataauth(), + StartAuthSession(WithAccountIdAndFlags(AUTH_SESSION_FLAGS_NONE), _)) + .WillOnce(ReplyWith( + BuildStartReply(kFirstAuthSessionId, /*user_exists=*/true, + /*keys=*/{{kCryptohomeGaiaKeyLabel, KeyData()}}))); + EXPECT_CALL( + userdataauth(), + AuthenticateAuthSession(AllOf(WithFirstAuthSessionId(), + WithPasswordKey(kCryptohomeGaiaKeyLabel)), + _)) + .WillOnce(ReplyWith(BuildAuthenticateSuccessReply())); + EXPECT_CALL(userdataauth(), + PreparePersistentVault(WithFirstAuthSessionId(), _)) + .WillOnce(ReplyWith(PreparePersistentVaultReply())); + + // Act. + authenticator().CompleteLogin(std::move(user_context)); + const UserContext got_user_context = on_auth_success_future().Get(); + + // Assert. + EXPECT_EQ(got_user_context.GetAccountId(), kAccountId); + EXPECT_EQ(got_user_context.GetAuthSessionId(), kFirstAuthSessionId); +} + +// Test the `CompleteLogin()` method in the password change scenario for the +// existing regular user. +TEST_F(AuthSessionAuthenticatorTest, + CompleteLoginRegularExistingPasswordChange) { + // Arrange. + CreateAuthenticator(/*is_ephemeral_mount_enforced=*/false); + auto user_context = std::make_unique<UserContext>( + user_manager::USER_TYPE_REGULAR, kAccountId); + user_context->SetKey(Key(kPassword)); + EXPECT_CALL( + userdataauth(), + StartAuthSession(WithAccountIdAndFlags(AUTH_SESSION_FLAGS_NONE), _)) + .WillOnce(ReplyWith( + BuildStartReply(kFirstAuthSessionId, + /*user_exists=*/true, + /*keys=*/{{kCryptohomeGaiaKeyLabel, KeyData()}}))); + // Set up the cryptohome authentication request to return a failure, since + // we're simulating the case when it only knows about the old password. + EXPECT_CALL( + userdataauth(), + AuthenticateAuthSession(AllOf(WithFirstAuthSessionId(), + WithPasswordKey(kCryptohomeGaiaKeyLabel)), + _)) + .WillOnce(ReplyWith(BuildAuthenticateFailureReply())); + + // Act. + authenticator().CompleteLogin(std::move(user_context)); + const UserContext got_user_context = + on_password_change_detected_future().Get(); + + // Assert. + EXPECT_EQ(got_user_context.GetAccountId(), kAccountId); + EXPECT_EQ(got_user_context.GetAuthSessionId(), kFirstAuthSessionId); +} + +// Test the `CompleteLogin()` method in the ephemeral user scenario. +TEST_F(AuthSessionAuthenticatorTest, CompleteLoginEphemeral) { + // Arrange. + CreateAuthenticator(/*is_ephemeral_mount_enforced=*/true); + auto user_context = std::make_unique<UserContext>( + user_manager::USER_TYPE_REGULAR, kAccountId); + user_context->SetKey(Key(kPassword)); + EXPECT_CALL(userdataauth(), + StartAuthSession( + WithAccountIdAndFlags(AUTH_SESSION_FLAGS_EPHEMERAL_USER), _)) + .WillOnce(ReplyWith(BuildStartReply(kFirstAuthSessionId, + /*user_exists=*/false, /*keys=*/{}))); + EXPECT_CALL(userdataauth(), + PrepareEphemeralVault(WithFirstAuthSessionId(), _)) + .WillOnce(ReplyWith(PrepareEphemeralVaultReply())); + EXPECT_CALL(userdataauth(), + AddCredentials(AllOf(WithFirstAuthSessionId(), + WithPasswordKey(kCryptohomeGaiaKeyLabel)), + _)) + .WillOnce(ReplyWith(AddCredentialsReply())); + + // Act. + authenticator().CompleteLogin(std::move(user_context)); + const UserContext got_user_context = on_auth_success_future().Get(); + + // Assert. + EXPECT_EQ(got_user_context.GetAccountId(), kAccountId); + EXPECT_EQ(got_user_context.GetAuthSessionId(), kFirstAuthSessionId); +} + +// Test the `CompleteLogin()` method in the scenario when an ephemeral login is +// requested while having stale persistent data for the same user. +TEST_F(AuthSessionAuthenticatorTest, CompleteLoginEphemeralStaleData) { + // Arrange. + CreateAuthenticator(/*is_ephemeral_mount_enforced=*/true); + auto user_context = std::make_unique<UserContext>( + user_manager::USER_TYPE_REGULAR, kAccountId); + user_context->SetKey(Key(kPassword)); + { + testing::InSequence seq; + EXPECT_CALL( + userdataauth(), + StartAuthSession( + WithAccountIdAndFlags(AUTH_SESSION_FLAGS_EPHEMERAL_USER), _)) + .WillOnce(ReplyWith(BuildStartReply(kFirstAuthSessionId, + /*user_exists=*/true, /*keys=*/{}))) + .RetiresOnSaturation(); + EXPECT_CALL(userdataauth(), Remove(WithFirstAuthSessionId(), _)) + .WillOnce(ReplyWith(RemoveReply())); + EXPECT_CALL( + userdataauth(), + StartAuthSession( + WithAccountIdAndFlags(AUTH_SESSION_FLAGS_EPHEMERAL_USER), _)) + .WillOnce(ReplyWith(BuildStartReply( + kSecondAuthSessionId, /*user_exists=*/false, /*keys=*/{}))); + EXPECT_CALL(userdataauth(), + PrepareEphemeralVault(WithSecondAuthSessionId(), _)) + .WillOnce(ReplyWith(PrepareEphemeralVaultReply())); + EXPECT_CALL(userdataauth(), + AddCredentials(AllOf(WithSecondAuthSessionId(), + WithPasswordKey(kCryptohomeGaiaKeyLabel)), + _)) + .WillOnce(ReplyWith(AddCredentialsReply())); + } + + // Act. + authenticator().CompleteLogin(std::move(user_context)); + const UserContext got_user_context = on_auth_success_future().Get(); + + // Assert. + EXPECT_EQ(got_user_context.GetAccountId(), kAccountId); + EXPECT_EQ(got_user_context.GetAuthSessionId(), kSecondAuthSessionId); +} + +// Test the `AuthenticateToLogin()` method in the successful scenario. +TEST_F(AuthSessionAuthenticatorTest, AuthenticateToLogin) { + // Arrange. + CreateAuthenticator(/*is_ephemeral_mount_enforced=*/false); + auto user_context = std::make_unique<UserContext>( + user_manager::USER_TYPE_REGULAR, kAccountId); + user_context->SetKey(Key(kPassword)); + EXPECT_CALL( + userdataauth(), + StartAuthSession(WithAccountIdAndFlags(AUTH_SESSION_FLAGS_NONE), _)) + .WillOnce(ReplyWith( + BuildStartReply(kFirstAuthSessionId, + /*user_exists=*/true, + /*keys=*/{{kCryptohomeGaiaKeyLabel, KeyData()}}))); + EXPECT_CALL( + userdataauth(), + AuthenticateAuthSession(AllOf(WithFirstAuthSessionId(), + WithPasswordKey(kCryptohomeGaiaKeyLabel)), + _)) + .WillOnce(ReplyWith(BuildAuthenticateSuccessReply())); + EXPECT_CALL(userdataauth(), + PreparePersistentVault(WithFirstAuthSessionId(), _)) + .WillOnce(ReplyWith(PreparePersistentVaultReply())); + + // Act. + authenticator().AuthenticateToLogin(std::move(user_context)); + const UserContext got_user_context = on_auth_success_future().Get(); + + // Assert. + EXPECT_EQ(got_user_context.GetAccountId(), kAccountId); + EXPECT_EQ(got_user_context.GetAuthSessionId(), kFirstAuthSessionId); +} + +// Test the `AuthenticateToLogin()` method in the authentication failure +// scenario. +TEST_F(AuthSessionAuthenticatorTest, AuthenticateToLoginAuthFailure) { + // Arrange. + CreateAuthenticator(/*is_ephemeral_mount_enforced=*/false); + auto user_context = std::make_unique<UserContext>( + user_manager::USER_TYPE_REGULAR, kAccountId); + user_context->SetKey(Key(kPassword)); + EXPECT_CALL( + userdataauth(), + StartAuthSession(WithAccountIdAndFlags(AUTH_SESSION_FLAGS_NONE), _)) + .WillOnce(ReplyWith( + BuildStartReply(kFirstAuthSessionId, /*user_exists=*/true, + /*keys=*/{{kCryptohomeGaiaKeyLabel, KeyData()}}))); + EXPECT_CALL( + userdataauth(), + AuthenticateAuthSession(AllOf(WithFirstAuthSessionId(), + WithPasswordKey(kCryptohomeGaiaKeyLabel)), + _)) + .WillOnce(ReplyWith(BuildAuthenticateFailureReply())); + + // Act. + authenticator().AuthenticateToLogin(std::move(user_context)); + const AuthFailure auth_failure = on_auth_failure_future().Get(); + + // Assert. + EXPECT_EQ(auth_failure.reason(), AuthFailure::COULD_NOT_MOUNT_CRYPTOHOME); +} + +// Test the `LoginOffTheRecord()` method in the successful scenario. +TEST_F(AuthSessionAuthenticatorTest, LoginOffTheRecord) { + // Arrange. + CreateAuthenticator(/*is_ephemeral_mount_enforced=*/false); + EXPECT_CALL(userdataauth(), PrepareGuestVault(_, _)) + .WillOnce(ReplyWith(PrepareGuestVaultReply())); + + // Act. + authenticator().LoginOffTheRecord(); + EXPECT_TRUE(on_off_the_record_auth_success_future().Wait()); +} + +// Test the `LoginAsPublicSession()` method in the successful scenario. +TEST_F(AuthSessionAuthenticatorTest, LoginAsPublicSession) { + // Arrange. + CreateAuthenticator(/*is_ephemeral_mount_enforced=*/false); + UserContext user_context(user_manager::USER_TYPE_PUBLIC_ACCOUNT, kAccountId); + EXPECT_CALL(userdataauth(), + StartAuthSession( + WithAccountIdAndFlags(AUTH_SESSION_FLAGS_EPHEMERAL_USER), _)) + .WillOnce(ReplyWith(BuildStartReply(kFirstAuthSessionId, + /*user_exists=*/false, /*keys=*/{}))); + EXPECT_CALL(userdataauth(), + PrepareEphemeralVault(WithFirstAuthSessionId(), _)) + .WillOnce(ReplyWith(PrepareEphemeralVaultReply())); + + // Act. + authenticator().LoginAsPublicSession(user_context); + const UserContext got_user_context = on_auth_success_future().Get(); + + // Assert. + EXPECT_EQ(got_user_context.GetAccountId(), kAccountId); + EXPECT_EQ(got_user_context.GetAuthSessionId(), kFirstAuthSessionId); +} + +// Test the `LoginAsKioskAccount()` method in the scenario when the kiosk +// homedir needs to be created. +TEST_F(AuthSessionAuthenticatorTest, LoginAsKioskAccountNew) { + // Arrange. + CreateAuthenticator(/*is_ephemeral_mount_enforced=*/false); + EXPECT_CALL( + userdataauth(), + StartAuthSession(WithAccountIdAndFlags(AUTH_SESSION_FLAGS_NONE), _)) + .WillOnce( + ReplyWith(BuildStartReply(kFirstAuthSessionId, /*user_exists=*/false, + /*keys=*/{}))); + EXPECT_CALL(userdataauth(), CreatePersistentUser(WithFirstAuthSessionId(), _)) + .WillOnce(ReplyWith(CreatePersistentUserReply())); + EXPECT_CALL(userdataauth(), + PreparePersistentVault(WithFirstAuthSessionId(), _)) + .WillOnce(ReplyWith(PreparePersistentVaultReply())); + EXPECT_CALL( + userdataauth(), + AddCredentials(AllOf(WithFirstAuthSessionId(), WithKioskKey()), _)) + .WillOnce(ReplyWith(AddCredentialsReply())); + + // Act. + authenticator().LoginAsKioskAccount(kAccountId); + const UserContext got_user_context = on_auth_success_future().Get(); + + // Assert. + EXPECT_EQ(got_user_context.GetAccountId(), kAccountId); + EXPECT_EQ(got_user_context.GetAuthSessionId(), kFirstAuthSessionId); +} + +// Test the `LoginAsKioskAccount()` method in the scenario when the kiosk +// homedir already exists. +TEST_F(AuthSessionAuthenticatorTest, LoginAsKioskAccountExisting) { + // Arrange. + CreateAuthenticator(/*is_ephemeral_mount_enforced=*/false); + KeyData key_data; + key_data.set_type(KeyData::KEY_TYPE_KIOSK); + EXPECT_CALL( + userdataauth(), + StartAuthSession(WithAccountIdAndFlags(AUTH_SESSION_FLAGS_NONE), _)) + .WillOnce(ReplyWith( + BuildStartReply(kFirstAuthSessionId, /*user_exists=*/true, + /*keys=*/{{kCryptohomePublicMountLabel, key_data}}))); + EXPECT_CALL(userdataauth(), + AuthenticateAuthSession( + AllOf(WithFirstAuthSessionId(), WithKioskKey()), _)) + .WillOnce(ReplyWith(BuildAuthenticateSuccessReply())); + EXPECT_CALL(userdataauth(), + PreparePersistentVault(WithFirstAuthSessionId(), _)) + .WillOnce(ReplyWith(PreparePersistentVaultReply())); + + // Act. + authenticator().LoginAsKioskAccount(kAccountId); + const UserContext got_user_context = on_auth_success_future().Get(); + + // Assert. + EXPECT_EQ(got_user_context.GetAccountId(), kAccountId); + EXPECT_EQ(got_user_context.GetAuthSessionId(), kFirstAuthSessionId); +} + +// Test the `LoginAsKioskAccount()` method in the ephemeral kiosk scenario. +TEST_F(AuthSessionAuthenticatorTest, LoginAsKioskAccountEphemeral) { + // Arrange. + CreateAuthenticator(/*is_ephemeral_mount_enforced=*/true); + EXPECT_CALL(userdataauth(), + StartAuthSession( + WithAccountIdAndFlags(AUTH_SESSION_FLAGS_EPHEMERAL_USER), _)) + .WillOnce(ReplyWith(BuildStartReply(kFirstAuthSessionId, + /*user_exists=*/false, /*keys=*/{}))); + EXPECT_CALL(userdataauth(), + PrepareEphemeralVault(WithFirstAuthSessionId(), _)) + .WillOnce(ReplyWith(PrepareEphemeralVaultReply())); + + // Act. + authenticator().LoginAsKioskAccount(kAccountId); + const UserContext got_user_context = on_auth_success_future().Get(); + + // Assert. + EXPECT_EQ(got_user_context.GetAccountId(), kAccountId); + EXPECT_EQ(got_user_context.GetAuthSessionId(), kFirstAuthSessionId); +} + +// Test the `LoginAsKioskAccount()` method in the scenario when an ephemeral +// kiosk is requested while having stale persistent data for the same user. +TEST_F(AuthSessionAuthenticatorTest, LoginAsKioskAccountEphemeralStaleData) { + // Arrange. + CreateAuthenticator(/*is_ephemeral_mount_enforced=*/true); + { + testing::InSequence seq; + EXPECT_CALL( + userdataauth(), + StartAuthSession( + WithAccountIdAndFlags(AUTH_SESSION_FLAGS_EPHEMERAL_USER), _)) + .WillOnce(ReplyWith(BuildStartReply(kFirstAuthSessionId, + /*user_exists=*/true, /*keys=*/{}))) + .RetiresOnSaturation(); + EXPECT_CALL(userdataauth(), Remove(WithFirstAuthSessionId(), _)) + .WillOnce(ReplyWith(RemoveReply())); + EXPECT_CALL( + userdataauth(), + StartAuthSession( + WithAccountIdAndFlags(AUTH_SESSION_FLAGS_EPHEMERAL_USER), _)) + .WillOnce(ReplyWith(BuildStartReply( + kSecondAuthSessionId, /*user_exists=*/false, /*keys=*/{}))); + EXPECT_CALL(userdataauth(), + PrepareEphemeralVault(WithSecondAuthSessionId(), _)) + .WillOnce(ReplyWith(PrepareEphemeralVaultReply())); + } + + // Act. + authenticator().LoginAsKioskAccount(kAccountId); + const UserContext got_user_context = on_auth_success_future().Get(); + + // Assert. + EXPECT_EQ(got_user_context.GetAccountId(), kAccountId); + EXPECT_EQ(got_user_context.GetAuthSessionId(), kSecondAuthSessionId); +} + +} // namespace ash
diff --git a/ash/components/login/auth/mock_safe_mode_delegate.cc b/ash/components/login/auth/mock_safe_mode_delegate.cc new file mode 100644 index 0000000..ab9abe8b --- /dev/null +++ b/ash/components/login/auth/mock_safe_mode_delegate.cc
@@ -0,0 +1,13 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/components/login/auth/mock_safe_mode_delegate.h" + +namespace ash { + +MockSafeModeDelegate::MockSafeModeDelegate() = default; + +MockSafeModeDelegate::~MockSafeModeDelegate() = default; + +} // namespace ash
diff --git a/ash/components/login/auth/mock_safe_mode_delegate.h b/ash/components/login/auth/mock_safe_mode_delegate.h new file mode 100644 index 0000000..db0e3eb --- /dev/null +++ b/ash/components/login/auth/mock_safe_mode_delegate.h
@@ -0,0 +1,29 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_COMPONENTS_LOGIN_AUTH_MOCK_SAFE_MODE_DELEGATE_H_ +#define ASH_COMPONENTS_LOGIN_AUTH_MOCK_SAFE_MODE_DELEGATE_H_ + +#include <string> + +#include "ash/components/login/auth/safe_mode_delegate.h" +#include "testing/gmock/include/gmock/gmock.h" + +namespace ash { + +class MockSafeModeDelegate : public SafeModeDelegate { + public: + MockSafeModeDelegate(); + ~MockSafeModeDelegate() override; + + MOCK_METHOD(bool, IsSafeMode, (), (override)); + MOCK_METHOD(void, + CheckSafeModeOwnership, + (const std::string& user_id_hash, IsOwnerCallback callback), + (override)); +}; + +} // namespace ash + +#endif // ASH_COMPONENTS_LOGIN_AUTH_MOCK_SAFE_MODE_DELEGATE_H_
diff --git a/ash/components/login/auth/public/BUILD.gn b/ash/components/login/auth/public/BUILD.gn index b477415d..809b4e42 100644 --- a/ash/components/login/auth/public/BUILD.gn +++ b/ash/components/login/auth/public/BUILD.gn
@@ -8,14 +8,16 @@ component("authpublic") { defines = [ "IS_ASH_LOGIN_AUTH_IMPL" ] - public_deps = [ ":challenge_response_key" ] + public_deps = [ + ":challenge_response_key", + "//components/password_manager/core/browser:password_hash_data", + ] deps = [ "//ash/components/cryptohome", "//ash/constants", "//base", "//chromeos/ash/components/dbus/userdataauth:userdataauth_proto", "//components/account_id", - "//components/password_manager/core/browser:password_hash_data", "//components/prefs", "//components/user_manager", "//crypto",
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc index 226f5db..bd92cae 100644 --- a/ash/constants/ash_features.cc +++ b/ash/constants/ash_features.cc
@@ -1122,11 +1122,6 @@ const base::Feature kOobeHidDetectionRevamp{"OobeHidDetectionRevamp", base::FEATURE_DISABLED_BY_DEFAULT}; -// Enables chrome://oobe/login url. The url seems not being used. The flag is a -// precaution in case it's actually used. -const base::Feature kOobeLoginUrl{"OobeLoginUrl", - base::FEATURE_DISABLED_BY_DEFAULT}; - // Enables or disables the Oobe quick start flow. const base::Feature kOobeQuickStart{"OobeQuickStart", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h index ac72ac95..b9d4599 100644 --- a/ash/constants/ash_features.h +++ b/ash/constants/ash_features.h
@@ -460,8 +460,6 @@ COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kOobeHidDetectionRevamp; COMPONENT_EXPORT(ASH_CONSTANTS) -extern const base::Feature kOobeLoginUrl; -COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kOobeQuickStart; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kOobeNewRecommendApps;
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb index f32e030c..5b3ee3c 100644 --- a/ash/strings/ash_strings_ar.xtb +++ b/ash/strings/ash_strings_ar.xtb
@@ -475,7 +475,8 @@ <translation id="371370241367527062">الميكروفون الأمامي</translation> <translation id="3713734891607377840">فتح الملف بعد اكتمال تنزيله</translation> <translation id="3726171378575546917">التطبيقات <ph name="UNAVAILABLE_APPS_ONE" /> و<ph name="UNAVAILABLE_APPS_TWO" /> و<ph name="UNAVAILABLE_APPS_COUNT" /> غير مثبَّتة على هذا الجهاز.</translation> -<translation id="3735740477244556633">ترتيب بحسب</translation> +<translation id="3735740477244556633">الترتيب حسب +</translation> <translation id="3742055079367172538">تم التقاط لقطة الشاشة</translation> <translation id="3761848338953536304">يطلب المشرف إيقاف ميزة قفل شريحة SIM.</translation> <translation id="3765841986579723851">تم تعديله اليوم.</translation> @@ -781,7 +782,7 @@ <translation id="5532994612895037630">انقر في أي مكان للتسجيل في وضع ملء الشاشة.</translation> <translation id="5536723544185013515">التطبيقات المُستخدَمة مؤخرًا: يمكنك التنقّل باستخدام السهم المتّجه لليمين أو لليسار للوصول إلى التطبيقات المُستخدَمة مؤخرًا.</translation> <translation id="553675580533261935">جارٍ الخروج من الجلسة</translation> -<translation id="5537725057119320332">إرسال</translation> +<translation id="5537725057119320332">بث</translation> <translation id="554893713779400387">تبديل الإملاء</translation> <translation id="5560420195677022218">يمكنك عرض إشعارات هاتفك على جهاز <ph name="DEVICE_TYPE" />.</translation> <translation id="556042886152191864">زر</translation>
diff --git a/ash/strings/ash_strings_az.xtb b/ash/strings/ash_strings_az.xtb index b26c89f3..902ebd2 100644 --- a/ash/strings/ash_strings_az.xtb +++ b/ash/strings/ash_strings_az.xtb
@@ -652,6 +652,7 @@ <translation id="4690510401873698237">Rəf aşağıdadır</translation> <translation id="4696813013609194136">Cihazı valideyn kodu ilə kiliddən çıxarın</translation> <translation id="4702647871202761252">Məxfilik ekranı deaktivdir</translation> +<translation id="470644585772471629">Rəng inversiyası</translation> <translation id="4717575069099566988">USB-C kabeliniz USB4'ü dəstəkləmir. Cihazın performansı məhdud ola bilər.</translation> <translation id="4730374152663651037">TEZ-TEZ İSTİFADƏ EDİLƏN</translation> <translation id="4731797938093519117">Valideyn girişi</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb index 43403500..86e8ce9 100644 --- a/ash/strings/ash_strings_bn.xtb +++ b/ash/strings/ash_strings_bn.xtb
@@ -27,6 +27,7 @@ <translation id="1111021433905331574">'সেটিংস' > <ph name="APP_TITLE" /> থেকে কীবোর্ড ব্যাকলাইটের রঙ পরিবর্তন করতে পারবেন</translation> <translation id="112308213915226829">তাককে স্বয়ংক্রিয়ভাবে লুকান</translation> <translation id="1142002900084379065">সাম্প্রতিক ফটো</translation> +<translation id="114451698114044150">অটোজুম চালু আছে।</translation> <translation id="1148499908455722006"><ph name="USER_NAME" />-এর জন্য অ্যাকাউন্টের তথ্য সহ ডায়ালগ খুলুন</translation> <translation id="1150989369772528668">ক্যালেন্ডার</translation> <translation id="1153356358378277386">যুক্ত করা ডিভাইসগুলি</translation> @@ -449,6 +450,7 @@ <translation id="3593039967545720377">ক্লিপবোর্ড ইতিহাস অ্যাক্সেস করতে এবং ক্লিপবোর্ড দেখতে <ph name="SHORTCUT_KEY_NAME" /> + V টিপুন। শুরু করতে আইটেম কপি করুন।</translation> <translation id="3593646411856133110">খুলে রাখা অ্যাপগুলি দেখার জন্য উপরের দিকে সোয়াইপ করে ধরে রাখুন</translation> <translation id="3595596368722241419">ব্যাটারি পুরো চার্জ</translation> +<translation id="3600061223661453002">বন্ধ আছে</translation> <translation id="3604801046548457007">ডেস্ক <ph name="DESK_TITILE" /> তৈরি করা হয়েছে</translation> <translation id="3606978283550408104">ব্রেইল প্রদর্শন সংযুক্ত হয়েছে৷</translation> <translation id="3615926715408477684">মোবাইল ডেটা চালু করা হলে ব্লুটুথও চালু হয়ে যাবে</translation> @@ -967,6 +969,7 @@ <translation id="6637729079642709226">ব্যবহারের মোট সময় পরিবর্তন করা</translation> <translation id="6641720045729354415">লাইভ ক্যাপশন টগল করুন। <ph name="STATE_TEXT" /></translation> <translation id="6643169293433369663">নাম অনুযায়ী বেছে নেওয়া সেটিং থেকে বেরিয়ে আগের অবস্থায় ফেরানো হয়েছে</translation> +<translation id="6649641931981131786">নিজেকে ফ্রেমের কেন্দ্রে রাখতে ক্যামেরা অ্যাডজাস্ট করুন।</translation> <translation id="6650072551060208490"><ph name="ORIGIN_NAME" /> আপনার পরিচয় যাচাই করতে চায়</translation> <translation id="6650933572246256093">ব্লুটুথ ডিভাইস "<ph name="DEVICE_NAME" />" যুক্ত করার অনুমতি চাইছে। ডিভাইসটিতে এই পাস কীটি দিন: <ph name="PASSKEY" /></translation> <translation id="6657585470893396449">পাসওয়ার্ড</translation> @@ -1008,6 +1011,7 @@ <translation id="685782768769951078">{NUM_DIGITS,plural, =1{আরও ১টি সংখ্যা লিখতে হবে}one{আরও #টি সংখ্যা লিখতে হবে}other{আরও #টি সংখ্যা লিখতে হবে}}</translation> <translation id="6867938213751067702"><ph name="FILENAME" /> ডাউনলোড পজ করা হয়েছে</translation> <translation id="6878400149835617132">শর্টকাট বন্ধ করা আছে</translation> +<translation id="6878709625737492815">অটোজুম বন্ধ আছে।</translation> <translation id="6884665277231944629">আজকের তারিখ বেছে নিন</translation> <translation id="6886172995547742638">আপনার <ph name="DEVICE_TYPE" />-এর পারফর্ম্যান্স আশানুরূপ নাও হতে পারে। একটি <ph name="PREFERRED_MINIMUM_POWER" />W অথবা আরও ভাল USB-C পাওয়ার অ্যাডাপ্টার ব্যবহার করুন।</translation> <translation id="688631446150864480">উইন্ডো পাল্টাতে, 'নিম্নমুখী তীরচিহ্ন' কী প্রেস করুন</translation> @@ -1087,6 +1091,7 @@ <translation id="7378203170292176219">রেকর্ড করতে ড্র্যাগ করে কিছুটা জায়গা বেছে নিন</translation> <translation id="7378594059915113390">মিডিয়ার নিয়ন্ত্রণ</translation> <translation id="7378889811480108604">'ব্যাটারি সেভার' মোড বন্ধ আছে</translation> +<translation id="7382680553121047388">চালু আছে</translation> <translation id="7384028040782072252">অ্যাপ নতুন করে সাজাতে, মাউস যেকোনও জায়গায় রেখে ডানদিকের বোতামে ক্লিক করুন</translation> <translation id="7392563512730092880">সেটিংস থেকে আপনি যখন খুশি সেট আপ করে নিতে পারেন।</translation> <translation id="7405710164030118432">ডিভাইসটি আনলক করতে আপনার Family Link-এর অভিভাবকীয় অ্যাক্সেস কোডটি লিখুন</translation> @@ -1170,6 +1175,7 @@ <translation id="7868900307798234037">আঙ্গুলের ছাপ দিয়ে আনলক করা হচ্ছে</translation> <translation id="7872195908557044066">আপনার অ্যাডমিনিস্ট্রেটর আপনার ই-সিম রিসেট করছেন। কয়েক মিনিট অপেক্ষা করুন।</translation> <translation id="7872786842639831132">বন্ধ আছে</translation> +<translation id="7875280185395705476">অটোজুম</translation> <translation id="7875575368831396199">মনে হচ্ছে যে আপনার <ph name="DEVICE_TYPE" /> ডিভাইসে ব্লুটুথ বন্ধ রয়েছে। 'ফোন হাব' ফিচারটি ব্যবহার করতে, ব্লুটুথ চালু করুন।</translation> <translation id="7877557217297072640">{0,plural, =0{এখনই ডিভাইসটি আগের ভার্সনে পরিবর্তন করুন}=1{১ সেকেন্ডের মধ্যে ডিভাইসটি আগের ভার্সনে পরিবর্তন করুন}one{# সেকেন্ডের মধ্যে ডিভাইসটি আগের ভার্সনে পরিবর্তন করুন}other{# সেকেন্ডের মধ্যে ডিভাইসটি আগের ভার্সনে পরিবর্তন করুন}}</translation> <translation id="7886169021410746335">গোপনীয়তা সেটিংস অ্যাডজাস্ট করুন</translation> @@ -1289,6 +1295,7 @@ <translation id="856298576161209842"><ph name="MANAGER" /> আপনার <ph name="DEVICE_TYPE" /> আপডেট করার সাজেশন দিচ্ছে</translation> <translation id="8563862697512465947">বিজ্ঞপ্তি সেটিংস</translation> <translation id="857201607579416096">স্ক্রিনের নিচে ডানদিকের কোণায় মেনু সরে গেছে।</translation> +<translation id="8576288697319745668">অটোজুম টগল করুন। <ph name="STATE_TEXT" /></translation> <translation id="8594115950068821369">-<ph name="FORMATTED_TIME" /></translation> <translation id="8598235756057743477">নাম বা রঙ অনুযায়ী অ্যাপ সাজান</translation> <translation id="8614517853887502247">ভিউ সংক্রান্ত নিরাপত্তা চালু থাকার জন্য <ph name="APP_1_TITLE" /> এবং <ph name="APP_2_TITLE" />-এর বিজ্ঞপ্তি লুকানো আছে</translation>
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb index 8b04cbb..f5fe8ba 100644 --- a/ash/strings/ash_strings_bs.xtb +++ b/ash/strings/ash_strings_bs.xtb
@@ -27,6 +27,7 @@ <translation id="1111021433905331574">Možete promijeniti boju pozadinskog svjetla tastature u Postavkama > <ph name="APP_TITLE" /></translation> <translation id="112308213915226829">Automatski sakrij policu</translation> <translation id="1142002900084379065">Nedavne fotografije</translation> +<translation id="114451698114044150">Automatsko zumiranje je uključeno.</translation> <translation id="1148499908455722006">Otvaranje informativnog dijaloškog okvira za korisnika <ph name="USER_NAME" /></translation> <translation id="1150989369772528668">Kalendar</translation> <translation id="1153356358378277386">Upareni uređaji</translation> @@ -449,6 +450,7 @@ <translation id="3593039967545720377">Pristupite historiji međumemorije pritiskom na <ph name="SHORTCUT_KEY_NAME" /> + V da vidite međumemoriju. Kopirajte stavku da započnete.</translation> <translation id="3593646411856133110">Prevucite prema gore i zadržite da vidite otvorene aplikacije</translation> <translation id="3595596368722241419">Baterija je puna</translation> +<translation id="3600061223661453002">Isključeno</translation> <translation id="3604801046548457007">Radna površina <ph name="DESK_TITILE" /> je kreirana</translation> <translation id="3606978283550408104">Brajev je redak povezan.</translation> <translation id="3615926715408477684">Omogućavanjem prijenosa podataka na mobilnoj mreži omogućit će se Bluetooth</translation> @@ -967,6 +969,7 @@ <translation id="6637729079642709226">Promjena vremena</translation> <translation id="6641720045729354415">Uključite/isključite Automatske titlove. <ph name="STATE_TEXT" /></translation> <translation id="6643169293433369663">Poništavanje načina sortiranja po nazivu</translation> +<translation id="6649641931981131786">Podesite kameru tako da budete u centru ekrana.</translation> <translation id="6650072551060208490"><ph name="ORIGIN_NAME" /> želi potvrditi vaš identitet</translation> <translation id="6650933572246256093">Bluetooth uređaj "<ph name="DEVICE_NAME" />" traži odobrenje za uparivanje. Unesite ovaj pristupni kôd na tom uređaju: <ph name="PASSKEY" /></translation> <translation id="6657585470893396449">Lozinka</translation> @@ -1008,6 +1011,7 @@ <translation id="685782768769951078">{NUM_DIGITS,plural, =1{Preostala je jedna cifra}one{Preostala je # cifra}few{Preostale su # cifre}other{Preostalo je # cifara}}</translation> <translation id="6867938213751067702">Pauzirano je preuzimanje fajla <ph name="FILENAME" /></translation> <translation id="6878400149835617132">Prečica je isključena</translation> +<translation id="6878709625737492815">Automatsko zumiranje je isključeno.</translation> <translation id="6884665277231944629">Vratite se na današnji datum</translation> <translation id="6886172995547742638">Vaš uređaj <ph name="DEVICE_TYPE" /> može funkcionirati uz slabije performanse. Koristite certificirani USB-C adapter za napajanje od <ph name="PREFERRED_MINIMUM_POWER" /> W ili jači.</translation> <translation id="688631446150864480">Pritisnite tipku strelice nadolje da se prebacite između prozora</translation> @@ -1087,6 +1091,7 @@ <translation id="7378203170292176219">Prevucite da odaberete oblast za snimanje</translation> <translation id="7378594059915113390">Upravljanje medijima</translation> <translation id="7378889811480108604">Način rada uštede baterije je isključen</translation> +<translation id="7382680553121047388">Uključeno</translation> <translation id="7384028040782072252">Kliknite desnim klikom bilo gdje da promijenite redoslijed aplikacija</translation> <translation id="7392563512730092880">Uvijek ga možete postaviti kasnije u Postavkama.</translation> <translation id="7405710164030118432">Da otključate uređaj, unesite kôd za pristup roditelja za Family Link</translation> @@ -1170,6 +1175,7 @@ <translation id="7868900307798234037">Otključavanje otiskom prsta</translation> <translation id="7872195908557044066">Vaš administrator vraća vaš eSIM na zadano. Pričekajte nekoliko minuta.</translation> <translation id="7872786842639831132">Isključeno</translation> +<translation id="7875280185395705476">Automatsko zumiranje</translation> <translation id="7875575368831396199">Izgleda da je Bluetooth isključen na vašem uređaju <ph name="DEVICE_TYPE" />. Uključite Bluetooth da koristite Phone Hub.</translation> <translation id="7877557217297072640">{0,plural, =0{Vratite uređaj na prethodnu verziju odmah}=1{Vratite uređaj na prethodnu verziju u roku od 1 sekunde}one{Vratite uređaj na prethodnu verziju u roku od # sekunde}few{Vratite uređaj na prethodnu verziju u roku od # sekunde}other{Vratite uređaj na prethodnu verziju u roku od # sekundi}}</translation> <translation id="7886169021410746335">Podesite postavke privatnosti</translation> @@ -1289,6 +1295,7 @@ <translation id="856298576161209842"><ph name="MANAGER" /> preporučuje da ažurirate uređaj <ph name="DEVICE_TYPE" /></translation> <translation id="8563862697512465947">Postavke obavijesti</translation> <translation id="857201607579416096">Meni je pomjeren u donji desni ugao ekrana.</translation> +<translation id="8576288697319745668">Uključi/isključi automatsko zumiranje. <ph name="STATE_TEXT" /></translation> <translation id="8594115950068821369">-<ph name="FORMATTED_TIME" /></translation> <translation id="8598235756057743477">Poredajte aplikacije po nazivu ili boji</translation> <translation id="8614517853887502247">Obavještenja aplikacije <ph name="APP_1_TITLE" /> i <ph name="APP_2_TITLE" /> su skrivena jer je uključena zaštita pregleda</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb index c8d703c..14f2c28 100644 --- a/ash/strings/ash_strings_ca.xtb +++ b/ash/strings/ash_strings_ca.xtb
@@ -306,6 +306,7 @@ <translation id="2805756323405976993">Aplicacions</translation> <translation id="2814448776515246190">Captura parcial</translation> <translation id="2819276065543622893">Ara se us tancarà la sessió.</translation> +<translation id="2822551631199737692">Càmera en ús</translation> <translation id="2825224105325558319"><ph name="DISPLAY_NAME" /> no admet la resolució <ph name="SPECIFIED_RESOLUTION" />. La resolució ha canviat a <ph name="FALLBACK_RESOLUTION" />.</translation> <translation id="2825619548187458965">Prestatge</translation> <translation id="2831035692318564937">Activat fins a l'alba</translation> @@ -807,6 +808,7 @@ <translation id="5682642926269496722">L'Assistent de Google no està disponible per al compte d'usuari actual.</translation> <translation id="5689633613396158040">Amb la funció Llum nocturna, és més fàcil mirar la pantalla i llegir-hi amb poca llum. Toca per canviar l'hora en què s'activa o per desactivar-la completament.</translation> <translation id="5691772641933328258">L'empremta digital no s'ha reconegut</translation> +<translation id="5693255400847650006">Micròfon en ús</translation> <translation id="570390244361237317">Totes les aplicacions, navega amb les tecles de fletxa per accedir a totes les aplicacions</translation> <translation id="5707775774148071965">El dispositiu admet una velocitat de transferència de dades més alta que el cable. És possible que el rendiment del dispositiu es vegi limitat.</translation> <translation id="5710450975648804523">Mode No molestis activat</translation> @@ -981,6 +983,7 @@ <translation id="6723839937902243910">Bateria</translation> <translation id="6727969043791803658">Connectat, <ph name="BATTERY_PERCENTAGE" />% de bateria</translation> <translation id="6732800389263199929">+ <ph name="COUNT" /></translation> +<translation id="6737983188036277605">Càmera i micròfon en ús</translation> <translation id="6739144137573853180">VES A CONFIGURACIÓ</translation> <translation id="6751052314767925245">Funció aplicada per l'administrador</translation> <translation id="6751826523481687655">La traça del rendiment està activada</translation>
diff --git a/ash/strings/ash_strings_cy.xtb b/ash/strings/ash_strings_cy.xtb index 27ddfa6..039a954 100644 --- a/ash/strings/ash_strings_cy.xtb +++ b/ash/strings/ash_strings_cy.xtb
@@ -306,6 +306,7 @@ <translation id="2805756323405976993">Apiau</translation> <translation id="2814448776515246190">Tynnu'n rhannol</translation> <translation id="2819276065543622893">Byddwch yn cael eich allgofnodi nawr.</translation> +<translation id="2822551631199737692">Mae'r camera yn cael ei ddefnyddio</translation> <translation id="2825224105325558319">Nid yw <ph name="DISPLAY_NAME" /> yn cefnogi <ph name="SPECIFIED_RESOLUTION" />. Newidiwyd y cydraniad i <ph name="FALLBACK_RESOLUTION" />.</translation> <translation id="2825619548187458965">Silff</translation> <translation id="2831035692318564937">Ymlaen tan godiad haul</translation> @@ -807,6 +808,7 @@ <translation id="5682642926269496722">Nid yw Google Assistant ar gael ar gyfer y cyfrif defnyddiwr presennol.</translation> <translation id="5689633613396158040">Mae Golau Nos yn ei gwneud yn haws edrych ar eich sgrîn neu ddarllen mewn golau gwan. Tapiwch i newid faint o'r gloch mae Golau Nos yn cael ei droi ymlaen neu ei ddiffodd yn llwyr.</translation> <translation id="5691772641933328258">Nid ydym yn adnabod yr ôl bys</translation> +<translation id="5693255400847650006">Mae'r meicroffon yn cael ei ddefnyddio</translation> <translation id="570390244361237317">Pob Ap, llywiwch gyda bysellau saeth i gyrchu pob ap</translation> <translation id="5707775774148071965">Mae eich dyfais yn cefnogi cyfradd data uwch na'ch cebl. Mae'n bosib y bydd perfformiad y ddyfais yn gyfyngedig.</translation> <translation id="5710450975648804523">Mae Peidiwch ag Aflonyddu wedi'i droi ymlaen</translation> @@ -981,6 +983,7 @@ <translation id="6723839937902243910">Pŵer</translation> <translation id="6727969043791803658">Wedi'i gysylltu, <ph name="BATTERY_PERCENTAGE" />% batri</translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6737983188036277605">Mae'r camera a'r meicroffon yn cael eu defnyddio</translation> <translation id="6739144137573853180">MYND I'R GOSODIADAU</translation> <translation id="6751052314767925245">Gorfodir gan eich gweinyddwr</translation> <translation id="6751826523481687655">Mae olrhain perfformiad wedi'i droi ymlaen</translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb index 84c7d06..43ff479f 100644 --- a/ash/strings/ash_strings_es-419.xtb +++ b/ash/strings/ash_strings_es-419.xtb
@@ -306,6 +306,7 @@ <translation id="2805756323405976993">Aplicaciones</translation> <translation id="2814448776515246190">Captura parcial</translation> <translation id="2819276065543622893">Saldrás de la sesión ahora.</translation> +<translation id="2822551631199737692">Cámara en uso</translation> <translation id="2825224105325558319"><ph name="DISPLAY_NAME" /> no admite una resolución de <ph name="SPECIFIED_RESOLUTION" />. Se cambió la resolución a <ph name="FALLBACK_RESOLUTION" />.</translation> <translation id="2825619548187458965">Biblioteca</translation> <translation id="2831035692318564937">Activado hasta el amanecer</translation> @@ -808,6 +809,7 @@ <translation id="5682642926269496722">El Asistente de Google no está disponible para la Cuenta de usuario actual.</translation> <translation id="5689633613396158040">La Luz nocturna te permite ver la pantalla o leer mejor con luz tenue. Presiona para cambiar el horario en el que se activa la Luz nocturna o desactívala por completo.</translation> <translation id="5691772641933328258">No se reconoció la huella dactilar</translation> +<translation id="5693255400847650006">Micrófono en uso</translation> <translation id="570390244361237317">Todas las apps, navega con las teclas de flechas para acceder a todas las apps</translation> <translation id="5707775774148071965">El dispositivo admite una mayor velocidad de datos que el cable. El rendimiento del dispositivo puede verse limitado.</translation> <translation id="5710450975648804523">"No interrumpir" activado</translation> @@ -982,6 +984,7 @@ <translation id="6723839937902243910">Alimentación</translation> <translation id="6727969043791803658">Conectado (batería: <ph name="BATTERY_PERCENTAGE" />%)</translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6737983188036277605">Cámara y micrófono en uso</translation> <translation id="6739144137573853180">IR A CONFIGURACIÓN</translation> <translation id="6751052314767925245">El administrador controla la función</translation> <translation id="6751826523481687655">Se activó el registro del rendimiento</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb index 7f467cf..4ec977a0 100644 --- a/ash/strings/ash_strings_fa.xtb +++ b/ash/strings/ash_strings_fa.xtb
@@ -306,6 +306,7 @@ <translation id="2805756323405976993">برنامهها</translation> <translation id="2814448776515246190">ضبط جزئی</translation> <translation id="2819276065543622893">هماکنون از سیستم خارج خواهید شد.</translation> +<translation id="2822551631199737692">دوربین درحال استفاده است</translation> <translation id="2825224105325558319"><ph name="DISPLAY_NAME" />، از <ph name="SPECIFIED_RESOLUTION" /> پشتیبانی نمیکند. وضوح به <ph name="FALLBACK_RESOLUTION" /> تغییر کرد.</translation> <translation id="2825619548187458965">قفسه</translation> <translation id="2831035692318564937">روشن تا طلوع آفتاب</translation> @@ -807,6 +808,7 @@ <translation id="5682642926269496722">«دستیار Google» برای حساب کاربری فعلی دردسترس نیست.</translation> <translation id="5689633613396158040">بااستفاده از «نور شب»، نگاه کردن به صفحهنمایش یا خواندن در نور کم آسانتر میشود. برای تغییر زمان روشن شدن «نور شب»، یا خاموش کردن آن بهطور کامل، ضربه بزنید.</translation> <translation id="5691772641933328258">اثر انگشت تشخیص داده نشد</translation> +<translation id="5693255400847650006">میکروفون درحال استفاده است</translation> <translation id="570390244361237317">همه برنامهها؛ برای دسترسی به همه برنامهها با کلیدهای جهتنما پیمایش کنید</translation> <translation id="5707775774148071965">دستگاه از سرعت انتقال داده بیشتری نسبت به کابلتان پشتیبانی میکند. ممکن است عملکرد دستگاه محدود شود.</translation> <translation id="5710450975648804523">«مزاحم نشوید» روشن است</translation> @@ -981,6 +983,7 @@ <translation id="6723839937902243910">نیرو</translation> <translation id="6727969043791803658">متصل، <ph name="BATTERY_PERCENTAGE" />٪ باتری</translation> <translation id="6732800389263199929">بیشاز <ph name="COUNT" /></translation> +<translation id="6737983188036277605">دوربین و میکروفون درحال استفاده هستند</translation> <translation id="6739144137573853180">رفتن به تنظیمات</translation> <translation id="6751052314767925245">بهاجبار اجراشده توسط سرپرست</translation> <translation id="6751826523481687655">ردیابی عملکرد روشن است</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb index 16c7949..fc3bf5a 100644 --- a/ash/strings/ash_strings_fil.xtb +++ b/ash/strings/ash_strings_fil.xtb
@@ -27,6 +27,7 @@ <translation id="1111021433905331574">Puwede mong baguhin ang kulay ng backlight ng iyong keyboard sa Mga Setting > <ph name="APP_TITLE" /></translation> <translation id="112308213915226829">Awtomatikong itago ang shelf</translation> <translation id="1142002900084379065">Mga pinakabagong larawan</translation> +<translation id="114451698114044150">Naka-on ang awtomatikong pag-zoom.</translation> <translation id="1148499908455722006">Buksan ang dialog ng impormasyon para sa <ph name="USER_NAME" /></translation> <translation id="1150989369772528668">Kalendaryo</translation> <translation id="1153356358378277386">Mga nakapares na device</translation> @@ -449,6 +450,7 @@ <translation id="3593039967545720377">I-access ang history ng iyong clipboard sa pamamagitan ng pagpindot sa <ph name="SHORTCUT_KEY_NAME" /> + V para tingnan ang clipboard mo. Kumopya ng item para magsimula.</translation> <translation id="3593646411856133110">Mag-swipe pataas at i-hold para makita ang mga nakabukas na app</translation> <translation id="3595596368722241419">Puno na ang baterya</translation> +<translation id="3600061223661453002">I-off</translation> <translation id="3604801046548457007">Ginawa ang Desk <ph name="DESK_TITILE" /></translation> <translation id="3606978283550408104">Nagkonekta ng braille display.</translation> <translation id="3615926715408477684">Kapag na-enable ang mobile data, mae-enable din ang Bluetooth</translation> @@ -650,6 +652,7 @@ <translation id="4690510401873698237">Nasa ibaba ang shelf</translation> <translation id="4696813013609194136">I-unlock ang device gamit ang parent code</translation> <translation id="4702647871202761252">Naka-off ang privacy screen</translation> +<translation id="470644585772471629">Pag-invert ng kulay</translation> <translation id="4717575069099566988">Hindi sinusuportahan ng iyong USB-C cable ang USB4. Posibleng maging limitado ang performance ng device.</translation> <translation id="4730374152663651037">MADALAS GAMITIN</translation> <translation id="4731797938093519117">Pangunahing access</translation> @@ -967,6 +970,7 @@ <translation id="6637729079642709226">Baguhin ang oras</translation> <translation id="6641720045729354415">I-toggle ang Instant Caption. <ph name="STATE_TEXT" /></translation> <translation id="6643169293433369663">I-undo ang ayos ng pagkakasunod-sunod ayon sa pangalan</translation> +<translation id="6649641931981131786">I-adjust ang camera para mapunta ka sa gitna ng screen.</translation> <translation id="6650072551060208490">Gustong kumpirmahin ng <ph name="ORIGIN_NAME" /> na ikaw ito</translation> <translation id="6650933572246256093">Gusto ng bluetooth device na "<ph name="DEVICE_NAME" />" ng pahintulot na magpares. Pakilagay ang passkey na ito sa device na iyon: <ph name="PASSKEY" /></translation> <translation id="6657585470893396449">Password</translation> @@ -1008,6 +1012,7 @@ <translation id="685782768769951078">{NUM_DIGITS,plural, =1{Isang digit na lang ang natitira}one{# digit na lang ang natitira}other{# na digit na lang ang natitira}}</translation> <translation id="6867938213751067702">Na-pause ang pag-download ng <ph name="FILENAME" /></translation> <translation id="6878400149835617132">Naka-off ang shortcut</translation> +<translation id="6878709625737492815">Naka-off ang awtomatikong pag-zoom.</translation> <translation id="6884665277231944629">Bumalik sa ngayong araw</translation> <translation id="6886172995547742638">Posibleng makaranas ang iyong <ph name="DEVICE_TYPE" /> ng hindi mahusay na performance. Gumamit ng certified na <ph name="PREFERRED_MINIMUM_POWER" />W o mas mataas na USB-C power adapter.</translation> <translation id="688631446150864480">Pindutin ang Pababang arrow key para lumipat ng mga window</translation> @@ -1087,6 +1092,7 @@ <translation id="7378203170292176219">Mag-drag para pumili ng bahaging ire-record</translation> <translation id="7378594059915113390">Mga Kontrol ng Media</translation> <translation id="7378889811480108604">Naka-off ang battery saver mode</translation> +<translation id="7382680553121047388">I-on</translation> <translation id="7384028040782072252">Mag-right click kahit saan para baguhin ang pagkakaayos ng iyong mga app</translation> <translation id="7392563512730092880">Puwede kang mag-set up sa ibang pagkakataon mula sa Mga Setting anumang oras.</translation> <translation id="7405710164030118432">Para i-unlock ang device, ilagay ang iyong access code ng magulang sa Family Link</translation> @@ -1170,6 +1176,7 @@ <translation id="7868900307798234037">Ina-unlock gamit ang fingerprint</translation> <translation id="7872195908557044066">Nire-reset ng iyong administrator ang eSIM mo. Maghintay nang ilang minuto.</translation> <translation id="7872786842639831132">Naka-off</translation> +<translation id="7875280185395705476">Autozoom</translation> <translation id="7875575368831396199">Mukhang naka-off ang Bluetooth sa iyong <ph name="DEVICE_TYPE" />. Paki-on ang Bluetooth para magamit ang Phone Hub.</translation> <translation id="7877557217297072640">{0,plural, =0{Ibalik sa nakaraang bersyon ang device ngayon}=1{Ibalik sa nakaraang bersyon ang device sa loob ng 1 segundo}one{Ibalik sa nakaraang bersyon ang device sa loob ng # segundo}other{Ibalik sa nakaraang bersyon ang device sa loob ng # na segundo}}</translation> <translation id="7886169021410746335">Isaayos ang mga setting ng privacy</translation> @@ -1289,6 +1296,7 @@ <translation id="856298576161209842">Inirerekomenda ng <ph name="MANAGER" /> na i-update mo ang iyong <ph name="DEVICE_TYPE" /></translation> <translation id="8563862697512465947">Mga Setting sa Abiso</translation> <translation id="857201607579416096">Inilipat ang menu sa kanang sulok sa ibaba ng screen.</translation> +<translation id="8576288697319745668">I-toggle ang awtomatikong pag-zoom. <ph name="STATE_TEXT" /></translation> <translation id="8594115950068821369">-<ph name="FORMATTED_TIME" /></translation> <translation id="8598235756057743477">Pagbukud-bukurin ang iyong mga app ayon sa pangalan o kulay</translation> <translation id="8614517853887502247">Nakatago ang mga notification sa <ph name="APP_1_TITLE" /> at <ph name="APP_2_TITLE" /> dahil naka-on ang proteksyon sa pagtingin</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb index a88a7f34..e8e22374 100644 --- a/ash/strings/ash_strings_hr.xtb +++ b/ash/strings/ash_strings_hr.xtb
@@ -27,6 +27,7 @@ <translation id="1111021433905331574">Boju pozadinskog osvjetljenja tipkovnice možete promijeniti u odjeljku Postavke > <ph name="APP_TITLE" /></translation> <translation id="112308213915226829">Automatski sakrij policu</translation> <translation id="1142002900084379065">Nedavne fotografije</translation> +<translation id="114451698114044150">Automatsko zumiranje je uključeno.</translation> <translation id="1148499908455722006">Otvorite dijaloški okvir s podacima o računu <ph name="USER_NAME" /></translation> <translation id="1150989369772528668">Kalendar</translation> <translation id="1153356358378277386">Upareni uređaji</translation> @@ -449,6 +450,7 @@ <translation id="3593039967545720377">Da biste pristupili povijesti međuspremnika i pregledali je, pritisnite <ph name="SHORTCUT_KEY_NAME" /> + V. Kopirajte stavku da biste započeli.</translation> <translation id="3593646411856133110">Prijeđite prstom prema gore i držite da biste vidjeli otvorene aplikacije</translation> <translation id="3595596368722241419">Baterija je puna</translation> +<translation id="3600061223661453002">Isključi</translation> <translation id="3604801046548457007">Izrađena je radna površina <ph name="DESK_TITILE" /></translation> <translation id="3606978283550408104">Brajev je redak povezan.</translation> <translation id="3615926715408477684">Omogućivanjem mobilnih podataka omogućit će se Bluetooth</translation> @@ -967,6 +969,7 @@ <translation id="6637729079642709226">Promijenite vrijeme</translation> <translation id="6641720045729354415">Uključite ili isključite automatske titlove. <ph name="STATE_TEXT" /></translation> <translation id="6643169293433369663">Poništavanje poretka po nazivu</translation> +<translation id="6649641931981131786">Prilagodite kameru da biste se postavili u središte zaslona.</translation> <translation id="6650072551060208490"><ph name="ORIGIN_NAME" /> želi potvrditi da ste to vi</translation> <translation id="6650933572246256093">Bluetooth uređaj "<ph name="DEVICE_NAME" />" traži dopuštenje za uparivanje. Unesite ovaj pristupni ključ na tom uređaju: <ph name="PASSKEY" /></translation> <translation id="6657585470893396449">Zaporka</translation> @@ -1008,6 +1011,7 @@ <translation id="685782768769951078">{NUM_DIGITS,plural, =1{Preostala jedna brojka}one{Preostala # brojka}few{Preostale # brojke}other{Preostalo # brojki}}</translation> <translation id="6867938213751067702">Pauzirano je preuzimanje datoteke <ph name="FILENAME" /></translation> <translation id="6878400149835617132">Prečac je isključen</translation> +<translation id="6878709625737492815">Automatsko zumiranje je isključeno.</translation> <translation id="6884665277231944629">Povratak na današnji datum</translation> <translation id="6886172995547742638">Uređaj <ph name="DEVICE_TYPE" /> može pokazati slabiju izvedbu. Upotrebljavajte certificirani pretvarač napona USB-C od najmanje <ph name="PREFERRED_MINIMUM_POWER" /> W.</translation> <translation id="688631446150864480">Pritisnite tipku strelice prema dolje da biste prešli na drugi prozor</translation> @@ -1087,6 +1091,7 @@ <translation id="7378203170292176219">Povucite da biste odabrali područje za snimanje</translation> <translation id="7378594059915113390">Medijske kontrole</translation> <translation id="7378889811480108604">Način štednje baterije je isključen</translation> +<translation id="7382680553121047388">Uključi</translation> <translation id="7384028040782072252">Kliknite desnom tipkom bilo gdje da biste promijenili redoslijed svojih aplikacija</translation> <translation id="7392563512730092880">Tu značajku možete postaviti i kasnije u Postavkama.</translation> <translation id="7405710164030118432">Da biste otključali uređaj, unesite kôd za roditeljski pristup Family Linka</translation> @@ -1170,6 +1175,7 @@ <translation id="7868900307798234037">Otključavanje otiskom prsta</translation> <translation id="7872195908557044066">Vaš administrator vraća vaš eSIM na zadano. Pričekajte nekoliko minuta.</translation> <translation id="7872786842639831132">Isključeno</translation> +<translation id="7875280185395705476">Aut. zumiranje</translation> <translation id="7875575368831396199">Čini se da je na vašem uređaju <ph name="DEVICE_TYPE" /> isključen Bluetooth. Da biste mogli upotrebljavati Phone hub, uključite Bluetooth.</translation> <translation id="7877557217297072640">{0,plural, =0{Odmah vratite uređaj na prethodnu verziju}=1{Vratite uređaj na prethodnu verziju u roku od 1 s}one{Vratite uređaj na prethodnu verziju u roku od # s}few{Vratite uređaj na prethodnu verziju u roku od # s}other{Vratite uređaj na prethodnu verziju u roku od # s}}</translation> <translation id="7886169021410746335">Prilagodba postavki privatnosti</translation> @@ -1289,6 +1295,7 @@ <translation id="856298576161209842"><ph name="MANAGER" /> preporučuje da ažurirate svoj uređaj <ph name="DEVICE_TYPE" />.</translation> <translation id="8563862697512465947">Postavke obavijesti</translation> <translation id="857201607579416096">Izbornik je premješten u donji desni kut zaslona.</translation> +<translation id="8576288697319745668">Uključite ili isključite automatsko zumiranje. <ph name="STATE_TEXT" /></translation> <translation id="8594115950068821369">-<ph name="FORMATTED_TIME" /></translation> <translation id="8598235756057743477">Poredajte aplikacije po nazivu ili po boji</translation> <translation id="8614517853887502247">Obavijesti aplikacija <ph name="APP_1_TITLE" /> i <ph name="APP_2_TITLE" /> skrivene su jer je uključena zaštita prikaza.</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb index 7e6a50b..d2404fc5 100644 --- a/ash/strings/ash_strings_id.xtb +++ b/ash/strings/ash_strings_id.xtb
@@ -306,6 +306,7 @@ <translation id="2805756323405976993">Apl</translation> <translation id="2814448776515246190">Tangkapan layar sebagian</translation> <translation id="2819276065543622893">Anda akan dikeluarkan sekarang.</translation> +<translation id="2822551631199737692">Kamera sedang digunakan</translation> <translation id="2825224105325558319"><ph name="DISPLAY_NAME" /> tidak mendukung <ph name="SPECIFIED_RESOLUTION" />. Resolusi diubah ke <ph name="FALLBACK_RESOLUTION" />.</translation> <translation id="2825619548187458965">Rak</translation> <translation id="2831035692318564937">Aktif sampai matahari terbit</translation> @@ -807,6 +808,7 @@ <translation id="5682642926269496722">Asisten Google tidak tersedia untuk akun pengguna saat ini.</translation> <translation id="5689633613396158040">Cahaya Malam memudahkan Anda melihat layar atau membaca saat cahaya redup. Ketuk untuk mengubah waktu pengaktifan Cahaya Malam atau menonaktifkannya sepenuhnya.</translation> <translation id="5691772641933328258">Sidik jari tidak dikenali</translation> +<translation id="5693255400847650006">Mikrofon sedang digunakan</translation> <translation id="570390244361237317">Semua Aplikasi, navigasikan dengan tombol panah untuk mengakses semua aplikasi</translation> <translation id="5707775774148071965">Perangkat mendukung kecepatan data yang lebih tinggi daripada kabel. Performa perangkat mungkin dibatasi.</translation> <translation id="5710450975648804523">Mode Jangan Ganggu aktif</translation> @@ -981,6 +983,7 @@ <translation id="6723839937902243910">Daya</translation> <translation id="6727969043791803658">Terhubung, baterai <ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6737983188036277605">Kamera dan mikrofon sedang digunakan</translation> <translation id="6739144137573853180">BUKA SETELAN</translation> <translation id="6751052314767925245">Diterapkan oleh administrator Anda</translation> <translation id="6751826523481687655">Pelacakan performa diaktifkan</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb index ed7e469..b03d4e6 100644 --- a/ash/strings/ash_strings_ja.xtb +++ b/ash/strings/ash_strings_ja.xtb
@@ -306,6 +306,7 @@ <translation id="2805756323405976993">アプリ</translation> <translation id="2814448776515246190">画面の一部のキャプチャ</translation> <translation id="2819276065543622893">ログアウトします。</translation> +<translation id="2822551631199737692">カメラを使用中</translation> <translation id="2825224105325558319"><ph name="DISPLAY_NAME" /> は <ph name="SPECIFIED_RESOLUTION" /> に対応していません。解像度を <ph name="FALLBACK_RESOLUTION" /> に変更しました。</translation> <translation id="2825619548187458965">シェルフ</translation> <translation id="2831035692318564937">日の出までオン</translation> @@ -807,6 +808,7 @@ <translation id="5682642926269496722">Google アシスタントは、現在のユーザー アカウントではご利用いただけません。</translation> <translation id="5689633613396158040">夜間モードを利用すると、薄明かりの下でも画面が見やすくなります。タップして、夜間モードをオンにする時間を変更したり、完全にオフにしたりできます。</translation> <translation id="5691772641933328258">指紋を認識できません</translation> +<translation id="5693255400847650006">マイクを使用中</translation> <translation id="570390244361237317">すべてのアプリ、矢印キーで操作して、すべてのアプリにアクセスできます</translation> <translation id="5707775774148071965">ケーブルの対応データレートがデバイスより低くなっています。デバイスのパフォーマンスが制限される可能性があります。</translation> <translation id="5710450975648804523">サイレント モードがオンになっています</translation> @@ -981,6 +983,7 @@ <translation id="6723839937902243910">電源</translation> <translation id="6727969043791803658">接続済み、<ph name="BATTERY_PERCENTAGE" />% のバッテリー残量</translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6737983188036277605">カメラとマイクを使用中</translation> <translation id="6739144137573853180">設定に移動</translation> <translation id="6751052314767925245">管理者によって適用</translation> <translation id="6751826523481687655">パフォーマンス追跡機能が有効になっています</translation>
diff --git a/ash/strings/ash_strings_ka.xtb b/ash/strings/ash_strings_ka.xtb index c33877e..e316f424 100644 --- a/ash/strings/ash_strings_ka.xtb +++ b/ash/strings/ash_strings_ka.xtb
@@ -27,6 +27,7 @@ <translation id="1111021433905331574">თქვენი კლავიატურის ფონური განათების ფერის შეცვლა შეგიძლიათ აქ: პარამეტრები > <ph name="APP_TITLE" /></translation> <translation id="112308213915226829">shelf თვითდამალვა</translation> <translation id="1142002900084379065">ბოლოდროინდელი ფოტოები</translation> +<translation id="114451698114044150">ავტომატური მასშტაბირება ჩართულია.</translation> <translation id="1148499908455722006">საინფორმაციო დიალოგის გახსნა <ph name="USER_NAME" />-ისთვის</translation> <translation id="1150989369772528668">კალენდარი</translation> <translation id="1153356358378277386">დაწყვილებული მოწყობილობები</translation> @@ -449,6 +450,7 @@ <translation id="3593039967545720377">თქვენი გაცვლის ბუფერის ისტორიაზე წვდომისთვის და გაცვლის ბუფერის სანახავად დააჭირეთ კლავიშთა კომბინაციას <ph name="SHORTCUT_KEY_NAME" /> + V. დასაწყებად დააკოპირეთ ერთეული.</translation> <translation id="3593646411856133110">გახსნილი აპების სანახავად გადაფურცლეთ ზემოთ და არ აუშვათ</translation> <translation id="3595596368722241419">ბატარეა სავსეა</translation> +<translation id="3600061223661453002">გამორთვა</translation> <translation id="3604801046548457007">სამუშაო მაგიდა <ph name="DESK_TITILE" /> შექმნილია</translation> <translation id="3606978283550408104">ბრაილის დისპლეი შეერთებულია.</translation> <translation id="3615926715408477684">მობილური ინტერნეტის ჩართვის შემთხვევაში, ჩაირთვება Bluetooth</translation> @@ -967,6 +969,7 @@ <translation id="6637729079642709226">დროის შეცვლა</translation> <translation id="6641720045729354415">ავტოსუბტიტრების გადართვა. <ph name="STATE_TEXT" /></translation> <translation id="6643169293433369663">სახელის მიხედვით დალაგების გაუქმება</translation> +<translation id="6649641931981131786">დააკორექტირეთ კამერა ისე, რომ ეკრანის ცენტრში მოექცეთ.</translation> <translation id="6650072551060208490"><ph name="ORIGIN_NAME" /> ითხოვს თქვენი ვინაობის დადასტურებას</translation> <translation id="6650933572246256093">Bluetooth მოწყობილობა „<ph name="DEVICE_NAME" />“ მოითხოვს დაწყვილების ნებართვას. შეიყვანეთ ეს საიდუმლო ფრაზა მოწყობილობაში: <ph name="PASSKEY" /></translation> <translation id="6657585470893396449">პაროლი</translation> @@ -1008,6 +1011,7 @@ <translation id="685782768769951078">{NUM_DIGITS,plural, =1{დარჩენილია 1 ციფრი}other{დარჩენილია # ციფრი}}</translation> <translation id="6867938213751067702">ჩამოტვირთვა დაპაუზებულია <ph name="FILENAME" /></translation> <translation id="6878400149835617132">მალსახმობი გამოირთო</translation> +<translation id="6878709625737492815">ავტომატური მასშტაბირება გამორთულია.</translation> <translation id="6884665277231944629">დღევანდელ დღეზე დაბრუნება</translation> <translation id="6886172995547742638">თქვენმა <ph name="DEVICE_TYPE" />-მა შეიძლება უფრო დაბალი წარმადობით იმუშაოს. გამოიყენეთ სერტიფიცირებული <ph name="PREFERRED_MINIMUM_POWER" /> ვტ-იანი ან უფრო მაღალი სიმძლავრის USB-C ელკვების ადაპტერი.</translation> <translation id="688631446150864480">ფანჯრებს შორის გადასართავად დააჭირეთ კლავიშს ქვემოთ მიმართული ისრით</translation> @@ -1087,6 +1091,7 @@ <translation id="7378203170292176219">ჩავლებით გადაიტანეთ, ჩასაწერი არე რომ აირჩიოთ</translation> <translation id="7378594059915113390">მედიის მართვის საშუალებები</translation> <translation id="7378889811480108604">ბატარეის დამზოგის რეჟიმი გამორთულია</translation> +<translation id="7382680553121047388">ჩართვა</translation> <translation id="7384028040782072252">აპების გადასალაგებლად დააწკაპუნეთ მარჯვენა ღილაკით ნებისმიერ ადგილას</translation> <translation id="7392563512730092880">დაყენება მოგვიანებითაც შეგიძლიათ პარამეტრებიდან.</translation> <translation id="7405710164030118432">მოწყობილობის განსაბლოკად შეიყვანეთ Family Link-ის წვდომის კოდი მშობლებისთვის</translation> @@ -1170,6 +1175,7 @@ <translation id="7868900307798234037">მიმდინარეობს თითის ანაბეჭდით განბლოკვა</translation> <translation id="7872195908557044066">ადმინისტრატორი ახორციელებს თქვენი eSIM-ის გადაყენებას. მოითმინეთ რამდენიმე წუთი.</translation> <translation id="7872786842639831132">გამორთვა</translation> +<translation id="7875280185395705476">ავტომატური მასშტაბირება</translation> <translation id="7875575368831396199">როგორც ჩანს, თქვენს <ph name="DEVICE_TYPE" />-ზე გამორთულია Bluetooth. ტელეფონის ცენტრის გამოსაყენებლად ჩართეთ Bluetooth.</translation> <translation id="7877557217297072640">{0,plural, =0{დააბრუნეთ მოწყობილობა წინა ვერსიაზე ახლავე}=1{დააბრუნეთ მოწყობილობა წინა ვერსიაზე 1 წამის განმავლობაში}other{დააბრუნეთ მოწყობილობა წინა ვერსიაზე # წამის განმავლობაში}}</translation> <translation id="7886169021410746335">კონფიდენციალურობის პარამეტრების კორექტირება</translation> @@ -1289,6 +1295,7 @@ <translation id="856298576161209842"><ph name="MANAGER" /> გირჩევთ, განაახლოთ თქვენი <ph name="DEVICE_TYPE" /></translation> <translation id="8563862697512465947">შეტყობინების პარამეტრები</translation> <translation id="857201607579416096">მენიუ გადატანილია ეკრანის ქვედა მარჯვენა კუთხეში.</translation> +<translation id="8576288697319745668">ავტომატური მასშტაბირების გადართვა. <ph name="STATE_TEXT" /></translation> <translation id="8594115950068821369">-<ph name="FORMATTED_TIME" /></translation> <translation id="8598235756057743477">დაალაგეთ თქვენი აპები სახელის ან ფერის მიხედვით</translation> <translation id="8614517853887502247"><ph name="APP_1_TITLE" />-ისა და <ph name="APP_2_TITLE" />-ის შეტყობინებები დამალულია, რადგან ჩართულია ნახვის დაცვა</translation>
diff --git a/ash/strings/ash_strings_km.xtb b/ash/strings/ash_strings_km.xtb index 97a2867b0..d2712a11 100644 --- a/ash/strings/ash_strings_km.xtb +++ b/ash/strings/ash_strings_km.xtb
@@ -27,6 +27,7 @@ <translation id="1111021433905331574">អ្នកអាចប្ដូរពណ៌ពន្លឺផ្នែកខាងក្រោយនៃក្ដារចុចរបស់អ្នកនៅក្នុងការកំណត់ > <ph name="APP_TITLE" /></translation> <translation id="112308213915226829">លាក់ធ្នើដោយស្វ័យប្រវត្តិ</translation> <translation id="1142002900084379065">រូបថតថ្មីៗ</translation> +<translation id="114451698114044150">មុខងារពង្រីកដោយស្វ័យប្រវត្តិត្រូវបានបើក។</translation> <translation id="1148499908455722006">បើកប្រអប់ព័ត៌មានសម្រាប់ <ph name="USER_NAME" /></translation> <translation id="1150989369772528668">ប្រតិទិន</translation> <translation id="1153356358378277386">ឧបករណ៍ដែលបានផ្គូផ្គង</translation> @@ -306,6 +307,7 @@ <translation id="2805756323405976993">កម្មវិធី</translation> <translation id="2814448776515246190">ថតនៅផ្នែកខ្លះ</translation> <translation id="2819276065543622893">អ្នកនឹងត្រូវចាកចេញឥឡូវនេះ។</translation> +<translation id="2822551631199737692">កំពុងប្រើកាមេរ៉ា</translation> <translation id="2825224105325558319"><ph name="DISPLAY_NAME" /> មិនអាចប្រើ <ph name="SPECIFIED_RESOLUTION" /> បានទេ។ បានប្ដូរកម្រិតច្បាស់ទៅ <ph name="FALLBACK_RESOLUTION" />។</translation> <translation id="2825619548187458965">ធ្នើ</translation> <translation id="2831035692318564937">បើករហូតដល់ពេលថ្ងៃរះ</translation> @@ -448,6 +450,7 @@ <translation id="3593039967545720377">ចូលប្រើប្រវត្តិឃ្លីបបតរបស់អ្នកដោយចុច <ph name="SHORTCUT_KEY_NAME" /> + V ដើម្បីមើលឃ្លីបបតរបស់អ្នក។ សូមចម្លងធាតុណាមួយ ដើម្បីចាប់ផ្ដើម។</translation> <translation id="3593646411856133110">អូសឡើងលើ រួចសង្កត់ឱ្យជាប់ ដើម្បីមើលកម្មវិធីដែលបើក</translation> <translation id="3595596368722241419">ថ្មពេញ</translation> +<translation id="3600061223661453002">បិទ</translation> <translation id="3604801046548457007">បានបង្កើតតុទី <ph name="DESK_TITILE" /></translation> <translation id="3606978283550408104">អេក្រង់ប្រែលត្រូវបានភ្ជាប់</translation> <translation id="3615926715408477684">ការបើកទិន្នន័យទូរសព្ទចល័តនឹងបើកប៊្លូធូស</translation> @@ -807,6 +810,7 @@ <translation id="5682642926269496722">មិនអាចប្រើ Google ជំនួយការសម្រាប់គណនីអ្នកប្រើប្រាស់បច្ចុប្បន្នបានទេ។</translation> <translation id="5689633613396158040">ពន្លឺពេលយប់ធ្វើឱ្យមានភាពងាយស្រួលជាងមុនក្នុងការមើលអេក្រង់របស់អ្នក ឬអាននៅពេលមានពន្លឺតិច។ ចុចដើម្បីផ្លាស់ប្ដូរពេលបើក "ពន្លឺពេលយប់" ឬបិទវាទាំងស្រុង។</translation> <translation id="5691772641933328258">មិនស្គាល់ស្នាមម្រាមដៃទេ</translation> +<translation id="5693255400847650006">កំពុងប្រើមីក្រូហ្វូន</translation> <translation id="570390244361237317">កម្មវិធីទាំងអស់, រុករកដោយប្រើគ្រាប់ចុចព្រួញ ដើម្បីចូលប្រើប្រាស់កម្មវិធីទាំងអស់</translation> <translation id="5707775774148071965">ឧបករណ៍របស់អ្នកអាចប្រើកម្រិតទិន្នន័យខ្ពស់ជាងខ្សែរបស់អ្នក។ ប្រតិបត្តិការឧបករណ៍អាចត្រូវបានដាក់កំហិត។</translation> <translation id="5710450975648804523">មុខងារកុំរំខានបានបើក</translation> @@ -965,6 +969,7 @@ <translation id="6637729079642709226">ប្ដូរម៉ោង</translation> <translation id="6641720045729354415">បិទ/បើកអក្សររត់ក្នុងពេលជាក់ស្ដែង។ <ph name="STATE_TEXT" /></translation> <translation id="6643169293433369663">ត្រឡប់លំដាប់នៃការតម្រៀបតាមឈ្មោះវិញ</translation> +<translation id="6649641931981131786">លៃសម្រួលកាមេរ៉ាដើម្បីដាក់រូបអ្នកនៅកណ្ដាលអេក្រង់។</translation> <translation id="6650072551060208490"><ph name="ORIGIN_NAME" /> ចង់បញ្ជាក់ថាជាអ្នក</translation> <translation id="6650933572246256093">ឧបករណ៍ប៊្លូធូស "<ph name="DEVICE_NAME" />" ចង់សុំការអនុញ្ញាតដើម្បីភ្ជាប់។ សូមបញ្ចូលពាក្យនៅលើឧបករណ៍នោះ៖ <ph name="PASSKEY" /></translation> <translation id="6657585470893396449">ពាក្យសម្ងាត់</translation> @@ -981,6 +986,7 @@ <translation id="6723839937902243910">ថាមពល</translation> <translation id="6727969043791803658">បានភ្ជាប់ ថ្ម <ph name="BATTERY_PERCENTAGE" /> %</translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6737983188036277605">កំពុងប្រើកាមេរ៉ា និងមីក្រូហ្វូន</translation> <translation id="6739144137573853180">ចូលទៅការកំណត់</translation> <translation id="6751052314767925245">អនុវត្តដោយអ្នកគ្រប់គ្រងរបស់អ្នក</translation> <translation id="6751826523481687655">បានបើកការតាមដានប្រតិបត្តិការ</translation> @@ -1005,6 +1011,7 @@ <translation id="685782768769951078">{NUM_DIGITS,plural, =1{នៅសល់មួយខ្ទង់ទៀត}other{នៅសល់ # ខ្ទង់ទៀត}}</translation> <translation id="6867938213751067702">ទាញយក <ph name="FILENAME" /> ដែលបានផ្អាក</translation> <translation id="6878400149835617132">បានបិទផ្លូវកាត់</translation> +<translation id="6878709625737492815">មុខងារពង្រីកដោយស្វ័យប្រវត្តិត្រូវបានបិទ។</translation> <translation id="6884665277231944629">ត្រឡប់ទៅថ្ងៃនេះវិញ</translation> <translation id="6886172995547742638"><ph name="DEVICE_TYPE" /> របស់អ្នកអាចដំណើរការយឺតជាងមុន។ សូមប្រើឆ្នាំងសាក USB-C កម្រិត <ph name="PREFERRED_MINIMUM_POWER" />W ឬខ្ពស់ជាងនេះដែលមានការទទួលស្គាល់។</translation> <translation id="688631446150864480">ចុចគ្រាប់ចុចព្រួញចុះក្រោម ដើម្បីប្ដូរវិនដូ</translation> @@ -1084,6 +1091,7 @@ <translation id="7378203170292176219">អូសដើម្បីជ្រើសរើសផ្នែកណាមួយ ដើម្បីថតវីដេអូ</translation> <translation id="7378594059915113390">ការគ្រប់គ្រងមេឌៀ</translation> <translation id="7378889811480108604">មុខងារសន្សំថ្មត្រូវបានបិទ</translation> +<translation id="7382680553121047388">បើក</translation> <translation id="7384028040782072252">ចុចកណ្ដុរខាងស្ដាំត្រង់ណាក៏បាន ដើម្បីតម្រៀបកម្មវិធីរបស់អ្នកឡើងវិញ</translation> <translation id="7392563512730092880">អ្នកអាចរៀបចំនៅពេលក្រោយនៅក្នុងការកំណត់បានជានិច្ច។</translation> <translation id="7405710164030118432">ដើម្បីដោះសោឧបករណ៍ សូមបញ្ចូលលេខកូដចូលប្រើប្រាស់របស់មាតាបិតាសម្រាប់ Family Link របស់អ្នក</translation> @@ -1167,6 +1175,7 @@ <translation id="7868900307798234037">ការដោះសោដោយប្រើស្នាមម្រាមដៃ</translation> <translation id="7872195908557044066">អ្នកគ្រប់គ្រងរបស់អ្នកកំពុងកំណត់ eSIM របស់អ្នកឡើងវិញ។ សូមរង់ចាំមួយភ្លែត។</translation> <translation id="7872786842639831132">បិទ</translation> +<translation id="7875280185395705476">ពង្រីកដោយស្វ័យប្រវត្តិ</translation> <translation id="7875575368831396199">ប៊្លូធូសហាក់ដូចជាបានបិទនៅលើ <ph name="DEVICE_TYPE" /> របស់អ្នក។ សូមបើកប៊្លូធូស ដើម្បីប្រើមណ្ឌលទូរសព្ទ។</translation> <translation id="7877557217297072640">{0,plural, =0{ប្ដូរកំណែឧបករណ៍ទៅកំណែមុនឥឡូវនេះ}=1{ប្ដូរកំណែឧបករណ៍ទៅកំណែមុនក្នុងរយៈពេល 1 វិនាទី}other{ប្ដូរកំណែឧបករណ៍ទៅកំណែមុនក្នុងរយៈពេល # វិនាទី}}</translation> <translation id="7886169021410746335">កែតម្រូវការកំណត់ឯកជនភាព</translation> @@ -1286,6 +1295,7 @@ <translation id="856298576161209842"><ph name="MANAGER" /> ណែនាំឱ្យអ្នកដំឡើងកំណែ <ph name="DEVICE_TYPE" /> របស់អ្នក</translation> <translation id="8563862697512465947">កំណត់ការជូនដំណឹង</translation> <translation id="857201607579416096">ម៉ឺនុយត្រូវបានផ្លាស់ទីទៅជ្រុងខាងក្រោមផ្នែកខាងស្ដាំនៃអេក្រង់។</translation> +<translation id="8576288697319745668">បិទ/បើកមុខងារពង្រីកដោយស្វ័យប្រវត្តិ។ <ph name="STATE_TEXT" /></translation> <translation id="8594115950068821369">-<ph name="FORMATTED_TIME" /></translation> <translation id="8598235756057743477">តម្រៀបកម្មវិធីរបស់អ្នកតាមឈ្មោះ ឬពណ៌</translation> <translation id="8614517853887502247">ការជូនដំណឹងអំពី <ph name="APP_1_TITLE" /> និង <ph name="APP_2_TITLE" /> ត្រូវបានលាក់ ដោយសារការការពារការមើលត្រូវបានបើក</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb index 70a95cb0..a851cc0 100644 --- a/ash/strings/ash_strings_ko.xtb +++ b/ash/strings/ash_strings_ko.xtb
@@ -27,6 +27,7 @@ <translation id="1111021433905331574">설정 > <ph name="APP_TITLE" />에서 키보드 백라이트 색상을 변경할 수 있습니다.</translation> <translation id="112308213915226829">실행기 자동 숨김</translation> <translation id="1142002900084379065">최근 사진</translation> +<translation id="114451698114044150">자동 확대가 사용 설정되어 있습니다.</translation> <translation id="1148499908455722006"><ph name="USER_NAME" /> 정보 대화상자 열기</translation> <translation id="1150989369772528668">캘린더</translation> <translation id="1153356358378277386">페어링된 기기</translation> @@ -306,6 +307,7 @@ <translation id="2805756323405976993">앱</translation> <translation id="2814448776515246190">부분 캡처</translation> <translation id="2819276065543622893">지금 로그아웃됩니다.</translation> +<translation id="2822551631199737692">카메라 사용 중</translation> <translation id="2825224105325558319"><ph name="DISPLAY_NAME" />에서 <ph name="SPECIFIED_RESOLUTION" />을(를) 지원하지 않습니다. 해상도가 <ph name="FALLBACK_RESOLUTION" />(으)로 변경되었습니다.</translation> <translation id="2825619548187458965">임시보관함</translation> <translation id="2831035692318564937">일출까지 켜기</translation> @@ -448,6 +450,7 @@ <translation id="3593039967545720377"><ph name="SHORTCUT_KEY_NAME" /> + V 키를 눌러 클립보드를 열면 클립보드 기록에 액세스할 수 있습니다. 시작하려면 항목을 복사하세요.</translation> <translation id="3593646411856133110">위로 스와이프한 후 눌러 열려 있는 앱 보기</translation> <translation id="3595596368722241419">배터리 충전 완료</translation> +<translation id="3600061223661453002">사용 설정</translation> <translation id="3604801046548457007"><ph name="DESK_TITILE" /> 데스크가 생성되었습니다.</translation> <translation id="3606978283550408104">점자 디스플레이가 연결되었습니다.</translation> <translation id="3615926715408477684">모바일 데이터를 사용 설정하면 블루투스가 사용 설정됩니다.</translation> @@ -807,6 +810,7 @@ <translation id="5682642926269496722">현재 사용자 계정에서 Google 어시스턴트를 사용할 수 없습니다.</translation> <translation id="5689633613396158040">야간 조명을 사용하면 주위가 어두울 때도 편안하게 화면을 보고 읽을 수 있습니다. 탭하여 야간 조명을 켜거나 완전히 끌 시간을 변경하세요.</translation> <translation id="5691772641933328258">지문을 인식할 수 없음</translation> +<translation id="5693255400847650006">마이크 사용 중</translation> <translation id="570390244361237317">전체 앱, 화살표 키로 이동하여 모든 앱에 액세스</translation> <translation id="5707775774148071965">기기에서 지원하는 데이터 속도가 케이블의 지원 속도보다 빠릅니다. 기기 성능이 제한될 수 있습니다.</translation> <translation id="5710450975648804523">방해 금지 모드 사용 중</translation> @@ -965,6 +969,7 @@ <translation id="6637729079642709226">시간 변경</translation> <translation id="6641720045729354415">실시간 자막을 전환합니다. <ph name="STATE_TEXT" /></translation> <translation id="6643169293433369663">이름별 정렬 순서 실행취소</translation> +<translation id="6649641931981131786">화면 중앙에 위치하도록 카메라를 조절합니다.</translation> <translation id="6650072551060208490"><ph name="ORIGIN_NAME" />에서 본인 확인을 요청합니다.</translation> <translation id="6650933572246256093">블루투스 기기 '<ph name="DEVICE_NAME" />'에서 페어링 허가를 요청합니다. 해당 기기에서 다음 패스키를 입력하세요. <ph name="PASSKEY" /></translation> <translation id="6657585470893396449">비밀번호</translation> @@ -981,6 +986,7 @@ <translation id="6723839937902243910">전원</translation> <translation id="6727969043791803658">연결됨, 배터리 <ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6737983188036277605">카메라 및 마이크 사용 중</translation> <translation id="6739144137573853180">설정으로 이동</translation> <translation id="6751052314767925245">관리자가 시행함</translation> <translation id="6751826523481687655">성능 추적이 사용 설정되어 있습니다.</translation> @@ -1005,6 +1011,7 @@ <translation id="685782768769951078">{NUM_DIGITS,plural, =1{1자리 남음}other{#자리 남음}}</translation> <translation id="6867938213751067702"><ph name="FILENAME" /> 다운로드가 일시중지되었습니다</translation> <translation id="6878400149835617132">바로가기 사용 중지됨</translation> +<translation id="6878709625737492815">자동 확대가 사용 중지되어 있습니다.</translation> <translation id="6884665277231944629">오늘로 돌아가기</translation> <translation id="6886172995547742638"><ph name="DEVICE_TYPE" /> 기기의 성능이 저하될 수 있습니다. 인증된 <ph name="PREFERRED_MINIMUM_POWER" />W 이상의 USB-C 전원 어댑터를 사용하세요.</translation> <translation id="688631446150864480">창을 전환하려면 아래쪽 화살표 키를 누르세요.</translation> @@ -1084,6 +1091,7 @@ <translation id="7378203170292176219">드래그하여 녹화할 영역을 선택하세요.</translation> <translation id="7378594059915113390">미디어 컨트롤</translation> <translation id="7378889811480108604">절전 모드 사용 안함</translation> +<translation id="7382680553121047388">사용 중지</translation> <translation id="7384028040782072252">앱을 재정렬하려면 아무 곳이나 마우스 오른쪽 버튼으로 클릭합니다</translation> <translation id="7392563512730092880">나중에 설정으로 이동하여 언제든지 설정할 수 있습니다.</translation> <translation id="7405710164030118432">기기의 잠금을 해제하려면 Family Link 부모 액세스 코드를 입력하세요.</translation> @@ -1167,6 +1175,7 @@ <translation id="7868900307798234037">지문으로 잠금 해제</translation> <translation id="7872195908557044066">관리자가 eSIM을 재설정하는 중입니다. 잠시만 기다려 주세요.</translation> <translation id="7872786842639831132">꺼짐</translation> +<translation id="7875280185395705476">자동 확대</translation> <translation id="7875575368831396199"><ph name="DEVICE_TYPE" />의 블루투스가 꺼져 있는 것 같습니다. 휴대전화 허브를 사용하려면 블루투스를 사용 설정하세요.</translation> <translation id="7877557217297072640">{0,plural, =0{지금 기기를 이전 버전으로 되돌리세요}=1{1초 이내에 기기를 이전 버전으로 되돌리세요}other{#초 이내에 기기를 이전 버전으로 되돌리세요}}</translation> <translation id="7886169021410746335">개인정보 보호 설정 조정</translation> @@ -1286,6 +1295,7 @@ <translation id="856298576161209842"><ph name="MANAGER" />에서 <ph name="DEVICE_TYPE" /> 기기의 업데이트를 권장합니다.</translation> <translation id="8563862697512465947">알림 설정</translation> <translation id="857201607579416096">메뉴가 화면 오른쪽 하단으로 이동했습니다.</translation> +<translation id="8576288697319745668">자동 확대 기능을 전환합니다. <ph name="STATE_TEXT" /></translation> <translation id="8594115950068821369">-<ph name="FORMATTED_TIME" /></translation> <translation id="8598235756057743477">이름 또는 색상별로 앱 정렬</translation> <translation id="8614517853887502247">사생활 보호가 켜져 있으므로 <ph name="APP_1_TITLE" /> 및 <ph name="APP_2_TITLE" /> 알림이 숨겨집니다.</translation>
diff --git a/ash/strings/ash_strings_lo.xtb b/ash/strings/ash_strings_lo.xtb index 59e7fa5..592048e4 100644 --- a/ash/strings/ash_strings_lo.xtb +++ b/ash/strings/ash_strings_lo.xtb
@@ -306,6 +306,7 @@ <translation id="2805756323405976993">ແອັບ</translation> <translation id="2814448776515246190">ຖ່າຍຮູບບາງສ່ວນ</translation> <translation id="2819276065543622893">ທ່ານຈະຖືກອອກຈາກລະບົບດຽວນີ້.</translation> +<translation id="2822551631199737692">ມີການໃຊ້ກ້ອງຖ່າຍຮູບຢູ່</translation> <translation id="2825224105325558319"><ph name="DISPLAY_NAME" /> ບໍ່ຮອງຮັບ <ph name="SPECIFIED_RESOLUTION" />. ຄວາມລະອຽດຖືກປ່ຽນເປັນ <ph name="FALLBACK_RESOLUTION" /> ແລ້ວ.</translation> <translation id="2825619548187458965">ຖ້ານ</translation> <translation id="2831035692318564937">ເປີດຈົນກວ່າຕາເວັນຂຶ້ນ</translation> @@ -807,6 +808,7 @@ <translation id="5682642926269496722">ຜູ້ຊ່ວຍ Google ບໍ່ສາມາດໃຊ້ໄດ້ສຳລັບບັນຊີຜູ້ໃຊ້ປັດຈຸບັນ.</translation> <translation id="5689633613396158040">ແສງກາງຄືນເຮັດໃຫ້ມັນງ່າຍກວ່າໃນການເບິ່ງໜ້າຈໍຂອງທ່ານ ຫຼື ອ່ານໃນແສງທີ່ມືດ. ແຕະເພື່ອປ່ຽນວ່າຈະເປີດແສງກາງຄືນເວລາໃດ ຫຼື ປິດມັນໄປເລີຍກໍໄດ້.</translation> <translation id="5691772641933328258">ບໍ່ຮູ້ຈັກລາຍນິ້ວມື</translation> +<translation id="5693255400847650006">ມີການໃຊ້ໄມໂຄຣໂຟນຢູ່</translation> <translation id="570390244361237317">ແອັບທັງໝົດ, ນຳທາງດ້ວຍປຸ່ມລູກສອນເພື່ອເຂົ້າເຖິງແອັບທັງໝົດ</translation> <translation id="5707775774148071965">ອຸປະກອນຂອງທ່ານຮອງຮັບອັດຕາຂໍ້ມູນທີ່ສູງກວ່າສາຍຂອງທ່ານ. ປະສິດທິພາບອຸປະກອນອາດຖືກຈຳກັດໄວ້.</translation> <translation id="5710450975648804523">ໂໝດຫ້າມລົບກວນເປີດຢູ່</translation> @@ -981,6 +983,7 @@ <translation id="6723839937902243910">ໄຟ</translation> <translation id="6727969043791803658">ເຊື່ອມຕໍ່ແລ້ວ, ແບັດເຕີຣີ <ph name="BATTERY_PERCENTAGE" /> %</translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6737983188036277605">ມີການໃຊ້ກ້ອງຖ່າຍຮູບ ແລະ ໄມໂຄຣໂຟນຢູ່</translation> <translation id="6739144137573853180">ໄປຫາການຕັ້ງຄ່າ</translation> <translation id="6751052314767925245">ບັງຄັບໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ</translation> <translation id="6751826523481687655">ການຕິດຕາມປະສິດທິພາບເປີດຢູ່</translation>
diff --git a/ash/strings/ash_strings_mk.xtb b/ash/strings/ash_strings_mk.xtb index 05670d33..8b4fa7d 100644 --- a/ash/strings/ash_strings_mk.xtb +++ b/ash/strings/ash_strings_mk.xtb
@@ -27,6 +27,7 @@ <translation id="1111021433905331574">Може да ја промените бојата на заднинското светло на тастатурата во „Поставки > <ph name="APP_TITLE" />“</translation> <translation id="112308213915226829">Автоматски сокриј полица</translation> <translation id="1142002900084379065">Неодамнешни фотографии</translation> +<translation id="114451698114044150">Автоматското зумирање е вклучено.</translation> <translation id="1148499908455722006">Отворете го дијалогот со податоци за <ph name="USER_NAME" /></translation> <translation id="1150989369772528668">Календар</translation> <translation id="1153356358378277386">Спарени уреди</translation> @@ -449,6 +450,7 @@ <translation id="3593039967545720377">Пристапете до историјата на привремената меморија така што ќе притиснете <ph name="SHORTCUT_KEY_NAME" /> + V за да се прикаже привремената меморија. Копирајте ставка за да започнете.</translation> <translation id="3593646411856133110">Повлечете нагоре и задржете за да ги видите отворените апликации</translation> <translation id="3595596368722241419">Батеријата е полна</translation> +<translation id="3600061223661453002">Исклучи</translation> <translation id="3604801046548457007">Работниот простор <ph name="DESK_TITILE" /> е создаден</translation> <translation id="3606978283550408104">Поврзан екран за брајово писмо.</translation> <translation id="3615926715408477684">Ако овозможите мобилен интернет, ќе се овозможи и Bluetooth</translation> @@ -968,6 +970,7 @@ <translation id="6637729079642709226">Сменете го времето</translation> <translation id="6641720045729354415">Вклучете/исклучете „Автоматски титлови“. <ph name="STATE_TEXT" /></translation> <translation id="6643169293433369663">Поништете го редоследот на подредувањето по име</translation> +<translation id="6649641931981131786">Приспособете ја камерата за да бидете во средината на екранот.</translation> <translation id="6650072551060208490"><ph name="ORIGIN_NAME" /> сака да потврдите дека сте вие</translation> <translation id="6650933572246256093">Уредот со Bluetooth „<ph name="DEVICE_NAME" />“ бара дозвола за спарување. Внесете ја пристапната шифра на уредот: <ph name="PASSKEY" /></translation> <translation id="6657585470893396449">Лозинка</translation> @@ -1009,6 +1012,7 @@ <translation id="685782768769951078">{NUM_DIGITS,plural, =1{Преостанува уште една цифра}one{Преостанува уште # цифра}other{Преостануваат уште # цифри}}</translation> <translation id="6867938213751067702">Преземањето на <ph name="FILENAME" /> е паузирано</translation> <translation id="6878400149835617132">Кратенката е исклучена</translation> +<translation id="6878709625737492815">Автоматското зумирање е исклучено</translation> <translation id="6884665277231944629">Вратете се на денешниот датум</translation> <translation id="6886172995547742638">Перформансите на вашиот <ph name="DEVICE_TYPE" /> може да бидат послаби. Користете сертифициран адаптер за напојување USB-C од <ph name="PREFERRED_MINIMUM_POWER" /> W или повеќе.</translation> <translation id="688631446150864480">Притискајте го копчето со стрелка надолу за да се префрлате меѓу прозорците</translation> @@ -1088,6 +1092,7 @@ <translation id="7378203170292176219">Повлечете за да изберете област за снимање</translation> <translation id="7378594059915113390">Контроли за аудиовизуелни медиуми</translation> <translation id="7378889811480108604">Режимот „Штедач на батерија“ е исклучен</translation> +<translation id="7382680553121047388">Вклучи</translation> <translation id="7384028040782072252">Кликнете со десното копче каде било за да ги преуредите апликациите</translation> <translation id="7392563512730092880">Во секое време може да ја поставите подоцна од „Поставки“.</translation> <translation id="7405710164030118432">За да го отклучите уредот, внесете го кодот за пристап на родителот за Family Link</translation> @@ -1171,6 +1176,7 @@ <translation id="7868900307798234037">Отклучување со отпечаток</translation> <translation id="7872195908557044066">Администраторот ја ресетира вашата eSIM. Почекајте неколку минути.</translation> <translation id="7872786842639831132">Исклучено</translation> +<translation id="7875280185395705476">Авто. зумирање</translation> <translation id="7875575368831396199">Се чини дека Bluetooth е исклучен на вашиот <ph name="DEVICE_TYPE" />. Вклучете го Bluetooth за да користите Phone Hub.</translation> <translation id="7877557217297072640">{0,plural, =0{Променете го уредот на претходната верзија сега}=1{Променете го уредот на претходната верзија во рок од 1 секунда}one{Променете го уредот на претходната верзија во рок од # секунда}other{Променете го уредот на претходната верзија во рок од # секунди}}</translation> <translation id="7886169021410746335">ги приспособи поставките за приватност.</translation> @@ -1290,6 +1296,7 @@ <translation id="856298576161209842"><ph name="MANAGER" /> препорачува да го ажурирате вашиот <ph name="DEVICE_TYPE" /></translation> <translation id="8563862697512465947">Поставки за известувања</translation> <translation id="857201607579416096">Менито е преместено во долниот десен агол на екранот.</translation> +<translation id="8576288697319745668">Вклучете/исклучете автоматско зумирање. <ph name="STATE_TEXT" /></translation> <translation id="8594115950068821369">-<ph name="FORMATTED_TIME" /></translation> <translation id="8598235756057743477">Подредете ги апликациите по име или боја.</translation> <translation id="8614517853887502247">Известувањата од <ph name="APP_1_TITLE" /> и <ph name="APP_2_TITLE" /> се сокриени бидејќи има вклучено заштита од прикажување</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb index 7020de0..8f1d278e 100644 --- a/ash/strings/ash_strings_ml.xtb +++ b/ash/strings/ash_strings_ml.xtb
@@ -306,6 +306,7 @@ <translation id="2805756323405976993">ആപ്സ്</translation> <translation id="2814448776515246190">ഭാഗികമായി ക്യാപ്ചർ ചെയ്യൽ</translation> <translation id="2819276065543622893">നിങ്ങൾ ഇപ്പോൾ സൈൻ ഔട്ട് ചെയ്യും.</translation> +<translation id="2822551631199737692">ക്യാമറ ഉപയോഗിക്കുന്നു</translation> <translation id="2825224105325558319"><ph name="DISPLAY_NAME" />, <ph name="SPECIFIED_RESOLUTION" /> എന്നതിനെ പിന്തുണയ്ക്കുന്നില്ല. റെസല്യൂഷൻ <ph name="FALLBACK_RESOLUTION" /> എന്നതിലേക്ക് മാറ്റി.</translation> <translation id="2825619548187458965">ഷെൽഫ്</translation> <translation id="2831035692318564937">സൂര്യാസ്തമയം വരെ ഓണാണ്</translation> @@ -807,6 +808,7 @@ <translation id="5682642926269496722">നിലവിലെ ഉപയോക്തൃ അക്കൗണ്ടിന് Google അസിസ്റ്റന്റ് ലഭ്യമല്ല.</translation> <translation id="5689633613396158040">മങ്ങിയ വെളിച്ചത്തിൽ സ്ക്രീനിൽ നോക്കുന്നതോ വായിക്കുന്നതോ നൈറ്റ് ലൈറ്റ് എളുപ്പമാക്കുന്നു. നൈറ്റ് ലൈറ്റ് പൂർണ്ണമായി ഓഫാകുകയോ ഓണാകുകയോ ചെയ്യേണ്ട സമയം മാറ്റാൻ ടാപ്പ് ചെയ്യുക.</translation> <translation id="5691772641933328258">വിരലടയാളം തിരിച്ചറിഞ്ഞില്ല</translation> +<translation id="5693255400847650006">മൈക്രോഫോൺ ഉപയോഗിക്കുന്നു</translation> <translation id="570390244361237317">എല്ലാ ആപ്പുകളും, എല്ലാ ആപ്പുകളും ആക്സസ് ചെയ്യാൻ അമ്പടയാള കീകൾ ഉപയോഗിച്ച് നാവിഗേറ്റ് ചെയ്യുക</translation> <translation id="5707775774148071965">നിങ്ങളുടെ ഉപകരണം, നിങ്ങളുടെ കേബിളിനേക്കാൾ കൂടുതൽ ഡാറ്റാ നിരക്കിനെ പിന്തുണയ്ക്കുന്നു. ഉപകരണ പ്രകടനം പരിമിതപ്പെട്ടേക്കാം.</translation> <translation id="5710450975648804523">'ശല്യപ്പെടുത്തരുത്' ഓണാണ്</translation> @@ -981,6 +983,7 @@ <translation id="6723839937902243910">പവർ</translation> <translation id="6727969043791803658">കണക്റ്റ് ചെയ്തു, <ph name="BATTERY_PERCENTAGE" />% ബാറ്ററി</translation> <translation id="6732800389263199929">+<ph name="COUNT" /> എണ്ണം</translation> +<translation id="6737983188036277605">ക്യാമറയും മൈക്രോഫോണും ഉപയോഗിക്കുന്നു</translation> <translation id="6739144137573853180">ക്രമീകരണത്തിലേക്ക് പോകുക</translation> <translation id="6751052314767925245">നിങ്ങളുടെ അഡ്മിൻ നടപ്പിലാക്കിയതാണ്</translation> <translation id="6751826523481687655">പ്രകടനം പിന്തുടരൽ ഓണാണ്</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb index 9cfe5165..060da85b 100644 --- a/ash/strings/ash_strings_nl.xtb +++ b/ash/strings/ash_strings_nl.xtb
@@ -1016,7 +1016,7 @@ <translation id="6886172995547742638">Je <ph name="DEVICE_TYPE" /> kan slechtere prestaties leveren. Gebruik een gecertificeerde USB-C-voedingsadapter van <ph name="PREFERRED_MINIMUM_POWER" /> W of hoger.</translation> <translation id="688631446150864480">Druk op de pijl-omlaag om tussen vensters te schakelen</translation> <translation id="6891721121089053234">Recente foto's, media en apps van je telefoon bekijken op je <ph name="DEVICE_TYPE" /></translation> -<translation id="6896758677409633944">Kopieer</translation> +<translation id="6896758677409633944">Kopiëren</translation> <translation id="6901883536534621389">Gebaren gebruiken om te navigeren</translation> <translation id="6919251195245069855">Je smartkaart wordt niet herkend. Probeer het opnieuw.</translation> <translation id="6931576957638141829">Opslaan in</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb index 2058284..d7b4396 100644 --- a/ash/strings/ash_strings_sk.xtb +++ b/ash/strings/ash_strings_sk.xtb
@@ -27,6 +27,7 @@ <translation id="1111021433905331574">Farbu podsvietenia klávesnice môžete zmeniť v sekcii Nastavenia > <ph name="APP_TITLE" /></translation> <translation id="112308213915226829">Automatické skrývanie poličky</translation> <translation id="1142002900084379065">Najnovšie fotky</translation> +<translation id="114451698114044150">Automatické priblíženie je zapnuté.</translation> <translation id="1148499908455722006">Otvoriť dialógové okno informácií o používateľovi <ph name="USER_NAME" /></translation> <translation id="1150989369772528668">Kalendár</translation> <translation id="1153356358378277386">Spárované zariadenia</translation> @@ -449,6 +450,7 @@ <translation id="3593039967545720377">Do histórie schránky môžete prejsť po zobrazení schránky stlačením klávesovej skratky <ph name="SHORTCUT_KEY_NAME" /> + V. Začnite skopírovaním položky.</translation> <translation id="3593646411856133110">Otvorené aplikácie zobrazíte potiahnutím nahor a pridržaním</translation> <translation id="3595596368722241419">Batéria je nabitá</translation> +<translation id="3600061223661453002">Vypnuté</translation> <translation id="3604801046548457007">Bola vytvorená plocha <ph name="DESK_TITILE" /></translation> <translation id="3606978283550408104">Bola pripojená Braillova obrazovka.</translation> <translation id="3615926715408477684">Zapnutím mobilných dát aktivujete Bluetooth</translation> @@ -967,6 +969,7 @@ <translation id="6637729079642709226">Zmena času</translation> <translation id="6641720045729354415">Prepnúť živý prepis. <ph name="STATE_TEXT" /></translation> <translation id="6643169293433369663">Vrátiť späť poradie zoradenia podľa názvu</translation> +<translation id="6649641931981131786">Upravte kameru, aby ste boli v strede obrazovky.</translation> <translation id="6650072551060208490"><ph name="ORIGIN_NAME" /> chce potvrdiť, že ste to vy</translation> <translation id="6650933572246256093">Zariadenie Bluetooth s názvom <ph name="DEVICE_NAME" /> žiada o povolenie párovania. Zadajte na danom zariadení tento prístupový kľúč: <ph name="PASSKEY" /></translation> <translation id="6657585470893396449">Heslo</translation> @@ -1008,6 +1011,7 @@ <translation id="685782768769951078">{NUM_DIGITS,plural, =1{Zostáva jedna číslica}few{Zostávajú # číslice}many{# digits remaining}other{Zostáva # číslic}}</translation> <translation id="6867938213751067702">Sťahovanie súboru <ph name="FILENAME" /> bolo pozastavené</translation> <translation id="6878400149835617132">Skratka je vypnutá</translation> +<translation id="6878709625737492815">Automatické priblíženie je vypnuté.</translation> <translation id="6884665277231944629">Prejsť späť na dnešok</translation> <translation id="6886172995547742638">Vaše zariadenie <ph name="DEVICE_TYPE" /> môže mať nižší výkon. Používajte nabíjačku s portom USB-C, ktorá má certifikovaný výkon minimálne <ph name="PREFERRED_MINIMUM_POWER" /> W</translation> <translation id="688631446150864480">Ak chcete prepnúť okná, stlačte kláves so šípkou nadol</translation> @@ -1087,6 +1091,7 @@ <translation id="7378203170292176219">Presunutím vyberte oblasť, ktorú chcete nahrať</translation> <translation id="7378594059915113390">Ovládacie prvky médií</translation> <translation id="7378889811480108604">Režim šetriča batérie je vypnutý</translation> +<translation id="7382680553121047388">Zapnuté</translation> <translation id="7384028040782072252">Kliknite pravým tlačidlom na ľubovoľné miesto a zmeňte poradie aplikácií</translation> <translation id="7392563512730092880">Túto funkciu môžete kedykoľvek nastaviť neskôr v sekcii Nastavenia.</translation> <translation id="7405710164030118432">Ak chcete toto zariadenie odomknúť, zadajte prístupový kód rodiča Family Link</translation> @@ -1170,6 +1175,7 @@ <translation id="7868900307798234037">Odomyká sa pomocou odtlačku prsta</translation> <translation id="7872195908557044066">Správca resetuje vašu eSIM kartu. Počkajte niekoľko minút.</translation> <translation id="7872786842639831132">Vypnuté</translation> +<translation id="7875280185395705476">Aut. priblíž.</translation> <translation id="7875575368831396199">Rozhranie Bluetooth je v zariadení <ph name="DEVICE_TYPE" /> zrejme vypnuté. Ak chcete použiť Telefónne centrum, zapnite ho.</translation> <translation id="7877557217297072640">{0,plural, =0{Obnovte v zariadení predchádzajúcu verziu}=1{Do sekundy obnovte v zariadení predchádzajúcu verziu}few{Do # sekúnd obnovte v zariadení predchádzajúcu verziu}many{Do # sekundy obnovte v zariadení predchádzajúcu verziu}other{Do # sekúnd obnovte v zariadení predchádzajúcu verziu}}</translation> <translation id="7886169021410746335">Upravte nastavenia ochrany súkromia</translation> @@ -1289,6 +1295,7 @@ <translation id="856298576161209842"><ph name="MANAGER" /> odporúča, aby ste aktualizovali zariadenie <ph name="DEVICE_TYPE" /></translation> <translation id="8563862697512465947">Nastavenia upozornení</translation> <translation id="857201607579416096">Ponuka bola presunutá do pravého dolného rohu obrazovky.</translation> +<translation id="8576288697319745668">Prepnite automatické priblíženie. <ph name="STATE_TEXT" /></translation> <translation id="8594115950068821369">-<ph name="FORMATTED_TIME" /></translation> <translation id="8598235756057743477">Zoraďte aplikácie podľa názvu alebo farby</translation> <translation id="8614517853887502247">Upozornenia z aplikácií <ph name="APP_1_TITLE" /> a <ph name="APP_2_TITLE" /> sú skryté, pretože je zapnutá ochrana pred zobrazením</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb index 014d9cf..7f7cfda 100644 --- a/ash/strings/ash_strings_sl.xtb +++ b/ash/strings/ash_strings_sl.xtb
@@ -306,6 +306,7 @@ <translation id="2805756323405976993">Aplikacije</translation> <translation id="2814448776515246190">Delni zajem</translation> <translation id="2819276065543622893">Zdaj boste odjavljeni.</translation> +<translation id="2822551631199737692">Kamera je v uporabi</translation> <translation id="2825224105325558319">Zaslon <ph name="DISPLAY_NAME" /> ne podpira te ločljivosti: <ph name="SPECIFIED_RESOLUTION" />. Ločljivost je bila spremenjena na: <ph name="FALLBACK_RESOLUTION" />.</translation> <translation id="2825619548187458965">Polica</translation> <translation id="2831035692318564937">Vklopljeno do sončnega vzhoda</translation> @@ -807,6 +808,7 @@ <translation id="5682642926269496722">Pomočnik Google ni na voljo za trenutni uporabniški račun.</translation> <translation id="5689633613396158040">Nočna svetloba olajša gledanje na zaslon ali branje pri šibki svetlobi. Dotaknite se, če želite spremeniti uro, ob kateri se vklopi nočna svetloba, oziroma če želite popolnoma izklopiti to funkcijo.</translation> <translation id="5691772641933328258">Prstni odtis ni prepoznan</translation> +<translation id="5693255400847650006">Mikrofon je v uporabi</translation> <translation id="570390244361237317">Vse aplikacije, s puščičnimi tipkami se premikate in dostopate do vseh aplikacij</translation> <translation id="5707775774148071965">Naprava podpira višjo podatkovno hitrost od kabla. Delovanje naprave bo morda omejeno.</translation> <translation id="5710450975648804523">Način »ne moti« je vklopljen</translation> @@ -981,6 +983,7 @@ <translation id="6723839937902243910">Napajanje</translation> <translation id="6727969043791803658">Povezano, <ph name="BATTERY_PERCENTAGE" /> % energije akumulatorja</translation> <translation id="6732800389263199929">In še <ph name="COUNT" /></translation> +<translation id="6737983188036277605">Kamera in mikrofon sta v uporabi</translation> <translation id="6739144137573853180">NASTAVITVE</translation> <translation id="6751052314767925245">Uveljavil vaš skrbnik</translation> <translation id="6751826523481687655">Sledenje učinkovitosti delovanja je vklopljeno</translation>
diff --git a/ash/strings/ash_strings_sr-Latn.xtb b/ash/strings/ash_strings_sr-Latn.xtb index f707a6a..7d80121 100644 --- a/ash/strings/ash_strings_sr-Latn.xtb +++ b/ash/strings/ash_strings_sr-Latn.xtb
@@ -27,6 +27,7 @@ <translation id="1111021433905331574">Boju pozadinskog osvetljenja tastature možete da promenite u podešavanjima > <ph name="APP_TITLE" /></translation> <translation id="112308213915226829">Automatski sakrij policu</translation> <translation id="1142002900084379065">Nedavne slike</translation> +<translation id="114451698114044150">Automatsko zumiranje je uključeno.</translation> <translation id="1148499908455722006">Otvara dijalog sa informacijama za korisnika <ph name="USER_NAME" /></translation> <translation id="1150989369772528668">Kalendar</translation> <translation id="1153356358378277386">Upareni uređaji</translation> @@ -449,6 +450,7 @@ <translation id="3593039967545720377">Pritisnite <ph name="SHORTCUT_KEY_NAME" /> + V da biste pristupili istoriji privremene memorije. Kopirajte neku stavku da biste započeli.</translation> <translation id="3593646411856133110">Prevucite nagore i zadržite da biste videli otvorene aplikacije</translation> <translation id="3595596368722241419">Baterija je puna</translation> +<translation id="3600061223661453002">Isključi</translation> <translation id="3604801046548457007">Radna površina <ph name="DESK_TITILE" /> je napravljena</translation> <translation id="3606978283550408104">Povezan je ekran sa Brajevom azbukom.</translation> <translation id="3615926715408477684">Ako omogućite mobilne podatke, omogućavate Bluetooth</translation> @@ -967,6 +969,7 @@ <translation id="6637729079642709226">Promenite vreme</translation> <translation id="6641720045729354415">Uključite ili isključite titl uživo. <ph name="STATE_TEXT" /></translation> <translation id="6643169293433369663">Opozovite redosled sortiranja prema nazivu</translation> +<translation id="6649641931981131786">Podesite kameru da biste postavili sebe u centar ekrana.</translation> <translation id="6650072551060208490"><ph name="ORIGIN_NAME" /> želi da potvrdi da ste to vi</translation> <translation id="6650933572246256093">Bluetooth uređaj „<ph name="DEVICE_NAME" />“ želi dozvolu za uparivanje. Unesite ovu šifru na tom uređaju: <ph name="PASSKEY" /></translation> <translation id="6657585470893396449">Lozinka</translation> @@ -1008,6 +1011,7 @@ <translation id="685782768769951078">{NUM_DIGITS,plural, =1{Preostala je jedna cifra}one{Preostala je # cifra}few{Preostale su # cifre}other{Preostalo je # cifara}}</translation> <translation id="6867938213751067702">Preuzimanje je pauzirano <ph name="FILENAME" /></translation> <translation id="6878400149835617132">Prečica je isključena</translation> +<translation id="6878709625737492815">Automatsko zumiranje je isključeno.</translation> <translation id="6884665277231944629">Vratite se na danas</translation> <translation id="6886172995547742638">To može negativno da utiče na rad uređaja <ph name="DEVICE_TYPE" />. Koristite sertifikovani USB-C adapter od <ph name="PREFERRED_MINIMUM_POWER" /> W ili jači.</translation> <translation id="688631446150864480">Pritiskajte taster sa strelicom nadole da biste menjali prozore</translation> @@ -1087,6 +1091,7 @@ <translation id="7378203170292176219">Prevucite da biste izabrali oblast za snimanje</translation> <translation id="7378594059915113390">Kontrole za medije</translation> <translation id="7378889811480108604">Režim uštede baterije je isključen</translation> +<translation id="7382680553121047388">Uključi</translation> <translation id="7384028040782072252">Kliknite desnim tasterom bilo gde da biste promenili redosled aplikacija</translation> <translation id="7392563512730092880">Uvek možete da podesite kasnije u Podešavanjima.</translation> <translation id="7405710164030118432">Da biste otključali uređaj, unesite pristupni kôd roditelja za Family Link</translation> @@ -1170,6 +1175,7 @@ <translation id="7868900307798234037">Otključavanje otiskom prsta</translation> <translation id="7872195908557044066">Administrator resetuje eSIM. Sačekajte nekoliko minuta.</translation> <translation id="7872786842639831132">Isključeno</translation> +<translation id="7875280185395705476">Auto-zumiranje</translation> <translation id="7875575368831396199">Izgleda da je isključen Bluetooth na uređaju <ph name="DEVICE_TYPE" />. Uključite Bluetooth da biste koristili Phone Hub.</translation> <translation id="7877557217297072640">{0,plural, =0{Promenite verziju uređaja u prethodnu verziju odmah}=1{Promenite verziju uređaja u prethodnu verziju u roku od 1 sekunde}one{Promenite verziju uređaja u prethodnu verziju u roku od # sekunde}few{Promenite verziju uređaja u prethodnu verziju u roku od # sekunde}other{Promenite verziju uređaja u prethodnu verziju u roku od # sekundi}}</translation> <translation id="7886169021410746335">Prilagodite podešavanja privatnosti</translation> @@ -1289,6 +1295,7 @@ <translation id="856298576161209842"><ph name="MANAGER" /> preporučuje da ažurirate <ph name="DEVICE_TYPE" /></translation> <translation id="8563862697512465947">Podešavanja obaveštenja</translation> <translation id="857201607579416096">Meni je premešten u donji desni ugao ekrana.</translation> +<translation id="8576288697319745668">Uključite ili isključite automatsko zumiranje. <ph name="STATE_TEXT" /></translation> <translation id="8594115950068821369">-<ph name="FORMATTED_TIME" /></translation> <translation id="8598235756057743477">Sortirajte aplikacije prema nazivu ili boji</translation> <translation id="8614517853887502247">Obaveštenja aplikacija <ph name="APP_1_TITLE" /> i <ph name="APP_2_TITLE" /> su skrivena jer je zaštita od pregleda uključena</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb index 5995e72..7753d02 100644 --- a/ash/strings/ash_strings_sr.xtb +++ b/ash/strings/ash_strings_sr.xtb
@@ -27,6 +27,7 @@ <translation id="1111021433905331574">Боју позадинског осветљења тастатуре можете да промените у подешавањима > <ph name="APP_TITLE" /></translation> <translation id="112308213915226829">Аутоматски сакриј полицу</translation> <translation id="1142002900084379065">Недавне слике</translation> +<translation id="114451698114044150">Аутоматско зумирање је укључено.</translation> <translation id="1148499908455722006">Отвара дијалог са информацијама за корисника <ph name="USER_NAME" /></translation> <translation id="1150989369772528668">Календар</translation> <translation id="1153356358378277386">Упарени уређаји</translation> @@ -449,6 +450,7 @@ <translation id="3593039967545720377">Притисните <ph name="SHORTCUT_KEY_NAME" /> + V да бисте приступили историји привремене меморије. Копирајте неку ставку да бисте започели.</translation> <translation id="3593646411856133110">Превуците нагоре и задржите да бисте видели отворене апликације</translation> <translation id="3595596368722241419">Батерија је пуна</translation> +<translation id="3600061223661453002">Искључи</translation> <translation id="3604801046548457007">Радна површина <ph name="DESK_TITILE" /> је направљена</translation> <translation id="3606978283550408104">Повезан је екран са Брајевом азбуком.</translation> <translation id="3615926715408477684">Ако омогућите мобилне податке, омогућавате Bluetooth</translation> @@ -967,6 +969,7 @@ <translation id="6637729079642709226">Промените време</translation> <translation id="6641720045729354415">Укључите или искључите титл уживо. <ph name="STATE_TEXT" /></translation> <translation id="6643169293433369663">Опозовите редослед сортирања према називу</translation> +<translation id="6649641931981131786">Подесите камеру да бисте поставили себе у центар екрана.</translation> <translation id="6650072551060208490"><ph name="ORIGIN_NAME" /> жели да потврди да сте то ви</translation> <translation id="6650933572246256093">Bluetooth уређај „<ph name="DEVICE_NAME" />“ жели дозволу за упаривање. Унесите ову шифру на том уређају: <ph name="PASSKEY" /></translation> <translation id="6657585470893396449">Лозинка</translation> @@ -1008,6 +1011,7 @@ <translation id="685782768769951078">{NUM_DIGITS,plural, =1{Преостала је једна цифра}one{Преостала је # цифра}few{Преостале су # цифре}other{Преостало је # цифара}}</translation> <translation id="6867938213751067702">Преузимање је паузирано <ph name="FILENAME" /></translation> <translation id="6878400149835617132">Пречица је искључена</translation> +<translation id="6878709625737492815">Аутоматско зумирање је искључено.</translation> <translation id="6884665277231944629">Вратите се на данас</translation> <translation id="6886172995547742638">То може негативно да утиче на рад уређаја <ph name="DEVICE_TYPE" />. Користите сертификовани USB-C адаптер од <ph name="PREFERRED_MINIMUM_POWER" /> W или јачи.</translation> <translation id="688631446150864480">Притискајте тастер са стрелицом надоле да бисте мењали прозоре</translation> @@ -1087,6 +1091,7 @@ <translation id="7378203170292176219">Превуците да бисте изабрали област за снимање</translation> <translation id="7378594059915113390">Контроле за медије</translation> <translation id="7378889811480108604">Режим уштеде батерије је искључен</translation> +<translation id="7382680553121047388">Укључи</translation> <translation id="7384028040782072252">Кликните десним тастером било где да бисте променили редослед апликација</translation> <translation id="7392563512730092880">Увек можете да подесите касније у Подешавањима.</translation> <translation id="7405710164030118432">Да бисте откључали уређај, унесите приступни кôд родитеља за Family Link</translation> @@ -1170,6 +1175,7 @@ <translation id="7868900307798234037">Откључавање отискoм прста</translation> <translation id="7872195908557044066">Администратор ресетује eSIM. Сачекајте неколико минута.</translation> <translation id="7872786842639831132">Искључено</translation> +<translation id="7875280185395705476">Ауто-зумирање</translation> <translation id="7875575368831396199">Изгледа да је искључен Bluetooth на уређају <ph name="DEVICE_TYPE" />. Укључите Bluetooth да бисте користили Phone Hub.</translation> <translation id="7877557217297072640">{0,plural, =0{Промените верзију уређаја у претходну верзију одмах}=1{Промените верзију уређаја у претходну верзију у року од 1 секунде}one{Промените верзију уређаја у претходну верзију у року од # секунде}few{Промените верзију уређаја у претходну верзију у року од # секунде}other{Промените верзију уређаја у претходну верзију у року од # секунди}}</translation> <translation id="7886169021410746335">Прилагодите подешавања приватности</translation> @@ -1289,6 +1295,7 @@ <translation id="856298576161209842"><ph name="MANAGER" /> препоручује да ажурирате <ph name="DEVICE_TYPE" /></translation> <translation id="8563862697512465947">Подешавања обавештења</translation> <translation id="857201607579416096">Мени је премештен у доњи десни угао екрана.</translation> +<translation id="8576288697319745668">Укључите или искључите аутоматско зумирање. <ph name="STATE_TEXT" /></translation> <translation id="8594115950068821369">-<ph name="FORMATTED_TIME" /></translation> <translation id="8598235756057743477">Сортирајте апликације према називу или боји</translation> <translation id="8614517853887502247">Обавештења апликација <ph name="APP_1_TITLE" /> и <ph name="APP_2_TITLE" /> су скривена јер је заштита од прегледа укључена</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb index 0c040d4..8d38798 100644 --- a/ash/strings/ash_strings_sw.xtb +++ b/ash/strings/ash_strings_sw.xtb
@@ -306,6 +306,7 @@ <translation id="2805756323405976993">Programu</translation> <translation id="2814448776515246190">Kupiga picha ya sehemu ya skrini</translation> <translation id="2819276065543622893">Utaondolewa kwenye akaunti sasa hivi.</translation> +<translation id="2822551631199737692">Kamera inatumika</translation> <translation id="2825224105325558319"><ph name="DISPLAY_NAME" /> haitumii <ph name="SPECIFIED_RESOLUTION" />. Ubora umebadilishwa kuwa <ph name="FALLBACK_RESOLUTION" /></translation> <translation id="2825619548187458965">Rafu</translation> <translation id="2831035692318564937">Imewashwa mpaka mawio</translation> @@ -807,6 +808,7 @@ <translation id="5682642926269496722">Programu ya Mratibu wa Google haipatikani katika akaunti ya mtumiaji wa sasa.</translation> <translation id="5689633613396158040">Mwanga wa Usiku hufanya uangalie skrini yako au usome katika mwangaza hafifu kwa urahisi. Gusa ili ubadilishe saa ambapo Mwanga wa Usiku huwashwa au uuzime kabisa.</translation> <translation id="5691772641933328258">Haikutambua alama ya kidole</translation> +<translation id="5693255400847650006">Maikrofoni inatumika</translation> <translation id="570390244361237317">Programu zote, sogeza kwa kutumia vitufe vya vishale ili ufikie programu zote</translation> <translation id="5707775774148071965">Kifaa chako kinatumia data ya kiwango cha juu kuliko uwezo wa kebo yako. Huenda utendaji kazi wa kifaa usiwe mzuri.</translation> <translation id="5710450975648804523">Umewasha kipengele cha Usinisumbue</translation> @@ -981,6 +983,7 @@ <translation id="6723839937902243910">Nishati</translation> <translation id="6727969043791803658">Imeunganishwa, kiasi cha chaji ni <ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6737983188036277605">Kamera na maikrofoni zinatumika</translation> <translation id="6739144137573853180">NENDA KWENYE MIPANGILIO</translation> <translation id="6751052314767925245">Kinadhibitiwa na msimamizi wako</translation> <translation id="6751826523481687655">Kipengele cha ufuatiliaji wa utendaji kimewashwa</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb index 5391b57f..ca199244 100644 --- a/ash/strings/ash_strings_th.xtb +++ b/ash/strings/ash_strings_th.xtb
@@ -27,6 +27,7 @@ <translation id="1111021433905331574">คุณเปลี่ยนสีไฟแบ็กไลต์ของแป้นพิมพ์ได้ในการตั้งค่า > <ph name="APP_TITLE" /></translation> <translation id="112308213915226829">ซ่อนชั้นวางโดยอัตโนมัติ</translation> <translation id="1142002900084379065">รูปภาพล่าสุด</translation> +<translation id="114451698114044150">การซูมอัตโนมัติเปิดอยู่</translation> <translation id="1148499908455722006">เปิดกล่องโต้ตอบข้อมูลของ <ph name="USER_NAME" /></translation> <translation id="1150989369772528668">ปฏิทิน</translation> <translation id="1153356358378277386">อุปกรณ์ที่จับคู่</translation> @@ -449,6 +450,7 @@ <translation id="3593039967545720377">เข้าถึงประวัติคลิปบอร์ดโดยกด <ph name="SHORTCUT_KEY_NAME" /> + V เพื่อดูคลิปบอร์ด คัดลอกรายการเพื่อเริ่มต้นใช้งาน</translation> <translation id="3593646411856133110">เลื่อนขึ้นค้างไว้เพื่อดูแอปที่เปิดอยู่</translation> <translation id="3595596368722241419">แบตเตอรี่เต็ม</translation> +<translation id="3600061223661453002">ปิด</translation> <translation id="3604801046548457007">สร้างเดสก์ <ph name="DESK_TITILE" /> แล้ว</translation> <translation id="3606978283550408104">เชื่อมต่ออุปกรณ์แสดงผลอักษรเบรลล์แล้ว</translation> <translation id="3615926715408477684">การเปิดใช้อินเทอร์เน็ตมือถือจะเปิดใช้บลูทูธ</translation> @@ -967,6 +969,7 @@ <translation id="6637729079642709226">เปลี่ยนเวลา</translation> <translation id="6641720045729354415">เปิด/ปิดคำบรรยายสด <ph name="STATE_TEXT" /></translation> <translation id="6643169293433369663">เลิกทำการจัดเรียงลำดับตามชื่อ</translation> +<translation id="6649641931981131786">ปรับกล้องเพื่อให้คุณอยู่ตรงกลางหน้าจอ</translation> <translation id="6650072551060208490"><ph name="ORIGIN_NAME" /> ต้องการยืนยันว่าเป็นคุณ</translation> <translation id="6650933572246256093">อุปกรณ์บลูทูธ "<ph name="DEVICE_NAME" />" ต้องการสิทธิ์ในการจับคู่ โปรดป้อนรหัสผ่านนี้บนอุปกรณ์นั้น: <ph name="PASSKEY" /></translation> <translation id="6657585470893396449">รหัสผ่าน</translation> @@ -1008,6 +1011,7 @@ <translation id="685782768769951078">{NUM_DIGITS,plural, =1{เหลือตัวเลขอีก 1 หลัก}other{เหลือตัวเลขอีก # หลัก}}</translation> <translation id="6867938213751067702">หยุดดาวน์โหลด <ph name="FILENAME" /> ไว้ชั่วคราว</translation> <translation id="6878400149835617132">ทางลัดปิดอยู่</translation> +<translation id="6878709625737492815">ซูมอัตโนมัติปิดอยู่</translation> <translation id="6884665277231944629">กลับไปที่วันนี้</translation> <translation id="6886172995547742638"><ph name="DEVICE_TYPE" /> อาจมีประสิทธิภาพลดลง ใช้อะแดปเตอร์ USB-C <ph name="PREFERRED_MINIMUM_POWER" /> วัตต์ขึ้นไปที่ได้รับการรับรอง</translation> <translation id="688631446150864480">กดปุ่มลูกศรลงเพื่อเปลี่ยนหน้าต่าง</translation> @@ -1087,6 +1091,7 @@ <translation id="7378203170292176219">ลากเพื่อเลือกพื้นที่ที่จะบันทึก</translation> <translation id="7378594059915113390">การควบคุมสื่อ</translation> <translation id="7378889811480108604">โหมดประหยัดแบตเตอรี่ปิดอยู่</translation> +<translation id="7382680553121047388">เปิด</translation> <translation id="7384028040782072252">คลิกขวาที่ใดก็ได้เพื่อเรียงลำดับแอปใหม่</translation> <translation id="7392563512730092880">คุณตั้งค่าภายหลังได้เสมอจากการตั้งค่า</translation> <translation id="7405710164030118432">ป้อนรหัสการเข้าถึง Family Link ของผู้ปกครองเพื่อปลดล็อกอุปกรณ์</translation> @@ -1170,6 +1175,7 @@ <translation id="7868900307798234037">กำลังปลดล็อกด้วยลายนิ้วมือ</translation> <translation id="7872195908557044066">ผู้ดูแลระบบกำลังรีเซ็ต eSIM รอสักครู่</translation> <translation id="7872786842639831132">ปิด</translation> +<translation id="7875280185395705476">ซูมอัตโนมัติ</translation> <translation id="7875575368831396199">ดูเหมือนว่าบลูทูธของ <ph name="DEVICE_TYPE" /> จะปิดอยู่ โปรดเปิดบลูทูธเพื่อใช้ฮับโทรศัพท์</translation> <translation id="7877557217297072640">{0,plural, =0{เปลี่ยนอุปกรณ์เป็นเวอร์ชันก่อนหน้าในตอนนี้}=1{เปลี่ยนอุปกรณ์เป็นเวอร์ชันก่อนหน้าภายใน 1 วินาที}other{เปลี่ยนอุปกรณ์เป็นเวอร์ชันก่อนหน้าภายใน # วินาที}}</translation> <translation id="7886169021410746335">ปรับการตั้งค่าความเป็นส่วนตัว</translation> @@ -1289,6 +1295,7 @@ <translation id="856298576161209842"><ph name="MANAGER" /> แนะนำให้คุณอัปเดต <ph name="DEVICE_TYPE" /></translation> <translation id="8563862697512465947">การตั้งค่าการแจ้งเตือน</translation> <translation id="857201607579416096">เมนูได้ย้ายไปอยู่ที่มุมขวาล่างของหน้าจอ</translation> +<translation id="8576288697319745668">สลับเปิด/ปิดซูมอัตโนมัติ <ph name="STATE_TEXT" /></translation> <translation id="8594115950068821369">-<ph name="FORMATTED_TIME" /></translation> <translation id="8598235756057743477">จัดเรียงแอปตามชื่อหรือสี</translation> <translation id="8614517853887502247">การแจ้งเตือนของ <ph name="APP_1_TITLE" /> และ <ph name="APP_2_TITLE" /> ซ่อนอยู่เนื่องจากเปิดโหมดป้องกันการดูไว้</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb index abb9f2e..7e0d6da3 100644 --- a/ash/strings/ash_strings_uk.xtb +++ b/ash/strings/ash_strings_uk.xtb
@@ -306,6 +306,7 @@ <translation id="2805756323405976993">Додатки</translation> <translation id="2814448776515246190">Зйомка частини екрана</translation> <translation id="2819276065543622893">Зараз ви вийдете.</translation> +<translation id="2822551631199737692">Використовується камера</translation> <translation id="2825224105325558319"><ph name="DISPLAY_NAME" /> не підтримує роздільну здатність <ph name="SPECIFIED_RESOLUTION" />. Роздільну здатність змінено на <ph name="FALLBACK_RESOLUTION" />.</translation> <translation id="2825619548187458965">Полиця</translation> <translation id="2831035692318564937">Увімкнено до сходу сонця</translation> @@ -807,6 +808,7 @@ <translation id="5682642926269496722">Google Асистент недоступний для поточного облікового запису користувача.</translation> <translation id="5689633613396158040">Нічний екран допомагає знизити напруження очей в умовах тьмяного освітлення. Торкніться, щоб змінити час увімкнення нічного екрана або вимкнути його повністю.</translation> <translation id="5691772641933328258">Відбиток не розпізнано</translation> +<translation id="5693255400847650006">Використовується мікрофон</translation> <translation id="570390244361237317">Усі додатки: щоб перейти до всіх додатків, використовуйте клавіші зі стрілками</translation> <translation id="5707775774148071965">Швидкість передачі даних для пристрою вища, ніж для кабелю. Продуктивність пристрою може бути обмежено.</translation> <translation id="5710450975648804523">Режим "Не турбувати" ввімкнено</translation> @@ -981,6 +983,7 @@ <translation id="6723839937902243910">Заряд</translation> <translation id="6727969043791803658">Під'єднано, акумулятор заряджено на <ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6737983188036277605">Використовується камера й мікрофон</translation> <translation id="6739144137573853180">ПЕРЕЙТИ ДО НАЛАШТУВАНЬ</translation> <translation id="6751052314767925245">Застосовується адміністратором</translation> <translation id="6751826523481687655">Відстеження ефективності ввімкнено</translation>
diff --git a/ash/strings/ash_strings_uz.xtb b/ash/strings/ash_strings_uz.xtb index 3aed503bd..5d9c90a 100644 --- a/ash/strings/ash_strings_uz.xtb +++ b/ash/strings/ash_strings_uz.xtb
@@ -652,6 +652,7 @@ <translation id="4690510401873698237">Javon pastda</translation> <translation id="4696813013609194136">Ota-ona kodi bilan qurilmani qulfdan chiqarish</translation> <translation id="4702647871202761252">Maxfiylik ekrani yoniq emas</translation> +<translation id="470644585772471629">Ranglarni akslantirish</translation> <translation id="4717575069099566988">USB-C kabelingiz USB4 qurilmalar bilan ishlamaydi. Qurilma samaradorligi cheklanishi mumkin.</translation> <translation id="4730374152663651037">TEZ-TEZ ISHLATILADIGAN</translation> <translation id="4731797938093519117">Ota-ona kirishi</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb index 6c0c98c..c0f1249 100644 --- a/ash/strings/ash_strings_vi.xtb +++ b/ash/strings/ash_strings_vi.xtb
@@ -650,6 +650,7 @@ <translation id="4690510401873698237">Giá ở dưới cùng</translation> <translation id="4696813013609194136">Mở khóa thiết bị bằng mã dành cho cha mẹ</translation> <translation id="4702647871202761252">Màn hình bảo vệ quyền riêng tư đang tắt</translation> +<translation id="470644585772471629">Đảo màu</translation> <translation id="4717575069099566988">Cáp USB-C của bạn không hỗ trợ USB4. Hiệu suất của thiết bị có thể bị hạn chế.</translation> <translation id="4730374152663651037">SỬ DỤNG THƯỜNG XUYÊN</translation> <translation id="4731797938093519117">Quyền truy cập của cha mẹ</translation>
diff --git a/ash/strings/ash_strings_zh-HK.xtb b/ash/strings/ash_strings_zh-HK.xtb index 5d24662..e25d48861 100644 --- a/ash/strings/ash_strings_zh-HK.xtb +++ b/ash/strings/ash_strings_zh-HK.xtb
@@ -307,6 +307,7 @@ <translation id="2805756323405976993">應用程式</translation> <translation id="2814448776515246190">局部擷取</translation> <translation id="2819276065543622893">現在即將登出。</translation> +<translation id="2822551631199737692">相機正在使用中</translation> <translation id="2825224105325558319"><ph name="DISPLAY_NAME" /> 不支援 <ph name="SPECIFIED_RESOLUTION" />,解像度已變更為 <ph name="FALLBACK_RESOLUTION" />。</translation> <translation id="2825619548187458965">捷徑列</translation> <translation id="2831035692318564937">開啟,直到日出</translation> @@ -808,6 +809,7 @@ <translation id="5682642926269496722">「Google 助理」不適用於目前的使用者帳戶。</translation> <translation id="5689633613396158040">「夜燈模式」讓您更易在光線昏暗的環境下觀看螢幕內容或閱讀。輕按即可變更「夜燈模式」的開啟時間,或完全關閉此功能。</translation> <translation id="5691772641933328258">識別唔到指紋</translation> +<translation id="5693255400847650006">麥克風正在使用中</translation> <translation id="570390244361237317">所有應用程式,用方向鍵導覽就可以存取所有應用程式</translation> <translation id="5707775774148071965">您的裝置支援比連接線更高的資料傳輸速率。裝置效能可能受到限制。</translation> <translation id="5710450975648804523">「請勿騷擾」模式已開啟</translation> @@ -982,6 +984,7 @@ <translation id="6723839937902243910">電源</translation> <translation id="6727969043791803658">已連接,電量為 <ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6737983188036277605">相機和麥克風正在使用中</translation> <translation id="6739144137573853180">前往「設定」</translation> <translation id="6751052314767925245">由管理員強制執行</translation> <translation id="6751826523481687655">效能追蹤已啟用</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb index 102f73f0..b474e36 100644 --- a/ash/strings/ash_strings_zh-TW.xtb +++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -307,6 +307,7 @@ <translation id="2805756323405976993">應用程式</translation> <translation id="2814448776515246190">局部擷取</translation> <translation id="2819276065543622893">現在即將登出。</translation> +<translation id="2822551631199737692">相機正在使用中</translation> <translation id="2825224105325558319"><ph name="DISPLAY_NAME" /> 不支援 <ph name="SPECIFIED_RESOLUTION" />,解析度已變更為 <ph name="FALLBACK_RESOLUTION" />。</translation> <translation id="2825619548187458965">檔案櫃</translation> <translation id="2831035692318564937">開啟,直到日出</translation> @@ -809,6 +810,7 @@ <translation id="5682642926269496722">Google 助理不支援目前的使用者帳戶。</translation> <translation id="5689633613396158040">夜燈功能可讓你在光線昏暗的環境下更容易看清畫面內容或閱讀文字。輕觸即可變更夜燈的開啟時間,或完全關閉夜燈功能。</translation> <translation id="5691772641933328258">指紋辨識失敗</translation> +<translation id="5693255400847650006">麥克風正在使用中</translation> <translation id="570390244361237317">所有的應用程式,以方向鍵瀏覽即可存取所有的應用程式</translation> <translation id="5707775774148071965">你使用的連接線無法達到裝置所支援的資料傳輸速率。裝置效能可能會因此受到限制。</translation> <translation id="5710450975648804523">「零打擾」模式已開啟</translation> @@ -983,6 +985,7 @@ <translation id="6723839937902243910">電源</translation> <translation id="6727969043791803658">已連線,電量為 <ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="6732800389263199929">+<ph name="COUNT" /></translation> +<translation id="6737983188036277605">相機和麥克風正在使用中</translation> <translation id="6739144137573853180">前往「設定」</translation> <translation id="6751052314767925245">由系統管理員強制執行</translation> <translation id="6751826523481687655">效能追蹤已啟用</translation>
diff --git a/ash/system/network/managed_sim_lock_notifier.cc b/ash/system/network/managed_sim_lock_notifier.cc index 68f93cc..2d53b9a 100644 --- a/ash/system/network/managed_sim_lock_notifier.cc +++ b/ash/system/network/managed_sim_lock_notifier.cc
@@ -142,6 +142,10 @@ for (auto& network : networks) { if (network->type_state->get_cellular()->sim_lock_enabled) { ShowNotification(); + if (network->type_state->get_cellular()->sim_locked) { + chromeos::CellularMetricsLogger::RecordSimLockNotificationLockType( + network->type_state->get_cellular()->sim_lock_type); + } return; } }
diff --git a/ash/system/network/managed_sim_lock_notifier_unittest.cc b/ash/system/network/managed_sim_lock_notifier_unittest.cc index 3968c741..46b21d7 100644 --- a/ash/system/network/managed_sim_lock_notifier_unittest.cc +++ b/ash/system/network/managed_sim_lock_notifier_unittest.cc
@@ -77,15 +77,19 @@ base::RunLoop().RunUntilIdle(); } - void SetCellularSimLockEnabled(bool enable) { + void SetCellularSimLockEnabled( + bool enable, + const absl::optional<std::string>& lock_type = absl::nullopt) { // Simulate a locked SIM. - base::Value sim_lock_status(base::Value::Type::DICTIONARY); - sim_lock_status.SetKey(shill::kSIMLockEnabledProperty, base::Value(enable)); + base::Value::Dict sim_lock_status; + sim_lock_status.Set(shill::kSIMLockEnabledProperty, enable); + if (lock_type.has_value()) + sim_lock_status.Set(shill::kSIMLockTypeProperty, *lock_type); network_config_helper_->network_state_helper() .device_test() ->SetDeviceProperty( kTestCellularDevicePath, shill::kSIMLockStatusProperty, - std::move(sim_lock_status), /*notify_changed=*/true); + base::Value(std::move(sim_lock_status)), /*notify_changed=*/true); // Set the cellular service to be the active profile. base::Value::List sim_slot_infos; @@ -346,4 +350,36 @@ chromeos::CellularMetricsLogger::SimLockNotificationEvent::kDismissed, 1); } +TEST_F(ManagedSimLockNotifierTest, SIMLockTypeMetrics) { + base::HistogramTester histograms; + + AddCellularDevice(); + AddCellularService(); + SetCellularSimLockEnabled(true, shill::kSIMLockPin); + SetAllowCellularSimLock(false); + + EXPECT_TRUE(GetManagedSimLockNotification()); + histograms.ExpectBucketCount( + chromeos::CellularMetricsLogger::kSimLockNotificationLockType, + chromeos::CellularMetricsLogger::SimPinLockType::kPinLocked, 1); + histograms.ExpectBucketCount( + chromeos::CellularMetricsLogger::kSimLockNotificationLockType, + chromeos::CellularMetricsLogger::SimPinLockType::kPukLocked, 0); + + SetCellularSimLockEnabled(false); + SetAllowCellularSimLock(true); + EXPECT_FALSE(GetManagedSimLockNotification()); + + SetCellularSimLockEnabled(true, shill::kSIMLockPuk); + SetAllowCellularSimLock(false); + + EXPECT_TRUE(GetManagedSimLockNotification()); + histograms.ExpectBucketCount( + chromeos::CellularMetricsLogger::kSimLockNotificationLockType, + chromeos::CellularMetricsLogger::SimPinLockType::kPinLocked, 1); + histograms.ExpectBucketCount( + chromeos::CellularMetricsLogger::kSimLockNotificationLockType, + chromeos::CellularMetricsLogger::SimPinLockType::kPukLocked, 1); +} + } // namespace ash
diff --git a/ash/wallpaper/wallpaper_controller_impl.cc b/ash/wallpaper/wallpaper_controller_impl.cc index 8365b296..1e443c89 100644 --- a/ash/wallpaper/wallpaper_controller_impl.cc +++ b/ash/wallpaper/wallpaper_controller_impl.cc
@@ -922,14 +922,12 @@ FROM_HERE, base::BindOnce(&DeleteGooglePhotosCache, account_id)); } - return pref_manager_->SetUserWallpaperInfo(account_id, - IsEphemeralUser(account_id), info); + return pref_manager_->SetUserWallpaperInfo(account_id, info); } bool WallpaperControllerImpl::GetUserWallpaperInfo(const AccountId& account_id, WallpaperInfo* info) const { - return pref_manager_->GetUserWallpaperInfo(account_id, - IsEphemeralUser(account_id), info); + return pref_manager_->GetUserWallpaperInfo(account_id, info); } bool WallpaperControllerImpl::GetWallpaperFromCache(const AccountId& account_id,
diff --git a/ash/wallpaper/wallpaper_pref_manager.cc b/ash/wallpaper/wallpaper_pref_manager.cc index ac0ccf4..3e85743 100644 --- a/ash/wallpaper/wallpaper_pref_manager.cc +++ b/ash/wallpaper/wallpaper_pref_manager.cc
@@ -10,6 +10,7 @@ #include "ash/constants/ash_features.h" #include "ash/constants/ash_pref_names.h" +#include "ash/public/cpp/session/session_types.h" #include "ash/public/cpp/wallpaper/wallpaper_controller_client.h" #include "ash/public/cpp/wallpaper/wallpaper_info.h" #include "ash/public/cpp/wallpaper/wallpaper_types.h" @@ -272,6 +273,18 @@ return Shell::Get()->session_controller()->IsActiveUserSessionStarted(); } + bool IsEphemeral(const AccountId& account_id) const override { + const UserSession* user_session = + Shell::Get()->session_controller()->GetUserSessionByAccountId( + account_id); + if (!user_session) { + // User is not logged in. Thus, they are not ephemeral. + return false; + } + + return user_session->user_info.is_ephemeral; + } + private: base::raw_ptr<WallpaperControllerClient> wallpaper_controller_client_ = nullptr; // not owned @@ -294,9 +307,8 @@ } bool GetUserWallpaperInfo(const AccountId& account_id, - bool ephemeral, WallpaperInfo* info) const override { - if (ephemeral) { + if (profile_helper_->IsEphemeral(account_id)) { // Ephemeral users do not save anything to local state. Return true if the // info can be found in the map, otherwise return false. auto it = ephemeral_users_wallpaper_info_.find(account_id); @@ -311,9 +323,8 @@ } bool SetUserWallpaperInfo(const AccountId& account_id, - bool ephemeral, const WallpaperInfo& info) override { - if (ephemeral) { + if (profile_helper_->IsEphemeral(account_id)) { ephemeral_users_wallpaper_info_.insert_or_assign(account_id, info); return true; }
diff --git a/ash/wallpaper/wallpaper_pref_manager.h b/ash/wallpaper/wallpaper_pref_manager.h index 1a3cf54..d9abc2e9 100644 --- a/ash/wallpaper/wallpaper_pref_manager.h +++ b/ash/wallpaper/wallpaper_pref_manager.h
@@ -48,6 +48,9 @@ // Returns true if at least one user is logged in. virtual bool IsActiveUserSessionStarted() const = 0; + + // Returns true if the user should store data in memory only. + virtual bool IsEphemeral(const AccountId& id) const = 0; }; // Manages wallpaper preferences and tracks the currently configured wallpaper. @@ -90,21 +93,14 @@ virtual void SetClient(WallpaperControllerClient* client) = 0; // Retrieve the wallpaper preference value for |account_id| and use it to - // populate |info|. If |ephemeral| is true, data is stored in an in memory - // map. If |ephemeral| is false, |info| is persisted to user prefs. Returns - // true if |info| was populated successfully. + // populate |info|. Returns true if |info| was populated successfully. // // NOTE: WallpaperPrefManager does not enforce any checks for policy // enforcement. Callers must check that the user is allowed to commit the pref // change. - // - // TODO(crbug.com/1329567): Remove the |ephemeral| parameter when we've safely - // moved to SessionController for user type. virtual bool GetUserWallpaperInfo(const AccountId& account_id, - bool ephemeral, WallpaperInfo* info) const = 0; virtual bool SetUserWallpaperInfo(const AccountId& account_id, - bool ephemeral, const WallpaperInfo& info) = 0; // Remove the wallpaper entry for |account_id|.
diff --git a/ash/wallpaper/wallpaper_pref_manager_unittest.cc b/ash/wallpaper/wallpaper_pref_manager_unittest.cc index 15870a6..b53a0014 100644 --- a/ash/wallpaper/wallpaper_pref_manager_unittest.cc +++ b/ash/wallpaper/wallpaper_pref_manager_unittest.cc
@@ -143,6 +143,9 @@ return is_sync_enabled; } + bool IsEphemeral(const AccountId&) const override { return is_ephemeral; } + + bool is_ephemeral = false; bool is_session_started = true; bool is_sync_enabled = true; AccountId active_account; @@ -187,37 +190,38 @@ TEST_F(WallpaperPrefManagerTest, GetWallpaperInfo_Normal) { WallpaperInfo expected_info = InfoWithType(WallpaperType::kDaily); - pref_manager_->SetUserWallpaperInfo(account_id_1, false, expected_info); + pref_manager_->SetUserWallpaperInfo(account_id_1, expected_info); WallpaperInfo actual_info; - EXPECT_TRUE( - pref_manager_->GetUserWallpaperInfo(account_id_1, false, &actual_info)); + EXPECT_TRUE(pref_manager_->GetUserWallpaperInfo(account_id_1, &actual_info)); EXPECT_EQ(expected_info, actual_info); } TEST_F(WallpaperPrefManagerTest, GetWallpaperInfo_Ephemeral) { + profile_helper_->is_ephemeral = true; WallpaperInfo expected_info = InfoWithType(WallpaperType::kDaily); - pref_manager_->SetUserWallpaperInfo(account_id_1, true, expected_info); + pref_manager_->SetUserWallpaperInfo(account_id_1, expected_info); WallpaperInfo actual_info; - EXPECT_TRUE( - pref_manager_->GetUserWallpaperInfo(account_id_1, true, &actual_info)); + EXPECT_TRUE(pref_manager_->GetUserWallpaperInfo(account_id_1, &actual_info)); EXPECT_EQ(expected_info, actual_info); } TEST_F(WallpaperPrefManagerTest, GetWallpaperInfoNothingToGet_Normal) { WallpaperInfo info; - EXPECT_FALSE(pref_manager_->GetUserWallpaperInfo(account_id_1, false, &info)); + EXPECT_FALSE(pref_manager_->GetUserWallpaperInfo(account_id_1, &info)); } TEST_F(WallpaperPrefManagerTest, GetWallpaperInfoNothingToGet_Ephemeral) { + profile_helper_->is_ephemeral = true; WallpaperInfo info; - EXPECT_FALSE(pref_manager_->GetUserWallpaperInfo(account_id_1, true, &info)); + EXPECT_FALSE(pref_manager_->GetUserWallpaperInfo(account_id_1, &info)); } TEST_F(WallpaperPrefManagerTest, SetWallpaperInfo_EphemeralDoesNotChangeLocal) { + profile_helper_->is_ephemeral = true; WallpaperInfo expected_info = InfoWithType(WallpaperType::kDaily); - pref_manager_->SetUserWallpaperInfo(account_id_1, true, expected_info); + pref_manager_->SetUserWallpaperInfo(account_id_1, expected_info); // Local state is expected to be untouched for ephemeral users. EXPECT_EQ(nullptr, local_state_->GetUserPrefValue(prefs::kUserWallpaperInfo)); @@ -227,7 +231,7 @@ WallpaperInfo info( GetDummyFileName(account_id_1), WALLPAPER_LAYOUT_CENTER_CROPPED, WallpaperType::kThirdParty, base::Time::Now().LocalMidnight()); - EXPECT_TRUE(pref_manager_->SetUserWallpaperInfo(account_id_1, false, info)); + EXPECT_TRUE(pref_manager_->SetUserWallpaperInfo(account_id_1, info)); AssertWallpaperInfoInPrefs(local_state_.get(), prefs::kUserWallpaperInfo, account_id_1, info); } @@ -236,7 +240,7 @@ profile_helper_->RegisterPrefsForAccount(account_id_1); WallpaperInfo info = InfoWithType(WallpaperType::kOnline); - EXPECT_TRUE(pref_manager_->SetUserWallpaperInfo(account_id_1, false, info)); + EXPECT_TRUE(pref_manager_->SetUserWallpaperInfo(account_id_1, info)); AssertWallpaperInfoInPrefs( profile_helper_->GetUserPrefServiceSyncable(account_id_1), prefs::kSyncableWallpaperInfo, account_id_1, info); @@ -255,7 +259,7 @@ prefs::kSyncableWallpaperInfo); WallpaperInfo info = InfoWithType(WallpaperType::kOnline); - EXPECT_TRUE(pref_manager_->SetUserWallpaperInfo(account_id_1, false, info)); + EXPECT_TRUE(pref_manager_->SetUserWallpaperInfo(account_id_1, info)); // Verify that calling SetUserWallpaperInfo does NOT change what is in synced // prefs when sync is disabled. @@ -273,7 +277,7 @@ prefs::kSyncableWallpaperInfo); WallpaperInfo info = InfoWithType(WallpaperType::kCustomized); - EXPECT_TRUE(pref_manager_->SetUserWallpaperInfo(account_id_1, false, info)); + EXPECT_TRUE(pref_manager_->SetUserWallpaperInfo(account_id_1, info)); // Custom wallpaper infos should not be propagated to synced preferences until // the image is uploaded to drivefs. That is not done in
diff --git a/ash/webui/camera_app_ui/camera_app_ui.cc b/ash/webui/camera_app_ui/camera_app_ui.cc index 6bef9e9..a7dc049 100644 --- a/ash/webui/camera_app_ui/camera_app_ui.cc +++ b/ash/webui/camera_app_ui/camera_app_ui.cc
@@ -53,10 +53,17 @@ base::BindOnce( [](const std::string& url, content::WebUIDataSource::GotDataCallback callback) { - base::FilePath path = - base::FilePath(kCCALocalOverrideDirectoryPath).Append(url); + // The url passed in only contain path and query part. + auto parsed_url = GURL(kChromeUICameraAppURL + url); + // parsed_url.path() includes the leading "/" but + // FilePath::Append only allows relative path. + base::FilePath file_path = + base::FilePath(kCCALocalOverrideDirectoryPath) + .Append(base::TrimString( + parsed_url.path_piece(), "/", + base::TrimPositions::TRIM_LEADING)); std::string result; - if (base::ReadFileToString(path, &result)) { + if (base::ReadFileToString(file_path, &result)) { std::move(callback).Run( base::RefCountedString::TakeString(&result)); } else {
diff --git a/ash/webui/help_app_ui/test/help_app_guest_ui_browsertest.js b/ash/webui/help_app_ui/test/help_app_guest_ui_browsertest.js index 9759a42e..c5e1cdba 100644 --- a/ash/webui/help_app_ui/test/help_app_guest_ui_browsertest.js +++ b/ash/webui/help_app_ui/test/help_app_guest_ui_browsertest.js
@@ -11,6 +11,14 @@ assertEquals(document.documentElement.lang, 'en-US'); }); +GUEST_TEST('GuestLoadsLoadTimeData', () => { + /** @type {{getString: function(string): string}} */ + const loadTimeData = window['loadTimeData']; + // Check `LoadTimeData` exists on the global window object. + chai.assert.isTrue(loadTimeData !== undefined); + chai.expect(loadTimeData.getString('appLocale')).to.equal('en-US'); +}); + /** * Waits for the app's initial index update to complete. This prevents it from * interfering with test code. After the update completes, there will be at
diff --git a/ash/webui/help_app_ui/test/help_app_ui_gtest_browsertest.js b/ash/webui/help_app_ui/test/help_app_ui_gtest_browsertest.js index 3c7b9ce4..a0b13e8 100644 --- a/ash/webui/help_app_ui/test/help_app_ui_gtest_browsertest.js +++ b/ash/webui/help_app_ui/test/help_app_ui_gtest_browsertest.js
@@ -180,6 +180,10 @@ runHelpAppTestInGuest('GuestHasLang'); }); +TEST_F('HelpAppUIGtestBrowserTest', 'GuestLoadsLoadTimeData', () => { + runHelpAppTestInGuest('GuestLoadsLoadTimeData'); +}); + TEST_F('HelpAppUIGtestBrowserTest', 'GuestCanSearchWithHeadings', () => { runHelpAppTestInGuest('GuestCanSearchWithHeadings'); });
diff --git a/base/memory/raw_ptr.h b/base/memory/raw_ptr.h index 5d8c1cfd..9a62f039 100644 --- a/base/memory/raw_ptr.h +++ b/base/memory/raw_ptr.h
@@ -796,7 +796,7 @@ return *this; } - ALWAYS_INLINE raw_ptr& operator=(raw_ptr&& p) { + ALWAYS_INLINE raw_ptr& operator=(raw_ptr&& p) noexcept { if (LIKELY(this != &p)) { Impl::ReleaseWrappedPtr(wrapped_ptr_); wrapped_ptr_ = p.wrapped_ptr_;
diff --git a/build/BUILD.gn b/build/BUILD.gn index 62c949b..37b8c2f 100644 --- a/build/BUILD.gn +++ b/build/BUILD.gn
@@ -8,6 +8,7 @@ import("//build/config/chromeos/args.gni") import("//build/config/chromeos/ui_mode.gni") import("//build/util/process_version.gni") +import("//build_overrides/build.gni") source_set("buildflag_header_h") { sources = [ "buildflag.h" ] @@ -56,12 +57,14 @@ ] } -group("gold_common_pytype") { - testonly = true +if (build_with_chromium) { + group("gold_common_pytype") { + testonly = true - data = [ "//build/skia_gold_common/" ] + data = [ "//build/skia_gold_common/" ] - data_deps = [ "//testing:pytype_dependencies" ] + data_deps = [ "//testing:pytype_dependencies" ] + } } if (is_chromeos) {
diff --git a/build/config/arm.gni b/build/config/arm.gni index 7d4a6d7..fb21f2b5 100644 --- a/build/config/arm.gni +++ b/build/config/arm.gni
@@ -87,9 +87,6 @@ if (arm_arch == "") { arm_arch = "armv7-a" } - if (arm_tune == "") { - arm_tune = "generic-armv7-a" - } if (arm_float_abi == "") { if (current_os == "linux" && target_cpu != v8_target_cpu) {
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1 index 79da1403..abbc422 100644 --- a/build/fuchsia/linux_internal.sdk.sha1 +++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@ -9.20220724.2.1 +9.20220725.0.1
diff --git a/buildtools/deps_revisions.gni b/buildtools/deps_revisions.gni index 507ad5d..8fb488c 100644 --- a/buildtools/deps_revisions.gni +++ b/buildtools/deps_revisions.gni
@@ -5,5 +5,5 @@ declare_args() { # Used to cause full rebuilds on libc++ rolls. This should be kept in sync # with the libcxx_revision vars in //DEPS. - libcxx_revision = "476d5aefd9faf2ad50b09eb49b8be59b4cca97a6" + libcxx_revision = "6c8f712bc4430d582f00f7c341d768a38d8f9334" }
diff --git a/chrome/VERSION b/chrome/VERSION index e47802e..3e91115 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=106 MINOR=0 -BUILD=5201 +BUILD=5202 PATCH=0
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AssistantOnboardingHelperTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AssistantOnboardingHelperTest.java index bbf6f1f..df5f6e0 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AssistantOnboardingHelperTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AssistantOnboardingHelperTest.java
@@ -85,7 +85,9 @@ TestThreadUtils.runOnUiThreadBlocking( () -> mOnboardingHelper.showOnboarding(/* useDialogOnboarding = */ false, "", - Collections.emptyMap(), mOnboardingCallback)); + Collections.emptyMap(), + /* hideBottomSheetOnOnboardingAccepted = */ false, + mOnboardingCallback)); waitUntilViewMatchesCondition(withId(R.id.button_init_ok), isCompletelyDisplayed()); onView(withId(R.id.button_init_ok)).perform(click()); @@ -98,7 +100,9 @@ TestThreadUtils.runOnUiThreadBlocking( () -> mOnboardingHelper.showOnboarding(/* useDialogOnboarding = */ true, "", - Collections.emptyMap(), mOnboardingCallback)); + Collections.emptyMap(), + /* hideBottomSheetOnOnboardingAccepted = */ false, + mOnboardingCallback)); waitUntilViewMatchesCondition(withId(R.id.button_init_ok), isCompletelyDisplayed()); // Check that the UI is shown in a dialog. @@ -116,7 +120,9 @@ TestThreadUtils.runOnUiThreadBlocking( () -> mOnboardingHelper.showOnboarding(/* useDialogOnboarding = */ false, "", - Collections.emptyMap(), mOnboardingCallback)); + Collections.emptyMap(), + /* hideBottomSheetOnOnboardingAccepted = */ false, + mOnboardingCallback)); waitUntilViewMatchesCondition(withId(R.id.button_init_ok), isCompletelyDisplayed()); TestThreadUtils.runOnUiThreadBlocking(() -> mOnboardingHelper.hideOnboarding()); @@ -131,7 +137,9 @@ TestThreadUtils.runOnUiThreadBlocking( () -> mOnboardingHelper.showOnboarding(/* useDialogOnboarding = */ true, "", - Collections.emptyMap(), mOnboardingCallback)); + Collections.emptyMap(), + /* hideBottomSheetOnOnboardingAccepted = */ false, + mOnboardingCallback)); waitUntilViewMatchesCondition(withId(R.id.button_init_ok), isCompletelyDisplayed()); TestThreadUtils.runOnUiThreadBlocking(() -> mOnboardingHelper.hideOnboarding());
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt index 0b795a5..a6935b1 100644 --- a/chrome/android/profiles/newest.txt +++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-105.0.5195.4_rc-r1-merged.afdo.bz2 +chromeos-chrome-amd64-105.0.5195.5_rc-r1-merged.afdo.bz2
diff --git a/chrome/app/resources/chromium_strings_ca.xtb b/chrome/app/resources/chromium_strings_ca.xtb index c039a85..2dd74f8 100644 --- a/chrome/app/resources/chromium_strings_ca.xtb +++ b/chrome/app/resources/chromium_strings_ca.xtb
@@ -41,6 +41,7 @@ <translation id="2018879682492276940">La instal·lació ha fallat. Torna-ho a provar.</translation> <translation id="2020032459870799438">Per comprovar si les teves altres contrasenyes estan protegides contra violacions de les dades i contra altres problemes de seguretat, <ph name="BEGIN_LINK" />inicia la sessió a Chromium<ph name="END_LINK" />.</translation> <translation id="2049376729098081731">Tria si vols incloure l'historial de Chromium per obtenir experiències més personalitzades als serveis de Google</translation> +<translation id="2088953378266246249">Informació sobre com gestiona Chromium els seus certificats arrel</translation> <translation id="2174178932569897599">Personalitza Chromium</translation> <translation id="2174917724755363426">La instal·lació no s'ha completat. Confirmes que vols cancel·lar-la?</translation> <translation id="2185166961232948079">Chromium - Inici de sessió a la xarxa - <ph name="PAGE_TITLE" /></translation> @@ -365,6 +366,7 @@ <translation id="9185526690718004400">Reinicia per actualitzar &Chromium</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> <translation id="93478295209880648">Pot ser que Chromium no funcioni correctament perquè ja no és compatible amb Windows XP ni Windows Vista</translation> +<translation id="942598560705308788">Certificats gestionats per Chromium</translation> <translation id="945990405696787151">Per obtenir actualitzacions de Chromium en un futur, necessitaràs macOS 10.13 o una versió posterior. Aquest ordinador utilitza OS X 10.11.</translation> <translation id="965162752251293939">Qui està utilitzant Chromium?</translation> <translation id="967427899662692980">Obtén la seguretat més efectiva de Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_cy.xtb b/chrome/app/resources/chromium_strings_cy.xtb index 9c5755d..d84aa2a 100644 --- a/chrome/app/resources/chromium_strings_cy.xtb +++ b/chrome/app/resources/chromium_strings_cy.xtb
@@ -43,6 +43,7 @@ <translation id="2018879682492276940">Methwyd â gosod. Rhowch gynnig arall arni.</translation> <translation id="2020032459870799438">I wirio a yw'ch cyfrineiriau eraill yn ddiogel rhag toriadau data a phroblemau diogelwch eraill, <ph name="BEGIN_LINK" />mewngofnodwch i Chromium<ph name="END_LINK" />.</translation> <translation id="2049376729098081731">Dewiswch a ddylid cynnwys hanes Chromium i gael profiadau mwy personol yng ngwasanaethau Google</translation> +<translation id="2088953378266246249">Gwybodaeth am sut mae Chromium yn rheoli ei dystysgrifau gwraidd</translation> <translation id="2174178932569897599">Personoleiddio Chromium</translation> <translation id="2174917724755363426">Gosod heb ei gwblhau. Ydych chi'n siŵr eich bod am ganslo?</translation> <translation id="2185166961232948079">Chromium - Mewngofnodi Rhwydwaith - <ph name="PAGE_TITLE" /></translation> @@ -367,6 +368,7 @@ <translation id="9185526690718004400">Ail-lansiwch i ddiweddaru &Chromium</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> <translation id="93478295209880648">Mae'n bosib na fydd Chromium yn gweithredu'n gywir oherwydd nad yw'n cael ei gefnogi mwyach ar Windows XP na Windows Vista</translation> +<translation id="942598560705308788">Tystysgrifau a reolir gan Chromium</translation> <translation id="945990405696787151">I gael diweddariadau Chromium yn y dyfodol, bydd angen macOS 10.13 neu'n hwyrach arnoch. Mae'r cyfrifiadur hwn yn defnyddio OS X 10.11.</translation> <translation id="965162752251293939">Pwy sy'n defnyddio Chromium?</translation> <translation id="967427899662692980">Cael diogelwch cryfaf Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_es-419.xtb b/chrome/app/resources/chromium_strings_es-419.xtb index 4d20cdb..429b7d08 100644 --- a/chrome/app/resources/chromium_strings_es-419.xtb +++ b/chrome/app/resources/chromium_strings_es-419.xtb
@@ -41,6 +41,7 @@ <translation id="2018879682492276940">No se completó la instalación. Vuelve a intentarlo.</translation> <translation id="2020032459870799438">Para comprobar si tus otras contraseñas están a salvo de violaciones de la seguridad de los datos y otros problemas de seguridad, <ph name="BEGIN_LINK" />accede a Chromium<ph name="END_LINK" />.</translation> <translation id="2049376729098081731">Elige si quieres incluir el historial de Chromium para tener experiencias más personalizadas en los servicios de Google</translation> +<translation id="2088953378266246249">Información sobre cómo Chromium administra sus certificados raíz</translation> <translation id="2174178932569897599">Personalizar Chromium</translation> <translation id="2174917724755363426">No se completó la instalación. ¿Confirmas que quieres cancelarla?</translation> <translation id="2185166961232948079">Chromium: Acceso a la red - <ph name="PAGE_TITLE" /></translation> @@ -359,6 +360,7 @@ <translation id="9185526690718004400">Reiniciar para actualizar &Chromium</translation> <translation id="9190841055450128916">Chromium (tráfico mDNS entrante)</translation> <translation id="93478295209880648">Es posible que Chromium no funcione correctamente porque ya no es compatible con Windows XP ni Windows Vista</translation> +<translation id="942598560705308788">Certificados administrados por Chromium</translation> <translation id="945990405696787151">Para obtener próximas actualizaciones de Chromium, necesitarás macOS 10.13 o versiones posteriores. Esta computadora usa OS X 10.11.</translation> <translation id="965162752251293939">¿Quién usa Chromium?</translation> <translation id="967427899662692980">Obtén la seguridad más sólida de Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_fa.xtb b/chrome/app/resources/chromium_strings_fa.xtb index 1744343..3b863f9 100644 --- a/chrome/app/resources/chromium_strings_fa.xtb +++ b/chrome/app/resources/chromium_strings_fa.xtb
@@ -41,6 +41,7 @@ <translation id="2018879682492276940">نصب تکمیل نشد. لطفاً دوباره امتحان کنید.</translation> <translation id="2020032459870799438">برای بررسی اینکه از دیگر گذرواژههایتان دربرابر نقض داده یا دیگر مشکلات امنیتی محافظت میشود، <ph name="BEGIN_LINK" />به سیستم Chromium وارد شوید<ph name="END_LINK" />.</translation> <translation id="2049376729098081731">انتخاب کنید که آیا سابقه Chromium برای تجربههای شخصیشدهتر در سرویسهای Google لحاظ شود یا نه</translation> +<translation id="2088953378266246249">اطلاعات مربوط به اینکه Chromium چگونه گواهینامههای ریشهاش را مدیریت میکند</translation> <translation id="2174178932569897599">سفارشی کردن Chromium</translation> <translation id="2174917724755363426">نصب کامل نیست. مطمئنید میخواهید آن را لغو کنید؟</translation> <translation id="2185166961232948079">Chromium - ورود به سیستم شبکه - <ph name="PAGE_TITLE" /></translation> @@ -363,6 +364,7 @@ <translation id="9185526690718004400">راهاندازی مجدد برای بهروزرسانی Chromium</translation> <translation id="9190841055450128916">Chromium (mDNS ورودی)</translation> <translation id="93478295209880648">Chromium ممکن است درست کار نکند زیرا دیگر در Windows XP یا Windows Vista پشتیبانی نمیشود</translation> +<translation id="942598560705308788">گواهینامههای تحتمدیریت Chromium</translation> <translation id="945990405696787151">برای دریافت بهروزرسانیهای آتی Chromium، باید macOS نسخه ۱۰.۱۳ یا بالاتر داشته باشید. این رایانه از OS X نسخه ۱۰.۱۱ استفاده میکند.</translation> <translation id="965162752251293939">چهکسی از Chromium استفاده میکند؟</translation> <translation id="967427899662692980">دریافت قویترین امنیت Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_id.xtb b/chrome/app/resources/chromium_strings_id.xtb index 3fa59b21..fafb2c1 100644 --- a/chrome/app/resources/chromium_strings_id.xtb +++ b/chrome/app/resources/chromium_strings_id.xtb
@@ -41,6 +41,7 @@ <translation id="2018879682492276940">Gagal menginstal. Coba lagi.</translation> <translation id="2020032459870799438">Untuk memeriksa apakah sandi Anda yang lain aman dari pelanggaran data dan masalah keamanan lainnya, <ph name="BEGIN_LINK" />login ke Chromium<ph name="END_LINK" />.</translation> <translation id="2049376729098081731">Pilih apakah akan menyertakan histori Chromium untuk mendapatkan pengalaman yang lebih dipersonalisasi di layanan Google</translation> +<translation id="2088953378266246249">Informasi tentang cara Chromium mengelola root certificate-nya</translation> <translation id="2174178932569897599">Sesuaikan Chromium</translation> <translation id="2174917724755363426">Penginstalan tidak selesai. Yakin ingin membatalkan?</translation> <translation id="2185166961232948079">Chromium - Login Jaringan - <ph name="PAGE_TITLE" /></translation> @@ -365,6 +366,7 @@ <translation id="9185526690718004400">Luncurkan kembali untuk mengupdate &Chromium</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> <translation id="93478295209880648">Chromium mungkin tidak berfungsi dengan semestinya karena sudah tidak didukung di Windows XP atau Windows Vista</translation> +<translation id="942598560705308788">Sertifikat yang dikelola oleh Chromium</translation> <translation id="945990405696787151">Untuk mendapatkan update Chromium berikutnya, Anda perlu macOS 10.13 atau yang lebih baru. Komputer ini menggunakan OS X 10.11.</translation> <translation id="965162752251293939">Siapa yang menggunakan Chromium?</translation> <translation id="967427899662692980">Dapatkan keamanan terkuat Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_ja.xtb b/chrome/app/resources/chromium_strings_ja.xtb index e8a68c34..2bf049d 100644 --- a/chrome/app/resources/chromium_strings_ja.xtb +++ b/chrome/app/resources/chromium_strings_ja.xtb
@@ -41,6 +41,7 @@ <translation id="2018879682492276940">インストールできませんでした。もう一度お試しください。</translation> <translation id="2020032459870799438">他のパスワードにデータ侵害などセキュリティに関する問題がないかどうかを確認するには、<ph name="BEGIN_LINK" />Chromium にログイン<ph name="END_LINK" />してください。</translation> <translation id="2049376729098081731">Chromium の履歴を含めて、Google サービスのパーソナライズに使用するかどうかを選択してください</translation> +<translation id="2088953378266246249">Chromium でのルート証明書の管理方法に関する情報</translation> <translation id="2174178932569897599">Chromium をカスタマイズ</translation> <translation id="2174917724755363426">インストールは完了していません。キャンセルしてもよろしいですか?</translation> <translation id="2185166961232948079">Chromium - ネットワークにログイン - <ph name="PAGE_TITLE" /></translation> @@ -363,6 +364,7 @@ <translation id="9185526690718004400">再起動して Chromium を更新(&C)</translation> <translation id="9190841055450128916">Chromium(mDNS インバウンド)</translation> <translation id="93478295209880648">Windows XP と Windows Vista はサポートされなくなったため、Chromium は正常に機能しない可能性があります</translation> +<translation id="942598560705308788">Chromium で管理されている証明書</translation> <translation id="945990405696787151">今後、Chromium のアップデートを受信するには、macOS 10.13 以降が必要となります。このコンピュータでは OS X 10.11 が実行されています。</translation> <translation id="965162752251293939">Chromium はどなたが使用しますか?</translation> <translation id="967427899662692980">Chromium の最高のセキュリティ強度で保護</translation>
diff --git a/chrome/app/resources/chromium_strings_km.xtb b/chrome/app/resources/chromium_strings_km.xtb index 52edf412..bfa8542 100644 --- a/chrome/app/resources/chromium_strings_km.xtb +++ b/chrome/app/resources/chromium_strings_km.xtb
@@ -43,6 +43,7 @@ <translation id="2018879682492276940">ការដំឡើងមិនបានសម្រេចទេ។ សូមព្យាយាមម្ដងទៀត។</translation> <translation id="2020032459870799438">ដើម្បីពិនិត្យមើលថាតើពាក្យសម្ងាត់ផ្សេងទៀតរបស់អ្នកមានសុវត្ថិភាពពីការបែកធ្លាយទិន្នន័យ និងបញ្ហាសុវត្ថិភាពផ្សេងទៀតឬអត់ សូម<ph name="BEGIN_LINK" />ចូល Chromium<ph name="END_LINK" />។</translation> <translation id="2049376729098081731">ជ្រើសរើសថាត្រូវរួមបញ្ចូលប្រវត្តិ Chromium ដើម្បីទទួលបានបទពិសោធន៍ប្រើប្រាស់កាន់តែស្របនឹងបុគ្គលនៅក្នុងសេវាកម្ម Google ឬអត់</translation> +<translation id="2088953378266246249">ព័ត៌មានអំពីរបៀបដែល Chromium គ្រប់គ្រងវិញ្ញាបនបត្រគោលរបស់ខ្លួន</translation> <translation id="2174178932569897599">ប្ដូរ Chromium តាមបំណង</translation> <translation id="2174917724755363426">ការដំឡើងមិនទាន់បញ្ចប់ទេ។ តើអ្នកពិតជាចង់បោះបង់មែនឬ?</translation> <translation id="2185166961232948079">Chromium - ការចូលបណ្ដាញ - <ph name="PAGE_TITLE" /></translation> @@ -367,6 +368,7 @@ <translation id="9185526690718004400">ចាប់ផ្តើមឡើងវិញដើម្បីដំឡើងកំណែ &Chromium</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> <translation id="93478295209880648">Chromium អាចនឹងដំណើរការមិនត្រឹមត្រូវ ដោយសារវាមិនអាចប្រើបាននៅលើ Windows XP ឬ Windows Vista ទៀតឡើយ។</translation> +<translation id="942598560705308788">វិញ្ញាបនបត្រត្រូវបានគ្រប់គ្រងដោយ Chromium</translation> <translation id="945990405696787151">ដើម្បីទទួលបានកំណែថ្មីរបស់ Chromium ក្នុងពេលអនាគត អ្នកនឹងត្រូវការ macOS 10.13 ឬកំណែខ្ពស់ជាងនេះ។ កុំព្យូទ័រនេះកំពុងប្រើ OS X 10.11។</translation> <translation id="965162752251293939">តើនរណាកំពុងប្រើ Chromium?</translation> <translation id="967427899662692980">ទទួលបានសុវត្ថិភាពខ្លាំងបំផុតរបស់ Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_ko.xtb b/chrome/app/resources/chromium_strings_ko.xtb index 4501acf..a7d918a 100644 --- a/chrome/app/resources/chromium_strings_ko.xtb +++ b/chrome/app/resources/chromium_strings_ko.xtb
@@ -43,6 +43,7 @@ <translation id="2018879682492276940">설치할 수 없습니다. 다시 시도해 보세요.</translation> <translation id="2020032459870799438">다른 암호가 정보 유출 및 다른 보안 문제로부터 안전한지 확인하려면 <ph name="BEGIN_LINK" />Chromium에 로그인<ph name="END_LINK" />하세요.</translation> <translation id="2049376729098081731">보다 맞춤설정된 Google 서비스 환경을 사용하기 위해 Chromium 방문 기록을 포함할지 선택하세요.</translation> +<translation id="2088953378266246249">Chromium의 루트 인증서 관리 방식에 관한 정보</translation> <translation id="2174178932569897599">Chromium 맞춤설정</translation> <translation id="2174917724755363426">설치가 완료되지 않았습니다. 취소하시겠습니까?</translation> <translation id="2185166961232948079">Chromium - 네트워크 로그인 - <ph name="PAGE_TITLE" /></translation> @@ -367,6 +368,7 @@ <translation id="9185526690718004400">다시 실행하여 Chromium 업데이트</translation> <translation id="9190841055450128916">Chromium(mDNS-In)</translation> <translation id="93478295209880648">Windows XP 또는 Windows Vista에서 더 이상 Chromium을 지원하지 않으므로 Chromium이 올바르게 작동하지 않을 수 있습니다</translation> +<translation id="942598560705308788">Chromium이 관리하는 인증서</translation> <translation id="945990405696787151">향후 Chromium 업데이트를 받으려면 macOS 10.13 이상이 필요합니다. 이 컴퓨터에서는 OS X 10.11을 사용하고 있습니다.</translation> <translation id="965162752251293939">Chromium 사용자 선택</translation> <translation id="967427899662692980">Chromium의 가장 강력한 보안 기능을 이용하세요</translation>
diff --git a/chrome/app/resources/chromium_strings_lo.xtb b/chrome/app/resources/chromium_strings_lo.xtb index 8b33301..d637e9ac 100644 --- a/chrome/app/resources/chromium_strings_lo.xtb +++ b/chrome/app/resources/chromium_strings_lo.xtb
@@ -43,6 +43,7 @@ <translation id="2018879682492276940">ການຕິດຕັ້ງບໍ່ສຳເລັດ. ກະລຸນາລອງໃໝ່.</translation> <translation id="2020032459870799438">ເພື່ອກວດເບິ່ງວ່າລະຫັດຜ່ານອື່ນຂອງທ່ານປອດໄພຈາກການລະເມີດຂໍ້ມູນ ແລະ ບັນຫາຄວາມປອດໄພອື່ນຫຼືບໍ່, ກະລຸນາ <ph name="BEGIN_LINK" />ເຂົ້າສູ່ລະບົບ Chromium<ph name="END_LINK" />.</translation> <translation id="2049376729098081731">ເລືອກວ່າຈະໃຫ້ຮວມປະຫວັດ Chromium ສຳລັບປະສົບການທີ່ປັບແຕ່ງສ່ວນຕົວໃນບໍລິການ Google ຫຼືບໍ່</translation> +<translation id="2088953378266246249">ຂໍ້ມູນກ່ຽວກັບວິທີທີ່ Chromium ຈັດການກັບໃບຮັບຮອງຮາກຖານຂອງມັນ</translation> <translation id="2174178932569897599">ປັບແຕ່ງ Chromium</translation> <translation id="2174917724755363426">ການຕິດຕັ້ງບໍ່ສຳເລັດ. ທ່ານແນ່ໃຈບໍ່ວ່າທ່ານຕ້ອງການຍົກເລີກ?</translation> <translation id="2185166961232948079">Chromium - ການເຂົ້າສູ່ລະບົບເຄືອຂ່າຍ - <ph name="PAGE_TITLE" /></translation> @@ -367,6 +368,7 @@ <translation id="9185526690718004400">ເລີ່ມເປີດໃຊ້ໃໝ່ເພື່ອອັບເດດ &Chromium</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> <translation id="93478295209880648">Chromium ອາດຈະບໍ່ເຮັດວຽກຢ່າງຖືກຕ້ອງ ເພາະວ່າມັນບໍ່ຖືກຮອງຮັບໃນ Windows XP ຫຼື Windows Vista ອີກຕໍ່ໄປ</translation> +<translation id="942598560705308788">ໃບຮັບຮອງທີ່ຈັດການໂດຍ Chromium</translation> <translation id="945990405696787151">ເພື່ອຮັບອັບເດດ Chromium ໃນອະນາຄົດ, ທ່ານຈະຕ້ອງໃຊ້ macOS 10.13 ຂຶ້ນໄປ. ຄອມພິວເຕີນີ້ກຳລັງໃຊ້ OS X 10.11.</translation> <translation id="965162752251293939">ໃຜກຳລັງໃຊ້ Chromium)</translation> <translation id="967427899662692980">ໃຊ້ຄວາມປອດໄພຂັ້ນສູງສຸດຂອງ Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_ml.xtb b/chrome/app/resources/chromium_strings_ml.xtb index bfc3e29..51ab48a 100644 --- a/chrome/app/resources/chromium_strings_ml.xtb +++ b/chrome/app/resources/chromium_strings_ml.xtb
@@ -43,6 +43,7 @@ <translation id="2018879682492276940">ഇൻസ്റ്റാൾ ചെയ്യാനായില്ല. വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="2020032459870799438">ഡാറ്റാ ലംഘനങ്ങളിൽ നിന്നും മറ്റ് സുരക്ഷാ പ്രശ്നങ്ങളിൽ നിന്നും നിങ്ങളുടെ മറ്റ് പാസ്വേഡുകൾ സുരക്ഷിതമാണോ എന്ന് പരിശോധിക്കാൻ, <ph name="BEGIN_LINK" />Chromium-ൽ സൈൻ ഇൻ ചെയ്യുക<ph name="END_LINK" />.</translation> <translation id="2049376729098081731">Google സേവനങ്ങളിൽ കൂടുതൽ വ്യക്തിപരമാക്കിയ അനുഭവം ലഭ്യമാകാൻ Chromium ചരിത്രം ഉൾപ്പെടുത്തണോ എന്ന് തിരഞ്ഞെടുക്കുക</translation> +<translation id="2088953378266246249">Chromium അതിന്റെ റൂട്ട് സർട്ടിഫിക്കറ്റുകൾ മാനേജ് ചെയ്യുന്നത് എങ്ങനെ എന്നതിനെക്കുറിച്ചുള്ള വിവരങ്ങൾ</translation> <translation id="2174178932569897599">Chromium ഇഷ്ടാനുസൃതമാക്കുക</translation> <translation id="2174917724755363426">ഇൻസ്റ്റാൾ ചെയ്യൽ പൂർത്തിയായിട്ടില്ല. റദ്ദാക്കണമെന്ന് ഉറപ്പാണോ?</translation> <translation id="2185166961232948079">Chromium - നെറ്റ്വർക്ക് സൈൻ ഇൻ - <ph name="PAGE_TITLE" /></translation> @@ -367,6 +368,7 @@ <translation id="9185526690718004400">&Chromium അപ്ഡേറ്റ് ചെയ്യാൻ വീണ്ടും ആരംഭിക്കുക</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> <translation id="93478295209880648">ഇനിയങ്ങോട്ട് Windows XP-യും Windows Vista-യും പിന്തുണയ്ക്കാത്തതിനാൽ Chromium ശരിയായി പ്രവർത്തിച്ചേക്കില്ല</translation> +<translation id="942598560705308788">Chromium മാനേജ് ചെയ്യുന്ന സർട്ടിഫിക്കറ്റുകൾ</translation> <translation id="945990405696787151">ഭാവിയിലെ Chromium അപ്ഡേറ്റുകൾ ലഭിക്കാൻ macOS 10.13 അല്ലെങ്കിൽ അതിന് ശേഷമുള്ള പതിപ്പ് ആവശ്യമാണ്. ഈ കമ്പ്യൂട്ടർ ഉപയോഗിക്കുന്നത് OS X 10.11 ആണ്.</translation> <translation id="965162752251293939">ആരൊക്കെയാണ് Chromium ഉപയോഗിക്കുന്നത്?</translation> <translation id="967427899662692980">Chromium-ന്റെ ഏറ്റവും ശക്തമായ സുരക്ഷ നേടുക</translation>
diff --git a/chrome/app/resources/chromium_strings_sl.xtb b/chrome/app/resources/chromium_strings_sl.xtb index 2593f783..28aad3d 100644 --- a/chrome/app/resources/chromium_strings_sl.xtb +++ b/chrome/app/resources/chromium_strings_sl.xtb
@@ -43,6 +43,7 @@ <translation id="2018879682492276940">Namestitev ni uspela. Poskusite znova.</translation> <translation id="2020032459870799438">Če želite preveriti, ali so druga gesla varna pred podatkovnimi kršitvami in drugimi varnostnimi težavami, <ph name="BEGIN_LINK" />se prijavite v Chromium<ph name="END_LINK" />.</translation> <translation id="2049376729098081731">Izberite, ali želite, da je zaradi osebno bolj prilagojenih izkušenj v Googlovih storitvah vključena zgodovina v Chromiumu.</translation> +<translation id="2088953378266246249">Informacije o tem, kako Chromium upravlja korenska potrdila.</translation> <translation id="2174178932569897599">Prilagodi Chromium</translation> <translation id="2174917724755363426">Namestitev še ni končana. Ali ste prepričani, da jo želite preklicati?</translation> <translation id="2185166961232948079">Chromium – Prijava v omrežje – <ph name="PAGE_TITLE" /></translation> @@ -367,6 +368,7 @@ <translation id="9185526690718004400">Znova zaženite, če želite posodobiti &Chromium</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> <translation id="93478295209880648">Chromium morda ne bo deloval pravilno, ker ni več podprt v sistemu Windows XP ali Windows Vista</translation> +<translation id="942598560705308788">Potrdila, ki jih upravlja Chromium</translation> <translation id="945990405696787151">Če želite prejemati prihodnje posodobitve Chromiuma, potrebujete macOS 10.13 ali novejšega. V tem računalniku je nameščen OS X 10.11.</translation> <translation id="965162752251293939">Kdo uporablja Chromium?</translation> <translation id="967427899662692980">Prejmite Chromiumovo najmočnejšo varnost</translation>
diff --git a/chrome/app/resources/chromium_strings_sw.xtb b/chrome/app/resources/chromium_strings_sw.xtb index 0bdb201..0caac94 100644 --- a/chrome/app/resources/chromium_strings_sw.xtb +++ b/chrome/app/resources/chromium_strings_sw.xtb
@@ -43,6 +43,7 @@ <translation id="2018879682492276940">Imeshindwa kusakinisha. Tafadhali jaribu tena.</translation> <translation id="2020032459870799438">Ili uangalie kama manenosiri yako mengine ni salama dhidi ya ufichuzi haramu wa data na matatizo mengine ya usalama, <ph name="BEGIN_LINK" />ingia katika akaunti kwenye Chromium<ph name="END_LINK" />.</translation> <translation id="2049376729098081731">Chagua iwapo ungependa kujumuisha historia kwenye Chromium ili upate hali ya utumiaji inayokufaa zaidi katika huduma za Google</translation> +<translation id="2088953378266246249">Maelezo kuhusu jinsi Chromium inavyodhibiti vyeti vyake vya msingi</translation> <translation id="2174178932569897599">Weka mipangilio ya Chromium upendavyo</translation> <translation id="2174917724755363426">Usakinishaji haujakamilika. Je, una uhakika unataka kughairi?</translation> <translation id="2185166961232948079">Chromium - Kuingia katika Akaunti ya Mtandao - <ph name="PAGE_TITLE" /></translation> @@ -367,6 +368,7 @@ <translation id="9185526690718004400">Fungua tena ili usasishe &Chromium</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> <translation id="93478295209880648">Huenda Chromium isifanye kazi vizuri kwa sababu haitumiki tena kwenye Windows XP au Windows Vista</translation> +<translation id="942598560705308788">Vyeti vinavyodhibitiwa na Chromium</translation> <translation id="945990405696787151">Ili upate masasisho ya Chromium ya hapo baadaye, utahitaji toleo la macOS 10.13 au toleo jipya zaidi. Kompyuta hii inatumia OS X 10.11.</translation> <translation id="965162752251293939">Ni nani anayetumia Chromium?</translation> <translation id="967427899662692980">Pata usalama thabiti zaidi kutoka Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_uk.xtb b/chrome/app/resources/chromium_strings_uk.xtb index 4897600..8364605 100644 --- a/chrome/app/resources/chromium_strings_uk.xtb +++ b/chrome/app/resources/chromium_strings_uk.xtb
@@ -41,6 +41,7 @@ <translation id="2018879682492276940">Помилка встановлення. Повторіть спробу.</translation> <translation id="2020032459870799438">Щоб перевірити, чи відомі порушення безпеки даних або інші проблеми не заторкнули інші ваші паролі, <ph name="BEGIN_LINK" />увійдіть у Chromium<ph name="END_LINK" />.</translation> <translation id="2049376729098081731">Укажіть, чи включати історію Chromium, щоб ми краще персоналізували роботу сервісів Google</translation> +<translation id="2088953378266246249">Інформація про те, як Chromium керує кореневими сертифікатами</translation> <translation id="2174178932569897599">Налаштувати Chromium</translation> <translation id="2174917724755363426">Встановлення не завершено. Скасувати його?</translation> <translation id="2185166961232948079">Chromium – Вхід у мережу– <ph name="PAGE_TITLE" /></translation> @@ -365,6 +366,7 @@ <translation id="9185526690718004400">Перезапустити, щоб оновити &Chromium</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> <translation id="93478295209880648">Chromium може працювати неналежним чином, оскільки більше не підтримується у Windows XP та Windows Vista</translation> +<translation id="942598560705308788">Сертифікати, якими керує Chromium</translation> <translation id="945990405696787151">Щоб отримувати майбутні оновлення Chromium, потрібна операційна система macOS 10.13 або новішої версії. На цьому комп’ютері встановлено OS X 10.11.</translation> <translation id="965162752251293939">Хто користується веб-переглядачем Chromium?</translation> <translation id="967427899662692980">Отримайте найвищий рівень безпеки в Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-HK.xtb b/chrome/app/resources/chromium_strings_zh-HK.xtb index 721cc3f..d01607a 100644 --- a/chrome/app/resources/chromium_strings_zh-HK.xtb +++ b/chrome/app/resources/chromium_strings_zh-HK.xtb
@@ -43,6 +43,7 @@ <translation id="2018879682492276940">無法安裝,請再試一次。</translation> <translation id="2020032459870799438">如要檢查其他密碼是否安全,且未受資料外洩或其他安全性問題影響,請<ph name="BEGIN_LINK" />登入 Chromium<ph name="END_LINK" />。</translation> <translation id="2049376729098081731">選擇是否包含 Chromium 記錄,以便在 Google 服務中享有更個人化的體驗</translation> +<translation id="2088953378266246249">瞭解 Chromium 如何管理根憑證</translation> <translation id="2174178932569897599">自訂 Chromium</translation> <translation id="2174917724755363426">安裝尚未完成。確定要取消嗎?</translation> <translation id="2185166961232948079">Chromium - 網絡登入 - <ph name="PAGE_TITLE" /></translation> @@ -366,6 +367,7 @@ <translation id="9185526690718004400">重新啟動以更新 &Chromium</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> <translation id="93478295209880648">由於 Chromium 將不再支援 Windows XP 或 Windows Vista,因此可能無法正常運作</translation> +<translation id="942598560705308788">由 Chromium 管理的憑證</translation> <translation id="945990405696787151">如要取得日後的 Chromium 更新,您將需要 macOS 10.13 或以上版本。此電腦正在使用 OS X 10.11。</translation> <translation id="965162752251293939">誰在使用 Chromium?</translation> <translation id="967427899662692980">取得 Chromium 最強大的安全防護功能</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-TW.xtb b/chrome/app/resources/chromium_strings_zh-TW.xtb index a38ce4d..bc0f6eb6 100644 --- a/chrome/app/resources/chromium_strings_zh-TW.xtb +++ b/chrome/app/resources/chromium_strings_zh-TW.xtb
@@ -41,6 +41,7 @@ <translation id="2018879682492276940">無法安裝,請再試一次。</translation> <translation id="2020032459870799438">如要檢查你其他的密碼是否因資料侵害事件而遭到外洩,或是否有其他安全性問題,<ph name="BEGIN_LINK" />請登入 Chromium<ph name="END_LINK" />。</translation> <translation id="2049376729098081731">選擇是否要包含 Chromium 歷史記錄,取得更貼近個人需求的 Google 服務體驗</translation> +<translation id="2088953378266246249">瞭解 Chromium 如何管理根憑證</translation> <translation id="2174178932569897599">自訂 Chromium</translation> <translation id="2174917724755363426">安裝作業尚未完成,確定要取消安裝嗎?</translation> <translation id="2185166961232948079">Chromium - 網路登入 - <ph name="PAGE_TITLE" /></translation> @@ -364,6 +365,7 @@ <translation id="9185526690718004400">重新啟動以更新 &Chromium</translation> <translation id="9190841055450128916">Chromium (mDNS-In)</translation> <translation id="93478295209880648">Chromium 已不適用於 Windows XP 或 Windows Vista,因此可能無法正常運作</translation> +<translation id="942598560705308788">由 Chromium 管理的憑證</translation> <translation id="945990405696787151">如要取得日後的 Chromium 更新,必須使用 macOS 10.13 以上版本。這部電腦目前版本為 OS X 10.11。</translation> <translation id="965162752251293939">誰在使用 Chromium?</translation> <translation id="967427899662692980">獲得 Chromium 最強大的安全防護</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index dc43e62..c350791 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -1007,7 +1007,7 @@ <translation id="1937774647013465102">يتعذّر استيراد نوع بنية الحاوية <ph name="ARCHITECTURE_CONTAINER" /> باستخدام هذا الجهاز الذي يمثل <ph name="ARCHITECTURE_DEVICE" />.يمكنك محاولة استعادة هذه الحاوية على جهاز مختلف، أو يمكنك الوصول إلى الملفات داخل صورة الحاوية هذه عن طريق فتح تطبيق "الملفات".</translation> <translation id="1938320257168860255">حدث خطأ. يجب أن يكون هاتفك قريبًا وغير مُقفَل وأنّ يكون البلوتوث وشبكة Wi-Fi مفعَّلَين.</translation> <translation id="1938351510777341717">مفتاح Command الخارجي</translation> -<translation id="1940546824932169984">الأجهزة المرتبطة</translation> +<translation id="1940546824932169984">الأجهزة المتصلة</translation> <translation id="1941410638996203291">وقت البدء: <ph name="TIME" /></translation> <translation id="1941553344801134989">الإصدار: <ph name="APP_VERSION" /></translation> <translation id="1941995177877935582">عرض خريطة المفاتيح</translation> @@ -2885,7 +2885,8 @@ <translation id="3732530910372558017">يجب ألا يزيد رقم التعريف الشخصي عن 63 حرفًا</translation> <translation id="3732857534841813090">معلومات ذات صلة بخدمة "مساعد Google"</translation> <translation id="3733296813637058299">سنثبّت هذه التطبيقات بالنيابة عنك. ويمكنك العثور على المزيد من التطبيقات لجهاز <ph name="DEVICE_TYPE" /> في "متجر Play".</translation> -<translation id="3735740477244556633">ترتيب بحسب</translation> +<translation id="3735740477244556633">الترتيب حسب +</translation> <translation id="3738632186060045350">سيتم حذف بيانات <ph name="DEVICE_TYPE" /> خلال 24 ساعة</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> <translation id="3739254215541673094">هل ترغب في فتح <ph name="APPLICATION" />؟</translation> @@ -4711,7 +4712,7 @@ <translation id="5532223876348815659">عام</translation> <translation id="5533001281916885985">يريد <ph name="SITE_NAME" /></translation> <translation id="5534304873398226603">إلغاء صورة أو فيديو</translation> -<translation id="5537725057119320332">إرسال</translation> +<translation id="5537725057119320332">بث</translation> <translation id="5539221284352502426">رفض الخادم كلمة المرور التي أدخلتَها. وتتضمن الأسباب المحتملة ما يلي: كلمة المرور قصيرة جدًا. يجب أن تتضمن كلمة المرور أرقامًا أو رموزًا. يجب أن تكون كلمة المرور مختلفة عن كلمات المرور السابقة.</translation> <translation id="5541694225089836610">تم إيقاف الإجراء من قِبل المشرف.</translation> <translation id="5542132724887566711">الملف التعريفي</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index c30404a..118b8406 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -79,6 +79,7 @@ <translation id="1076766328672150609">Övladınız cihazı kiliddən çıxarmaq üçün PİN kod istifadə edə bilər.</translation> <translation id="1076818208934827215">Microsoft Internet Explorer</translation> <translation id="1076882167394279216"><ph name="LANGUAGE" /> üçün orfoqrafiya yoxlayan lüğət endirilə bilmədi Yenidən cəhd edin.</translation> +<translation id="1078037449555275327">ChromeVox ayarları</translation> <translation id="1079766198702302550">Kamera girişini həmişə blok edin</translation> <translation id="1081956462909987459">{NUM_TABS,plural, =1{<ph name="GROUP_TITLE" /> - 1 Tab}other{<ph name="GROUP_TITLE" /> - # Tab}}</translation> <translation id="1082214733466244292">Administratorunuz bu cihaz üçün bəzi funksiyaları blok edib</translation> @@ -396,6 +397,7 @@ <translation id="1390907927270446471"><ph name="PROFILE_USERNAME" /> adlı şəxsin <ph name="PRINTER_NAME" /> ilə çap etmək icazəsi yoxdur. Administratorunuz ilə əlaqə saxlayın.</translation> <translation id="1393283411312835250">Günəş və buludlar</translation> <translation id="1395730723686586365">Güncəlləşdirici başladıldı</translation> +<translation id="1395832189806039783">Klaviatura fokusu ilə elementi vurğulayın</translation> <translation id="1396139853388185343">Printer ayarlanarkən xəta baş verdi</translation> <translation id="1396259464226642517">Bu nəticə gözlənilməz oldu? <ph name="BEGIN_LINK" />Rəy göndərin<ph name="END_LINK" /></translation> <translation id="1396963298126346194">Daxil etdiyiniz istifadəçi adı və parol üst-üstə düşmür</translation> @@ -548,6 +550,7 @@ <translation id="1531734061664070992"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" />, <ph name="THIRD_SWITCH" /></translation> <translation id="1533948060140843887">Başa düşürəm ki, bu endirmə kompüterimə zərər verəcək</translation> <translation id="1535228823998016251">Ucadan</translation> +<translation id="1535753739390684432">Xüsusi mətnin ucadan səsləndirilməsinə qulaq asın. Əvvəlcə ekranınızın aşağısındakı "Seçib danışın" ikonasını seçin, sonra mətni vurğulayın.</translation> <translation id="1536754031901697553">Ayrılır...</translation> <translation id="1537254971476575106">Tam ekran miqyası</translation> <translation id="15373452373711364">Böyük maus kursoru</translation> @@ -704,6 +707,7 @@ <translation id="166278006618318542">Subyektin İctimai Açarı Alqoritmi</translation> <translation id="1662801900924515589"><ph name="APP" /> quraşdırıldı</translation> <translation id="1666232093776384142">Periferik cihazlar üçün data giriş qorumasını deaktiv edin</translation> +<translation id="1667842670298352129">Xüsusi mətnin ucadan səsləndirilməsinə qulaq asın. Əvvəlcə ekranınızın aşağısındakı "Seçib danışın" ikonasını seçin, sonra mətni vurğulayın. Həmçinin klaviatura qısa yolundan istifadə edə bilərsiniz: Mətni vurğulayın, sonra Axtarış + S düyməsini basın.</translation> <translation id="1668435968811469751">Əl ilə qeydiyyatdan keçirin</translation> <translation id="1668979692599483141">Təkliflər barədə öyrənin</translation> <translation id="1670399744444387456">Əsas</translation> @@ -731,6 +735,7 @@ <translation id="1692115862433274081">Başqa hesab istifadə edin</translation> <translation id="1692118695553449118">Sinxronizasiya aktivdir</translation> <translation id="1692210323591458290">Tünd-bənövşəyi</translation> +<translation id="1692713444215319269">Rəng inversiyası, böyüdücü və displey ayarları</translation> <translation id="1695487653372841667">Google ilə hansı məlumatların paylaşılmasına nəzarət edə bilərsiniz. Bunu istənilən zaman Ayarlarda dəyişə bilərsiniz.</translation> <translation id="1695510246756136088">İnternetə qoşulmaq mümkün deyil. Yenə cəhd edin.</translation> <translation id="169675691788639886">Cihazda SSH serveri konfiqurasiya edilmişdir. Həssas hesablarla daxil olmayın.</translation> @@ -942,6 +947,7 @@ <translation id="1877520246462554164">Doğrulama açarı əldə etmək alınmadı. Yenidən cəhd etmək üçün hesabdan çıxın və təkar daxil olun.</translation> <translation id="1877860345998737529">Əməliyyat təyinatını dəyişin</translation> <translation id="1878155070920054810">Görünür, güncəlləmə tamamlanana kimi Chromebook'un enerjisi bitəcək. Fasilə olmaması üçün onun düzgün şarj edildiyinə əmin olun.</translation> +<translation id="1878885068166344708">Fokusu hərəkət etdirdikdə element vurğulanır. Fokusu dəyişmək üçün tabı basın və ya element seçin.</translation> <translation id="1879000426787380528">Belə daxil olun</translation> <translation id="18802377548000045">Tabların ölçüsü böyük enə keçirilir</translation> <translation id="1880905663253319515">"<ph name="CERTIFICATE_NAME" />" sertifikatı silinsin?</translation> @@ -969,6 +975,7 @@ <translation id="1904580727789512086">Ziyarət etdiyiniz keçidlər Google Hesabınızda saxlanılır</translation> <translation id="1905375423839394163">Chromebook cihaz adı</translation> <translation id="1906181697255754968">Saytlar adətən işinizi avtomatik yaddaşda saxlamaq kimi xüsusiyyətlər üçün cihazınızdakı fayllar və qovluqlara giriş edir</translation> +<translation id="1907044622262489040">Səsinizlə yazın. Axtarış + D düymələrindən istifadə edin, sonra danışmağa başlayın.</translation> <translation id="1908591798274282246">Qapalı Qrupu Yenidən Açın</translation> <translation id="1909880997794698664">Bu cihazı hazırda kiosk rejimində saxlamaq istəyirsiniz?</translation> <translation id="1915073950770830761">kanar</translation> @@ -1324,6 +1331,7 @@ <translation id="2241053333139545397">Datanızı çoxsaylı cihazlarda oxuyun və dəyişin</translation> <translation id="2241634353105152135">Sadəcə bir dəfə</translation> <translation id="2242687258748107519">Fayl məlumatı</translation> +<translation id="2245603955208828424">Elementlər arasında hərf-hərf hərəkət etmək üçün ox düymələrindən istifadə edin</translation> <translation id="2246129643805925002">Ən son funksiyaları və təhlükəsizlik təkmilləşdirmələrini təmin etmək üçün <ph name="DEVICE_TYPE" /> avtomatik olaraq arxa fonda güncəllənəcək. Güncəlləmə tərcihlərini Ayarlarda nəzərdən keçirə bilərsiniz.</translation> <translation id="2246549592927364792">Google'dan şəkil təsvirləri əldə etmək istəyirsiniz?</translation> <translation id="2247738527273549923">Cihazınız təşkilatınız tərəfindən idarə olunur</translation> @@ -1429,6 +1437,7 @@ <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" />% hazırdır</translation> <translation id="2318143611928805047">Kağız ölçüsü</translation> <translation id="2318817390901984578">Android tətbiqləri istifadə etmək üçün <ph name="DEVICE_TYPE" /> cihazını batareya ilə doldurun və yeniləyin.</translation> +<translation id="2319459402137712349">Klaviaturanı açmaq üçün mətn sahəsini seçin. Həmçinin ekranınızın altındakı Klaviatura işarəsini seçə bilərsiniz.</translation> <translation id="2319993584768066746">Giriş ekranı şəkilləri</translation> <translation id="2322193970951063277">Başlıqlar və alt qeydlər</translation> <translation id="2322318151094136999">Saytlar seriya portlarına daxil olmaq istədikdə icazə tələb edilsin (tövsiyə edilir)</translation> @@ -1503,6 +1512,7 @@ <translation id="2379281330731083556">İstifadəçi sistemi dialoqu çap edin... <ph name="SHORTCUT_KEY" /></translation> <translation id="2381499968174336913">Paylaşılan tabın önizləməsi</translation> <translation id="2381756643783702095">Göndərməmişdən öncə soruşun (tövsiyə olunur)</translation> +<translation id="2383825469508278924">Klaviatura düymələrinin yerləşməsini, funksiya düymələrini və s. dəyişdirin</translation> <translation id="2386202302581016807">Əlçatan cihaz yaddaşınız ayarlamanı tamamlamaq üçün çox azdır</translation> <translation id="2387052489799050037">Əsas səhifəyə keçin</translation> <translation id="2387602571959163792"><ph name="DESK_NAME" /> (Cari)</translation> @@ -1680,6 +1690,7 @@ <translation id="2542050502251273923">Şəbəkə bağlantı meneceri və ff_debug istifadə edən digər xidmətlərin sazlama səviyyəsini ayarlayır.</translation> <translation id="2544352060595557290">Bu Tab</translation> <translation id="2546302722632337735">Saytların qorunan məzmunu oxutmaq üçün identifikatorlardan istifadə etməsinə icazə verməyin</translation> +<translation id="2546991196809436099">Ekrandakı elementləri böyütmək üçün yaxınlaşdırın. Böyüdücünü aktiv və deaktiv etmək üçün Axtarış + Ctrl + M istifadə edin.</translation> <translation id="2548347166720081527"><ph name="PERMISSION" /> üçün icazə verilib</translation> <translation id="2548545707296594436">eSIM profil keşini sıfırlayın</translation> <translation id="2549985041256363841">Çəkməyə başlayın</translation> @@ -1838,6 +1849,7 @@ <translation id="2715640894224696481">Təhlükəsizlik açarı sorğusu</translation> <translation id="2715751256863167692">Bu güncəlləmə Chromebook'u sıfırlayır və cari istifadəçi datasını silir.</translation> <translation id="2716986496990888774">Bu ayar valideyn tərəfindən idarə edilir.</translation> +<translation id="271749239614426244">Kiçik kursor hərəkətini nəzərə almayın</translation> <translation id="2718395828230677721">Gecə İşığı</translation> <translation id="2718998670920917754">Antivirus proqramı virus aşkar etdi.</translation> <translation id="2719936478972253983">Aşağıdakı kukilər blok edilib</translation> @@ -2407,6 +2419,7 @@ <translation id="3274763671541996799">Tam ekrana daxil olmusunuz.</translation> <translation id="3275778809241512831">Daxili təhlükəsizlik açarı hazırda təhlükədədir. Onu istifadə etdiyiniz bütün xidmətlərdən silin. Bu problemi həll etmək üçün təhlükəsizlik açarını sıfırlayın.</translation> <translation id="3275778913554317645">Pəncərə kimi açın</translation> +<translation id="3277214528693754078">Mətn kursoru ilə naviqasiya (klaviatura ilə baxış)</translation> <translation id="3278001907972365362">Google Hesablarına baxın</translation> <translation id="3279092821516760512">Seçilmiş kontaktlar yalnız yaxında olduqda sizinlə paylaşa bilər. Siz qəbul etmədən köçürmələr başlamayacaq.</translation> <translation id="3279230909244266691">Bir az səbr edin; virtual maşın başladılır.</translation> @@ -2721,6 +2734,7 @@ <translation id="3578874072190212775">Saytlara dələduzluqla mübarizə aparmağa və botları insanlardan ayırmağa kömək edin</translation> <translation id="3581605050355435601">IP ünvanını avtomatik konfiqurasiya edin</translation> <translation id="3582057310199111521">Aldadıcı saytda daxil edilib və data pozulması ilə nəticələnib</translation> +<translation id="3582299299336701326">İşıqlı ekranlarını qaranlıq, qaranlıq ekranları isə işıqlı edin. Rəng inversiyasını aktiv və deaktiv etmək üçün Axtarış + Ctrl + H düymələrini basın.</translation> <translation id="3584169441612580296">Kompüterinizdə foto, musiqi və digər medianı oxuyun və dəyişin</translation> <translation id="3586806079541226322">Bu fayl açılmır</translation> <translation id="3586931643579894722">Detalları gizlədin</translation> @@ -2837,6 +2851,7 @@ <translation id="369135240373237088">Məktəb hesabı ilə yenidən daxil olun</translation> <translation id="3693415264595406141">Parol:</translation> <translation id="3694027410380121301">Öncəki Tabı Seçin</translation> +<translation id="3694590407685276748">Mətn kursorunu vurğulayın</translation> <translation id="369489984217678710">Parollar və digər giriş datası</translation> <translation id="369522892592566391">{NUM_FILES,plural, =0{Güvənlik yoxlanışları tamamlanıb. Datanız yüklənəcək.}=1{Güvənlik yoxlanışları tamamlanıb. Faylınız yüklənəcək.}other{Güvənlik yoxlanışları tamamlanıb. Fayllarınız yüklənəcək.}}</translation> <translation id="3698471669415859717">Nəzərdən keçirmə tamamlandı</translation> @@ -2972,6 +2987,7 @@ <translation id="3814529970604306954">Məktəb Hesabı</translation> <translation id="3816118180265633665">Chrome Rəngləri</translation> <translation id="3817524650114746564">Kompüterin proksi ayarlarına keçin</translation> +<translation id="3819164369574292143">Ekrandakı elementləri böyütmək üçün yaxınlaşdırın. Böyüdücünü aktiv və deaktiv etmək üçün Axtarış + Ctrl + M istifadə edin. Yaxınlaşdırdıqda hərəkət etmək üçün Ctrl + Alt + Ox düymələrindən istifadə edin.</translation> <translation id="3819257035322786455">Yedəkləyin</translation> <translation id="3819261658055281761">Sistem bu cihazda uzunmüddətli API giriş açarını saxlaya bilmədi.</translation> <translation id="3819800052061700452">Tam ekran</translation> @@ -3219,6 +3235,7 @@ <translation id="403725336528835653">Bunu birinci sınayın</translation> <translation id="4040105702484676956"><ph name="SITE_NAME" /> və ona bağlı quraşdırılmış tətbiq üçün sayt datası və icazələr silinsin?</translation> <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Səhifədən Çıxın}other{Səhifələrdən Çıxın}}</translation> +<translation id="4043267180218562935">Kursor ölçüsü</translation> <translation id="4044612648082411741">Sertifikat parolunuzu daxil edin</translation> <translation id="4044708573046946214">Ekran kilidi parolu</translation> <translation id="404493185430269859">Defolt axtarış sistemi</translation> @@ -3335,6 +3352,7 @@ <translation id="4152670763139331043">{NUM_TABS,plural, =1{1 panel}other{# panel}}</translation> <translation id="4154664944169082762">Barmaq izi</translation> <translation id="4157869833395312646">Microsoft Server Gated Cryptography</translation> +<translation id="4158315983204257156">Veb saytın mətn ölçüsü və şrifti</translation> <translation id="4158364720893025815">Keçdiniz</translation> <translation id="4159681666905192102">Bu, <ph name="CUSTODIAN_EMAIL" /> və <ph name="SECOND_CUSTODIAN_EMAIL" /> tərəfindən idarə olunan uşaq hesabıdır.</translation> <translation id="4163560723127662357">Naməlum klaviatura</translation> @@ -3892,6 +3910,7 @@ <translation id="4699357559218762027">(avto-başlatma)</translation> <translation id="4701025263201366865">Valideyn girişi</translation> <translation id="4701335814944566468">Dünən baxılıb</translation> +<translation id="470644585772471629">Rəng inversiyası</translation> <translation id="4707337002099455863">Həmişə bütün saytlarda</translation> <translation id="4708794300267213770">Oyanarkən ekran kilidi göstərilsin</translation> <translation id="4708849949179781599"><ph name="PRODUCT_NAME" /> məhsulundan çıxın</translation> @@ -3905,6 +3924,8 @@ <translation id="4723140812774948886">Növbəti ilə dəyişdirin</translation> <translation id="4724450788351008910">Mənsubluq Dəyişdi</translation> <translation id="4725511304875193254">Korqi</translation> +<translation id="4726710355753484204">Yaxınlaşdırmaq üçün Ctrl + Alt + Parlaqlığı Artır düymələrindən istifadə edin. +Uzaqlaşdırmaq üçün Ctrl + Alt + Parlaqlığı Azalt düymələrindən istifadə edin.</translation> <translation id="4726710629007580002">Bu artırmanı quraşdırmağa cəhd edərkən xəbərdarlıqlar var idi:</translation> <translation id="4727847987444062305">İdarə edilən qonaq sessiyası</translation> <translation id="4728558894243024398">Platforma</translation> @@ -4246,6 +4267,7 @@ <translation id="5073956501367595100">{0,plural,offset:2 =1{<ph name="FILE1" />}=2{<ph name="FILE1" />, <ph name="FILE2" />}other{<ph name="FILE1" />, <ph name="FILE2" /> və daha #}}</translation> <translation id="5074318175948309511">Yeni ayarlar qüvvəyə minməmişdən əvvəl bu səhifə yenidən yüklənilməlidir.</translation> <translation id="5074761966806028321">Ayarlamanı tamamlamaq üçün hələ də icazə tələb olunur</translation> +<translation id="5075563999073408211">Cihazınızı bir və ya daha çox açarla idarə edin. Açarlar klaviatura düymələri, geympad düymələri və ya xüsusi cihazlar ola bilər.</translation> <translation id="5075910247684008552">Təhlükəli məzmun defolt olaraq təhlükəsiz saytlarda blok edildi</translation> <translation id="5078638979202084724">Bütün vərəqələri əlfəcinləyin</translation> <translation id="5078796286268621944">Yanlış PIN</translation> @@ -4324,6 +4346,7 @@ <translation id="5154108062446123722"><ph name="PRINTING_DESTINATION" /> üçün qabaqcıl ayarlar</translation> <translation id="5154702632169343078">Mövzu</translation> <translation id="5155327081870541046">Ünvan panelinə axtarmaq istədiyiniz saytın qısayolunu daxil edin (məsələn: "@əlfəcinlər"). Sonra, istədiyiniz klaviatura qısayolunu basın və axtarış sözünü daxil edin.</translation> +<translation id="5156638757840305347">Kursor göründükdə və ya hərəkət etdikdə vurğulanır</translation> <translation id="5157635116769074044">Ekrana başlamaq üçün bu səhifəyə sancın...</translation> <translation id="5159094275429367735">Crostini'ni ayarlayın</translation> <translation id="5159419673777902220">Valideyniniz artırma icazələrini deaktiv edib</translation> @@ -4463,6 +4486,7 @@ <translation id="5293170712604732402">Ayarları orijinal defolt ayarlarına sıfırlayın</translation> <translation id="5294097441441645251">Kiçik hərf simvolu və ya altdan xətt ilə başlamalıdır</translation> <translation id="5294618183559481278">Cihazınızın qarşısındakı insanları aşkar etmək üçün <ph name="DEVICE_TYPE" /> cihazınız daxili sensordan istifadə edir. Bütün data dərhal cihazınızda işlənir və sonra silinir. Sensor datası heç vaxt Google'a göndərilmir. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation> +<translation id="5296350763804564124">Səsli rəyi dinləyərək ekrana baxmadan cihazınızdan istifadə edə bilərsiniz. Brayl əlifbası qoşulmuş cihaz ilə əlçatandır.</translation> <translation id="5297082477358294722">Parol yadda saxlanıldı. Yadda saxlanılmış parollara <ph name="SAVED_PASSWORDS_STORE" /> ünvanında baxın və idarə edin.</translation> <translation id="5297946558563358707">Başqası ekranınıza baxdıqda, ekranınızın aşağı sağ tərəfində Məxfilik gözü işarəsini göstərin</translation> <translation id="5298219193514155779">Temanı yaradan:</translation> @@ -5214,6 +5238,7 @@ <translation id="6043994281159824495">Hesabdan çıxın</translation> <translation id="6045114302329202345">Əsas TrackPoint düyməsi</translation> <translation id="6047632800149092791">Sinxronlaşdırma işləmir. Çıxın və yenidən daxil olun.</translation> +<translation id="6048747414605857443">ChromeVox və Seçib danış üçün nitq sintezi səslərini seçin və fərdiləşdirin</translation> <translation id="6049797270917061226">Bu fayl hücumçulara şəxsi məlumatlarınızı oğurlamaq imkanı vermiş ola bilər.</translation> <translation id="6051354611314852653">Vay! Sistem bu cihaza olan API girişini doğrulaya bilmədi.</translation> <translation id="6051638103735819069"><ph name="BEGIN_PARAGRAPH1" />ChromeOS cihazlarına avtomatik hesabatlar göndərmək icazəsi vermək bizə ChromeOS'da nəyi düzəldəcıyimizi və təkmilləşdirəcəyimizi prioritetləşdirməyə kömək edir. Bu hesabatlara ChromeOS'un nə vaxt çökməsi, hansı funksiyaların istifadə edilməsi və adətən nə qədər yaddaş istifadə edildiyi və Android tətbiqi diaqnostika və istifadə datası kimi məlumatlar daxil ola bilər. Bəzi birləşdirilmiş data Google tətbiqlərinə və Android developerləri kimi partnyorlara da kömək edəcək.<ph name="END_PARAGRAPH1" /> @@ -5337,6 +5362,7 @@ <translation id="6155141482566063812">Arxa fondakı tab ekranınızı paylaşır</translation> <translation id="6156323911414505561">Əlfəcin panelini göstərin</translation> <translation id="6156863943908443225">Skript keşi</translation> +<translation id="6156944117133588106">Planşet rejimində naviqasiya düymələrini göstərin</translation> <translation id="615930144153753547">Saytlar şəkillər göstərə bilər</translation> <translation id="6160625263637492097">Doğrulamaq üçün sertifikatla təmin edin</translation> <translation id="6163363155248589649">&Normal</translation> @@ -5669,6 +5695,7 @@ <translation id="6494445798847293442">Sertifikatlaşdırma Təşkilatı deyil</translation> <translation id="6494974875566443634">Fərdiləşdirmə</translation> <translation id="6497457470714179223">{NUM_FILES,plural, =0{Bu data həssas və ya təhlükəli məzmun ehtiva edir}=1{Bu fayl həssas və ya təhlükəli məzmun ehtiva edir}other{Bu fayllar həssas və ya təhlükəli məzmun ehtiva edir}}</translation> +<translation id="6497784818439587832">Ekranınızdakı elementləri kiçiltmək və ya böyütmək üçün ekran ölçüsünü dəyişdirin</translation> <translation id="6497789971060331894">Siçanın geri sürüşdürməsi</translation> <translation id="6498249116389603658">&Bütün dilləriniz</translation> <translation id="6499143127267478107">Proksi skriptdə host həll olunur...</translation> @@ -5762,6 +5789,7 @@ <translation id="6582274660680936615">Qonaq kimi baxırsınız</translation> <translation id="6583328141350416497">Endirməyə davam edin</translation> <translation id="6584878029876017575">Microsoft Lifetime Signing</translation> +<translation id="6585584201072946561">Veb brauzeri üçün mətn ölçüsünü və şriftini fərdiləşdirin</translation> <translation id="6586099239452884121">Qonaq axtarışı</translation> <translation id="6586213706115310390">"Ok Google" dedikdə Assistentinizə daxil olun.</translation> <translation id="6586451623538375658">Əsas siçan düyməsini Swap</translation> @@ -6493,6 +6521,7 @@ <translation id="7312210124139670355">Administratorunuz eSIM-inizi sıfırlayır. Bir neçə dəqiqə çəkə bilər.</translation> <translation id="7320213904474460808">Şəbəkəni defolt olaraq seçin</translation> <translation id="7321545336522791733">Server əlçatmazdır</translation> +<translation id="7323315405936922211">Kursor sahəsinin ölçüsü</translation> <translation id="7324297612904500502">Beta Forumu</translation> <translation id="7325209047678309347">Kağız ilişib</translation> <translation id="7326004502692201767">Uşaq üçün bu <ph name="DEVICE_TYPE" /> cihazını ayarlayın</translation> @@ -6859,6 +6888,7 @@ <translation id="7665369617277396874">Hesab əlavə edin</translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{{NUM_WEEKS} həftə ərzində <ph name="DEVICE_TYPE" /> cihazını qaytarın}other{{NUM_WEEKS} həftə ərzində <ph name="DEVICE_TYPE" /> cihazını qaytarın}}</translation> <translation id="7668423670802040666"><ph name="ACCOUNT" /> üçün Google Parol Menecerində</translation> +<translation id="7668648754769651616">Əlçatımlılıq funksiyaları cihazınızın istifadəsini asanlaşdırır. Sürətli Ayarlara giriş üçün ekranın aşağısındakı vaxtı seçin.</translation> <translation id="7669825497510425694">{NUM_ATTEMPTS,plural, =1{Yanlış PIN. Bir cəhdiniz qalır.}other{Yanlış PIN. # cəhdiniz qalır.}}</translation> <translation id="7670434942695515800">Ən yaxşı performans üçün ən son versiyaya təkmilləşdirin. Təkmilləşdirmə tamamlanmadığı hallara qarşı faylların yedəklənməsi tövsiyə olunur. Təkmilləşdirmə başlayan kimi Linux söndürüləcək. Davam etməzdən əvvəl açıq faylları yadda saxlayın. <ph name="LINK_START" />Ətraflı məlumat<ph name="LINK_END" /></translation> <translation id="7670483791111801022">Altyazılar</translation> @@ -6915,6 +6945,7 @@ <translation id="7717014941119698257">Endirmə: <ph name="STATUS" /></translation> <translation id="771721654176725387">Bununla baxış datanız bu cihazdan həmişəlik siləcək. Datanı bərpa etmək üçün sinxronlaşdırmanı aşağıdakı kimi aktiv edin:</translation> <translation id="7717845620320228976">Güncəlləmələri yoxlayın</translation> +<translation id="7718490543420739837">Ekran klaviaturası, diktə, Keçirici ilə Giriş və s.</translation> <translation id="7719367874908701697">Səhifə yaxınlaşdırması</translation> <translation id="7719588063158526969">Cihazın adı çox uzundur</translation> <translation id="7720216670798402294">ChromeOS cihaz məlumatlarını və cihaz datasını oxuyun.</translation> @@ -7554,6 +7585,7 @@ <translation id="8314835274931377415">Keçirici ilə Giriş ayarlanması başladılsın?</translation> <translation id="8317582043908962055">P&DF mətnini tanıyın</translation> <translation id="8317671367883557781">Şəbəkə bağlantısı əlavə edin</translation> +<translation id="8318266828739827371">Ekranınızın böyüdülmüş sahəsini görmək üçün bölünmüş ekran görünüşündən istifadə edin. Daxili böyüdücünü aktiv və deaktiv etmək üçün Axtarış + Ctrl + D istifadə edin.</translation> <translation id="8319414634934645341">Genişləndirilmiş Açar İstifadəsi</translation> <translation id="8321837372750396788">Bu <ph name="DEVICE_TYPE" /> <ph name="MANAGER" /> tərəfindən idarə ediləcək.</translation> <translation id="8322814362483282060">Bu səhifəyə mikrofonunuza giriş qadağan edilib.</translation> @@ -7790,6 +7822,7 @@ <translation id="8574990355410201600">Həmişə <ph name="HOST" /> hostunda səsə icazə verin</translation> <translation id="8575286410928791436">Çıxış etmək üçün <ph name="KEY_EQUIVALENT" /> düyməsinə basın</translation> <translation id="8576885347118332789">{NUM_TABS,plural, =1{Oxuma siyahısına tab əlavə edin}other{Oxuma siyahısına tablar əlavə edin}}</translation> +<translation id="8577052309681449949">Avtomatik klikləmə, kursor ölçüsü, kursor rəngi və s.</translation> <translation id="8578639784464423491">99 hərfi keçməməlidir</translation> <translation id="857943718398505171">İcazə verilib (tövsiyə olunur)</translation> <translation id="8581809080475256101">İrəli etmək üçün basın və tarixçəni görmək üçün kontekst menyunu seçin</translation> @@ -7929,6 +7962,7 @@ <translation id="8708671767545720562">Əlavə məlumat</translation> <translation id="8711402221661888347">Marinadlar</translation> <translation id="8712637175834984815">Anladım</translation> +<translation id="8713110120305151436">Sürətli Ayarlarda əlçatımlılıq seçimlərini göstərin</translation> <translation id="8713570323158206935"><ph name="BEGIN_LINK1" />Sistem məlumatını<ph name="END_LINK1" /> göndərin</translation> <translation id="8714838604780058252">Arxa fon qrafikləri</translation> <translation id="871515167518607670">Cihaz seçin. Sonra səhifəni görmək üçün Chrome'u açın.</translation> @@ -8072,6 +8106,7 @@ <translation id="8845001906332463065">Yardım alın</translation> <translation id="8846132060409673887">Bu kompüterin istehsalçı və modelini oxuyun</translation> <translation id="8846163936679269230">eSIM profillərini sıfırlayın</translation> +<translation id="8846239054091760429">Mono audio, başlanğıc, Canlı Altyazı və s</translation> <translation id="8847523528195140327">Qapaq bağlandıqda hesabdan çıxsın</translation> <translation id="8847988622838149491">USB</translation> <translation id="8849001918648564819">Gizli</translation> @@ -8086,6 +8121,7 @@ <translation id="8859174528519900719">Alt çərçivə: <ph name="SUBFRAME_SITE" /></translation> <translation id="8859402192569844210">Xidmət Şərtlərini yükləmək mümkün olmadı</translation> <translation id="8859662783913000679">Valideyn hesabı</translation> +<translation id="8861568709166518036">Əsas səhifəyə keçmək, geri getmək və tətbiqləri keçirmək üçün ekrandakı düymələrdən istifadə edin. ChromeVox və ya avtomatik klikləmə aktiv olduqda avtomatik aktivləşir.</translation> <translation id="8862003515646449717">Sürətli brauzerə keçin</translation> <translation id="8863753581171631212">Linki yeni <ph name="APP" /> tətbiqində açın</translation> <translation id="8864055848767439877"><ph name="TAB_NAME" /> <ph name="APP_NAME" /> ilə paylaşılır</translation> @@ -8114,6 +8150,7 @@ <translation id="8879921471468674457">Giriş məlumatını yadda saxlayın</translation> <translation id="8880054210564666174">Kontakt siyahısını endirmək olmur. Şəbəkə bağlantınızı yoxlayın və ya <ph name="LINK_BEGIN" />yenidən cəhd edin<ph name="LINK_END" />.</translation> <translation id="8881020143150461183">Yenidən cəhd edin. Texniki dəstək üçün <ph name="CARRIER_NAME" /> ilə əlaqə saxlayın.</translation> +<translation id="888256071122006425">Maus və taçped ayarları</translation> <translation id="8883273463630735858">Kursor sürətini aktiv edin</translation> <translation id="8884023684057697730"><ph name="BEGIN_BOLD" />Datanızı necə idarə edə bilərsiniz:<ph name="END_BOLD" /> Məxfiliyinizi qorumaq üçün 4 həftədən köhnə saytları siyahıdan avtomatik silirik. Yenidən ziyarət etdiyiniz sayt yenidən siyahıda görünə bilər. Və ya saytın sizin üçün maraqlar müəyyən etməsini istəmirsinizsə, həmin saytı silə bilərsiniz.</translation> <translation id="8884570509232205463">Cihazınız artıq <ph name="UNLOCK_TIME" /> olduqda kilidlənir.</translation> @@ -8300,6 +8337,7 @@ <translation id="9066777626153702300">Aktiv olmayan saytlar</translation> <translation id="9066782832737749352">Yazıdan Nitqə Çevirmə</translation> <translation id="9068298336633421551">Məkan icazəsi olan Android tətbiqləri və xidmətlərinə cihaz məkanından istifadə icazəsi verin. Google müntəzəm olaraq məkan datasını toplaya və bu datanı məkan dəqiqliyi və məkanla bağlı xidmətləri təkmilləşdirmək üçün istifadə edə bilər.</translation> +<translation id="9068598199622656904">Klaviatura qısayolları üçün düymələri eyni vaxtda basıb saxlamaq əvəzinə bir düyməyə basın</translation> <translation id="9068878141610261315">Dəstəklənməyən fayl növü</translation> <translation id="9070342919388027491">Tab sola köçürüldü</translation> <translation id="9074739597929991885">Bluetooth</translation> @@ -8425,6 +8463,7 @@ <translation id="9186963452600581158">Uşağın Google Hesabı ilə daxil olun</translation> <translation id="9187967020623675250">Düymələr uyğun gəlmir. <ph name="RESPONSE" /> üçün istənilən düyməyə basın.</translation> <translation id="9188732951356337132">İstifadə və diaqnostika datasını göndərin. Bu cihaz hazırda Google'a diaqnostika, cihaz və tətbiq istifadə datasını avtomatik göndərir. Bu, övladınızı müəyyən etmək üçün istifadə edilməyəcək, eyni zamanda, sistem və tətbiq sabitliyi və digər təkmilləşdirmələrə kömək edəcək. Ümumi data, həmçinin, Google tətbiqləri və Android developerləri kimi partnyorlara kömək edəcək. Övladınız üçün əlavə Veb və Tətbiq Fəaliyyəti ayarı aktiv edilərsə, bu data Google Hesabında yadda saxlana bilər. <ph name="BEGIN_LINK2" />Ətraflı Məlumat<ph name="END_LINK2" /></translation> +<translation id="9192019773545828776">Səsli rəyi dinləyərək ekrana baxmadan cihazınızdan istifadə edə bilərsiniz. Brayl əlifbası qoşulmuş cihaz ilə əlçatandır. ChromeVox'u aktiv və deaktiv etmək üçün Ctrl + Alt + Z istifadə edin. Naviqasiya etmək üçün Axtarış + Sol ox və ya Sağ oxu istifadə edin. Seçmək (aktiv etmək) üçün Axtarış + Boşluq istifadə edin.</translation> <translation id="919686179725692564">Tətbiqlərin yedəklənməsi barədə ətraflı məlumat əldə edin</translation> <translation id="9198090666959937775">Android telefonunuzu təhlükəsizlik açarı kimi istifadə edin</translation> <translation id="9199503643457729322">Məxfilik Bələdçisindən uzaqlaşmaq üçün klikləyin.</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index edcb5c2b..553ea70 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -993,6 +993,7 @@ <translation id="1916502483199172559">ডিফল্ট লাল রঙের অবতার</translation> <translation id="1918141783557917887">&ক্ষুদ্রতর</translation> <translation id="1920390473494685033">পরিচিতি</translation> +<translation id="1921544956190977703">ঝুঁকিপূর্ণ ওয়েবসাইট, ডাউনলোড এবং এক্সটেনশনের জন্য আপনার কাছে Chrome-এর সবচেয়ে শক্তিশালী নিরাপত্তা আছে</translation> <translation id="1921584744613111023"><ph name="DPI" /> dpi</translation> <translation id="1923468477587371721">আপনি আলাদা আলাদা প্রোডাক্টের ভাষা পরিবর্তন না করা পর্যন্ত Gmail, Drive এবং YouTube-এর মতো Google সাইট আপনার Google অ্যাকাউন্টের ভাষা ব্যবহার করে</translation> <translation id="1923539912171292317">স্বয়ংক্রিয় ক্লিকগুলি</translation> @@ -2094,6 +2095,7 @@ <ph name="DOMAIN" />-এর জন্য আপনার স্মার্ট কার্ড প্রবেশ করিয়ে রাখতে হবে।</translation> <translation id="2923234477033317484">এই অ্যাকাউন্ট সরিয়ে দিন</translation> <translation id="2923644930701689793">আপনার ফোনের ক্যামেরা রোল অ্যাক্সেস করুন</translation> +<translation id="292371311537977079">Chrome সেটিংস</translation> <translation id="2925658782192398150">হয়ে গেছে, কোনও সমস্যা পাওয়া যায়নি</translation> <translation id="2926085873880284723">ডিফল্ট শর্টকাট ফিরিয়ে আনুন</translation> <translation id="2926620265753325858"><ph name="DEVICE_NAME" /> কাজ করে না।</translation> @@ -2677,6 +2679,7 @@ <translation id="3511528412952710609">স্বল্পস্থায়ী</translation> <translation id="3514335087372914653">গেম কন্ট্রোল</translation> <translation id="3514373592552233661">একাধিক নেটওয়ার্ক উপলব্ধ থাকলে, পছন্দের নেটওয়ার্ককে অন্যান্য পরিচিত নেটওয়ার্কগুলির থেকে অগ্রাধিকার দেওয়া হবে</translation> +<translation id="3514647716686280777">আপনি স্ট্যান্ডার্ড নিরাপত্তা সুরক্ষা পাচ্ছেন। ঝুঁকিপূর্ণ ওয়েবসাইট, ডাউনলোড এবং এক্সটেনশনের বিরুদ্ধে আরও সুরক্ষা পেতে, Chrome সেটিংসে উন্নত নিরাপদ ব্রাউজিং চালু করুন।</translation> <translation id="3515983984924808886">রিসেট করা কনফার্ম করতে আপনার নিরাপত্তা কী আবার টাচ করুন। পিন সহ নিরাপত্তা কীয়ে সেভ করা সব তথ্য মুছে যাবে।</translation> <translation id="3518985090088779359">স্বীকার করুন ও অবিরত রাখুন</translation> <translation id="3519564332031442870">প্রিন্ট সম্পর্কিত ব্যাকএন্ড পরিষেবা</translation> @@ -5475,6 +5478,7 @@ <translation id="6278428485366576908">থীম</translation> <translation id="6278776436938569440">লোকেশন পরিবর্তন করুন</translation> <translation id="6279183038361895380">আপনার কার্সার দেখাতে |<ph name="ACCELERATOR" />| চাপুন</translation> +<translation id="6279595948631688299">বেছে নেওয়া সার্টিফিকেট এক্সপোর্ট করুন...</translation> <translation id="6280215091796946657">অন্য একটি অ্যাকাউন্ট দিয়ে সাইন-ইন করুন</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6282180787514676874">{COUNT,plural, =1{১ শিট কাগজের বেশি হয়ে গেছে}one{{COUNT} শিট কাগজের বেশি হয়ে গেছে}other{{COUNT} শিট কাগজের বেশি হয়ে গেছে}}</translation> @@ -5589,6 +5593,7 @@ <translation id="6398715114293939307">Google Play Store সরান</translation> <translation id="6398765197997659313">পূর্ণ স্ক্রীণ বন্ধ করুন</translation> <translation id="6399774419735315745">গুপ্তচর</translation> +<translation id="6401458660421980302">এই ট্যাবটিকে অন্য ডিভাইসে পাঠাতে, সেখানে Chrome-এ সাইন-ইন করুন</translation> <translation id="6401597285454423070">আপনার কম্পিউটারে একটি বিশ্বস্ত প্ল্যাটফর্ম মডিউল (TPM) নিরাপত্তা ডিভাইস রয়েছে, যা ChromeOS-এ অনেকগুলি জটিল সুরক্ষা ফিচার প্রয়োগ করতে ব্যবহৃত হয়। আরও জানতে Chromebook সহায়তা কেন্দ্রে যান: https://support.google.com/chromebook/?p=tpm</translation> <translation id="6404187344102273690">Chromebook গেমিং</translation> <translation id="6404511346730675251">বুকমার্ক সম্পাদনা করুন</translation> @@ -5827,6 +5832,7 @@ <translation id="6619801788773578757">কিয়স্ক অ্যাপ্লিকেশান যোগ করুন</translation> <translation id="6619990499523117484">আপনার পিন নিশ্চিত করুন</translation> <translation id="6620254580880484313">কন্টেনারের নাম</translation> +<translation id="6621391692573306628">এই ট্যাবটিকে অন্য ডিভাইসে পাঠাতে, উভয় ডিভাইসেই Chrome-এ সাইন-ইন করুন</translation> <translation id="6622980291894852883">চিত্রগুলিকে ব্লক করা চালিয়ে যান</translation> <translation id="6624036901798307345">ট্যাবলেট মোডে প্রতিটি ট্যাবে থাম্বনেল দেখানো হয় এমন ট্যাব বার খোলার জন্য ট্যাব কাউন্টার টুলবার বোতামে ট্যাপ করুন।</translation> <translation id="6624535038674360844"><ph name="FILE_NAME" />-এ সংবেদনশীল বা বিপজ্জনক কন্টেন্ট আছে। ফাইলের মালিককে সেটি ঠিক করতে বলুন।</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index d48594d..78e0513f 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -991,6 +991,7 @@ <translation id="1916502483199172559">Zadani crveni avatar</translation> <translation id="1918141783557917887">&Manje</translation> <translation id="1920390473494685033">Kontakti</translation> +<translation id="1921544956190977703">Imate najjaču Chromeovu zaštitu od opasnih web lokacija, preuzimanja i ekstenzija</translation> <translation id="1921584744613111023"><ph name="DPI" /> dpi</translation> <translation id="1923468477587371721">Googleove web lokacije kao što su Gmail, Disk i YouTube koriste jezik vašeg Google računa osim ako niste promijenili jezik zasebnog proizvoda</translation> <translation id="1923539912171292317">Automatski klikovi</translation> @@ -2092,6 +2093,7 @@ Domena <ph name="DOMAIN" /> zahtijeva da pametna kartica ostane umetnuta.</translation> <translation id="2923234477033317484">Ukloni ovaj račun</translation> <translation id="2923644930701689793">Pristupite snimljenim fotografijama telefona</translation> +<translation id="292371311537977079">Postavke Chromea</translation> <translation id="2925658782192398150">Gotovo; nije pronađen nijedan problem</translation> <translation id="2926085873880284723">Vrati zadane prečace</translation> <translation id="2926620265753325858">Uređaj <ph name="DEVICE_NAME" /> nije podržan.</translation> @@ -2675,6 +2677,7 @@ <translation id="3511528412952710609">Kratko</translation> <translation id="3514335087372914653">Kontrola igre</translation> <translation id="3514373592552233661">Preferirane mreže će imati prednost u odnosu na druge poznate mreže ako je dostupno više od jedne mreže</translation> +<translation id="3514647716686280777">Dobijate standardnu sigurnosnu zaštitu. Da dobijete bolju zaštitu od opasnih web lokacija, preuzimanja i ekstenzija, uključite Poboljšano sigurno pregledanje u postavkama Chromea.</translation> <translation id="3515983984924808886">Dodirnite ponovo svoj sigurnosni ključ da potvrdite vraćanje na zadano. Izbrisat će se sve informacije koje su pohranjene na sigurnosnom ključu, uključujući njegov PIN.</translation> <translation id="3518985090088779359">Prihvati i nastavi</translation> <translation id="3519564332031442870">Pozadinska usluga štampanja</translation> @@ -5470,6 +5473,7 @@ <translation id="6278428485366576908">Tema</translation> <translation id="6278776436938569440">Promijeni lokaciju</translation> <translation id="6279183038361895380">Pritisnite |<ph name="ACCELERATOR" />| da prikažete kursor</translation> +<translation id="6279595948631688299">I&zvezi odabrani certifikat...</translation> <translation id="6280215091796946657">Prijavite se s drugim računom</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6282180787514676874">{COUNT,plural, =1{Premašuje ograničenje od 1 lista papira}one{Premašuje ograničenje od {COUNT} lista papira}few{Premašuje ograničenje od {COUNT} lista papira}other{Premašuje ograničenje od {COUNT} listova papira}}</translation> @@ -5584,6 +5588,7 @@ <translation id="6398715114293939307">Ukloni Google Play trgovinu</translation> <translation id="6398765197997659313">Napusti prikaz preko cijelog ekrana</translation> <translation id="6399774419735315745">Špijunka</translation> +<translation id="6401458660421980302">Da pošaljete ovu karticu na drugi uređaj, prijavite se na Chrome tamo</translation> <translation id="6401597285454423070">Vaš računar sadrži sigurnosni uređaj s modulom pouzdane platforme (TPM) koji se koristi za primjenu mnogih važnih sigurnosnih funkcija u ChromeOS-u. Posjetite Chromebook centar za pomoć da saznate više: https://support.google.com/chromebook/?p=tpm</translation> <translation id="6404187344102273690">Igranje na Chromebooku</translation> <translation id="6404511346730675251">Uredite oznaku</translation> @@ -5824,6 +5829,7 @@ <translation id="6619801788773578757">Dodaj aplikaciju za kiosk</translation> <translation id="6619990499523117484">Potvrdite PIN</translation> <translation id="6620254580880484313">Naziv spremnika</translation> +<translation id="6621391692573306628">Da pošaljete ovu karticu na drugi uređaj, prijavite se na Chrome na oba uređaja</translation> <translation id="6622980291894852883">Nastavi blokirati slike</translation> <translation id="6624036901798307345">U načinu rada tableta dodirnite dugme alatne trake brojača kartica da otvorite novu traku kartice koja prikazuje sličice svake kartice.</translation> <translation id="6624535038674360844">U fajlu <ph name="FILE_NAME" /> postoji osjetljiv ili opasan sadržaj. Zatražite od vlasnika da ispravi grešku.</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index c311828d..2add116 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -5889,6 +5889,7 @@ <translation id="6709133671862442373">Notícies</translation> <translation id="6709357832553498500">Connecta mitjançant <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Anterior</translation> +<translation id="6710394144992407503">Comprova si hi ha errors ortogràfics quan escriguis text en pàgines web</translation> <translation id="6711146141291425900">Enllaça el compte de <ph name="WEB_DRIVE" /> per a Baixades</translation> <translation id="6712943853047024245">Ja has desat una contrasenya amb aquest nom d'usuari per a <ph name="WEBSITE" /></translation> <translation id="6713233729292711163">Afegeix un perfil de treball</translation> @@ -6507,6 +6508,7 @@ <translation id="7340757554212515731">Envia automàticament informes d'error i dades de diagnòstic i d'ús a Google</translation> <translation id="7341834142292923918">Vol accedir a aquest lloc web</translation> <translation id="7343372807593926528">Descriu el problema abans d'enviar suggeriments.</translation> +<translation id="7344585835349671209">Gestiona els certificats HTTPS/SSL al dispositiu</translation> <translation id="7345706641791090287">Confirma la contrasenya</translation> <translation id="7346909386216857016">D'acord</translation> <translation id="7347452120014970266">Amb aquesta acció s'esborraran totes les dades i galetes emmagatzemades per <ph name="ORIGIN_NAME" /> i per les seves aplicacions instal·lades</translation> @@ -6636,6 +6638,7 @@ <translation id="7460045493116006516">Tema instal·lat actualment</translation> <translation id="7461924472993315131">Fixa</translation> <translation id="746216226901520237">La propera vegada, <ph name="DEVICE_TYPE" /> es desbloquejarà amb el telèfon. Pots desactivar Smart Lock a Configuració.</translation> +<translation id="7464153996453281700">Component ja actualitzat</translation> <translation id="7464637891177137294">Desa-la al teu Compte de Google, <ph name="ACCOUNT" /></translation> <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{# pestanya oberta; prem per commutar la barra de pestanyes}other{# pestanyes obertes; prem per commutar la barra de pestanyes}}</translation> <translation id="7465635034594602553">S'ha produït un error. Espera uns quants minuts i torna a executar <ph name="APP_NAME" />.</translation> @@ -7144,6 +7147,7 @@ <translation id="793531125873261495">S'ha produït un error en baixar la màquina virtual. Torna-ho a provar.</translation> <translation id="7935451262452051102"><ph name="PERCENT" />% completat</translation> <translation id="7939062555109487992">Opcions avançades</translation> +<translation id="7939328347457537652">Gestiona els certificats del dispositiu</translation> <translation id="7939412583708276221">Continua de totes maneres</translation> <translation id="7942349550061667556">Vermell</translation> <translation id="7943368935008348579">Baixa els fitxers PDF</translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb index c63d6b2..339766d 100644 --- a/chrome/app/resources/generated_resources_cy.xtb +++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -5917,6 +5917,7 @@ <translation id="6709133671862442373">Newyddion</translation> <translation id="6709357832553498500">Cysylltu gan ddefnyddio <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Blaenorol</translation> +<translation id="6710394144992407503">Gwiriwch am wallau sillafu pan fyddwch yn teipio testun ar dudalennau gwe</translation> <translation id="6711146141291425900">Cysylltwch gyfrif <ph name="WEB_DRIVE" /> ar gyfer Lawrlwythiadau</translation> <translation id="6712943853047024245">Rydych eisoes wedi cadw cyfrinair gyda'r enw defnyddiwr hwn ar ei gyfer <ph name="WEBSITE" /></translation> <translation id="6713233729292711163">Ychwanegu Proffil Gwaith</translation> @@ -6535,6 +6536,7 @@ <translation id="7340757554212515731">Yn anfon adroddiadau toriadau yn awtomatig ynghyd â data diagnostig a defnydd at Google</translation> <translation id="7341834142292923918">Eisiau cael mynediad at y wefan hon</translation> <translation id="7343372807593926528">Disgrifiwch y broblem cyn anfon adborth.</translation> +<translation id="7344585835349671209">Rheoli tystysgrifau HTTPS/SSL ar eich dyfais</translation> <translation id="7345706641791090287">Cadarnhewch eich cyfrinair</translation> <translation id="7346909386216857016">Iawn, rwy'n deall</translation> <translation id="7347452120014970266">Bydd hyn yn clirio'r holl ddata a chwcis sy'n cael eu storio gan <ph name="ORIGIN_NAME" /> a'i apiau sydd wedi'u gosod</translation> @@ -6664,6 +6666,7 @@ <translation id="7460045493116006516">Thema bresennol rydych wedi'i gosod</translation> <translation id="7461924472993315131">Pinio</translation> <translation id="746216226901520237">Y tro nesaf, bydd eich ffôn yn datgloi eich <ph name="DEVICE_TYPE" />. Gallwch ddiffodd Smart Lock yn y gosodiadau.</translation> +<translation id="7464153996453281700">Cydran eisoes yn gyfredol</translation> <translation id="7464637891177137294">Cadwch ef yn eich Cyfrif Google, <ph name="ACCOUNT" /></translation> <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{Mae # tab ar agor, pwyswch i doglo'r stribed tabiau}zero{Mae # tab ar agor, pwyswch i doglo'r stribed tabiau}two{Mae # thab ar agor, pwyswch i doglo'r stribed tabiau}few{Mae # thab ar agor, pwyswch i doglo'r stribed tabiau}many{Mae # tab ar agor, pwyswch i doglo'r stribed tabiau}other{Mae # tab ar agor, pwyswch i doglo'r stribed tabiau}}</translation> <translation id="7465635034594602553">Aeth rywbeth o'i le. Arhoswch ychydig funudau a rhedwch <ph name="APP_NAME" /> eto.</translation> @@ -7172,6 +7175,7 @@ <translation id="793531125873261495">Bu gwall wrth lawrlwytho'r peiriant rhithwir. Rhowch gynnig arall arni.</translation> <translation id="7935451262452051102">Wedi cwblhau <ph name="PERCENT" />%</translation> <translation id="7939062555109487992">Dewisiadau uwch</translation> +<translation id="7939328347457537652">Rheoli tystysgrifau dyfais</translation> <translation id="7939412583708276221">Cadw beth bynnag</translation> <translation id="7942349550061667556">Coch</translation> <translation id="7943368935008348579">Lawrlwytho ffeiliau PDF</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index 25997bbe..c427bd0 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -5888,6 +5888,7 @@ <translation id="6709133671862442373">Noticias</translation> <translation id="6709357832553498500">Conectar a través de <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Anterior</translation> +<translation id="6710394144992407503">Verificar que no haya errores ortográficos cuando escribas en páginas web</translation> <translation id="6711146141291425900">Vincular la cuenta de <ph name="WEB_DRIVE" /> para las descargas</translation> <translation id="6712943853047024245">Ya guardaste una contraseña con este nombre de usuario para <ph name="WEBSITE" /></translation> <translation id="6713233729292711163">Agregar un perfil de trabajo</translation> @@ -6506,6 +6507,7 @@ <translation id="7340757554212515731">Envía automáticamente informes de fallas, datos de uso y de diagnóstico a Google</translation> <translation id="7341834142292923918">Requiere acceso a este sitio</translation> <translation id="7343372807593926528">Describe el problema antes de enviar los comentarios.</translation> +<translation id="7344585835349671209">Administra certificados HTTPS/SSL en tu dispositivo.</translation> <translation id="7345706641791090287">Confirma tu contraseña</translation> <translation id="7346909386216857016">Entendido</translation> <translation id="7347452120014970266">Esta acción borrará todos los datos y cookies almacenados por <ph name="ORIGIN_NAME" /> y sus apps instaladas</translation> @@ -6635,6 +6637,7 @@ <translation id="7460045493116006516">Tema actual que tienes instalado</translation> <translation id="7461924472993315131">Fijar</translation> <translation id="746216226901520237">La próxima vez, tu teléfono desbloqueará tu <ph name="DEVICE_TYPE" />. Puedes desactivar Smart Lock en la configuración.</translation> +<translation id="7464153996453281700">Componente actualizado</translation> <translation id="7464637891177137294">Guárdala en tu Cuenta de Google, <ph name="ACCOUNT" />.</translation> <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{# pestaña abierta, presiona para activar o desactivar la barra de pestañas}other{# pestañas abiertas, presiona para activar o desactivar la barra de pestañas}}</translation> <translation id="7465635034594602553">Se produjo un error. Espera unos minutos y vuelve a ejecutar <ph name="APP_NAME" />.</translation> @@ -7143,6 +7146,7 @@ <translation id="793531125873261495">Se produjo un error al descargar la máquina virtual. Vuelve a intentarlo.</translation> <translation id="7935451262452051102">Se completó el <ph name="PERCENT" />%</translation> <translation id="7939062555109487992">Opciones avanzadas</translation> +<translation id="7939328347457537652">Administrar certificados de dispositivos</translation> <translation id="7939412583708276221">Continuar de todos modos</translation> <translation id="7942349550061667556">Rojo</translation> <translation id="7943368935008348579">Descargar archivos PDF</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index 52827ee..09a8e68d 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -5906,6 +5906,7 @@ <translation id="6709133671862442373">اخبار</translation> <translation id="6709357832553498500">اتصال با استفاده از <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">قبلی</translation> +<translation id="6710394144992407503">بررسی غلطهای املایی درحین تایپ نوشتار در صفحههای وب</translation> <translation id="6711146141291425900">برای دسترسی به «بارگیریها»، حساب <ph name="WEB_DRIVE" /> را پیوند دهید</translation> <translation id="6712943853047024245">قبلاً گذرواژهای با این نام کاربری برای <ph name="WEBSITE" /> ذخیره کردهاید</translation> <translation id="6713233729292711163">افزودن نمایه کاری</translation> @@ -6524,6 +6525,7 @@ <translation id="7340757554212515731">گزارشهای خرابی و دادههای استفاده و عیبیابی را بهطور خودکار به Google ارسال میکند</translation> <translation id="7341834142292923918">میخواهد به این سایت دسترسی پیدا کند</translation> <translation id="7343372807593926528">لطفاً قبلاز ارسال بازخورد، مشکل را شرح دهید.</translation> +<translation id="7344585835349671209">مدیریت گواهینامههای HTTPS/SSL در دستگاه</translation> <translation id="7345706641791090287">گذرواژهتان را تأیید کنید</translation> <translation id="7346909386216857016">بله متوجه شدم.</translation> <translation id="7347452120014970266">با این کار همه دادهها و کوکیهای ذخیرهشده توسط <ph name="ORIGIN_NAME" /> و برنامههای نصبشده آن پاک میشود</translation> @@ -6653,6 +6655,7 @@ <translation id="7460045493116006516">زمینه کنونی که نصب کردهاید</translation> <translation id="7461924472993315131">پین</translation> <translation id="746216226901520237">دفعه بعد، تلفنتان قفل <ph name="DEVICE_TYPE" /> را باز خواهد کرد. میتوانید Smart Lock را در «تنظیمات» خاموش کنید.</translation> +<translation id="7464153996453281700">عنصر درحالحاضر بهروز است</translation> <translation id="7464637891177137294">آن را در «حساب Google» خود (<ph name="ACCOUNT" />) ذخیره کنید</translation> <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{# برگه باز است، برای پنهان/نمایان کردن نوار برگه فشار دهید}one{# برگه باز است، برای پنهان/نمایان کردن نوار برگه فشار دهید}other{# برگه باز است، برای پنهان/نمایان کردن نوار برگه فشار دهید}}</translation> <translation id="7465635034594602553">مشکلی پیش آمد. لطفاً چند دقیقه صبر کنید و دوباره <ph name="APP_NAME" /> را اجرا کنید.</translation> @@ -7160,6 +7163,7 @@ <translation id="793531125873261495">هنگام بارگیری دستگاه مجازی خطایی روی داد. لطفاً دوباره امتحان کنید.</translation> <translation id="7935451262452051102"><ph name="PERCENT" /> درصد تکمیل شد</translation> <translation id="7939062555109487992">گزینههای پیشرفته</translation> +<translation id="7939328347457537652">مدیریت گواهینامههای دستگاه</translation> <translation id="7939412583708276221">درهر حال حفظ شود</translation> <translation id="7942349550061667556">قرمز</translation> <translation id="7943368935008348579">بارگیری فایلهای PDF</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 6789151..7033363c 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -81,6 +81,7 @@ <translation id="1076766328672150609">Puwedeng gumamit ng PIN ang iyong anak para i-unlock ang device.</translation> <translation id="1076818208934827215">Microsoft Internet Explorer</translation> <translation id="1076882167394279216">Hindi ma-download ang diksyunaryo ng pang-check ng pagbabaybay para sa <ph name="LANGUAGE" />. Subukan ulit.</translation> +<translation id="1078037449555275327">Mga setting ng ChromeVox</translation> <translation id="1079766198702302550">Palaging i-block ang access sa camera</translation> <translation id="1081956462909987459">{NUM_TABS,plural, =1{<ph name="GROUP_TITLE" /> - 1 Tab}one{<ph name="GROUP_TITLE" /> - # Tab}other{<ph name="GROUP_TITLE" /> - # na Tab}}</translation> <translation id="1082214733466244292">Na-block ng iyong administrator ang ilang functionality para sa device na ito</translation> @@ -401,6 +402,7 @@ <translation id="1390907927270446471">Hindi pinapahintulutan si <ph name="PROFILE_USERNAME" /> na mag-print sa <ph name="PRINTER_NAME" />. Makipag-ugnayan sa iyong administrator.</translation> <translation id="1393283411312835250">Araw at mga ulap</translation> <translation id="1395730723686586365">Sinimulan ang updater</translation> +<translation id="1395832189806039783">Mag-highlight ng item gamit ang pag-focus ng keyboard</translation> <translation id="1396139853388185343">Nagkaroon ng error sa pag-set up ng printer</translation> <translation id="1396259464226642517">Hindi ba inaasahan ang resultang ito? <ph name="BEGIN_LINK" />Magpadala ng feedback<ph name="END_LINK" /></translation> <translation id="1396963298126346194">Hindi nagtutugma ang username at password na inilagay mo</translation> @@ -554,6 +556,7 @@ <translation id="1531734061664070992"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" />, <ph name="THIRD_SWITCH" /></translation> <translation id="1533948060140843887">Nauunawaan kong makakasama sa aking computer ang pag-download na ito</translation> <translation id="1535228823998016251">Malakas</translation> +<translation id="1535753739390684432">Marinig na binabasa nang malakas ang partikular na text. Una, piliin ang icon na Select-to-speak sa ibaba ng iyong screen, pagkatapos ay i-highlight ang text.</translation> <translation id="1536754031901697553">Nagdidiskonekta...</translation> <translation id="1537254971476575106">Fullscreen magnifier</translation> <translation id="15373452373711364">Malaking mouse cursor</translation> @@ -712,6 +715,7 @@ <translation id="166278006618318542">Subject Public Key Algorithm</translation> <translation id="1662801900924515589">Na-install ang <ph name="APP" /></translation> <translation id="1666232093776384142">I-disable ang proteksyon sa pag-access ng data para sa mga peripheral</translation> +<translation id="1667842670298352129">Marinig na binabasa nang malakas ang partikular na text. Una, piliin ang icon na Select-to-speak sa ibaba ng iyong screen, pagkatapos ay i-highlight ang text. Puwede ka ring gumamit ng keyboard shortcut: Mag-highlight ng text, pagkatapos ay pindutin ang Search + S.</translation> <translation id="1668435968811469751">Magpa-enroll nang manual</translation> <translation id="1668979692599483141">Matuto tungkol sa mga suhestyon</translation> <translation id="1670399744444387456">Pangunahin</translation> @@ -739,6 +743,7 @@ <translation id="1692115862433274081">Gumamit ng ibang account</translation> <translation id="1692118695553449118">Naka-on ang pag-sync</translation> <translation id="1692210323591458290">Dark purple</translation> +<translation id="1692713444215319269">Pag-invert ng kulay, magnifier, at mga setting ng display</translation> <translation id="1695487653372841667">Makokontrol mo kung anong data ang ibinabahagi sa Google. Puwede mo itong baguhin anumang oras sa Mga Setting.</translation> <translation id="1695510246756136088">Hindi makakonekta sa internet. Subukan ulit.</translation> <translation id="169675691788639886">May naka-configure na server ng SSH ang device. Huwag mag-sign in gamit ang mga sensitibong account.</translation> @@ -959,6 +964,7 @@ <translation id="1877520246462554164">Hindi nakuha ang token sa pag-authenticate. Mag-sign out at muling mag-sign in upang subukang muli.</translation> <translation id="1877860345998737529">Pagtatakda ng switch sa pagkilos</translation> <translation id="1878155070920054810">Mukhang mauubusan na ng power ang iyong Chromebook bago pa matapos ang pag-update. Tiyaking nagcha-charge ito nang tama para maiwasan ang pagkaantala.</translation> +<translation id="1878885068166344708">Iha-highlight ang item kapag ginalaw mo ang focus. Pindutin ang tab o pumili ng item para baguhin ang focus.</translation> <translation id="1879000426787380528">Mag-sign in bilang</translation> <translation id="18802377548000045">Paliitin ang mga tab sa malaking lapad</translation> <translation id="1880905663253319515">Tanggalin ang certificate na "<ph name="CERTIFICATE_NAME" />"?</translation> @@ -986,6 +992,7 @@ <translation id="1904580727789512086">Naka-save sa iyong Google Account ang mga URL na iyong binibisita</translation> <translation id="1905375423839394163">Pangalan ng Chromebook device</translation> <translation id="1906181697255754968">Karaniwang ina-access ng mga site ang mga file at folder sa iyong device para sa mga feature gaya ng awtomatikong pag-save sa trabaho mo</translation> +<translation id="1907044622262489040">Mag-type gamit ang iyong boses. Gamitin ang Search + D, pagkatapos ay magsimulang magsalita.</translation> <translation id="1908591798274282246">Buksan Ulit ang Nakasarang Grupo</translation> <translation id="1909880997794698664">Sigurado ka bang gusto mong permanenteng panatilihin sa kiosk mode ang device na ito?</translation> <translation id="1915073950770830761">canary</translation> @@ -993,6 +1000,7 @@ <translation id="1916502483199172559">Default na pulang avatar</translation> <translation id="1918141783557917887">&Mas maliit</translation> <translation id="1920390473494685033">Mga Contact</translation> +<translation id="1921544956190977703">Nasa iyo ang pinakamaigting na seguridad ng Chrome laban sa mga mapanganib na website, download, at extension</translation> <translation id="1921584744613111023"><ph name="DPI" /> dpi</translation> <translation id="1923468477587371721">Ginagamit ng mga Google site tulad ng Gmail, Drive, at YouTube ang wika ng iyong Google Account maliban kung binago mo ang wika ng indibidwal na produkto</translation> <translation id="1923539912171292317">Mga awtomatikong pag-click</translation> @@ -1340,6 +1348,7 @@ <translation id="2241053333139545397">Basahin at baguhin ang iyong data sa ilang website</translation> <translation id="2241634353105152135">Isang beses lang</translation> <translation id="2242687258748107519">Info ng File</translation> +<translation id="2245603955208828424">Gamitin ang mga arrow key para magpalipat-lipat ng item nang kada titik</translation> <translation id="2246129643805925002">Awtomatikong nag-a-update ang iyong <ph name="DEVICE_TYPE" /> sa background para mabigyan ka ng mga pinakabagong feature at pagpapahusay sa seguridad. Puwede mong suriin ang mga kagustuhan sa update sa Mga Setting.</translation> <translation id="2246549592927364792">Kumuha ng mga paglalarawan ng larawan mula sa Google?</translation> <translation id="2247738527273549923">Pinapamahalaan ng iyong organisasyon ang device mo</translation> @@ -1445,6 +1454,7 @@ <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" />% ang natapos</translation> <translation id="2318143611928805047">Sukat ng papel</translation> <translation id="2318817390901984578">Upang gamitin ang mga Android app, i-charge at i-update ang iyong <ph name="DEVICE_TYPE" />.</translation> +<translation id="2319459402137712349">Pumili ng field ng text para buksan ang keyboard. Puwede mo ring piliin ang icon ng Keyboard sa ibaba ng iyong screen.</translation> <translation id="2319993584768066746">Mga larawan sa screen sa pag-sign in</translation> <translation id="2322193970951063277">Mga header at footer</translation> <translation id="2322318151094136999">Magtanong kapag gustong i-access ng isang site ang mga serial port (inirerekomenda)</translation> @@ -1519,6 +1529,7 @@ <translation id="2379281330731083556">I-print gamit ang dialog ng system... <ph name="SHORTCUT_KEY" /></translation> <translation id="2381499968174336913">Preview ng nakabahaging tab</translation> <translation id="2381756643783702095">Magtanong bago magpadala (inirerekomenda)</translation> +<translation id="2383825469508278924">Baguhing ang pagmamapa ng key ng keyboard, mga function key, at higit pa</translation> <translation id="2386202302581016807">Masyadong maliit ang available na storage ng iyong device para tapusin ang pag-set up</translation> <translation id="2387052489799050037">Pumunta sa Home</translation> <translation id="2387602571959163792"><ph name="DESK_NAME" /> (Kasalukuyan)</translation> @@ -1696,6 +1707,7 @@ <translation id="2542050502251273923">Itinatakda ang antas ng pag-debug ng manager ng koneksyon ng network at iba pang serbisyong gumagamit ng ff_debug.</translation> <translation id="2544352060595557290">Tab na Ito</translation> <translation id="2546302722632337735">Huwag payagan ang mga site na gumamit ng mga identifier para mag-play ng pinoprotektahang content</translation> +<translation id="2546991196809436099">Mag-zoom in para palakihin ang mga item sa screen. Gamitin ang Search + Ctrl + M para i-on at i-off ang magnifier.</translation> <translation id="2548347166720081527">Pinayagan ang <ph name="PERMISSION" /></translation> <translation id="2548545707296594436">I-reset ang cache ng profile ng eSIM</translation> <translation id="2549985041256363841">Simulang mag-record</translation> @@ -1854,6 +1866,7 @@ <translation id="2715640894224696481">Kahilingan sa security key</translation> <translation id="2715751256863167692">Ire-reset ng pag-upgrade na ito ang iyong Chromebook at aalisin nito ang kasalukuyang data ng user.</translation> <translation id="2716986496990888774">Pinapamahalaan ng magulang ang setting na ito.</translation> +<translation id="271749239614426244">Balewalain ang maliit na galaw ng cursor</translation> <translation id="2718395828230677721">Night Light</translation> <translation id="2718998670920917754">Nakakita ng virus ang software ng anti-virus.</translation> <translation id="2719936478972253983">Na-block ang sumusunod na cookies</translation> @@ -2094,6 +2107,7 @@ Inaatasan ka ng <ph name="DOMAIN" /> na panatilihing nakalagay ang iyong smart card.</translation> <translation id="2923234477033317484">Alisin ang account na ito</translation> <translation id="2923644930701689793">I-access ang camera roll ng iyong telepono</translation> +<translation id="292371311537977079">Mga setting ng Chrome</translation> <translation id="2925658782192398150">Tapos na, walang nakitang isyu</translation> <translation id="2926085873880284723">I-restore ang mga default na shortcut</translation> <translation id="2926620265753325858">Hindi sinusuportahan ang <ph name="DEVICE_NAME" />.</translation> @@ -2422,6 +2436,7 @@ <translation id="3274763671541996799">Nag-full screen ka.</translation> <translation id="3275778809241512831">Kasalukuyang hindi secure ang iyong internal na security key. Pakialis ito sa anumang serbisyo kung saan mo ito ginamit. Para lutasin ang isyu, paki-reset ang security key.</translation> <translation id="3275778913554317645">Buksan bilang window</translation> +<translation id="3277214528693754078">Mag-navigate gamit ang cursor ng text (caret browsing)</translation> <translation id="3278001907972365362">Nangangailangan ng pansin ang iyong (mga) Google Account</translation> <translation id="3279092821516760512">Makakapagbahagi sa iyo ang mga piling contact kapag malapit sila. Hindi magsisimula ang mga paglilipat hangga't hindi mo tinatanggap ang mga ito.</translation> <translation id="3279230909244266691">Maaaring abutin nang ilang minuto ang prosesong ito. Sinisimulan ang virtual machine.</translation> @@ -2677,6 +2692,7 @@ <translation id="3511528412952710609">Maikli</translation> <translation id="3514335087372914653">Kontrol sa Laro</translation> <translation id="3514373592552233661">Mas pipiliin ang mga gustong network kaysa sa iba pang kilalang network kung may mahigit sa isang available</translation> +<translation id="3514647716686280777">Ang standard na proteksyon sa seguridad ang nakukuha mo. Para makakuha ng higit pang proteksyon laban sa mga mapanganib na website, download, at extension, i-on ang Pinahusay na Ligtas na Pag-browse sa mga setting ng Chrome.</translation> <translation id="3515983984924808886">Pindutin ulit ang iyong security key para kumpirmahin ang pag-reset. Made-delete ang lahat ng impormasyong naka-store sa security key, kabilang ang PIN nito.</translation> <translation id="3518985090088779359">Tanggapin, magpatuloy</translation> <translation id="3519564332031442870">Backend na Serbisyo sa Pag-print</translation> @@ -2735,6 +2751,7 @@ <translation id="3578874072190212775">Tulungan ang mga site na labanan ang panloloko at matukoy ang mga bot kumpara sa mga tao</translation> <translation id="3581605050355435601">Awtomatikong i-configure ang IP address</translation> <translation id="3582057310199111521">Nailagay sa isang mapanlinlang na site at nakita sa paglabag sa data</translation> +<translation id="3582299299336701326">Padilimin ang maliliwanag na screen, at paliwanagin ang madidilim na screen. Pindutin ang Search + Ctrl + H para i-on at i-off ang pag-invert ng kulay.</translation> <translation id="3584169441612580296">Basahin at baguhin ang mga larawan, musika at iba pang media sa iyong computer</translation> <translation id="3586806079541226322">Hindi mabuksan ang file na ito</translation> <translation id="3586931643579894722">Magtago ng mga detalye</translation> @@ -2851,6 +2868,7 @@ <translation id="369135240373237088">Mag-sign in ulit sa isang pampaaralang account</translation> <translation id="3693415264595406141">Password:</translation> <translation id="3694027410380121301">Select Previous Tab</translation> +<translation id="3694590407685276748">I-highlight ang cursor ng text</translation> <translation id="369489984217678710">Mga password at iba pang data sa pag-sign in</translation> <translation id="369522892592566391">{NUM_FILES,plural, =0{Tapos na ang mga pagsusuri sa seguridad. Ia-upload ang iyong data.}=1{Tapos na ang mga pagsusuri sa seguridad. Ia-upload ang iyong file.}one{Tapos na ang mga pagsusuri sa seguridad. Ia-upload ang iyong mga file.}other{Tapos na ang mga pagsusuri sa seguridad. Ia-upload ang iyong mga file.}}</translation> <translation id="3698471669415859717">Tapos na ang pagsusuri</translation> @@ -2986,6 +3004,7 @@ <translation id="3814529970604306954">Pampaaralang Account</translation> <translation id="3816118180265633665">Mga Kulay ng Chrome</translation> <translation id="3817524650114746564">Buksan ang mga setting ng proxy ng iyong computer</translation> +<translation id="3819164369574292143">Mag-zoom in para palakihin ang mga item sa screen. Gamitin ang Search + Ctrl + M para i-on at i-off ang magnifier. Gamitin ang Ctrl + Alt + Mga arrow key para gumalaw kapag naka-zoom in.</translation> <translation id="3819257035322786455">Backup</translation> <translation id="3819261658055281761">Hindi na-store ng system ang pangmatagalang token ng access ng API para sa device na ito.</translation> <translation id="3819800052061700452">&Full screen</translation> @@ -3233,6 +3252,7 @@ <translation id="403725336528835653">Subukan muna ito</translation> <translation id="4040105702484676956">I-clear ang data ng site at mga pahintulot para sa <ph name="SITE_NAME" /> at naka-install na app nito?</translation> <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Umalis sa Page}one{Umalis sa Mga Page}other{Umalis sa Mga Page}}</translation> +<translation id="4043267180218562935">Laki ng cursor</translation> <translation id="4044612648082411741">Ilagay ang password ng iyong certificate</translation> <translation id="4044708573046946214">Password ng lock ng screen</translation> <translation id="404493185430269859">Default na search engine</translation> @@ -3351,6 +3371,7 @@ <translation id="4152670763139331043">{NUM_TABS,plural, =1{1 tab}one{# tab}other{# na tab}}</translation> <translation id="4154664944169082762">Mga fingerprint</translation> <translation id="4157869833395312646">Microsoft Server Gated Cryptography</translation> +<translation id="4158315983204257156">Laki at font ng text sa website</translation> <translation id="4158364720893025815">Pumasa</translation> <translation id="4159681666905192102">Isa itong account para sa mga bata na pinamamahalaan nina <ph name="CUSTODIAN_EMAIL" /> at <ph name="SECOND_CUSTODIAN_EMAIL" />.</translation> <translation id="4163560723127662357">Hindi kilalang keyboard</translation> @@ -3896,6 +3917,7 @@ <translation id="4689421377817139245">I-sync ang bookmark na ito sa iyong iPhone</translation> <translation id="4690091457710545971"><Apat na file na ginawa ng Intel Wi-Fi firmware: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. Ang unang tatlo ay mga binary file na may mga dump sa pagpaparehistro at iginiit ng Intel na walang personal na impormasyon o impormasyong nakakapagpakilala sa device. Ang panghuling file ay isang execution trace mula sa Intel firmware; tinanggalan ito ng anumang personal na impormasyon o impormasyong nakakapagpakilala sa device, ngunit masyado itong malaki para maipakita rito. Nagawa ang mga file na ito bilang tugon sa mga kamakailang naging problema sa Wi-Fi sa iyong device, at ibabahagi ito sa Intel para makatulong sa pag-troubleshoot ng mga problemang ito.></translation> <translation id="4691791363716065510">Matitingnan ng <ph name="ORIGIN" /> ang <ph name="FILENAME" /> hanggang sa isara mo ang lahat ng tab para sa site na ito</translation> +<translation id="4692342362587775867">Posibleng nakakasagabal ang mga notification mula sa site na ito</translation> <translation id="4692623383562244444">Mga search engine</translation> <translation id="4692736633446859167">Pinili mo dati na hindi payagan ang anumang extension sa <ph name="SITE" />. Kung idaragdag mo ang site na ito dito, puwede ring hilingin ng iba pang extension na basahin at baguhin ang iyong data ng site sa <ph name="SITE" />.</translation> <translation id="4693155481716051732">Sushi</translation> @@ -3908,6 +3930,7 @@ <translation id="4699357559218762027">(awtomatikong inilunsad)</translation> <translation id="4701025263201366865">Pag-sign in ng magulang</translation> <translation id="4701335814944566468">Tiningnan kahapon</translation> +<translation id="470644585772471629">Pag-invert ng kulay</translation> <translation id="4707337002099455863">Palagi sa Lahat ng Site</translation> <translation id="4708794300267213770">Ipakita ang lock screen kapag pinagana mula sa pag-sleep</translation> <translation id="4708849949179781599">Quit <ph name="PRODUCT_NAME" /></translation> @@ -3921,6 +3944,8 @@ <translation id="4723140812774948886">I-swap sa susunod</translation> <translation id="4724450788351008910">Binago ang Kaugnayan</translation> <translation id="4725511304875193254">Corgi</translation> +<translation id="4726710355753484204">Gamitin ang Ctrl + Alt + Dagdagan ang Liwanag para mag-zoom in. +Gamitin ang Ctrl + Alt + Bawasan ang Liwanag para mag-zoom out.</translation> <translation id="4726710629007580002">Nagkaroon ng mga babala noong sinusubukang i-install ang extension na ito:</translation> <translation id="4727847987444062305">Pinapamahalaang session ng bisita</translation> <translation id="4728558894243024398">Platform</translation> @@ -4262,6 +4287,7 @@ <translation id="5073956501367595100">{0,plural,offset:2 =1{<ph name="FILE1" />}=2{<ph name="FILE1" />, <ph name="FILE2" />}one{<ph name="FILE1" />, <ph name="FILE2" />, at # pa}other{<ph name="FILE1" />, <ph name="FILE2" />, at # pa}}</translation> <translation id="5074318175948309511">Maaaring kailangan na muling i-load ang page na ito bago gumana ang mga bagong setting.</translation> <translation id="5074761966806028321">Kinakailangan pa rin ang pahintulot para tapusin ang pag-set up</translation> +<translation id="5075563999073408211">Kontrolin ang iyong device gamit ang isa o higit pang switch. Ang mga switch ay puwedeng maging mga key sa keyboard, button sa gamepad, o nakalaang device.</translation> <translation id="5075910247684008552">Bina-block ang hindi secure na content bilang default sa mga secure na site</translation> <translation id="5078638979202084724">I-bookmark ang lahat ng mga tab</translation> <translation id="5078796286268621944">Maling PIN</translation> @@ -4340,6 +4366,7 @@ <translation id="5154108062446123722">Mga advanced na setting para sa <ph name="PRINTING_DESTINATION" /></translation> <translation id="5154702632169343078">Paksa</translation> <translation id="5155327081870541046">Sa address bar, ilagay ang shortcut para sa site kung saan mo gustong maghanap, gaya ng "@bookmarks." Pagkatapos ay pindutin ang iyong gustong keyboard shortcut, at ilagay ang termino para sa paghahanap mo.</translation> +<translation id="5156638757840305347">Iha-highlight ang cursor kapag lumabas o gumalaw ito</translation> <translation id="5157635116769074044">I-pin ang Pahinang ito sa Screen ng Simula...</translation> <translation id="5159094275429367735">I-set up ang Crostini</translation> <translation id="5159419673777902220">Na-disable ng iyong magulang ang mga pahintulot sa extension</translation> @@ -4479,6 +4506,7 @@ <translation id="5293170712604732402">I-restore ang mga setting sa mga orihinal na default ng mga ito</translation> <translation id="5294097441441645251">Dapat ay nagsisimula sa maliit na character o underscore</translation> <translation id="5294618183559481278">Gumagamit ang iyong <ph name="DEVICE_TYPE" /> ng built-in na sensor para ma-detect ang mga tao sa harap ng device mo. Ipoproseso kaagad at pagkatapos ay ide-delete ang lahat ng data sa iyong device. Hindi kailanman ipinapadala sa Google ang data ng sensor. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> +<translation id="5296350763804564124">Makarinig ng pasalitang feedback para magamit mo ang iyong device nang hindi tumitingin sa screen. Available ang braille na feedback gamit ang isang nakakonektang device.</translation> <translation id="5297082477358294722">Na-save ang password. Tingnan at pamahalaan ang mga naka-save na password sa iyong <ph name="SAVED_PASSWORDS_STORE" />.</translation> <translation id="5297946558563358707">Kapag may ibang tumingin sa iyong screen, ipakita ang icon na mata ng Privacy sa kanang bahagi sa ibaba ng iyong screen</translation> <translation id="5298219193514155779">Ang tema ay nilikha ni</translation> @@ -5232,6 +5260,7 @@ <translation id="6043994281159824495">Mag-sign out ngayon</translation> <translation id="6045114302329202345">Pangunahing button ng TrackPoint</translation> <translation id="6047632800149092791">Hindi gumagana ang pag-sync. Subukang mag-sign out at mag-sign in ulit.</translation> +<translation id="6048747414605857443">Pumili at mag-customize ng mga boses ng text-to-speech para sa ChromeVox at Select-to-speak</translation> <translation id="6049797270917061226">Puwedeng bigyang-daan ng file na ito na manakaw ng mga attacker ang iyong personal na impormasyon.</translation> <translation id="6051354611314852653">Oops! Nabigong pahintulutan ng system ang pag-access sa API para sa device na ito.</translation> <translation id="6051638103735819069"><ph name="BEGIN_PARAGRAPH1" />Kapag pinayagan ang mga ChromeOS device na magpadala ng mga awtomatikong ulat, makakatulong ito sa aming bigyang-priyoridad kung ano ang dapat ayusin at pahusayin sa ChromeOS. Posibleng kasama sa mga ulat na ito ang mga bagay gaya kung kailan nagka-crash ang ChromeOS, aling mga feature ang ginamit, kung gaano kalaking memory ang karaniwang nagamit, at data ng diagnostic at paggamit ng Android app. Makakatulong din ang ilang pinagsama-samang data sa mga Google app at partner, gaya ng mga developer ng Android.<ph name="END_PARAGRAPH1" /> @@ -5355,6 +5384,7 @@ <translation id="6155141482566063812">Ibinabahagi ng tab sa background ang iyong screen</translation> <translation id="6156323911414505561">Ipakita ang bookmarks bar</translation> <translation id="6156863943908443225">Script cache</translation> +<translation id="6156944117133588106">Ipakita ang mga button ng navigation sa tablet mode</translation> <translation id="615930144153753547">Puwedeng magpakita ng mga larawan ang mga site</translation> <translation id="6160625263637492097">Magbigay ng mga certificate para sa pagpapatotoo</translation> <translation id="6163363155248589649">&Normal</translation> @@ -5472,6 +5502,7 @@ <translation id="6278428485366576908">Tema</translation> <translation id="6278776436938569440">Baguhin ang lokasyon</translation> <translation id="6279183038361895380">Pindutin ang |<ph name="ACCELERATOR" />| upang ipakita ang iyong cursor</translation> +<translation id="6279595948631688299">I-e&xport ang napiling certificate...</translation> <translation id="6280215091796946657">Mag-sign in gamit ang ibang account</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6282180787514676874">{COUNT,plural, =1{Lumalampas sa limitasyong 1 pirasong papel}one{Lumalampas sa limitasyong {COUNT} pirasong papel}other{Lumalampas sa limitasyong {COUNT} na pirasong papel}}</translation> @@ -5586,6 +5617,7 @@ <translation id="6398715114293939307">Alisin ang Google Play Store</translation> <translation id="6398765197997659313">Lumabas sa buong screen</translation> <translation id="6399774419735315745">Espiya</translation> +<translation id="6401458660421980302">Para ipadala ang tab na ito sa ibang device, mag-sign in sa Chrome doon</translation> <translation id="6401597285454423070">Ang iyong computer ay mayroong device na panseguridad na Trusted Platform Module (TPM), na ginagamit para magpatupad ng maraming mahalagang panseguridad na feature sa ChromeOS. Bumisita sa Help Center ng Chromebook para matuto pa: https://support.google.com/chromebook/?p=tpm</translation> <translation id="6404187344102273690">Gaming sa Chromebook</translation> <translation id="6404511346730675251">I-edit ang bookmark</translation> @@ -5685,6 +5717,7 @@ <translation id="6494445798847293442">Hindi Certification Authority</translation> <translation id="6494974875566443634">Pag-customize</translation> <translation id="6497457470714179223">{NUM_FILES,plural, =0{May sensitibo o mapanganib na content ang data na ito}=1{May sensitibo o mapanganib na content ang file na ito}one{May sensitibo o mapanganib na content ang mga file na ito}other{May sensitibo o mapanganib na content ang mga file na ito}}</translation> +<translation id="6497784818439587832">Baguhin ang laki ng display para paliitin o palakihin ang mga item sa iyong screen</translation> <translation id="6497789971060331894">Reverse na pag-scroll gamit ang mouse</translation> <translation id="6498249116389603658">&Lahat ng iyong wika</translation> <translation id="6499143127267478107">Nireresolba ang host sa proxy script...</translation> @@ -5778,6 +5811,7 @@ <translation id="6582274660680936615">Nagba-browse ka bilang isang Bisita</translation> <translation id="6583328141350416497">Ipagpatuloy ang pag-download</translation> <translation id="6584878029876017575">Microsoft Lifetime Signing</translation> +<translation id="6585584201072946561">I-customize ang laki at font ng text para sa web browser</translation> <translation id="6586099239452884121">Pagba-browse ng bisita</translation> <translation id="6586213706115310390">I-access ang iyong Assistant kapag sinabi mong "Hey Google."</translation> <translation id="6586451623538375658">Palitan ang pangunahing button ng mouse</translation> @@ -5824,6 +5858,7 @@ <translation id="6619801788773578757">Magdagdag ng kiosk application</translation> <translation id="6619990499523117484">Kumpirmahin ang iyong PIN</translation> <translation id="6620254580880484313">Pangalan ng container</translation> +<translation id="6621391692573306628">Para ipadala ang tab na ito sa ibang device, mag-sign in sa Chrome sa dalawang device</translation> <translation id="6622980291894852883">Magpatuloy sa paghaharang ng mga larawan</translation> <translation id="6624036901798307345">Sa tablet mode, i-tap ang button ng toolbar para sa pagbibilang ng tab para mabuksan ang bagong tabstrip na nagpapakita ng mga thumbnail ng bawat tab.</translation> <translation id="6624535038674360844">May sensitibo o mapanganib na content ang <ph name="FILE_NAME" />. Hilingin sa may-ari nitong ayusin ito.</translation> @@ -6510,6 +6545,7 @@ <translation id="7312210124139670355">Nire-reset ng iyong administrator ang eSIM mo. Puwede itong tumagal nang ilang minuto.</translation> <translation id="7320213904474460808">Pumili ng default na network</translation> <translation id="7321545336522791733">Hindi makakonekta sa server</translation> +<translation id="7323315405936922211">Laki ng lugar ng cursor</translation> <translation id="7324297612904500502">Forum sa Beta</translation> <translation id="7325209047678309347">Nag-jam ang papel</translation> <translation id="7326004502692201767">I-set up ang <ph name="DEVICE_TYPE" /> na ito para sa isang bata</translation> @@ -6876,6 +6912,7 @@ <translation id="7665369617277396874">Magdagdag ng account</translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{Ibalik ang <ph name="DEVICE_TYPE" /> sa loob ng {NUM_WEEKS} linggo}one{Ibalik ang <ph name="DEVICE_TYPE" /> sa loob ng {NUM_WEEKS} linggo}other{Ibalik ang <ph name="DEVICE_TYPE" /> sa loob ng {NUM_WEEKS} na linggo}}</translation> <translation id="7668423670802040666">Sa Google Password Manager para sa <ph name="ACCOUNT" /></translation> +<translation id="7668648754769651616">Pinapadaling gamitin ng mga feature ng accessibility ang iyong device. Para i-access ang Mga Mabilisang Setting, piliin ang oras sa ibaba ng iyong screen.</translation> <translation id="7669825497510425694">{NUM_ATTEMPTS,plural, =1{Maling PIN. May isa kang pagtatangkang natitira.}one{Maling PIN. May # kang pagtatangkang natitira.}other{Maling PIN. May # kang pagtatangkang natitira.}}</translation> <translation id="7670434942695515800">Para sa pinakamahusay na performance, mag-upgrade sa pinakabagong bersyon. Inirerekomenda ang pag-back up ng iyong mga file kung sakaling hindi makumpleto ang pag-upgrade. Kapag nagsimula na ang pag-upgrade, magsa-shut down ang Linux. I-save ang mga nakabukas na file bago magpatuloy. <ph name="LINK_START" />Matuto pa<ph name="LINK_END" /></translation> <translation id="7670483791111801022">Mga Subtitle</translation> @@ -6932,6 +6969,7 @@ <translation id="7717014941119698257">Nagda-download: <ph name="STATUS" /></translation> <translation id="771721654176725387">Permanente nitong ide-delete ang iyong data mula sa pagba-browse sa device na ito. Para ma-recover ang data, i-on ang i-sync bilang</translation> <translation id="7717845620320228976">Tumingin ng mga update</translation> +<translation id="7718490543420739837">On-screen na keyboard, dictation, Switch Access, at higit pa</translation> <translation id="7719367874908701697">Pag-zoom ng page</translation> <translation id="7719588063158526969">Masyadong mahaba ang pangalan ng device</translation> <translation id="7720216670798402294">Basahin ang impormasyon ng device at data ng device ng ChromeOS.</translation> @@ -7573,6 +7611,7 @@ <translation id="8314835274931377415">Simulan ang pag-set up ng Switch Access?</translation> <translation id="8317582043908962055">Kilalanin ang PDF text</translation> <translation id="8317671367883557781">Idagdag ang koneksyon sa network</translation> +<translation id="8318266828739827371">Gumamit ng split-screen view para makita ang naka-magnify na bahagi ng iyong screen. Gamitin ang Search + Ctrl + D para i-on at i-off ang naka-dock na magnifier.</translation> <translation id="8319414634934645341">Extended na Paggamit ng Key</translation> <translation id="8321837372750396788">Papamahalaan ng <ph name="MANAGER" /> ang <ph name="DEVICE_TYPE" /> na ito.</translation> <translation id="8322814362483282060">Na-block na ang pahinang ito sa pag-access sa iyong mikropono.</translation> @@ -7810,6 +7849,7 @@ <translation id="8574990355410201600">Palaging payagan ang tunog sa <ph name="HOST" /></translation> <translation id="8575286410928791436">Pindutin nang matagal ang <ph name="KEY_EQUIVALENT" /> para Umalis.</translation> <translation id="8576885347118332789">{NUM_TABS,plural, =1{Idagdag ang tab sa listahan ng babasahin}one{Idagdag ang mga tab sa listahan ng babasahin}other{Idagdag ang mga tab sa listahan ng babasahin}}</translation> +<translation id="8577052309681449949">Mga awtomatikong pag-click, laki ng cursor, kulay ng cursor, at higit pa</translation> <translation id="8578639784464423491">Hindi maaaring lumagpas sa 99 na titik</translation> <translation id="857943718398505171">Pinapayagan (inirerekomenda)</translation> <translation id="8581809080475256101">Pindutin upang makapunta sa susunod, gamitin ang menu ng konteksto upang makita ang history</translation> @@ -7949,6 +7989,7 @@ <translation id="8708671767545720562">&Higit Pang Impormasyon</translation> <translation id="8711402221661888347">Burger</translation> <translation id="8712637175834984815">Nakuha ko</translation> +<translation id="8713110120305151436">Ipakita ang mga opsyon sa accessibility sa Mga Mabilisang Setting</translation> <translation id="8713570323158206935">Ipadala ang <ph name="BEGIN_LINK1" />impormasyon ng system<ph name="END_LINK1" /></translation> <translation id="8714838604780058252">Graphics sa background</translation> <translation id="871515167518607670">Pumili ng device. Pagkatapos, para makita ang page, buksan ang Chrome doon.</translation> @@ -8095,6 +8136,7 @@ <translation id="8845001906332463065">Humingi ng tulong</translation> <translation id="8846132060409673887">I-read ang manufacturer at modelo ng computer na ito</translation> <translation id="8846163936679269230">I-reset ang mga profile ng eSIM</translation> +<translation id="8846239054091760429">Mono audio, startup, Instant Caption, at higit pa</translation> <translation id="8847523528195140327">I-sign out kapag nakasara ang cover</translation> <translation id="8847988622838149491">USB</translation> <translation id="8849001918648564819">Nakatago</translation> @@ -8109,6 +8151,7 @@ <translation id="8859174528519900719">Subframe: <ph name="SUBFRAME_SITE" /></translation> <translation id="8859402192569844210">Hindi ma-load ang Mga Tuntunin ng Serbisyo</translation> <translation id="8859662783913000679">Account ng magulang</translation> +<translation id="8861568709166518036">Gumamit ng mga button sa screen para mag-navigate sa home, pabalik, at magpalit ng app. Awtomatikong nag-o-on kung naka-on ang ChromeVox o awtomatikong nagki-click.</translation> <translation id="8862003515646449717">Lumipat sa isang mabilis na browser</translation> <translation id="8863753581171631212">Buksan ang link sa bagong <ph name="APP" /></translation> <translation id="8864055848767439877">Ibinabahagi ang <ph name="TAB_NAME" /> sa <ph name="APP_NAME" /></translation> @@ -8138,6 +8181,7 @@ <translation id="8879921471468674457">Tandaan ang impormasyon sa pag-sign in</translation> <translation id="8880054210564666174">Hindi ma-download ang listahan ng contact. Pakisuri ang iyong koneksyon ng network, o <ph name="LINK_BEGIN" />subukan ulit<ph name="LINK_END" />.</translation> <translation id="8881020143150461183">Pakisubukan ulit. Para sa technical support, makipag-ugnayan sa <ph name="CARRIER_NAME" />.</translation> +<translation id="888256071122006425">Mga setting ng mouse at touchpad</translation> <translation id="8883273463630735858">I-enable ang pag-accelerate ng touchpad</translation> <translation id="8884023684057697730"><ph name="BEGIN_BOLD" />Paano mo mapapamahalaan ang iyong data:<ph name="END_BOLD" /> Para protektahan ang iyong privacy, awtomatiko kaming nagde-delete sa listahan ng mga site na mas matagal sa 4 na linggo. Posibleng lumabas ulit sa listahan ang isang site na bibisitahin mo ulit. O puwede kang mag-alis ng site kung ayaw mo kailanman na tumukoy ang site na iyon ng mga interes para sa iyo.</translation> <translation id="8884570509232205463">Nagla-lock na ngayon ang iyong device sa ganap na <ph name="UNLOCK_TIME" />.</translation> @@ -8324,6 +8368,7 @@ <translation id="9066777626153702300">Mga hindi aktibong site</translation> <translation id="9066782832737749352">Text-to-Speech</translation> <translation id="9068298336633421551">Payagan ang mga Android app at serbisyong may pahintulot sa lokasyon na gamitin ang lokasyon ng device na ito. Posibleng pana-panahong mangolekta ang Google ng data ng lokasyon at gamitin nito ang data na ito nang anonymous para mas maging tumpak ang lokasyon at pahusayin ang mga serbisyong batay sa lokasyon.</translation> +<translation id="9068598199622656904">Paisa-isang pumindot ng key para sa mga keyboard shortcut sa halip na magkakasabay na pumindot nang matagal ng mga key</translation> <translation id="9068878141610261315">Hindi sinusuportahang uri ng file</translation> <translation id="9070342919388027491">Inilipat sa kaliwa ang Tab</translation> <translation id="9074739597929991885">Bluetooth</translation> @@ -8449,6 +8494,7 @@ <translation id="9186963452600581158">Mag-sign in gamit ang Google Account ng isang bata</translation> <translation id="9187967020623675250">Hindi magkatugma ang mga key. Pumindot ng anumang key para <ph name="RESPONSE" />.</translation> <translation id="9188732951356337132">Magpadala ng data ng paggamit at diagnostic na data. Sa kasalukuyan, ang device na ito ay awtomatikong nagpapadala ng diagnostic na data, data ng device, at data ng paggamit sa app sa Google. Hindi ito gagamitin para tukuyin ang pagkakakilanlan ng iyong anak, at makakatulong ito sa stability ng system at ng app, at sa iba pang pagpapahusay. Makakatulong din ang ilang pinagsama-samang data sa mga app at partner ng Google, gaya ng mga developer ng Android. Kung naka-on ang karagdagang setting ng Aktibidad sa Web at App para sa iyong anak, maaaring ma-save ang data na ito sa kanyang Google Account. <ph name="BEGIN_LINK2" />Matuto Pa<ph name="END_LINK2" /></translation> +<translation id="9192019773545828776">Makarinig ng pasalitang feedback para magamit mo ang iyong device nang hindi tumitingin sa screen. Available ang braille na feedback gamit ang isang nakakonektang device. Gamitin ang Ctrl + Alt + Z para i-on at i-off ang ChromeVox. Gamitin ang Search + Pakaliwang arrow o Pakanang arrow para mag-navigate. Gamitin ang Search + Space para pumili (mag-activate).</translation> <translation id="919686179725692564">Matuto pa tungkol sa pag-back up ng iyong mga app.</translation> <translation id="9198090666959937775">Gamitin ang iyong Android phone bilang security key</translation> <translation id="9199503643457729322">I-click para mag-navigate paalis sa Gabay sa Privacy.</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index ec088a05..87aa877 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -982,6 +982,7 @@ <translation id="1916502483199172559">Zadani crveni avatar</translation> <translation id="1918141783557917887">&Manji</translation> <translation id="1920390473494685033">Kontakti</translation> +<translation id="1921544956190977703">Imate najsnažniju Chromeovu zaštitu od opasnih web-lokacija, preuzimanja i proširenja</translation> <translation id="1921584744613111023"><ph name="DPI" /> dpi</translation> <translation id="1923468477587371721">Web-lokacije Googleovih usluga kao što su Gmail, Disk i YouTube koriste jezik vašeg Google računa, osim ako ste promijenili jezik pojedinačnog proizvoda</translation> <translation id="1923539912171292317">Automatski klikovi</translation> @@ -2081,6 +2082,7 @@ <ph name="DOMAIN" /> zahtijeva da vaša pametna kartica ostane umetnuta.</translation> <translation id="2923234477033317484">Ukloni taj račun</translation> <translation id="2923644930701689793">Pristupite snimljenim fotografijama na telefonu</translation> +<translation id="292371311537977079">Postavke preglednika Chrome</translation> <translation id="2925658782192398150">Gotovo, nije pronađena nijedna poteškoća</translation> <translation id="2926085873880284723">Vrati zadane prečace</translation> <translation id="2926620265753325858">Uređaj <ph name="DEVICE_NAME" /> nije podržan.</translation> @@ -2664,6 +2666,7 @@ <translation id="3511528412952710609">Kratko</translation> <translation id="3514335087372914653">Kontrola igre</translation> <translation id="3514373592552233661">Preferirane mreže imat će prednost pred ostalim poznatim mrežama ako je dostupno više mreža</translation> +<translation id="3514647716686280777">Imate standardnu zaštitu sigurnosti. Da biste se bolje zaštitili od opasnih web-lokacija, preuzimanja i proširenja, uključite poboljšano sigurno pregledavanje u postavkama Chromea.</translation> <translation id="3515983984924808886">Još jednom dodirnite sigurnosni ključ da biste potvrdili vraćanje na zadano. Izbrisat će se sve informacije pohranjene na sigurnosnom ključu, uključujući PIN.</translation> <translation id="3518985090088779359">Prihvati i nastavi</translation> <translation id="3519564332031442870">Pozadinska usluga ispisa</translation> @@ -5455,6 +5458,7 @@ <translation id="6278428485366576908">Tema</translation> <translation id="6278776436938569440">Promijeni lokaciju</translation> <translation id="6279183038361895380">Pritisnite |<ph name="ACCELERATOR" />| da bi se prikazao pokazivač</translation> +<translation id="6279595948631688299">Izvezi odabrani certifikat...</translation> <translation id="6280215091796946657">Prijavite se drugim računom</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6282180787514676874">{COUNT,plural, =1{Premašuje ograničenje od jednog lista papira}one{Premašuje ograničenje od {COUNT} lista papira}few{Premašuje ograničenje od {COUNT} lista papira}other{Premašuje ograničenje od {COUNT} listova papira}}</translation> @@ -5569,6 +5573,7 @@ <translation id="6398715114293939307">Ukloni Trgovinu Google Play</translation> <translation id="6398765197997659313">Izađi iz cijelog zaslona</translation> <translation id="6399774419735315745">Špijunka</translation> +<translation id="6401458660421980302">Da biste poslali ovu karticu na drugi uređaj, prijavite se na Chrome na tom uređaju</translation> <translation id="6401597285454423070">Vaše računalo sadrži sigurnosni uređaj Trusted Platform Module (TPM) koji se upotrebljava za primjenu mnogih kritičnih sigurnosnih značajki u Chrome OS-u. Posjetite Chromebookov centar za pomoć da biste saznali više: https://support.google.com/chromebook/?p=tpm</translation> <translation id="6404187344102273690">Igranje igara na Chromebookovima</translation> <translation id="6404511346730675251">Uredi oznaku</translation> @@ -5809,6 +5814,7 @@ <translation id="6619801788773578757">Dodaj aplikaciju kioska</translation> <translation id="6619990499523117484">Potvrdite PIN</translation> <translation id="6620254580880484313">Naziv spremnika</translation> +<translation id="6621391692573306628">Da biste poslali ovu karticu na drugi uređaj, prijavite se na Chrome na oba uređaja</translation> <translation id="6622980291894852883">Nastavi blokirati slike</translation> <translation id="6624036901798307345">U načinu rada tableta dodirnite na gumb alatne trake brojača kartica da biste otvorili novu vrpcu kartica koja prikazuje minijature svake kartice.</translation> <translation id="6624535038674360844">Datoteka <ph name="FILE_NAME" /> ima osjetljiv ili opasan sadržaj. Recite vlasniku da ispravi pogrešku.</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index b5ed174..0b4de02 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -5907,6 +5907,7 @@ <translation id="6709133671862442373">Berita</translation> <translation id="6709357832553498500">Sambungkan menggunakan <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Sebelumnya</translation> +<translation id="6710394144992407503">Periksa kesalahan ejaan saat mengetik teks di halaman web</translation> <translation id="6711146141291425900">Tautkan akun <ph name="WEB_DRIVE" /> untuk Hasil Download</translation> <translation id="6712943853047024245">Anda sudah menyimpan sandi dengan nama pengguna ini untuk <ph name="WEBSITE" /></translation> <translation id="6713233729292711163">Tambahkan Profil Kerja</translation> @@ -6525,6 +6526,7 @@ <translation id="7340757554212515731">Otomatis mengirimkan laporan kerusakan serta diagnostik dan data penggunaan ke Google</translation> <translation id="7341834142292923918">Ingin mengakses situs ini</translation> <translation id="7343372807593926528">Jelaskan masalahnya sebelum mengirim masukan.</translation> +<translation id="7344585835349671209">Kelola sertifikat HTTPS/SSL di perangkat</translation> <translation id="7345706641791090287">Konfirmasi sandi Anda</translation> <translation id="7346909386216857016">Oke, mengerti</translation> <translation id="7347452120014970266">Ini akan menghapus semua data dan cookie yang disimpan oleh <ph name="ORIGIN_NAME" /> dan aplikasi yang terinstal di dalamnya</translation> @@ -6654,6 +6656,7 @@ <translation id="7460045493116006516">Tema saat ini yang telah diinstal</translation> <translation id="7461924472993315131">Sematkan</translation> <translation id="746216226901520237">Saat digunakan lagi, ponsel Anda akan membuka kunci <ph name="DEVICE_TYPE" /> ini. Anda dapat menonaktifkan Smart Lock di Setelan.</translation> +<translation id="7464153996453281700">Komponen sudah yang terbaru</translation> <translation id="7464637891177137294">Simpan di Akun Google Anda, <ph name="ACCOUNT" /></translation> <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{# tab terbuka, tekan untuk beralih tab setrip}other{# tab terbuka, tekan untuk beralih tab setrip}}</translation> <translation id="7465635034594602553">Terjadi error. Tunggu beberapa menit lalu jalankan <ph name="APP_NAME" /> lagi.</translation> @@ -7162,6 +7165,7 @@ <translation id="793531125873261495">Error saat mendownload mesin virtual. Coba lagi.</translation> <translation id="7935451262452051102"><ph name="PERCENT" />% selesai</translation> <translation id="7939062555109487992">Opsi lanjutan</translation> +<translation id="7939328347457537652">Kelola sertifikat perangkat</translation> <translation id="7939412583708276221">Lanjutkan saja</translation> <translation id="7942349550061667556">Merah</translation> <translation id="7943368935008348579">Download PDF</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index ab96a360..100d230 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -4105,6 +4105,7 @@ <translation id="4900392736118574277">דף הפתיחה השתנה ל-<ph name="URL" />.</translation> <translation id="490051679772058907"><ph name="REFRESH_RATE" /> הרץ – סריקה שזורה</translation> <translation id="4900652253009739885">לא ניתן להסיר את המתג היחיד שהוקצה לפעולה "בחירה". צריך להקיש על מקש כלשהו כדי <ph name="RESPONSE" />.</translation> +<translation id="4901154724271753917">הרחבת התפריט 'נסגרו לאחרונה'</translation> <translation id="4901309472892185668">יש לבחור מצב לניסוי <ph name="EXPERIMENT_NAME" />.</translation> <translation id="49027928311173603">המדיניות שהורדה מהשרת אינה חוקית: <ph name="VALIDATION_ERROR" />.</translation> <translation id="4906490889887219338">הגדרה או ניהול של התקני רשת לשיתוף קבצים. <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation> @@ -6986,6 +6987,7 @@ <translation id="7768526219335215384">ל-<ph name="ORIGIN" /> תהיה הרשאה לראות את הקבצים בתיקייה <ph name="FOLDERNAME" /></translation> <translation id="7768770796815395237">שינוי</translation> <translation id="7768784765476638775">הקראה</translation> +<translation id="7769748505895274502">כיווץ התפריט 'נסגרו לאחרונה'</translation> <translation id="7770406201819593386">הרצה של בדיקות ניתוחים לגבי ChromeOS Flex.</translation> <translation id="7770450735129978837">הלחצן הימני בעכבר</translation> <translation id="7770612696274572992">התמונה הועתקה ממכשיר אחר</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index 11279e6..3bee88d 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -5873,6 +5873,7 @@ <translation id="6709133671862442373">ニュース</translation> <translation id="6709357832553498500">「<ph name="EXTENSIONNAME" />」を使用して接続</translation> <translation id="6710213216561001401">前へ</translation> +<translation id="6710394144992407503">ウェブページにテキストを入力するときにスペルミスがないか確認する</translation> <translation id="6711146141291425900">ダウンロードするには <ph name="WEB_DRIVE" /> アカウントをリンクしてください</translation> <translation id="6712943853047024245">このユーザー名で <ph name="WEBSITE" /> のパスワードはすでに保存されています</translation> <translation id="6713233729292711163">仕事用プロファイルを追加</translation> @@ -6489,6 +6490,7 @@ <translation id="7340757554212515731">障害レポート、診断データ、使用状況データを自動的に Google に送信します</translation> <translation id="7341834142292923918">このサイトへのアクセス許可が必要です</translation> <translation id="7343372807593926528">問題の詳細を記入してからフィードバックを送信してください。</translation> +<translation id="7344585835349671209">デバイスの HTTPS / SSL 証明書を管理します</translation> <translation id="7345706641791090287">パスワードを再入力</translation> <translation id="7346909386216857016">OK</translation> <translation id="7347452120014970266"><ph name="ORIGIN_NAME" /> により保存されたすべてのデータと Cookie、インストールされたアプリが削除されます</translation> @@ -6618,6 +6620,7 @@ <translation id="7460045493116006516">インストールした現在のテーマ</translation> <translation id="7461924472993315131">固定</translation> <translation id="746216226901520237">次回から、スマートフォンで <ph name="DEVICE_TYPE" /> のロックを解除できます。Smart Lock を無効にするには [設定] をご利用ください。</translation> +<translation id="7464153996453281700">コンポーネントはすでに最新です</translation> <translation id="7464637891177137294"><ph name="ACCOUNT" /> の Google アカウントに保存します</translation> <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{現在開いているタブは # 個で、このボタンを押すとタブバーを切り替えます}other{現在開いているタブは # 個で、このボタンを押すとタブバーを切り替えます}}</translation> <translation id="7465635034594602553">エラーが発生しました。数分後にもう一度 <ph name="APP_NAME" /> を実行してください。</translation> @@ -7124,6 +7127,7 @@ <translation id="793531125873261495">仮想マシンのダウンロード中にエラーが発生しました。もう一度お試しください。</translation> <translation id="7935451262452051102"><ph name="PERCENT" />% 完了</translation> <translation id="7939062555109487992">詳細オプション</translation> +<translation id="7939328347457537652">デバイス証明書の管理</translation> <translation id="7939412583708276221">続行する</translation> <translation id="7942349550061667556">赤</translation> <translation id="7943368935008348579">PDF をダウンロードする</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index c91b494..0663201 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -980,6 +980,7 @@ <translation id="1916502483199172559">ნაგულისხმევი წითელი ავატარი</translation> <translation id="1918141783557917887">&უფრო პატარა</translation> <translation id="1920390473494685033">კონტაქტები</translation> +<translation id="1921544956190977703">თქვენ სარგებლობთ Chrome-ის ყველაზე ძლიერი დაცვით სახიფათო ვებსაიტებისგან, ჩამოტვირთვებისა და გაფართოებებისგან</translation> <translation id="1921584744613111023"><ph name="DPI" /> dpi</translation> <translation id="1923468477587371721">Google-ის საიტები, როგორიცაა Gmail, Drive და YouTube, იყენებს თქვენი Google ანგარიშის ენას, თუ ცალკეული პროდუქტების ენები არ შეგიცვლიათ</translation> <translation id="1923539912171292317">ავტომატური დაწკაპუნებები</translation> @@ -2078,6 +2079,7 @@ <ph name="DOMAIN" /> მოითხოვს, რომ თქვენი სმარტ-ბარათი ჩასმული იყოს.</translation> <translation id="2923234477033317484">ამ ანგარიშის ამოშლა</translation> <translation id="2923644930701689793">იქონიეთ წვდომა თქვენი ტელეფონის კამერის ალბომზე</translation> +<translation id="292371311537977079">Chrome-ის პარამეტრები</translation> <translation id="2925658782192398150">მზადაა, პრობლემები არ მოიძებნა</translation> <translation id="2926085873880284723">ნაგულისხმევი მალსახმობების აღდგენა</translation> <translation id="2926620265753325858"><ph name="DEVICE_NAME" /> მხარდაუჭერელია.</translation> @@ -2661,6 +2663,7 @@ <translation id="3511528412952710609">მოკლე</translation> <translation id="3514335087372914653">თამაშის კონტროლი</translation> <translation id="3514373592552233661">რამდენიმე ქსელის ხელმისაწვდომობის შემთხვევაში, სასურველ ქსელებს სხვა ცნობილ ქსელებზე მეტი პრიორიტეტი მიენიჭება</translation> +<translation id="3514647716686280777">თქვენ სარგებლობთ უსაფრთხოების სტანდარტული საშუალებებით. სახიფათო ვებსაიტებისგან, ჩამოტვირთვებისა და გაფართოებებისგან დაცვის უფრო ძლიერი საშუალებებით რომ ისარგებლოთ, Chrome-ის პარამეტრებიდან ჩართეთ გაძლიერებული Safe Browsing.</translation> <translation id="3515983984924808886">გადაყენების დასასრულებლად ხელახლა შეეხეთ უსაფრთხოების გასაღებს. უსაფრთხოების გასაღებზე შენახული მთელი ინფორმაცია (მისი PIN-კოდის ჩათვლით) წაიშლება.</translation> <translation id="3518985090088779359">მიღება და გაგრძელება</translation> <translation id="3519564332031442870">Print Backend Service</translation> @@ -3879,6 +3882,7 @@ <translation id="4689421377817139245">განახორციელეთ ამ სანიშნეს თქვენს iPhone-თან სინქრონიზაცია</translation> <translation id="4690091457710545971"><Intel Wi-Fi ჩაშენებული პროგრამული უზრუნველყოფის მიერ გენერირებული ოთხი ფაილი: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. პირველი სამი არის ორობითი ფაილი, რომელიც შეიცავს რეგისტრის დამპებს და Intel ადასტურებს, რომ ისინი არ შეიცავს პიროვნების ან მოწყობილობის მაიდენტიფირებელ ინფორმაციას. ბოლო ფაილი წარმოადგენს Intel-ის ჩაშენებული პროგრამული უზრუნველყოფის შესრულების ტრასირებას, რომელიდანაც ამოშლილია პიროვნების ან მოწყობილობის მაიდენტიფირებელი ინფორმაცია, თუმცა ის მეტისმეტად დიდია აქ საჩვენებლად. აღნიშნული ფაილები გენერირებული იყო თქვენს მოწყობილობაში Wi-Fi ქსელთან დაკავშირებული პრობლემების პასუხად, რომლებიც ბოლო დროს დაფიქსირდა, და გაზიარდება Intel-თან აღნიშნული პრობლემების აღმოფხვრის მიზნით.></translation> <translation id="4691791363716065510"><ph name="ORIGIN" /> შეძლებს „<ph name="FILENAME" />“-ის ნახვას ამ საიტის ყველა ჩანართის დახურვამდე</translation> +<translation id="4692342362587775867">ამ საიტიდან მიღებული შეტყობინებები, შესაძლოა, ხელისშემშლელი იყოს</translation> <translation id="4692623383562244444">საძიებო სისტემები</translation> <translation id="4692736633446859167">ადრე აირჩიეთ, არ დაგეშვათ გაფართოებები <ph name="SITE" />-ზე. ამ საიტის აქ დამატების შემთხვევაში, სხვა გაფართოებებსაც ექნებათ საშუალება, წაიკითხონ და შეცვალონ თქვენი საიტის მონაცემები <ph name="SITE" />-ზე.</translation> <translation id="4693155481716051732">სუში</translation> @@ -5455,6 +5459,7 @@ <translation id="6278428485366576908">თემა</translation> <translation id="6278776436938569440">მდებარეობის შეცვლა</translation> <translation id="6279183038361895380">კურსორის საჩვენებლად, დააჭირეთ კლავიშზე |<ph name="ACCELERATOR" />|</translation> +<translation id="6279595948631688299">არჩეული სერტიფიკატის ე&ქსპორტირება...</translation> <translation id="6280215091796946657">სისტემაში სხვა ანგარიშით შესვლა</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6282180787514676874">{COUNT,plural, =1{გადაჭარბებულია ქაღალდის 1 ფურცლის ლიმიტი}other{გადაჭარბებულია ქაღალდის {COUNT} ფურცლის ლიმიტი}}</translation> @@ -5569,6 +5574,7 @@ <translation id="6398715114293939307">Google Play Store-ის ამოშლა</translation> <translation id="6398765197997659313">სრულეკრანიანი რეჟიმიდან გამოსვლა</translation> <translation id="6399774419735315745">ჯაშუში</translation> +<translation id="6401458660421980302">ეს ჩანართი სხვა მოწყობილობაზე რომ გაგზავნოთ, შედით იქიდან Chrome-ში</translation> <translation id="6401597285454423070">თქვენი კომპიუტერი შეიცავს სანდო პლატფორმის მოდულის (TPM) უსაფრთხოების მოწყობილობას, რომელიც ChromeOS-ში უსაფრთხოებასთან დაკავშირებული მრავალი კრიტიკული ფუნქციის შესასრულებლად გამოიყენება. დამატებითი ინფორმაციისთვის ეწვიეთ Chromebook-ის დახმარების ცენტრს: https://support.google.com/chromebook/?p=tpm</translation> <translation id="6404187344102273690">თამაში Chromebook-ებზე</translation> <translation id="6404511346730675251">სანიშნის რედაქტირება</translation> @@ -5805,6 +5811,7 @@ <translation id="6619801788773578757">kiosk აპლიკაციის დამატება</translation> <translation id="6619990499523117484">დაადასტურეთ თქვენი PIN-კოდი</translation> <translation id="6620254580880484313">კონტეინერის სახელი</translation> +<translation id="6621391692573306628">ეს ჩანართი სხვა მოწყობილობაზე რომ გაგზავნოთ, შედით Chrome-ში ორივე მოწყობილობიდან</translation> <translation id="6622980291894852883">გააგრძელეთ გამოსახულებების დაბლოკვა</translation> <translation id="6624036901798307345">ტაბლეტის რეჟიმში ხელსაწყოთა ზოლზე ჩანართების მთვლელის ღილაკზე შეხებისას გაიხსნება ჩანართების ახალი ზოლი, რომელზეც ნაჩვენები იქნება თითოეული ჩანართის მინიატურული ვერსია.</translation> <translation id="6624535038674360844"><ph name="FILE_NAME" /> შეიცავს სენსიტიურ ან სახიფათო კონტენტს. სთხოვეთ მის მფლობელს აღნიშნულის გამოსწორება.</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb index 6686288..947d067bb 100644 --- a/chrome/app/resources/generated_resources_km.xtb +++ b/chrome/app/resources/generated_resources_km.xtb
@@ -992,6 +992,7 @@ <translation id="1916502483199172559">រូបតំណាងពណ៌ក្រហមលំនាំដើម</translation> <translation id="1918141783557917887">តូចជាង</translation> <translation id="1920390473494685033">ទំនាក់ទំនង</translation> +<translation id="1921544956190977703">អ្នកមានសុវត្ថិភាពខ្លាំងបំផុតរបស់ Chrome ប្រឆាំងនឹងគេហទំព័រ ការទាញយក និងកម្មវិធីបន្ថែមដែលមានគ្រោះថ្នាក់</translation> <translation id="1921584744613111023"><ph name="DPI" /> dpi</translation> <translation id="1923468477587371721">គេហទំព័រ Google ដូចជា Gmail, ថាស និង YouTube ជាដើមប្រើភាសាគណនី Google របស់អ្នក លុះត្រាតែអ្នកបានប្ដូរភាសាផលិតផលនីមួយៗ</translation> <translation id="1923539912171292317">ចុចដោយស្វ័យប្រវត្តិ</translation> @@ -2093,6 +2094,7 @@ <ph name="DOMAIN" /> តម្រូវឱ្យអ្នកបន្តដោតកាតឆ្លាតវៃរបស់អ្នក។</translation> <translation id="2923234477033317484">លុបគណនីនេះ</translation> <translation id="2923644930701689793">ចូលប្រើរបុំកាមេរ៉ាទូរសព្ទរបស់អ្នក</translation> +<translation id="292371311537977079">ការកំណត់ Chrome</translation> <translation id="2925658782192398150">រួចរាល់ រកមិនឃើញបញ្ហាទេ</translation> <translation id="2926085873880284723">ស្ដារផ្លូវកាត់លំនាំដើម</translation> <translation id="2926620265753325858">មិនអាចប្រើ <ph name="DEVICE_NAME" /> បានទេ។</translation> @@ -2676,6 +2678,7 @@ <translation id="3511528412952710609">ខ្លី</translation> <translation id="3514335087372914653">ការគ្រប់គ្រងហ្គេម</translation> <translation id="3514373592552233661">បណ្តាញដែលចូលចិត្តប្រើនឹងត្រូវបានជ្រើសរើសជំនួសឲ្យបណ្តាញដែលស្គាល់ផ្សេងទៀត ប្រសិនបើមានបណ្តាញច្រើនដែលអាចប្រើបាន</translation> +<translation id="3514647716686280777">អ្នកកំពុងទទួលបានការការពារសុវត្ថិភាពស្តង់ដារ។ ដើម្បីទទួលបានការការពារបន្ថែមប្រឆាំងនឹងគេហទំព័រ ការទាញយក និងកម្មវិធីបន្ថែមដែលមានគ្រោះថ្នាក់ សូមបើកការរុករកដោយសុវត្ថិភាពបន្ថែមនៅក្នុងការកំណត់ Chrome។</translation> <translation id="3515983984924808886">ចុចសោសុវត្ថិភាពរបស់អ្នកម្ដងទៀត ដើម្បីបញ្ជាក់ការកំណត់ឡើងវិញ។ នឹងលុបព័ត៌មានទាំងអស់ដែលរក្សាទុកនៅក្នុងសោសុវត្ថិភាព រួមទាំងកូដ PIN របស់វាផងដែរ។</translation> <translation id="3518985090088779359">ព្រមទទួល និងបន្ត</translation> <translation id="3519564332031442870">Print Backend Service</translation> @@ -5472,6 +5475,7 @@ <translation id="6278428485366576908">ធីម</translation> <translation id="6278776436938569440">ប្ដូរទីតាំង</translation> <translation id="6279183038361895380">ចុច |<ph name="ACCELERATOR" />| ដើម្បីបង្ហាញទស្សន៍ទ្រនិចរបស់អ្នក</translation> +<translation id="6279595948631688299">នាំ&ចេញវិញ្ញាបនបត្រដែលបានជ្រើសរើស...</translation> <translation id="6280215091796946657">ចូលដោយប្រើគណនីផ្សេង</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6282180787514676874">{COUNT,plural, =1{លើសកម្រិតកំណត់ក្រដាស 1 សន្លឹក}other{លើសកម្រិតកំណត់ក្រដាស {COUNT} សន្លឹក}}</translation> @@ -5586,6 +5590,7 @@ <translation id="6398715114293939307">លុប Google Play Store</translation> <translation id="6398765197997659313">ចាកចេញពីអេក្រង់ពេញ</translation> <translation id="6399774419735315745">អ្នកស៊ើបការ</translation> +<translation id="6401458660421980302">ដើម្បីបញ្ជូនផ្ទាំងនេះទៅឧបករណ៍ផ្សេង សូមចូល Chrome នៅលើនោះ</translation> <translation id="6401597285454423070">កុំព្យូទ័ររបស់អ្នកមានឧបករណ៍សុវត្ថិភាពម៉ូឌុលប្រព័ន្ធដែលអាចជឿទុកចិត្ត (TPM) ដែលត្រូវបានប្រើដើម្បីប្រតិបត្តិការមុខងារសុវត្ថិភាពសំខាន់ៗជាច្រើននៅក្នុង ChromeOS។ សូមចូលទៅកាន់មជ្ឈមណ្ឌលជំនួយ Chromebook ដើម្បីស្វែងយល់បន្ថែម៖ https://support.google.com/chromebook/?p=tpm</translation> <translation id="6404187344102273690">ហ្គេម Chromebook</translation> <translation id="6404511346730675251">កែប្រែចំណាំ</translation> @@ -5822,6 +5827,7 @@ <translation id="6619801788773578757">បញ្ចូលកម្មវិធីបញ្ជរ</translation> <translation id="6619990499523117484">បញ្ជាក់កូដ PIN របស់អ្នក</translation> <translation id="6620254580880484313">ឈ្មោះទម្រង់ផ្ទុក</translation> +<translation id="6621391692573306628">ដើម្បីបញ្ជូនផ្ទាំងនេះទៅឧបករណ៍ផ្សេង សូមចូល Chrome នៅលើឧបករណ៍ទាំងពីរ</translation> <translation id="6622980291894852883">បន្តការរារាំងរូបភាព</translation> <translation id="6624036901798307345">នៅក្នុងមុខងារថេប្លេត សូមចុចលើប៊ូតុងរបារឧបករណ៍កម្មវិធីរាប់ផ្ទាំង ដើម្បីបើករបារផ្ទាំងថ្មី ដែលបង្ហាញរូបក្របតំណាងផ្ទាំងនីមួយៗ។</translation> <translation id="6624535038674360844"><ph name="FILE_NAME" /> មានខ្លឹមសាររសើប ឬគ្រោះថ្នាក់។ សូមស្នើឱ្យម្ចាស់ឯកសារនេះធ្វើការកែប្រែ។</translation> @@ -5908,6 +5914,7 @@ <translation id="6709133671862442373">ព័ត៌មាន</translation> <translation id="6709357832553498500">ភ្ជាប់ដោយប្រើ <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">មុន</translation> +<translation id="6710394144992407503">ពិនិត្យរកមើលបញ្ហាអក្ខរាវិរុទ្ធ នៅពេលអ្នកវាយបញ្ចូលអក្សរនៅលើទំព័របណ្ដាញ</translation> <translation id="6711146141291425900">ភ្ជាប់គណនី <ph name="WEB_DRIVE" /> សម្រាប់ការទាញយក</translation> <translation id="6712943853047024245">អ្នកបានរក្សាទុកពាក្យសម្ងាត់ជាមួយឈ្មោះអ្នកប្រើប្រាស់នេះសម្រាប់ <ph name="WEBSITE" /> រួចហើយ</translation> <translation id="6713233729292711163">បញ្ចូលកម្រងព័ត៌មានការងារ</translation> @@ -6526,6 +6533,7 @@ <translation id="7340757554212515731">ផ្ញើរបាយការណ៍អំពីការគាំង ព្រមទាំងទិន្នន័យប្រើប្រាស់ និងការវិភាគទៅ Google ដោយស្វ័យប្រវត្តិ</translation> <translation id="7341834142292923918">ចង់ទទួលបានសិទ្ធិចូលប្រើគេហទំព័រនេះ</translation> <translation id="7343372807593926528">សូមរៀបរាប់អំពីបញ្ហា មុននឹងផ្ញើមតិកែលម្អ។</translation> +<translation id="7344585835349671209">គ្រប់គ្រងវិញ្ញាបនបត្រ HTTPS/SSL នៅលើឧបករណ៍របស់អ្នក</translation> <translation id="7345706641791090287">បញ្ជាក់ពាក្យសម្ងាត់របស់អ្នក</translation> <translation id="7346909386216857016">យល់ព្រម ខ្ញុំយល់ហើយ</translation> <translation id="7347452120014970266">សកម្មភាពនេះនឹងសម្អាតទិន្នន័យ និងខូគីទាំងអស់ដែលបានរក្សាទុកដោយ <ph name="ORIGIN_NAME" /> និងកម្មវិធីដែលវាបានដំឡើង</translation> @@ -6655,6 +6663,7 @@ <translation id="7460045493116006516">រចនាប័ទ្មបច្ចុប្បន្នដែលអ្នកបានដំឡើង</translation> <translation id="7461924472993315131">លេខសម្គាល់</translation> <translation id="746216226901520237">លើកក្រោយ ទូរសព្ទរបស់អ្នកនឹងដោះសោ <ph name="DEVICE_TYPE" /> របស់អ្នក។ អ្នកអាចបិទ Smart Lock នៅក្នុងការកំណត់។</translation> +<translation id="7464153996453281700">សមាសធាតុមានបច្ចុប្បន្នភាពរួចហើយ</translation> <translation id="7464637891177137294">រក្សាទុកពាក្យសម្ងាត់នៅក្នុងគណនី Google របស់អ្នក, <ph name="ACCOUNT" /></translation> <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{ផ្ទាំងបើក # សូមចុច ដើម្បីបិទ/បើករបារផ្ទាំង}other{ផ្ទាំងបើក # សូមចុច ដើម្បីបិទ/បើករបារផ្ទាំង}}</translation> <translation id="7465635034594602553">មានអ្វីមួយខុសប្រក្រតី។ សូមរង់ចាំមួយភ្លែត រួចដំណើរការ <ph name="APP_NAME" /> ម្ដងទៀត។</translation> @@ -7163,6 +7172,7 @@ <translation id="793531125873261495">មានបញ្ហាក្នុងការទាញយកម៉ាស៊ីននិម្មិត។ សូមព្យាយាមម្តងទៀត។</translation> <translation id="7935451262452051102">បានបញ្ចប់ <ph name="PERCENT" />%</translation> <translation id="7939062555109487992">ជម្រើសកម្រិតខ្ពស់</translation> +<translation id="7939328347457537652">គ្រប់គ្រងវិញ្ញាបនបត្រឧបករណ៍</translation> <translation id="7939412583708276221">រក្សាទុកវាទោះបីជាយ៉ាងណាក៏ដោយ</translation> <translation id="7942349550061667556">ក្រហម</translation> <translation id="7943368935008348579">ទាញយក PDF</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index 42d805a..1af51c725 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -992,6 +992,7 @@ <translation id="1916502483199172559">기본 빨간색 아바타</translation> <translation id="1918141783557917887">작게(&S)</translation> <translation id="1920390473494685033">연락처</translation> +<translation id="1921544956190977703">위험한 웹사이트, 다운로드 항목, 확장 프로그램에 대응하는 Chrome의 가장 강력한 보안 기능이 적용됩니다.</translation> <translation id="1921584744613111023"><ph name="DPI" />dpi</translation> <translation id="1923468477587371721">사용자가 개별 제품의 언어를 변경하지 않는 이상 Gmail, Drive, YouTube와 같은 Google 사이트에는 Google 계정의 언어가 사용됩니다.</translation> <translation id="1923539912171292317">자동 클릭</translation> @@ -2094,6 +2095,7 @@ <ph name="DOMAIN" />에서 스마트 카드를 삽입해 둔 상태로 둘 것을 요청합니다.</translation> <translation id="2923234477033317484">계정 삭제</translation> <translation id="2923644930701689793">휴대전화 카메라 롤에 액세스합니다.</translation> +<translation id="292371311537977079">Chrome 설정</translation> <translation id="2925658782192398150">완료, 문제가 발견되지 않음</translation> <translation id="2926085873880284723">기본 바로가기 복원</translation> <translation id="2926620265753325858"><ph name="DEVICE_NAME" /> 기기는 지원되지 않습니다.</translation> @@ -2677,6 +2679,7 @@ <translation id="3511528412952710609">짧게</translation> <translation id="3514335087372914653">게임 컨트롤</translation> <translation id="3514373592552233661">두 개 이상의 네트워크를 사용할 수 있는 경우 기본 설정된 네트워크가 다른 알려진 네트워크보다 우선 사용됩니다.</translation> +<translation id="3514647716686280777">표준 보호 조치를 사용하고 있습니다. 위험한 웹사이트, 다운로드 항목, 확장 프로그램에 대응하여 보안을 강화하려면 Chrome 설정에서 향상된 세이프 브라우징을 사용 설정하세요.</translation> <translation id="3515983984924808886">보안 키를 다시 터치하여 초기화 여부를 확인하세요. PIN을 비롯하여 보안 키에 저장된 모든 정보가 삭제됩니다.</translation> <translation id="3518985090088779359">동의하고 계속</translation> <translation id="3519564332031442870">인쇄 백엔드 서비스</translation> @@ -5470,6 +5473,7 @@ <translation id="6278428485366576908">테마</translation> <translation id="6278776436938569440">위치 변경</translation> <translation id="6279183038361895380">|<ph name="ACCELERATOR" />|을(를) 눌러 커서 표시</translation> +<translation id="6279595948631688299">선택한 인증서 내보내기(&x)...</translation> <translation id="6280215091796946657">다른 계정으로 로그인</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6282180787514676874">{COUNT,plural, =1{용지 1장 제한 초과}other{용지 {COUNT}장 제한 초과}}</translation> @@ -5584,6 +5588,7 @@ <translation id="6398715114293939307">Google Play 스토어 삭제</translation> <translation id="6398765197997659313">전체화면 닫기</translation> <translation id="6399774419735315745">스파이</translation> +<translation id="6401458660421980302">이 탭을 다른 기기로 보내려면 해당 기기에서 Chrome에 로그인하세요.</translation> <translation id="6401597285454423070">컴퓨터에 TPM(신뢰할 수 있는 플랫폼 모듈) 보안 기기가 있습니다. 이 기기는 ChromeOS에서 여러 중요한 보안 기능을 구현하는 데 사용됩니다. 자세히 알아보려면 Chromebook 고객센터의 다음 페이지를 방문하세요. https://support.google.com/chromebook/?p=tpm</translation> <translation id="6404187344102273690">Chromebook 게임</translation> <translation id="6404511346730675251">북마크 수정</translation> @@ -5820,6 +5825,7 @@ <translation id="6619801788773578757">키오스크 애플리케이션 추가</translation> <translation id="6619990499523117484">PIN 확인</translation> <translation id="6620254580880484313">컨테이너 이름</translation> +<translation id="6621391692573306628">이 탭을 다른 기기로 보내려면 두 기기 모두에서 Chrome에 로그인하세요.</translation> <translation id="6622980291894852883">이미지 계속 차단</translation> <translation id="6624036901798307345">태블릿 모드에서 탭 카운터 툴바 버튼을 탭하여 각 탭의 썸네일을 보여주는 새로운 탭 표시줄을 엽니다.</translation> <translation id="6624535038674360844"><ph name="FILE_NAME" /> 파일에 민감하거나 위험한 콘텐츠가 있습니다. 소유자에게 수정을 요청하세요.</translation> @@ -5906,6 +5912,7 @@ <translation id="6709133671862442373">뉴스</translation> <translation id="6709357832553498500"><ph name="EXTENSIONNAME" />을(를) 사용하여 연결</translation> <translation id="6710213216561001401">이전</translation> +<translation id="6710394144992407503">웹페이지에 텍스트 입력 시 맞춤법 오류 확인</translation> <translation id="6711146141291425900">다운로드용 <ph name="WEB_DRIVE" /> 계정 연결</translation> <translation id="6712943853047024245">이미 <ph name="WEBSITE" />의 사용자 이름과 비밀번호를 저장했습니다.</translation> <translation id="6713233729292711163">직장 프로필 추가</translation> @@ -6524,6 +6531,7 @@ <translation id="7340757554212515731">진단 및 사용 데이터와 함께 비정상 종료 보고서를 Google에 자동으로 전송합니다.</translation> <translation id="7341834142292923918">이 사이트의 액세스 권한이 필요합니다.</translation> <translation id="7343372807593926528">의견을 보내기 전에 문제를 설명해 주세요.</translation> +<translation id="7344585835349671209">기기에서 HTTPS/SSL 인증서 관리</translation> <translation id="7345706641791090287">비밀번호 확인</translation> <translation id="7346909386216857016">확인</translation> <translation id="7347452120014970266"><ph name="ORIGIN_NAME" /> 및 설치된 앱에서 저장한 모든 데이터와 쿠키가 삭제됩니다.</translation> @@ -6653,6 +6661,7 @@ <translation id="7460045493116006516">내가 설치한 현재 테마입니다.</translation> <translation id="7461924472993315131">고정</translation> <translation id="746216226901520237">다음번에는 휴대전화를 통해 <ph name="DEVICE_TYPE" />이 잠금 해제됩니다. 설정에서 Smart Lock을 사용 중지할 수 있습니다.</translation> +<translation id="7464153996453281700">구성요소가 이미 최신 상태임</translation> <translation id="7464637891177137294">비밀번호를 Google 계정(<ph name="ACCOUNT" />)에 저장합니다.</translation> <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{열려 있는 탭 #개, 눌러서 탭 표시줄 표시/숨기기}other{열려 있는 탭 #개, 눌러서 탭 표시줄 표시/숨기기}}</translation> <translation id="7465635034594602553">문제가 발생했습니다. 잠시 후 <ph name="APP_NAME" /> 앱을 다시 실행해 주세요.</translation> @@ -7162,6 +7171,7 @@ <translation id="793531125873261495">가상 머신을 다운로드하는 중 문제가 발생했습니다. 다시 시도해 주세요.</translation> <translation id="7935451262452051102"><ph name="PERCENT" />% 완료됨</translation> <translation id="7939062555109487992">고급 옵션</translation> +<translation id="7939328347457537652">기기 인증서 관리</translation> <translation id="7939412583708276221">계속 다운로드</translation> <translation id="7942349550061667556">빨간색</translation> <translation id="7943368935008348579">PDF 다운로드</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index b16a92cf..2639758e 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -3265,6 +3265,7 @@ <translation id="4077919383365622693">ລະບົບຈະລຶບລ້າງຂໍ້ມູນ ແລະ ຄຸກກີ້ທັງໝົດທີ່ເກັບໄວ້ໂດຍ <ph name="SITE" />.</translation> <translation id="4078738236287221428">ບັງຄັບແຄສ</translation> <translation id="4079140982534148664">ໃຊ້ການກວດການສະກົດຄຳທີ່ປັບປຸງດີຂຶ້ນແລ້ວ</translation> +<translation id="4081203444152654304">ຊອກຫາພາຍໃນຮູບພາບດ້ວຍ <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="4081242589061676262">ບໍ່ສາມາດສົ່ງສັນຍານໄຟລ໌ໄດ້.</translation> <translation id="408223403876103285"><ph name="WEBSITE" /> ໄດ້ສົ່ງການແຈ້ງເຕືອນຫາໂທລະສັບຂອງທ່ານແລ້ວ. ເພື່ອຢືນຢັນວ່າແມ່ນທ່ານແທ້, ໃຫ້ເຮັດຕາມຂັ້ນຕອນຢູ່ບ່ອນນັ້ນ.</translation> <translation id="4084682180776658562">ບຸກມາກຄ໌</translation> @@ -3658,6 +3659,7 @@ <translation id="4476590490540813026">ນັກກິລາ</translation> <translation id="4476659815936224889">ເພື່ອສະແກນລະຫັດນີ້, ທ່ານສາມາດໃຊ້ແອັບໂປຣແກຣມສະແກນ QR ໃນໂທລະສບຂອງທ່ານ ຫຼື ບາງແອັບກ້ອງຖ່າຍຮູບອື່ນ.</translation> <translation id="4477015793815781985">ລວມມີ Ctrl, Alt ຫຼື ⌘</translation> +<translation id="4477379360383751882">ຊອກຫາພາຍໃນຮູບພາບດ້ວຍ <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="4478664379124702289">ບັນທຶກລິ້ງເປັນ...</translation> <translation id="4479424953165245642">ຈັດການແອັບພລິເຄຊັນ Kiosk</translation> <translation id="4479639480957787382">ອີເທີເນັດ</translation> @@ -5903,6 +5905,7 @@ <translation id="6709133671862442373">ຂ່າວ</translation> <translation id="6709357832553498500">ເຊື່ອມຕໍ່ດ້ວຍການໃຊ້ <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">ຜ່ານມາ</translation> +<translation id="6710394144992407503">ກວດສອບເບິ່ງຂໍ້ຜິດພາດກ່ຽວກັບການສະກົດຄຳເມື່ອທ່ານພິມຂໍ້ຄວາມຢູ່ໜ້າເວັບ</translation> <translation id="6711146141291425900">ລິ້ງບັນຊີ <ph name="WEB_DRIVE" /> ສຳລັບການດາວໂຫຼດ</translation> <translation id="6712943853047024245">ທ່ານເຄີຍບັນທຶກລະຫັດຜ່ານດ້ວຍຊື່ຜູ້ໃຊ້ນີ້ສຳລັບ <ph name="WEBSITE" /> ໄປກ່ອນແລ້ວ</translation> <translation id="6713233729292711163">ເພີ່ມໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ</translation> @@ -6521,6 +6524,7 @@ <translation id="7340757554212515731">ສົ່ງລາຍງານການຂັດຂ້ອງຮວມທັງການວິນິໄສ ແລະ ຂໍ້ມູນການນຳໃຊ້ໄປໃຫ້ Google ໂດຍອັດຕະໂນມັດ</translation> <translation id="7341834142292923918">ຕ້ອງການເຂົ້າເຖິງເວັບໄຊນີ້</translation> <translation id="7343372807593926528">ກະລຸນາອະທິບາຍບັນຫາກ່ອນທີ່ຈະສົ່ງຄຳຕິຊົມ.</translation> +<translation id="7344585835349671209">ຈັດການໃບຮັບຮອງ HTTPS/SSL ຢູ່ອຸປະກອນຂອງທ່ານ</translation> <translation id="7345706641791090287">ຢືນຢັນລະຫັດຜ່ານຂອງທ່ານ</translation> <translation id="7346909386216857016">ຕົກລົງ, ເຂົ້າໃຈແລ້ວ</translation> <translation id="7347452120014970266">ນີ້ຈະລຶບລ້າງຂໍ້ມູນ ແລະ ຄຸກກີ້ທັງໝົດທີ່ເກັບໄວ້ໂດຍ <ph name="ORIGIN_NAME" /> ແລະ ແອັບທີ່ຕິດຕັ້ງຂອງມັນ</translation> @@ -6650,6 +6654,7 @@ <translation id="7460045493116006516">ຮູບແບບສີສັນປັດຈຸບັນທີ່ທ່ານໄດ້ຕິດຕັ້ງ</translation> <translation id="7461924472993315131">ປັກໝຸດ</translation> <translation id="746216226901520237">ຄັ້ງຕໍ່ໄປ, ໂທລະສັບຂອງທ່ານຈະປົດລັອກ <ph name="DEVICE_TYPE" /> ຂອງທ່ານ. ທ່ານສາມາດປິດ Smart Lock ໄດ້ໃນການຕັ້ງຄ່າ.</translation> +<translation id="7464153996453281700">ອົງປະກອບມີການອັບເດດແລ້ວ</translation> <translation id="7464637891177137294">ບັນທຶກມັນໄວ້ໃນບັນຊີ Google ຂອງທ່ານ, <ph name="ACCOUNT" /></translation> <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{ມີແຖບເປີດຢູ່ # ແຖບ, ກະລຸນາກົດເພື່ອສະຫຼັບແນວແຖບ}other{ມີແຖບເປີດຢູ່ # ແຖບ, ກະລຸນາກົດເພື່ອສະຫຼັບແນວແຖບ}}</translation> <translation id="7465635034594602553">ມີບາງຢ່າງຜິດພາດ. ກະລຸນາລໍຖ້າສອງສາມນາທີ ແລ້ວເປີດໃຊ້ <ph name="APP_NAME" /> ອີກຄັ້ງ.</translation> @@ -7157,6 +7162,7 @@ <translation id="793531125873261495">ເກີດຄວາມຜິດພາດໃນດາວໂຫຼດເຄື່ອງຈຳລອງສະເໝືອນຈິງ. ກະລຸນາລອງອີກຄັ້ງ.</translation> <translation id="7935451262452051102">ສຳເລັດແລ້ວ <ph name="PERCENT" />%</translation> <translation id="7939062555109487992">ຕົວເລືອກຂັ້ນສູງ</translation> +<translation id="7939328347457537652">ຈັດການໃບຮັບຮອງອຸປະກອນ</translation> <translation id="7939412583708276221">ແນວໃດກໍ່ຮັກສາໄວ້</translation> <translation id="7942349550061667556">ສີແດງ</translation> <translation id="7943368935008348579">ດາວໂຫຼດ PDF</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb index 4a0f5e3..7cf8af5 100644 --- a/chrome/app/resources/generated_resources_mk.xtb +++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -993,6 +993,7 @@ <translation id="1916502483199172559">Стандарден црвен аватар</translation> <translation id="1918141783557917887">&Помал</translation> <translation id="1920390473494685033">Контакти</translation> +<translation id="1921544956190977703">Ја имате најсилната безбедност на Chrome од опасни веб-сајтови, преземања и екстензии</translation> <translation id="1921584744613111023"><ph name="DPI" /> dpi</translation> <translation id="1923468477587371721">Сајтовите на Google како Gmail, Drive и YouTube го користат јазикот на вашата сметка на Google, освен ако не сте го промениле јазикот на конкретниот производ</translation> <translation id="1923539912171292317">Автоматско кликнување</translation> @@ -2094,6 +2095,7 @@ <ph name="DOMAIN" /> бара паметната картичка да ви остане вметната.</translation> <translation id="2923234477033317484">Отстранете ја сметкава</translation> <translation id="2923644930701689793">Пристапете до лентата на камерата на телефонот</translation> +<translation id="292371311537977079">Поставки за Chrome</translation> <translation id="2925658782192398150">Готово, не се најдени проблеми</translation> <translation id="2926085873880284723">Врати ги стандардните кратенки</translation> <translation id="2926620265753325858"><ph name="DEVICE_NAME" /> не е поддржано.</translation> @@ -2677,6 +2679,7 @@ <translation id="3511528412952710609">Кратко</translation> <translation id="3514335087372914653">Контрола на игра</translation> <translation id="3514373592552233661">Доколку е достапна повеќе од една мрежа, оние што се претпочитани ќе имаат предност пред другите познати мрежи</translation> +<translation id="3514647716686280777">Добивате стандардна безбедносна заштита. За да добиете поголема заштита од опасни веб-сајтови, преземања и екстензии, вклучете „Подобрено безбедно прелистување“ во поставките за Chrome.</translation> <translation id="3515983984924808886">Допрете го безбедносниот клуч повторно за да го потврдите ресетирањето. Ќе се избришат сите информации складирани во безбедносниот клуч, вклучувајќи го и неговиот PIN.</translation> <translation id="3518985090088779359">Прифати и продолжи</translation> <translation id="3519564332031442870">Услуга на бекендот за печатење</translation> @@ -3896,6 +3899,7 @@ <translation id="4689421377817139245">Синхронизирајте го обележувачов со вашиот iPhone</translation> <translation id="4690091457710545971"><Генерирани се четири датотеки од фирмверот за Wi-Fi на Intel: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. Првите три се бинарни датотеки што содржат складови од регистарот за коишто Intel тврди дека не содржат информации за лична идентификација или идентификација на уред. Последната датотека е трага за извршувањето од фирмверот на Intel од којашто се исчистени сите информации за лична идентификација или идентификација на уред, но е преголема за да се прикаже тука. Овие датотеки беа генерирани како одговор на неодамнешните Wi-Fi проблеми на вашиот уред и ќе се споделат со Intel за помош при нивното решавање.></translation> <translation id="4691791363716065510"><ph name="ORIGIN" /> ќе може да ја прегледува <ph name="FILENAME" /> сѐ додека не ги затворите сите картички за сајтов</translation> +<translation id="4692342362587775867">Известувањата од сајтов може да се вознемирувачки</translation> <translation id="4692623383562244444">Пребарувачи</translation> <translation id="4692736633446859167">Претходно одбравте да не дозволите екстензии на <ph name="SITE" /> Ако го додадете сајтов овде, другите екстензии може исто така да побараат да ги читаат и менуваат вашите податоци за сајт на <ph name="SITE" />.</translation> <translation id="4693155481716051732">Суши</translation> @@ -5472,6 +5476,7 @@ <translation id="6278428485366576908">Тема</translation> <translation id="6278776436938569440">Променете ја локацијата</translation> <translation id="6279183038361895380">Притиснете |<ph name="ACCELERATOR" />| за да се покаже покажувачот</translation> +<translation id="6279595948631688299">Извези го избраниот сертификат…</translation> <translation id="6280215091796946657">Најави се со друга сметка</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6282180787514676874">{COUNT,plural, =1{Ја надминува границата од 1 лист хартија}one{Ја надминува границата од {COUNT} лист хартија}other{Ја надминува границата од {COUNT} листови хартија}}</translation> @@ -5586,6 +5591,7 @@ <translation id="6398715114293939307">Отстранете ја Google Play Store</translation> <translation id="6398765197997659313">Излези од цел екран</translation> <translation id="6399774419735315745">Шпионка</translation> +<translation id="6401458660421980302">За да ја испратите картичкава на друг уред, најавете се на Chrome таму</translation> <translation id="6401597285454423070">Вашиот компјутер содржи безбедносен уред Trusted Platform Module (TPM) што се користи за имплементирање на многу важни безбедносни функции во Chrome OS. Посетете го „Центарот за помош на Chromebook“ за да дознаете повеќе: https://support.google.com/chromebook/?p=tpm</translation> <translation id="6404187344102273690">Играње на Chromebook</translation> <translation id="6404511346730675251">Измени обележувач</translation> @@ -5824,6 +5830,7 @@ <translation id="6619801788773578757">Додајте киоск-апликација</translation> <translation id="6619990499523117484">Потврдете го вашиот PIN</translation> <translation id="6620254580880484313">Име на контејнер</translation> +<translation id="6621391692573306628">За да ја испратите картичкава на друг уред, најавете се на Chrome на двата уреда</translation> <translation id="6622980291894852883">Продолжи со блокирање слики…</translation> <translation id="6624036901798307345">Во режимот на таблет, допрете го копчето за алатник на бројачот на картички за да се отвори нова лента за картички која прикажува сликички за секоја картичка.</translation> <translation id="6624535038674360844"><ph name="FILE_NAME" /> содржи чувствителни или опасни содржини. Побарајте од сопственикот да ја поправи.</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index fe05a4f..ea95bf6a 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -5891,6 +5891,7 @@ <translation id="6709133671862442373">News</translation> <translation id="6709357832553498500"><ph name="EXTENSIONNAME" /> ഉപയോഗിച്ച് കണക്റ്റുചെയ്യുക</translation> <translation id="6710213216561001401">മുമ്പത്തേത്</translation> +<translation id="6710394144992407503">വെബ് പേജുകളിൽ ടൈപ്പ് ചെയ്യുമ്പോൾ അക്ഷരത്തെറ്റുകളുണ്ടോയെന്ന് പരിശോധിക്കുക</translation> <translation id="6711146141291425900">ഡൗൺലോഡുകൾക്കായി <ph name="WEB_DRIVE" /> അക്കൗണ്ട് ലിങ്ക് ചെയ്യുക</translation> <translation id="6712943853047024245">ഈ ഉപയോക്തൃനാമത്തിനുള്ള പാസ്വേഡ് നിങ്ങൾ <ph name="WEBSITE" /> എന്നതിനായി മുമ്പേ സംരക്ഷിച്ചിട്ടുണ്ട്</translation> <translation id="6713233729292711163">ഔദ്യോഗിക പ്രൊഫൈൽ ചേർക്കുക</translation> @@ -6509,6 +6510,7 @@ <translation id="7340757554212515731">ക്രാഷ് റിപ്പോർട്ടുകളും പ്രശ്നനിർണ്ണയ, ഉപയോഗ ഡാറ്റയും സ്വയമേവ Google-ന് അയയ്ക്കുന്നു</translation> <translation id="7341834142292923918">ഈ സൈറ്റിലേക്ക് ആക്സസ് ആവശ്യമുണ്ട്</translation> <translation id="7343372807593926528">ഫീഡ്ബാക്ക് അയയ്ക്കുന്നതിന് മുമ്പ് പ്രശ്നത്തെക്കുറിച്ച് വിവരിക്കുക.</translation> +<translation id="7344585835349671209">നിങ്ങളുടെ ഉപകരണത്തിൽ HTTPS/SSL സർട്ടിഫിക്കറ്റുകൾ മാനേജ് ചെയ്യുക</translation> <translation id="7345706641791090287">പാസ്വേഡ് സ്ഥിരീകരിക്കുക</translation> <translation id="7346909386216857016">മനസ്സിലായി</translation> <translation id="7347452120014970266">ഇത് <ph name="ORIGIN_NAME" /> എന്നതും അതിന്റെ ഇൻസ്റ്റാൾ ചെയ്തിരിക്കുന്ന ആപ്പുകളും സംഭരിച്ചിട്ടുള്ള എല്ലാ ഡാറ്റയും കുക്കികളും മായ്ക്കും</translation> @@ -6638,6 +6640,7 @@ <translation id="7460045493116006516">നിങ്ങൾ നിലവിൽ ഇൻസ്റ്റാൾ ചെയ്തിരിക്കുന്ന തീം</translation> <translation id="7461924472993315131">പിൻ ചെയ്യുക</translation> <translation id="746216226901520237">അടുത്ത തവണ നിങ്ങളുടെ ഫോൺ <ph name="DEVICE_TYPE" /> അൺലോക്ക് ചെയ്യും. Smart Lock ക്രമീകരണത്തിൽ ഓഫാക്കാം.</translation> +<translation id="7464153996453281700">കമ്പോണന്റ് നിലവിൽ അപ് ടു ഡേറ്റാണ്</translation> <translation id="7464637891177137294">നിങ്ങളുടെ <ph name="ACCOUNT" /> എന്ന Google അക്കൗണ്ടിൽ ഇത് സംരക്ഷിക്കുക</translation> <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{# ടാബ് തുറന്നിരിക്കുന്നു, തുറന്ന് വച്ചിട്ടുള്ള ടാബ് അടയ്ക്കാൻ അമർത്തുക}other{# ടാബുകൾ തുറന്നിരിക്കുന്നു, തുറന്ന് വച്ചിട്ടുള്ള ടാബ് അടയ്ക്കാൻ അമർത്തുക}}</translation> <translation id="7465635034594602553">എന്തോ കുഴപ്പമുണ്ടായി. അൽപ്പസമയം കാത്തിരുന്ന ശേഷം, <ph name="APP_NAME" /> വീണ്ടും റൺ ചെയ്യുക.</translation> @@ -7145,6 +7148,7 @@ <translation id="793531125873261495">വെർച്വൽ മെഷീൻ ഡൗൺലോഡ് ചെയ്യുന്നതിൽ പിശക്. വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="7935451262452051102"><ph name="PERCENT" />% പൂർത്തിയായി</translation> <translation id="7939062555109487992">വിപുലമായ ഓപ്ഷനുകൾ</translation> +<translation id="7939328347457537652">ഉപകരണ സർട്ടിഫിക്കറ്റുകൾ മാനേജ് ചെയ്യുക</translation> <translation id="7939412583708276221">എങ്ങനെയാണെങ്കിലും സൂക്ഷിക്കുക</translation> <translation id="7942349550061667556">ചുവപ്പ്</translation> <translation id="7943368935008348579">PDF-കൾ ഡൗൺലോഡ് ചെയ്യുക</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index 3e8bc5a..a8a7c4c6 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -3893,6 +3893,7 @@ <translation id="4689421377817139245">Энэ хавчуургыг iPhone-д синк хийх</translation> <translation id="4690091457710545971"><Intel Wi-Fi жижиг програмаас гаргасан дөрвөн файлд: csr.lst, fh_regs.lst, radio.lst, monitor.lst.sysmon. Эхний гурван файлд бүртгэлийн хаягдал мэдээллийг агуулдаг бөгөөд эдгээр нь ямар ч хувийн эсвэл төхөөрөмжийг таних мэдээлэл агуулаагүйг Intel-с баталдаг хоёртын файл байна. Сүүлийн файл нь Intel жижиг програмын гүйцэтгэлийн ул мөр юм. Түүнчлэн, тус файл нь хувийн эсвэл төхөөрөмжийг таних мэдээллийг агуулдаггүй хэдий ч хэт том хэмжээтэй учир энд харуулах боломжгүй байдаг. Эдгээр файл нь таны төхөөрөмжийн саяхны Wi-Fi-н асуудлаас шалтгаалан үүссэн бөгөөд эдгээр асуудлыг шийдвэрлэхийн тулд Intel-тэй хуваалцах болно.></translation> <translation id="4691791363716065510">Таныг энэ сайтын бүх табыг хаах хүртэл <ph name="ORIGIN" /> нь <ph name="FILENAME" />-г үзэх боломжтой байна</translation> +<translation id="4692342362587775867">Энэ сайтын мэдэгдэл тасалдуулсан байж магадгүй</translation> <translation id="4692623383562244444">Хайлтын систем</translation> <translation id="4692736633446859167">Та өмнө нь <ph name="SITE" /> дээрх аливаа өргөтгөлийг зөвшөөрөхгүй байхаар сонгосон. Хэрэв та энэ сайтыг энд нэмбэл бусад өргөтгөл мөн таны <ph name="SITE" /> дээрх сайтын өгөгдлийг унших болон өөрчлөх хүсэлт тавих боломжтой.</translation> <translation id="4693155481716051732">Сүши</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 616a778..8b7325d 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -2710,7 +2710,7 @@ <translation id="3554493885489666172">तुमचे डिव्हाइस <ph name="PROFILE_NAME" /> द्वारे व्यवस्थापित केले आहे. अॅडमिनिस्ट्रेटर या डिव्हाइसवरील कोणत्याही प्रोफाइलचा डेटा ॲक्सेस करू शकतो.</translation> <translation id="3555812735919707620">एक्स्टेंशन काढून टाका</translation> <translation id="3556000484321257665">तुमचे शोध इंजीन <ph name="URL" /> मध्ये बदलले.</translation> -<translation id="3556433843310711081">तुमचा व्यवस्थापक तुमच्यासाठी ती अनावरोधित करू शकतो</translation> +<translation id="3556433843310711081">तुमचा व्यवस्थापक तुमच्यासाठी ती अनब्लॉक करू शकतो</translation> <translation id="3557101512409028104">Family Link सह वेबसाइटवरील बंधने आणि स्क्रीन वेळ मर्यादा सेट करा</translation> <translation id="3559262020195162408">डिव्हाइसवर धोरण इंस्टॉल करता आले नाही.</translation> <translation id="3559533181353831840">सुमारे <ph name="TIME_LEFT" /> शिल्लक</translation> @@ -4913,7 +4913,7 @@ <translation id="5728450728039149624">Smart Lock चे स्क्रीन लॉक करण्याचे पर्याय</translation> <translation id="5729712731028706266">&दृश्य</translation> <translation id="5731247495086897348">पे&स्ट करा आणि जा</translation> -<translation id="5732392974455271431">तुमचे पालक तुमच्यासाठी ती अनावरोधित करू शकतात</translation> +<translation id="5732392974455271431">तुमचे पालक तुमच्यासाठी ती अनब्लॉक करू शकतात</translation> <translation id="5733866499231170760">चुकीचा आयडी. तुम्ही एंटर केलेला फॉरमॅट चुकीचा आहे. तुम्ही योग्य फॉरमॅटमध्ये आयडी एंटर करत आहात, याची खात्री करण्यासाठी कृपया तुम्हाला मिळालेल्या सूचना तपासा. तुम्हाला या समस्येचे निराकरण करता येत नसल्यास, कृपया फील्ड रिक्त ठेवा आणि इंस्टॉलेशन करणे पुढे सुरू ठेवा.</translation> <translation id="5734362860645681824">संप्रेषणे</translation> <translation id="5734697361979786483">फाइल शेअर जोडा</translation> @@ -6962,7 +6962,7 @@ <translation id="7754347746598978109">JavaScript वापरण्याची अनुमती नाही</translation> <translation id="7754704193130578113">डाउनलोड करण्यापूर्वी प्रत्येक फाइल कुठे सेव्ह करावी ते विचारा</translation> <translation id="7755134875397410803">टास्क पूर्ण करण्यात तुम्हाला मदत करण्यासाठी, Google ला तुम्ही Assistant वापरून सबमिट करता त्या माहितीसह तुम्ही Assistant वापरता त्या साइटचा आशय आणि URLs मिळतील. ही माहिती तुमच्या Google खाते मध्ये स्टोअर केली जाऊ शकते. तुम्ही Chrome सेटिंग्जमध्ये Assistant बंद करू शकता. <ph name="LEARN_MORE" /></translation> -<translation id="7755287808199759310">तुमचे पालक तुमच्यासाठी ती अनावरोधित करू शकतात</translation> +<translation id="7755287808199759310">तुमचे पालक तुमच्यासाठी ती अनब्लॉक करू शकतात</translation> <translation id="7757592200364144203">डिव्हाइसचे नाव बदला</translation> <translation id="7757739382819740102">जवळपास असलेले संपर्क तुमच्यासोबत शेअर करू शकतात. मंजुरी आवश्यक असेल.</translation> <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> वरून शेअर केलेला मजकूर</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index fc1cbc8..dac1be4 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -3895,6 +3895,7 @@ <translation id="4689421377817139245">Segerakkan penanda halaman ini ke iPhone anda</translation> <translation id="4690091457710545971"><Empat fail dihasilkan oleh perisian tegar Wi-Fi Intel: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. Tiga fail yang pertama ialah fail perduaan yang mengandungi longgokan pendaftaran dan Intel menegaskan bahawa fail ini tidak mengandungi maklumat peribadi atau yang mengenal pasti peranti. Fail terakhir ialah surih pelaksanaan daripada perisian tegar Intel; fail ini telah dibersihkan supaya tidak mengandungi sebarang maklumat peribadi atau yang mengenal pasti peranti, tetapi terlalu besar untuk dipaparkan di sini. Fail ini dihasilkan sebagai tindak balas terhadap masalah Wi-Fi pada peranti anda baru-baru ini dan akan dikongsi dengan Intel untuk membantu dalam menyelesaikan masalah ini.></translation> <translation id="4691791363716065510"><ph name="ORIGIN" /> akan dapat melihat <ph name="FILENAME" /> sehinggalah anda menutup semua tab bagi tapak ini</translation> +<translation id="4692342362587775867">Pemberitahuan daripada laman ini mungkin mengganggu</translation> <translation id="4692623383562244444">Enjin carian</translation> <translation id="4692736633446859167">Sebelum ini anda memilih untuk tidak membenarkan sebarang sambungan pada <ph name="SITE" />. Jika anda menambahkan laman ini di sini, sambungan lain juga boleh meminta untuk membaca dan menukar data laman anda pada <ph name="SITE" />.</translation> <translation id="4693155481716051732">Susyi</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index ff06deb..b5a4102 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -4088,6 +4088,7 @@ <translation id="4900392736118574277">तपाईंको सुरुवात पृष्ठलाई <ph name="URL" /> मा परिवर्तन गरिएको छ।</translation> <translation id="490051679772058907"><ph name="REFRESH_RATE" /> हर्ज - इन्टरलेस गरिएको</translation> <translation id="4900652253009739885">"चयन" गर्ने कार्यका निम्ति असाइन गरिएको एक मात्र स्विच हटाउन मिल्दैन। तपाईं <ph name="RESPONSE" /> चाहनुहुन्छ भने कुनै की थिच्नुहोस्।</translation> +<translation id="4901154724271753917">हालसालै बन्द गरिएका ट्याबहरूको सूची एक्स्पान्ड गर्नुहोस्</translation> <translation id="4901309472892185668">परीक्षणको चरणमा रहेको <ph name="EXPERIMENT_NAME" /> नामक सुविधाको स्थिति चयन गर्नुहोस्।</translation> <translation id="49027928311173603">सर्भरबाट डाउनलोड गरिएको नीति अवैध छ: <ph name="VALIDATION_ERROR" /></translation> <translation id="4906490889887219338">नेटवर्कको फाइल आदान प्रदान गर्ने कार्य सेटअप वा व्यवस्थापन गर्नुहोस्। <ph name="LINK_BEGIN" />थप जान्नुहोस्<ph name="LINK_END" /></translation> @@ -6967,6 +6968,7 @@ <translation id="7768526219335215384"><ph name="ORIGIN" /> ले <ph name="FOLDERNAME" /> मा भएका फाइलहरू हेर्न सक्ने छ</translation> <translation id="7768770796815395237">परिवर्तन गर्नुहोस्</translation> <translation id="7768784765476638775">सेलेक्ट टु स्पिक</translation> +<translation id="7769748505895274502">हालसालै बन्द गरिएका ट्याबहरूको सूची कोल्याप्स गर्नुहोस्</translation> <translation id="7770406201819593386">ChromeOS Flex का डाइग्नोस्टिक परीक्षणहरू गर्ने।</translation> <translation id="7770450735129978837">राइट माउस क्लिक</translation> <translation id="7770612696274572992">अर्को यन्त्रबाट छवि कपी गरियो</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index f142b0cc0..a57d2db89 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -6084,7 +6084,7 @@ <translation id="6892812721183419409">Link openen als <ph name="USER" /></translation> <translation id="6893164346922798247">eSpeak</translation> <translation id="6895032998810961280">Gegevens aan Google melden over schadelijke software, systeeminstellingen en processen die op je computer zijn aangetroffen tijdens deze opschoonbewerking</translation> -<translation id="6896758677409633944">Kopieer</translation> +<translation id="6896758677409633944">Kopiëren</translation> <translation id="6897363604023044284">Sites kiezen om te wissen</translation> <translation id="6897688156970667447">Handig bij weinig licht en spaart de batterij</translation> <translation id="6898440773573063262">Kiosk-apps kunnen nu worden geconfigureerd voor automatisch starten op dit apparaat.</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index d0ed00c..c870bfe 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -3886,6 +3886,7 @@ <translation id="4689421377817139245">Synkroniser dette bokmerket med iPhone</translation> <translation id="4690091457710545971"><Fire filer genereres av Intel Wi-Fi-fastvaren: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. De tre første er binærfiler som inneholder registerdumper og kontrolleres av Intel for å sikre at de ikke inneholder personlig eller enhetsidentifiserende informasjon. Den siste filen er et kjøringsspor fra Intel-fastvaren. All personlig eller enhetsidentifiserende informasjon er fjernet fra filen, men den er for stor til å vises her. Disse filene ble generert som svar på nylige Wi-Fi-problemer med enheten din og deles med Intel for å bidra med feilsøking av disse problemene.></translation> <translation id="4691791363716065510">Da kan <ph name="ORIGIN" /> se <ph name="FILENAME" /> frem til du lukker alle fanene for dette nettstedet</translation> +<translation id="4692342362587775867">Varsler fra dette nettstedet kan være forstyrrende</translation> <translation id="4692623383562244444">Søkemotorer</translation> <translation id="4692736633446859167">Du har tidligere valgt å ikke tillate noen utvidelser på <ph name="SITE" />. Hvis du legger til dette nettstedet her, kan andre utvidelser også be om å få lese og endre nettstedsdataene dine på <ph name="SITE" />.</translation> <translation id="4693155481716051732">Sushi</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 013cdcc..8a7c6fa1 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -3880,6 +3880,7 @@ <translation id="4689421377817139245">Sincronizează marcajul pe iPhone</translation> <translation id="4690091457710545971"><Patru fișiere generate de firmware-ul Wi-Fi Intel: csr.lst, fh_regs.lst, radio_reg.lst, monitor.lst.sysmon. Primele trei sunt fișiere binare care conțin dumpuri de registru, despre care Intel afirmă că nu conțin informații cu caracter personal sau de identificare a dispozitivelor. Ultimul fișier este o urmărire a executării firmware-ului Intel; din acesta au fost eliminate informațiile cu caracter personal sau de identificare a dispozitivelor, dar este prea mare pentru a fi afișat aici. Aceste fișiere au fost generate ca răspuns la problemele recente privind conexiunea Wi-Fi ale dispozitivului și vor fi trimise la Intel în vederea remedierii.></translation> <translation id="4691791363716065510"><ph name="ORIGIN" /> va putea vedea <ph name="FILENAME" /> până când închizi toate filele pentru acest site</translation> +<translation id="4692342362587775867">Notificările de la acest site pot fi deranjante</translation> <translation id="4692623383562244444">Motoare de căutare</translation> <translation id="4692736633446859167">Anterior, ai ales să nu permiți extensii pe <ph name="SITE" />. Dacă adaugi site-ul aici, și alte extensii pot solicita să citească și să modifice datele privind site-urile de la <ph name="SITE" />.</translation> <translation id="4693155481716051732">Sushi</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index f3fb19c..838cbc7 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -982,6 +982,7 @@ <translation id="1916502483199172559">Predvolený červený avatar</translation> <translation id="1918141783557917887">&Menší</translation> <translation id="1920390473494685033">Kontakty</translation> +<translation id="1921544956190977703">Máte najúčinnejšie zabezpečenie Chromu pred nebezpečnými webmi, sťahovanými súbormi a rozšíreniami</translation> <translation id="1921584744613111023"><ph name="DPI" /> dpi</translation> <translation id="1923468477587371721">Weby Google, ako sú Gmail, Disk a YouTube, používajú jazyk vášho účtu Google, pokiaľ ste nezmenili jazyk jednotlivých služieb</translation> <translation id="1923539912171292317">Automatické kliknutia</translation> @@ -2080,6 +2081,7 @@ <ph name="DOMAIN" /> vyžaduje, aby ste svoju čipovú kartu ponechali vloženú.</translation> <translation id="2923234477033317484">Odstrániť tento účet</translation> <translation id="2923644930701689793">Prístup k snímkam telefónu</translation> +<translation id="292371311537977079">Nastavenia Chromu</translation> <translation id="2925658782192398150">Hotovo, nenašli sa žiadne problémy</translation> <translation id="2926085873880284723">Obnoviť predvolené skratky</translation> <translation id="2926620265753325858">Zariadenie <ph name="DEVICE_NAME" /> nie je podporované.</translation> @@ -2663,6 +2665,7 @@ <translation id="3511528412952710609">Krátke</translation> <translation id="3514335087372914653">Ovládanie hry</translation> <translation id="3514373592552233661">Ak je k dispozícii viac sietí, uprednostní sa preferovaná sieť pred ostatnými známymi sieťami</translation> +<translation id="3514647716686280777">Máte štandardnú ochranu zabezpečenia. Ak chcete získať účinnejšiu ochranu pred nebezpečnými webmi, sťahovanými súbormi a rozšíreniami, zapnite v nastaveniach Chromu Zlepšené bezpečné prehliadanie.</translation> <translation id="3515983984924808886">Resetovanie potvrďte opätovným stlačením bezpečnostného kľúča. Všetky informácie uchované v bezpečnostnom kľúči (vrátane jeho kódu PIN) budú odstránené.</translation> <translation id="3518985090088779359">Prijať a pokračovať</translation> <translation id="3519564332031442870">Tlačová služba na strane servera</translation> @@ -5457,6 +5460,7 @@ <translation id="6278428485366576908">Motív</translation> <translation id="6278776436938569440">Zmeniť umiestnenie</translation> <translation id="6279183038361895380">Stlačením klávesa |<ph name="ACCELERATOR" />| zobrazíte kurzor</translation> +<translation id="6279595948631688299">Exportovať vybraný certifikát…</translation> <translation id="6280215091796946657">Prihlásiť sa pomocou iného účtu</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6282180787514676874">{COUNT,plural, =1{Prekračuje limit 1 hárka papiera}few{Prekračuje limit {COUNT} hárkov papiera}many{Prekračuje limit {COUNT} hárka papiera}other{Prekračuje limit {COUNT} hárkov papiera}}</translation> @@ -5571,6 +5575,7 @@ <translation id="6398715114293939307">Odstrániť Obchod Google Play</translation> <translation id="6398765197997659313">Ukončiť zobrazenie na celú obrazovku</translation> <translation id="6399774419735315745">Špión</translation> +<translation id="6401458660421980302">Ak chcete túto kartu odoslať do iného zariadenia, prihláste sa v ňom do Chromu</translation> <translation id="6401597285454423070">Váš počítač obsahuje bezpečnostné zariadenie Trusted Platform Module (TPM), pomocou ktorého sa v systéme Chrome OS implementuje mnoho kľúčových bezpečnostných funkcií. Viac sa dozviete v centre pomoci pre Chromebooky na https://support.google.com/chromebook/?p=tpm.</translation> <translation id="6404187344102273690">Hranie hier v Chromebookoch</translation> <translation id="6404511346730675251">Upraviť záložku</translation> @@ -5811,6 +5816,7 @@ <translation id="6619801788773578757">Pridať aplikáciu pre režim kiosku</translation> <translation id="6619990499523117484">Potvrďte kód PIN</translation> <translation id="6620254580880484313">Názov kontajnera</translation> +<translation id="6621391692573306628">Ak chcete túto kartu odoslať do iného zariadenia, prihláste v oboch zariadeniach do Chromu</translation> <translation id="6622980291894852883">Pokračovať v blokovaní obrázkov</translation> <translation id="6624036901798307345">V režime tabletu klepnite na paneli s nástrojmi na tlačidlo počítadla kariet a otvorte tak nový panel kariet s miniatúrami všetkých kariet.</translation> <translation id="6624535038674360844"><ph name="FILE_NAME" /> má citlivý alebo nebezpečný obsah. Požiadajte vlastníka o nápravu.</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index cc01e02..688168b 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -5918,6 +5918,7 @@ <translation id="6709133671862442373">Novice</translation> <translation id="6709357832553498500">Povezava z uporabo razširitve <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Prejšnji</translation> +<translation id="6710394144992407503">Preverjanje črkovanja pri vnašanju besedila na spletnih straneh</translation> <translation id="6711146141291425900">Povezava računa za <ph name="WEB_DRIVE" /> za prenose</translation> <translation id="6712943853047024245">Geslo ste s tem uporabniškim imenom že shranili za: <ph name="WEBSITE" />.</translation> <translation id="6713233729292711163">Dodaj delovni profil</translation> @@ -6536,6 +6537,7 @@ <translation id="7340757554212515731">Samodejno pošiljanje poročil o zrušitvah, diagnostičnih podatkov in podatkov o uporabi Googlu.</translation> <translation id="7341834142292923918">Želi dostop do tega spletnega mesta</translation> <translation id="7343372807593926528">Preden pošljete povratne informacije, opišite težavo.</translation> +<translation id="7344585835349671209">Upravljanjte potrdila HTTPS/SSL v napravi.</translation> <translation id="7345706641791090287">Potrdite geslo</translation> <translation id="7346909386216857016">V redu, razumem</translation> <translation id="7347452120014970266">S tem boste izbrisali vse podatke in piškotke, ki jih je shranilo spletno mesto <ph name="ORIGIN_NAME" /> s svojimi nameščenimi aplikacijami.</translation> @@ -6665,6 +6667,7 @@ <translation id="7460045493116006516">Trenutna tema, ki ste jo namestili</translation> <translation id="7461924472993315131">Pripni</translation> <translation id="746216226901520237">Naslednjič bo telefon odklenil napravo <ph name="DEVICE_TYPE" />. Funkcijo Smart Lock lahko izklopite v nastavitvah.</translation> +<translation id="7464153996453281700">Komponenta je že posodobljena.</translation> <translation id="7464637891177137294">Shranite ga v računu Google, <ph name="ACCOUNT" />.</translation> <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{# odprt zavihek, pritisnite za preklop traka z zavihki}one{# odprt zavihek, pritisnite za preklop traka z zavihki}two{# odprta zavihka, pritisnite za preklop traka z zavihki}few{# odprti zavihki, pritisnite za preklop traka z zavihki}other{# odprtih zavihkov, pritisnite za preklop traka z zavihki}}</translation> <translation id="7465635034594602553">Prišlo je do napake. Počakajte nekaj minut, nato znova zaženite aplikacijo <ph name="APP_NAME" />.</translation> @@ -7173,6 +7176,7 @@ <translation id="793531125873261495">Napaka pri prenosu navideznega računalnika. Poskusite znova.</translation> <translation id="7935451262452051102"><ph name="PERCENT" /> % dokončano</translation> <translation id="7939062555109487992">Dodatne možnosti</translation> +<translation id="7939328347457537652">Upravljanje potrdil v napravi</translation> <translation id="7939412583708276221">Vseeno obdrži</translation> <translation id="7942349550061667556">Rdeča</translation> <translation id="7943368935008348579">Prenos datotek PDF</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index a7db954..7132ef9 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -979,6 +979,7 @@ <translation id="1916502483199172559">Podrazumevani crveni avatar</translation> <translation id="1918141783557917887">&Manje</translation> <translation id="1920390473494685033">Kontakti</translation> +<translation id="1921544956190977703">Imate najjaču Chrome zaštitu od opasnih veb-sajtova, preuzimanja i dodataka</translation> <translation id="1921584744613111023"><ph name="DPI" /> dpi</translation> <translation id="1923468477587371721">Google sajtovi poput Gmail-a, Diska i YouTube-a koriste jezik Google naloga ako niste menjali jezike za pojedinačne proizvode</translation> <translation id="1923539912171292317">Automatski klikovi</translation> @@ -2077,6 +2078,7 @@ <ph name="DOMAIN" /> zahteva da pametna kartica ostane umetnuta.</translation> <translation id="2923234477033317484">Ukloni ovaj nalog</translation> <translation id="2923644930701689793">Pristupajte sadržaju sa telefona</translation> +<translation id="292371311537977079">Podešavanja Chrome-a</translation> <translation id="2925658782192398150">Gotovo, nije pronađen nijedan problem</translation> <translation id="2926085873880284723">Vrati podrazumevane prečice</translation> <translation id="2926620265753325858">Uređaj <ph name="DEVICE_NAME" /> nije podržan.</translation> @@ -2660,6 +2662,7 @@ <translation id="3511528412952710609">Kratko</translation> <translation id="3514335087372914653">Kontrola igre</translation> <translation id="3514373592552233661">Željene mreže će imati prioritet u odnosu na druge poznate mreže ako je dostupno više njih</translation> +<translation id="3514647716686280777">Dobijate standardnu zaštitu. Da biste dobili dodatnu zaštitu od opasnih veb-sajtova, preuzimanja i dodataka, uključite poboljšano bezbedno pregledanje u podešavanjima Chrome-a.</translation> <translation id="3515983984924808886">Dodirnite ponovo bezbednosni ključ da biste potvrdili resetovanje. Sve informacije sačuvane na bezbednosnom ključu, uključujući njegov PIN, biće obrisane.</translation> <translation id="3518985090088779359">Prihvati i nastavi</translation> <translation id="3519564332031442870">Pozadinska usluga štampanja</translation> @@ -5454,6 +5457,7 @@ <translation id="6278428485366576908">Tema</translation> <translation id="6278776436938569440">Promeni lokaciju</translation> <translation id="6279183038361895380">Pritisnite |<ph name="ACCELERATOR" />| da biste prikazali pokazivač</translation> +<translation id="6279595948631688299">I&zvezi izabrani sertifikat...</translation> <translation id="6280215091796946657">Prijavi me na drugi nalog</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6282180787514676874">{COUNT,plural, =1{Premašuje ograničenje od 1 lista papira}one{Premašuje ograničenje od {COUNT} lista papira}few{Premašuje ograničenje od {COUNT} lista papira}other{Premašuje ograničenje od {COUNT} listova papira}}</translation> @@ -5568,6 +5572,7 @@ <translation id="6398715114293939307">Uklonite Google Play prodavnicu</translation> <translation id="6398765197997659313">Izađi iz režima celog ekrana</translation> <translation id="6399774419735315745">Špijunka</translation> +<translation id="6401458660421980302">Da biste poslali ovu karticu na drugi uređaj, prijavite se u Chrome na tom uređaju</translation> <translation id="6401597285454423070">Računar sadrži bezbednosni uređaj sa modulom pouzdane platforme (TPM), koji se koristi za primenu mnogih bezbednosnih funkcija od suštinske važnosti u Chrome OS-u. Posetite Centar za pomoć za Chromebook da biste saznali više: https://support.google.com/chromebook/?p=tpm</translation> <translation id="6404187344102273690">Igranje igara na Chromebook-u</translation> <translation id="6404511346730675251">Izmena obeleživača</translation> @@ -5808,6 +5813,7 @@ <translation id="6619801788773578757">Dodajte kiosk aplikaciju</translation> <translation id="6619990499523117484">Potvrdite PIN</translation> <translation id="6620254580880484313">Naziv kontejnera</translation> +<translation id="6621391692573306628">Da biste poslali ovu karticu na drugi uređaj, prijavite se u Chrome na oba uređaja</translation> <translation id="6622980291894852883">Nastavi blokiranje slika</translation> <translation id="6624036901798307345">U režimu tableta dodirnite dugme brojača kartica na traci s alatkama da biste otvorili novu traku sa karticama koja prikazuje sličice svake kartice.</translation> <translation id="6624535038674360844"><ph name="FILE_NAME" /> sadrži osetljiv ili opasan sadržaj. Zatražite od vlasnika da reši problem.</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index 256f6d90..3d56508 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -979,6 +979,7 @@ <translation id="1916502483199172559">Подразумевани црвени аватар</translation> <translation id="1918141783557917887">&Мање</translation> <translation id="1920390473494685033">Контакти</translation> +<translation id="1921544956190977703">Имате најјачу Chrome заштиту од опасних веб-сајтова, преузимања и додатака</translation> <translation id="1921584744613111023"><ph name="DPI" /> dpi</translation> <translation id="1923468477587371721">Google сајтови попут Gmail-а, Диска и YouTube-а користе језик Google налога ако нисте мењали језике за појединачне производе</translation> <translation id="1923539912171292317">Аутоматски кликови</translation> @@ -2077,6 +2078,7 @@ <ph name="DOMAIN" /> захтева да паметна картица остане уметнута.</translation> <translation id="2923234477033317484">Уклони овај налог</translation> <translation id="2923644930701689793">Приступајте садржају са телефона</translation> +<translation id="292371311537977079">Подешавања Chrome-а</translation> <translation id="2925658782192398150">Готово, није пронађен ниједан проблем</translation> <translation id="2926085873880284723">Врати подразумеване пречице</translation> <translation id="2926620265753325858">Уређај <ph name="DEVICE_NAME" /> није подржан.</translation> @@ -2660,6 +2662,7 @@ <translation id="3511528412952710609">Кратко</translation> <translation id="3514335087372914653">Контрола игре</translation> <translation id="3514373592552233661">Жељене мреже ће имати приоритет у односу на друге познате мреже ако је доступно више њих</translation> +<translation id="3514647716686280777">Добијате стандардну заштиту. Да бисте добили додатну заштиту од опасних веб-сајтова, преузимања и додатака, укључите побољшано безбедно прегледање у подешавањима Chrome-а.</translation> <translation id="3515983984924808886">Додирните поново безбедносни кључ да бисте потврдили ресетовање. Све информације сачуване на безбедносном кључу, укључујући његов PIN, биће обрисане.</translation> <translation id="3518985090088779359">Прихвати и настави</translation> <translation id="3519564332031442870">Позадинска услуга штампања</translation> @@ -5454,6 +5457,7 @@ <translation id="6278428485366576908">Тема</translation> <translation id="6278776436938569440">Промени локацију</translation> <translation id="6279183038361895380">Притисните |<ph name="ACCELERATOR" />| да бисте приказали показивач</translation> +<translation id="6279595948631688299">И&звези изабрани сертификат...</translation> <translation id="6280215091796946657">Пријави ме на други налог</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6282180787514676874">{COUNT,plural, =1{Премашује ограничење од 1 листа папира}one{Премашује ограничење од {COUNT} листа папира}few{Премашује ограничење од {COUNT} листа папира}other{Премашује ограничење од {COUNT} листова папира}}</translation> @@ -5568,6 +5572,7 @@ <translation id="6398715114293939307">Уклоните Google Play продавницу</translation> <translation id="6398765197997659313">Изађи из режима целог екрана</translation> <translation id="6399774419735315745">Шпијунка</translation> +<translation id="6401458660421980302">Да бисте послали ову картицу на други уређај, пријавите се у Chrome на том уређају</translation> <translation id="6401597285454423070">Рачунар садржи безбедносни уређај са модулом поуздане платформе (TPM), који се користи за примену многих безбедносних функција од суштинске важности у Chrome ОС-у. Посетите Центар за помоћ за Chromebook да бисте сазнали више: https://support.google.com/chromebook/?p=tpm</translation> <translation id="6404187344102273690">Играње игара на Chromebook-у</translation> <translation id="6404511346730675251">Измена обележивача</translation> @@ -5808,6 +5813,7 @@ <translation id="6619801788773578757">Додајте киоск апликацију</translation> <translation id="6619990499523117484">Потврдите PIN</translation> <translation id="6620254580880484313">Назив контејнера</translation> +<translation id="6621391692573306628">Да бисте послали ову картицу на други уређај, пријавите се у Chrome на оба уређаја</translation> <translation id="6622980291894852883">Настави блокирање слика</translation> <translation id="6624036901798307345">У режиму таблета додирните дугме бројача картица на траци с алаткама да бисте отворили нову траку са картицама која приказује сличице сваке картице.</translation> <translation id="6624535038674360844"><ph name="FILE_NAME" /> садржи осетљив или опасан садржај. Затражите од власника да реши проблем.</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index 6a89d458..fad0cbd 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -5902,6 +5902,7 @@ <translation id="6709133671862442373">Habari</translation> <translation id="6709357832553498500">Unganisha ukitumia <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Iliyopita</translation> +<translation id="6710394144992407503">Angalia makosa ya kitahajia unapoandika maandishi kwenye kurasa za wavuti</translation> <translation id="6711146141291425900">Unganisha akaunti ya <ph name="WEB_DRIVE" /> kwa ajili ya Vipakuliwa</translation> <translation id="6712943853047024245">Tayari umehifadhi nenosiri lenye jina hili la mtumiaji unalotumia katika <ph name="WEBSITE" /></translation> <translation id="6713233729292711163">Ongeza Wasifu wa Kazini</translation> @@ -6520,6 +6521,7 @@ <translation id="7340757554212515731">Hutuma kiotomatiki ripoti za kuacha kufanya kazi pamoja na data ya matumizi na uchunguzi kwenda Google</translation> <translation id="7341834142292923918">Ingependa kufikia tovuti hii</translation> <translation id="7343372807593926528">Tafadhali fafanua tatizo kabla ya kutuma maoni.</translation> +<translation id="7344585835349671209">Dhibiti vyeti vya HTTPS au SSL kwenye kifaa chako</translation> <translation id="7345706641791090287">Thibitisha nenosiri lako</translation> <translation id="7346909386216857016">Sawa, nimeelewa</translation> <translation id="7347452120014970266">Hatua hii itafuta data na vidakuzi vyote vilivyohifadhiwa na <ph name="ORIGIN_NAME" /> na programu zake zilizosakinishwa</translation> @@ -6649,6 +6651,7 @@ <translation id="7460045493116006516">Mandhari ya sasa uliyosakinisha</translation> <translation id="7461924472993315131">Bana</translation> <translation id="746216226901520237">Wakati ujao, simu yako itafungua <ph name="DEVICE_TYPE" /> yako. Unaweza kuzima Smart Lock katika Mipangilio.</translation> +<translation id="7464153996453281700">Kipengele kimesasishwa tayari</translation> <translation id="7464637891177137294">Hifadhi katika Akaunti yako ya Google, <ph name="ACCOUNT" /></translation> <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{Kichupo # kimefunguliwa, bonyeza ili uwashe ukanda wa vichupo}other{Vichupo # vimefunguliwa, bonyeza ili uwashe ukanda wa vichupo}}</translation> <translation id="7465635034594602553">Hitilafu fulani imetokea. Tafadhali subiri kwa dakika chache kisha usakinishe <ph name="APP_NAME" /> tena.</translation> @@ -7158,6 +7161,7 @@ <translation id="793531125873261495">Hitilafu imetokea wakati wa kupakua mashine dhahania. Tafadhali jaribu tena.</translation> <translation id="7935451262452051102">Asilimia <ph name="PERCENT" /> imekamilika</translation> <translation id="7939062555109487992">Chaguo mahiri</translation> +<translation id="7939328347457537652">Dhibiti vyeti vya kifaa</translation> <translation id="7939412583708276221">Hata hivyo weka</translation> <translation id="7942349550061667556">Nyekundu</translation> <translation id="7943368935008348579">Pakua PDF</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index a44d30e..79b26fd7 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -980,6 +980,7 @@ <translation id="1916502483199172559">รูปโปรไฟล์เริ่มต้นสีแดง</translation> <translation id="1918141783557917887">เ&ล็กลง</translation> <translation id="1920390473494685033">รายชื่อติดต่อ</translation> +<translation id="1921544956190977703">คุณมีการรักษาความปลอดภัยที่เข้มงวดที่สุดของ Chrome จากเว็บไซต์ การดาวน์โหลด และส่วนขยายที่เป็นอันตราย</translation> <translation id="1921584744613111023"><ph name="DPI" /> dpi</translation> <translation id="1923468477587371721">เว็บไซต์ของ Google อย่างเช่น Gmail, ไดรฟ์ และ YouTube ใช้ภาษาของบัญชี Google ยกเว้นว่าคุณได้เปลี่ยนภาษาของแต่ละผลิตภัณฑ์</translation> <translation id="1923539912171292317">การคลิกอัตโนมัติ</translation> @@ -2078,6 +2079,7 @@ คุณต้องเสียบสมาร์ทการ์ดไว้ตลอดเพื่อให้ใช้งาน <ph name="DOMAIN" /> ต่อไปได้</translation> <translation id="2923234477033317484">นำบัญชีนี้ออก</translation> <translation id="2923644930701689793">เข้าถึงรูปภาพจากกล้องในโทรศัพท์</translation> +<translation id="292371311537977079">การตั้งค่า Chrome</translation> <translation id="2925658782192398150">เสร็จสิ้น ไม่พบปัญหา</translation> <translation id="2926085873880284723">คืนค่าทางลัดเริ่มต้น</translation> <translation id="2926620265753325858">ไม่รองรับ <ph name="DEVICE_NAME" /></translation> @@ -2661,6 +2663,7 @@ <translation id="3511528412952710609">น้อย</translation> <translation id="3514335087372914653">ตัวควบคุมเกม</translation> <translation id="3514373592552233661">ระบบจะเลือกเครือข่ายที่ต้องการแทนเครือข่ายที่รู้จักอื่นๆ หากมีเครือข่ายที่รู้จักมากกว่า 1 เครือข่าย</translation> +<translation id="3514647716686280777">คุณกำลังได้รับการป้องกันความปลอดภัยแบบมาตรฐาน หากต้องการรับการป้องกันมากยิ่งขึ้นจากเว็บไซต์ การดาวน์โหลด และส่วนขยายที่เป็นอันตราย ให้เปิดฟีเจอร์ Safe Browsing พร้อมการปกป้องที่ดียิ่งขึ้นในการตั้งค่า Chrome</translation> <translation id="3515983984924808886">แตะคีย์ความปลอดภัยอีกครั้งเพื่อยืนยันการรีเซ็ต ระบบจะลบข้อมูลทั้งหมดที่เก็บไว้ในคีย์ความปลอดภัย รวมถึง PIN ของคีย์ด้วย</translation> <translation id="3518985090088779359">ยอมรับและทำต่อ</translation> <translation id="3519564332031442870">บริการแบ็กเอนด์ของการพิมพ์</translation> @@ -3879,6 +3882,7 @@ <translation id="4689421377817139245">ซิงค์บุ๊กมาร์กนี้กับ iPhone ของคุณ</translation> <translation id="4690091457710545971"><มีไฟล์ 4 ไฟล์ที่สร้างขึ้นโดยเฟิร์มแวร์ Wi-Fi ของ Intel ได้แก่ csr.lst, fh_regs.lst, radio_reg.lst และ monitor.lst.sysmon โดย 3 ไฟล์แรกเป็นไฟล์ไบนารีที่มี Register Dump ซึ่งผ่านการยืนยันโดย Intel เพื่อไม่ให้รวมข้อมูลส่วนตัวหรือข้อมูลที่ระบุอุปกรณ์ ส่วนไฟล์สุดท้ายเป็นการติดตามการทำงานจากเฟิร์มแวร์ของ Intel โดยมีการลบข้อมูลส่วนตัวหรือข้อมูลที่ระบุอุปกรณ์ออกไปแล้ว แต่ไฟล์มีขนาดใหญ่เกินกว่าที่จะแสดงตรงนี้ได้ ไฟล์เหล่านี้สร้างขึ้นมาเพื่อตอบสนองต่อปัญหา Wi-Fi ล่าสุดในอุปกรณ์ของคุณและระบบจะแชร์ไฟล์กับ Intel เพื่อช่วยแก้ปัญหาเหล่านี้></translation> <translation id="4691791363716065510"><ph name="ORIGIN" /> จะดู <ph name="FILENAME" /> ได้อยู่จนกว่าคุณจะปิดทุกแท็บของเว็บไซต์นี้</translation> +<translation id="4692342362587775867">การแจ้งเตือนจากเว็บไซต์นี้อาจรบกวน</translation> <translation id="4692623383562244444">เครื่องมือค้นหา</translation> <translation id="4692736633446859167">คุณเคยเลือกที่จะไม่อนุญาตให้ใช้งานส่วนขยายใดๆ บน <ph name="SITE" /> หากคุณเพิ่มเว็บไซต์นี้ที่นี่ ส่วนขยายอื่นๆ จะขออ่านและเปลี่ยนแปลงข้อมูลเว็บไซต์บน <ph name="SITE" /> ได้ด้วย</translation> <translation id="4693155481716051732">ซูชิ</translation> @@ -5452,6 +5456,7 @@ <translation id="6278428485366576908">ธีม</translation> <translation id="6278776436938569440">เปลี่ยนสถานที่</translation> <translation id="6279183038361895380">กด |<ph name="ACCELERATOR" />| เพื่อแสดงเคอร์เซอร์ของคุณ</translation> +<translation id="6279595948631688299">ส่งออกใบรับรองที่เลือก...</translation> <translation id="6280215091796946657">ลงชื่อเข้าใช้ด้วยบัญชีอื่น</translation> <translation id="6280912520669706465">ARC</translation> <translation id="6282180787514676874">{COUNT,plural, =1{เกินขีดจำกัด 1 แผ่น}other{เกินขีดจำกัด {COUNT} แผ่น}}</translation> @@ -5566,6 +5571,7 @@ <translation id="6398715114293939307">นำ Google Play Store ออก</translation> <translation id="6398765197997659313">ออกจากการแสดงแบบเต็มหน้าจอ</translation> <translation id="6399774419735315745">สายลับ</translation> +<translation id="6401458660421980302">หากต้องการส่งแท็บนี้ไปยังอุปกรณ์อื่น ให้ลงชื่อเข้าใช้ Chrome ในอุปกรณ์นั้น</translation> <translation id="6401597285454423070">คอมพิวเตอร์ของคุณมีอุปกรณ์รักษาความปลอดภัย Trusted Platform Module (TPM) ซึ่งใช้เพื่อนำฟีเจอร์การรักษาความปลอดภัยที่สำคัญจำนวนมากมาใช้ใน Chrome OS ดูข้อมูลเพิ่มเติมได้จากศูนย์ช่วยเหลือของ Chromebook ซึ่งอยู่ที่ https://support.google.com/chromebook/?p=tpm</translation> <translation id="6404187344102273690">Chromebook สำหรับเล่นเกม</translation> <translation id="6404511346730675251">แก้ไขบุ๊กมาร์ก</translation> @@ -5802,6 +5808,7 @@ <translation id="6619801788773578757">เพิ่มแอปพลิเคชันคีออสก์</translation> <translation id="6619990499523117484">ยืนยัน PIN</translation> <translation id="6620254580880484313">ชื่อคอนเทนเนอร์</translation> +<translation id="6621391692573306628">หากต้องการส่งแท็บนี้ไปยังอุปกรณ์อื่น ให้ลงชื่อเข้าใช้ Chrome ในอุปกรณ์ทั้ง 2 เครื่อง</translation> <translation id="6622980291894852883">บล็อกการแสดงภาพ</translation> <translation id="6624036901798307345">ในโหมดแท็บเล็ต ให้แตะปุ่มแถบเครื่องมือตัวนับแท็บเพื่อเปิดแนวแท็บใหม่ซึ่งแสดงภาพขนาดย่อของแต่ละแท็บ</translation> <translation id="6624535038674360844"><ph name="FILE_NAME" /> มีเนื้อหาที่ละเอียดอ่อนหรือเป็นอันตราย โปรดขอให้เจ้าของไฟล์แก้ไข</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 74f2b69..4617fbce 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -5913,6 +5913,7 @@ <translation id="6709133671862442373">Новини</translation> <translation id="6709357832553498500">Під’єднатися за допомогою розширення <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Назад</translation> +<translation id="6710394144992407503">Перевіряти текст, який вводиться на веб-сторінках, на орфографічні помилки</translation> <translation id="6711146141291425900">Зв’яжіть обліковий запис сервісу <ph name="WEB_DRIVE" /> для завантажень</translation> <translation id="6712943853047024245">Ви вже зберегли пароль, зв’язаний із цим іменем користувача, для <ph name="WEBSITE" /></translation> <translation id="6713233729292711163">Додати робочий профіль</translation> @@ -6531,6 +6532,7 @@ <translation id="7340757554212515731">Автоматично надсилає в Google звіти про збої, а також дані про діагностику та використання</translation> <translation id="7341834142292923918">Запитує дозвіл запускатися на цьому сайті</translation> <translation id="7343372807593926528">Перш ніж надсилати відгук, опишіть проблему.</translation> +<translation id="7344585835349671209">Керуйте сертифікатами HTTPS/SSL на своєму пристрої</translation> <translation id="7345706641791090287">Підтвердьте пароль</translation> <translation id="7346909386216857016">OK</translation> <translation id="7347452120014970266">Буде видалено всі дані й файли cookie, збережені сайтом <ph name="ORIGIN_NAME" /> і встановленими ним додатками</translation> @@ -6660,6 +6662,7 @@ <translation id="7460045493116006516">Поточна встановлена тема</translation> <translation id="7461924472993315131">Закріпити</translation> <translation id="746216226901520237">Наступного разу ви зможете розблокувати пристрій <ph name="DEVICE_TYPE" /> за допомогою свого телефона. Smart Lock можна вимкнути в налаштуваннях.</translation> +<translation id="7464153996453281700">Компонент уже оновлено</translation> <translation id="7464637891177137294">Збережіть його у своєму обліковому записі Google, <ph name="ACCOUNT" /></translation> <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{# відкрита вкладка. Натисніть, щоб перемкнути панель вкладок.}one{# відкрита вкладка. Натисніть, щоб перемкнути панель вкладок.}few{# відкриті вкладки. Натисніть, щоб перемкнути панель вкладок.}many{# відкритих вкладок. Натисніть, щоб перемкнути панель вкладок.}other{# відкритої вкладки. Натисніть, щоб перемкнути панель вкладок.}}</translation> <translation id="7465635034594602553">Сталася помилка. Зачекайте кілька хвилин і запустіть додаток <ph name="APP_NAME" /> ще раз.</translation> @@ -7168,6 +7171,7 @@ <translation id="793531125873261495">Не вдалося завантажити віртуальну машину. Повторіть спробу.</translation> <translation id="7935451262452051102">Виконано <ph name="PERCENT" />%</translation> <translation id="7939062555109487992">Розширені параметри</translation> +<translation id="7939328347457537652">Керувати сертифікатами на пристрої</translation> <translation id="7939412583708276221">Усе ж зберегти</translation> <translation id="7942349550061667556">Червоний</translation> <translation id="7943368935008348579">Завантажувати файли PDF</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index b90c6c7..9529dc81 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -81,6 +81,7 @@ <translation id="1076766328672150609">Farzandingiz PIN kod yordamida qurilma qulfini ochishi mumkin.</translation> <translation id="1076818208934827215">Microsoft Internet Explorer</translation> <translation id="1076882167394279216"><ph name="LANGUAGE" /> tili uchun imloni tekshirish lugʻati yuklab olinmadi Qayta urining.</translation> +<translation id="1078037449555275327">ChromeVox sozlamalari</translation> <translation id="1079766198702302550">Kameraga ruxsat har doim ta’qiqlansin</translation> <translation id="1081956462909987459">{NUM_TABS,plural, =1{<ph name="GROUP_TITLE" /> – 1 ta varaq}other{<ph name="GROUP_TITLE" /> – # ta varaq}}</translation> <translation id="1082214733466244292">Administrator bu qurilma uchun ayrim funksiyalarni bloklagan</translation> @@ -398,6 +399,7 @@ <translation id="1390907927270446471"><ph name="PROFILE_USERNAME" /> foydalanuvchisiga <ph name="PRINTER_NAME" /> printerida chop etishga ruxsat berilmagan. Administratorga murojaat qiling.</translation> <translation id="1393283411312835250">Quyosh va bulutlar</translation> <translation id="1395730723686586365">Yangilash vositasi ishga tushdi</translation> +<translation id="1395832189806039783">Elementni klaviatura fokusi orqali ajratib belgilash</translation> <translation id="1396139853388185343">Printer sozlanmadi</translation> <translation id="1396259464226642517">Xatolik yuz berdimi? <ph name="BEGIN_LINK" />Bizga xabar qiling<ph name="END_LINK" /></translation> <translation id="1396963298126346194">Siz kiritgan foydalanuvchi nomi va parol mos kelmadi</translation> @@ -548,6 +550,7 @@ <translation id="1531734061664070992"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" />, <ph name="THIRD_SWITCH" /></translation> <translation id="1533948060140843887">Kompyuterimga zarar yetkazishi mumkinligidan xabarim bor</translation> <translation id="1535228823998016251">Baland</translation> +<translation id="1535753739390684432">Kerakli matnni oʻqib eshittirish. Avval ekranning quyi qismidagi Teginib tinglash belgisini bosing va keyin matnni belgilang.</translation> <translation id="1536754031901697553">Uzilmoqda…</translation> <translation id="1537254971476575106">Butun ekran rejimidagi lupa</translation> <translation id="15373452373711364">Sichqonchaning katta kursori</translation> @@ -706,6 +709,7 @@ <translation id="166278006618318542">Subyekt ochiq kaliti algoritmi</translation> <translation id="1662801900924515589"><ph name="APP" /> oʻrnatildi</translation> <translation id="1666232093776384142">Tashqi qurilmalar uchun maʼlumotlarga kirish cheklovi olib tashlansinmi?</translation> +<translation id="1667842670298352129">Kerakli matnni oʻqib eshittirish. Avval ekranning quyi qismidagi Teginib tinglash belgisini bosing va keyin matnni belgilang. Shuningdek, tezkor tugma ishlatish mumkin: Matnni belgilab, Search+S tugmalarini bosing.</translation> <translation id="1668435968811469751">Mustaqil qayd qilish</translation> <translation id="1668979692599483141">Tavsiya haqida batafsil</translation> <translation id="1670399744444387456">Asosiy sozlamalar</translation> @@ -733,6 +737,7 @@ <translation id="1692115862433274081">Boshqa hisobdan foydalanish</translation> <translation id="1692118695553449118">Sinxronlash yoniq</translation> <translation id="1692210323591458290">Toʻq siyohrang</translation> +<translation id="1692713444215319269">Ranlarni akslantirish, lupa va ekran sozlamalari</translation> <translation id="1695487653372841667">Qaysi maʼlumotlarni Googlega ulashishni tanlay olasiz. Buni istalgan vaqtda sozlamalardan oʻzgartirish mumkin.</translation> <translation id="1695510246756136088">Internetga ulanilmadi. Qayta urining.</translation> <translation id="169675691788639886">Qurilmada sozlangan SSH server bor. Maxfiy hisoblardan kirmang.</translation> @@ -945,6 +950,7 @@ <translation id="1877520246462554164">Hisob tekshiruvi tokeni olinmadi. Qayta urinish uchun hisobingizdan chiqing va qaytadan kiring.</translation> <translation id="1877860345998737529">Switch harakatini tayinlash</translation> <translation id="1878155070920054810">Chromebook oxirigacha yangilanmasdan turib uning quvvati tugab qolishi mumkin. Uzilishlarning oldini olish uchun uning xatosiz quvvatlanayotganini tekshiring.</translation> +<translation id="1878885068166344708">Fokus surilganda element ajratib belgilanadi. Fokusni oʻzgartirish uchun tab tugmasini yoki element ustiga bosing.</translation> <translation id="1879000426787380528">Hisobni tanlang</translation> <translation id="18802377548000045">Varaqlar ikki marta kichraytiriladi</translation> <translation id="1880905663253319515">“<ph name="CERTIFICATE_NAME" />” sertifikati o‘chirilsinmi?</translation> @@ -972,6 +978,7 @@ <translation id="1904580727789512086">Tashrif qilingan URL manzillar Google hisobingizda saqlanadi</translation> <translation id="1905375423839394163">Chromebook qurilmasi nomi</translation> <translation id="1906181697255754968">Saytlar odatda yopilmagan ishlaringizni saqlash maqsadida qurilmangizdagi fayllar va jildlar bilan ishlaydi</translation> +<translation id="1907044622262489040">Ovoz bilan yozing. Search+D tugmalarini bosib, gapirishni boshlang.</translation> <translation id="1908591798274282246">Yopilgan guruhni qayta ochish</translation> <translation id="1909880997794698664">Qurilma har doim kiosk rejimida ishga tushirilsinmi?</translation> <translation id="1915073950770830761">canary</translation> @@ -1327,6 +1334,7 @@ <translation id="2241053333139545397">Bir nechta saytlardagi ma’lumotlarni ko‘rish va o‘zgartirish</translation> <translation id="2241634353105152135">Bir marta</translation> <translation id="2242687258748107519">Fayl ma’lumoti</translation> +<translation id="2245603955208828424">Kursorni harfma-harf surish uchun strelka tugmalarini bosing</translation> <translation id="2246129643805925002"><ph name="DEVICE_TYPE" /> qurilmangiz eng oxirgi funksiyalar va xavfsizlikka oid tuzatishlarni olish uchun fonda avtomatik yangilanadi. Yangilanish parametrlarini Sozlamalar orqali tekshirish mumkin.</translation> <translation id="2246549592927364792">Rasmlar tavsifi Google orqali olinsinmi?</translation> <translation id="2247738527273549923">Qurilmangiz tashkilotingiz tomonidan boshqariladi</translation> @@ -1432,6 +1440,7 @@ <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" />% bajarildi</translation> <translation id="2318143611928805047">Qog‘oz hajmi</translation> <translation id="2318817390901984578">Android ilovalardan foydalanish uchun <ph name="DEVICE_TYPE" /> qurilmasini quvvatlang va uning tizimini yangilang.</translation> +<translation id="2319459402137712349">Klaviaturani ochish uchun matn maydonchasini tanlang. Shuningdek, ekranning quyi qismidagi klaviatura belgisini tanlash mumkin.</translation> <translation id="2319993584768066746">Kirish ekranidagi suratlar</translation> <translation id="2322193970951063277">Sarlavha va taglavhalar</translation> <translation id="2322318151094136999">Sayt ketma-ket portlardan foydalanish oldidan ruxsat olinsin (tavsiya etiladi)</translation> @@ -1506,6 +1515,7 @@ <translation id="2379281330731083556">Tizim muloqot oynasi yordamida chop etish... <ph name="SHORTCUT_KEY" /></translation> <translation id="2381499968174336913">Ulashilgan varaq koʻrinishi</translation> <translation id="2381756643783702095">Yuborishdan oldin so‘ralsin (tavsiya etiladi)</translation> +<translation id="2383825469508278924">Klaviatura tugmalari tayinlovi, funksiya tugmalari va boshqalarni oʻzgartirish</translation> <translation id="2386202302581016807">Oʻrnatishni yakunlash uchun qurilma xotirasida kam joy qolgan</translation> <translation id="2387052489799050037">Boshiga</translation> <translation id="2387602571959163792"><ph name="DESK_NAME" /> (Ayni vaqtda)</translation> @@ -1683,6 +1693,7 @@ <translation id="2542050502251273923">Tarmoq ulanishlari menejeri va boshqa xizmatlar uchun ff_debug orqali xatolarni aniqlash darajasini belgilaydi.</translation> <translation id="2544352060595557290">Shu varaq</translation> <translation id="2546302722632337735">Saytlarga himoyalangan kontenti ijro etish uchun identifikatordan foydalanishni taqiqlash</translation> +<translation id="2546991196809436099">Ekrandagi elementlar kattalashtirilishi. Lupani yoqib, oʻchirish uchun Search+Ctrl+M tugmalarini bosing.</translation> <translation id="2548347166720081527"><ph name="PERMISSION" /> ruxsati berildi</translation> <translation id="2548545707296594436">eSIM profil keshini asliga qaytarish</translation> <translation id="2549985041256363841">Yozuvni boshlash</translation> @@ -1841,6 +1852,7 @@ <translation id="2715640894224696481">Elektron kalit soʻrovi</translation> <translation id="2715751256863167692">Bu yangilanish Chromebook qurilmangizni ilk sozlamalarga qaytaradi va undagi foydalanuvchi ma’lumotlarini tozalaydi.</translation> <translation id="2716986496990888774">Bu sozlamani ota-ona boshqaradi.</translation> +<translation id="271749239614426244">Kursorning kichik harakatlari inkor etilsin</translation> <translation id="2718395828230677721">Tungi rejim</translation> <translation id="2718998670920917754">Antivirus dasturi virus aniqlandi.</translation> <translation id="2719936478972253983">Quyidagi cookie fayllari bloklandi:</translation> @@ -2410,6 +2422,7 @@ <translation id="3274763671541996799">To‘liq ekran rejimiga o‘tdingiz.</translation> <translation id="3275778809241512831">Elektron kalitingiz himoyalanmagan. Uni ulangan har qanday xizmatdan olib tashlang. Buni hal qilish uchun elektron kalit sozlamalarini qayta tiklang.</translation> <translation id="3275778913554317645">Alohida oynada ochish</translation> +<translation id="3277214528693754078">Matn kursori bilan harakatlanish (faol kursor rejimi)</translation> <translation id="3278001907972365362">Google hisob(lar)ingiz bilan muammo bor</translation> <translation id="3279092821516760512">Tanlangan kontaktlar atrofdaligida sizga fayl yubora oladi. Uzatmalar qabul qilinmaguncha boshlanmaydi.</translation> <translation id="3279230909244266691">Bu jarayon bir necha daqiqa olishi mumkin. Virtual mashina ishga tushirilmoqda.</translation> @@ -2724,6 +2737,7 @@ <translation id="3578874072190212775">Saytlarga firibgarlikka qarshi kurash va botlarni odamlardan farqlashda yordam berish</translation> <translation id="3581605050355435601">IP manzilni avtomatik sozlash</translation> <translation id="3582057310199111521">Qalbaki va axborotlari oshkor qilingan saytga kirdingiz.</translation> +<translation id="3582299299336701326">Och ekranlarni qorongʻi qilish va qorongʻi ekranlarni yoritish. Ranglar akslantirilishini yoqish va oʻchirish uchun Search+Ctrl+H tugmalarini bosing.</translation> <translation id="3584169441612580296">Kompyuteringizdagi rasmlar, musiqa va boshqa mediafayllarni ko‘rish va o‘zgartirishga ruxsat</translation> <translation id="3586806079541226322">Bu fayl ochilmadi</translation> <translation id="3586931643579894722">Tafsilotlarni yopish</translation> @@ -2840,6 +2854,7 @@ <translation id="369135240373237088">Maktab hisobingizdan qayta kiring</translation> <translation id="3693415264595406141">Parol:</translation> <translation id="3694027410380121301">Avvalgi ichki oynani tanlash</translation> +<translation id="3694590407685276748">Matn kursorini ajratib belgilash</translation> <translation id="369489984217678710">Parollar va boshqa kirish ma’lumotlari</translation> <translation id="369522892592566391">{NUM_FILES,plural, =0{Xavfsizlik tekshuvlari yakunlandi. Maʼlumotlaringiz yuklanadi.}=1{Xavfsizlik tekshuvlari yakunlandi. Faylingiz yuklanadi.}other{Xavfsizlik tekshuvlari yakunlandi. Fayllaringiz yuklanadi.}}</translation> <translation id="3698471669415859717">Tekshirildi</translation> @@ -2975,6 +2990,7 @@ <translation id="3814529970604306954">Maktab hisobi</translation> <translation id="3816118180265633665">Chrome ranglari</translation> <translation id="3817524650114746564">Kompyuter proksi-serveri sozlamalarini ochish</translation> +<translation id="3819164369574292143">Ekrandagi elementlar kattalashtirilishi. Lupani yoqib, oʻchirish uchun Search+Ctrl+M tugmalarini bosing. Kattalashtirilganidan keyin Ctrl+Alt+Strelka tugmalari bilan harakatlaning.</translation> <translation id="3819257035322786455">Zaxiralash</translation> <translation id="3819261658055281761">Tizim bu qurilmada API uchun ruxsat tokenini saqlay olmadi.</translation> <translation id="3819800052061700452">&To‘liq ekran rejimi</translation> @@ -3222,6 +3238,7 @@ <translation id="403725336528835653">Birinchi boʻlib sinang</translation> <translation id="4040105702484676956"><ph name="SITE_NAME" /> saytlari, ruxsatlari, va oʻrnatilgan ilovalar tozalansinmi?</translation> <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Sahifani yopish}other{Sahifalarni yopish}}</translation> +<translation id="4043267180218562935">Kursor hajmi</translation> <translation id="4044612648082411741">Sertifikat parolini kiriting</translation> <translation id="4044708573046946214">Ekran qulfi paroli</translation> <translation id="404493185430269859">Birlamchi qidiruv tizimi</translation> @@ -3340,6 +3357,7 @@ <translation id="4152670763139331043">{NUM_TABS,plural, =1{1 ta ichki oyna}other{# ta ichki oyna}}</translation> <translation id="4154664944169082762">Barmoq izlari</translation> <translation id="4157869833395312646">Microsoft shifrlash serveri</translation> +<translation id="4158315983204257156">Saytlardagi matn hajmi va shrifti</translation> <translation id="4158364720893025815">Tekshirildi</translation> <translation id="4159681666905192102">Bu bolalar hisobi <ph name="CUSTODIAN_EMAIL" /> va <ph name="SECOND_CUSTODIAN_EMAIL" /> hisoblari tomonidan boshqariladi.</translation> <translation id="4163560723127662357">Noma’lum klaviatura</translation> @@ -3897,6 +3915,7 @@ <translation id="4699357559218762027">(avtomatik-ishga tushirilgan)</translation> <translation id="4701025263201366865">Ota-onalar uchun kirish</translation> <translation id="4701335814944566468">Kecha koʻrilgan</translation> +<translation id="470644585772471629">Ranglarni akslantirish</translation> <translation id="4707337002099455863">Doim barcha saytlarda</translation> <translation id="4708794300267213770">Qurilma uyqu rejimidan chiqarilishida ekran qulfi ko‘rsatilsin</translation> <translation id="4708849949179781599"><ph name="PRODUCT_NAME" />’dan chiqish</translation> @@ -3910,6 +3929,8 @@ <translation id="4723140812774948886">Keyingisiga almashtirish</translation> <translation id="4724450788351008910">A’zolik o‘zgardi</translation> <translation id="4725511304875193254">Korgi</translation> +<translation id="4726710355753484204">Kattalashtirish uchun Ctrl+Alt+Yorqinlikni oshirish tugmalarini bosing. +Kichiklashtirish uchun Ctrl+Alt+Yorqinlikni pasaytirish tugmalarini bosing.</translation> <translation id="4726710629007580002">Kengaytmani o‘rnatishda ogohlantirishlar bo‘ldi:</translation> <translation id="4727847987444062305">Boshqaruvdagi mehmon seansi</translation> <translation id="4728558894243024398">Platforma</translation> @@ -4251,6 +4272,7 @@ <translation id="5073956501367595100">{0,plural,offset:2 =1{<ph name="FILE1" />}=2{<ph name="FILE1" />, <ph name="FILE2" />}other{<ph name="FILE1" />, <ph name="FILE2" />, va yana # ta}}</translation> <translation id="5074318175948309511">Sozlamalar kuchga kirishi uchun sahifani qayta yuklash kerak.</translation> <translation id="5074761966806028321">Sozlashni yakunlash uchun ruxsat kerak</translation> +<translation id="5075563999073408211">Qurilmani bitta yoki ikkita kalit tugma yordamida boshqaring. Kalit tugmalar klaviatura tugmalari, geympad tugmalari yoki maxsus qurilmalar boʻlishi mumkin.</translation> <translation id="5075910247684008552">Himoyalangan saytlarda zararli kontent avtomatik bloklanadi</translation> <translation id="5078638979202084724">Barcha ichki oynalarni xatcho‘plarga qo‘shish</translation> <translation id="5078796286268621944">Noto‘g‘ri PIN-kod</translation> @@ -4329,6 +4351,7 @@ <translation id="5154108062446123722"><ph name="PRINTING_DESTINATION" /> – kengaytirilgan sozlamalar</translation> <translation id="5154702632169343078">Subyekt</translation> <translation id="5155327081870541046">Manzil qatorida qidiriladigan sayt uchun “@bookmarks” kabi buyruqni kiriting. Keyin oldindan belgilangan tezkor tugmani bosib, qidiruv iborasini kiriting.</translation> +<translation id="5156638757840305347">Kursor chiqqanda yoki surilganda ajratib belgilanadi</translation> <translation id="5157635116769074044">Ushbu sahifani bosh ekranga qadab qo‘yish...</translation> <translation id="5159094275429367735">Crostini taʼminotini sozlash</translation> <translation id="5159419673777902220">Ota-onangiz bu kengaytma ruxsatlarini olib tashlagan</translation> @@ -4468,6 +4491,7 @@ <translation id="5293170712604732402">Sozlamalarni asliga qaytarish</translation> <translation id="5294097441441645251">Faqat kichik harf yoki ostki chiziq bilan boshlansin</translation> <translation id="5294618183559481278"><ph name="DEVICE_TYPE" /> qurilmangiz oldidagi odamlarni aniqlash uchun ichki sensordan foydalanadi. Barcha maʼlumotlar tezda qurilmangizda qayta ishlanadi va oʻchirib tashlanadi. Sensor maʼlumotlari hech qachon Googlega yuborilmaydi. <ph name="LINK_BEGIN" />Batafsil<ph name="LINK_END" /></translation> +<translation id="5296350763804564124">Oʻqib eshittirish orqali qurilmadan ekranga qaramay foydalanish mumkin. Ulangan qurilmada brayl aloqasi ishlaydi.</translation> <translation id="5297082477358294722">Parol saqlandi. <ph name="SAVED_PASSWORDS_STORE" /> omboridagi saqlangan parollarni ko‘rish va boshqarish.</translation> <translation id="5297946558563358707">Biror kishi ekraningizga qarasa, ekranning pastki oʻng burchagida koʻz belgisi chiqadi</translation> <translation id="5298219193514155779">Mavzu muallifi:</translation> @@ -5221,6 +5245,7 @@ <translation id="6043994281159824495">Chiqish</translation> <translation id="6045114302329202345">Asosiy TrackPoint tugmasi</translation> <translation id="6047632800149092791">Sinxronizatsiya ishlamayapti. Profilingizdan chiqing va qaytadan urining.</translation> +<translation id="6048747414605857443">ChromeVox va Teginib tinglash funksiyalari uchun nutq sintezatori ovozini tanlash va moslash</translation> <translation id="6049797270917061226">Bu fayl yordamida firibgarlar shaxsiy axborotingizni oʻgʻirlashi mumkin.</translation> <translation id="6051354611314852653">Bu qurilmada API ruxsatini berib bo‘lmadi.</translation> <translation id="6051638103735819069"><ph name="BEGIN_PARAGRAPH1" />ChromeOS qurilmalariga hisobotlarni avtomatik yuborishga ruxsat bersangiz, xatolarni tuzatish va ChromeOS tizimini yaxshilashimizda yordam bergan boʻlasiz. Bunday hisobotlarga ChromeOS qachon ishlamay qolgani, qaysi funksiyalardan foydalanilgani, odatda qancha xotira ishlatilishi, Android ilovasi diagnostika va foydalanish statistikasi kabi maʼlumotlar kirishi mumkin. Ayrim toʻplangan maʼlumotlar Android dasturchilar kabi hamkorlarimizga ham oʻz ilovalari va mahsulotlarini yanada yaxshilashga yordam beradi.<ph name="END_PARAGRAPH1" /> @@ -5344,6 +5369,7 @@ <translation id="6155141482566063812">Fondagi varaq ekraningizni uzatmoqda</translation> <translation id="6156323911414505561">Xatcho‘plar panelini ko‘rsatish</translation> <translation id="6156863943908443225">Skript keshi</translation> +<translation id="6156944117133588106">Planshet rejimida navigatsiya tugmalarini chiqarish</translation> <translation id="615930144153753547">Saytlar rasmlar chiqarishi mumkin</translation> <translation id="6160625263637492097">Haqiqiylik tekshiruvi uchun sertifikatlar taqdim etilishi</translation> <translation id="6163363155248589649">&Odatiy</translation> @@ -5676,6 +5702,7 @@ <translation id="6494445798847293442">Sertifikatlashtirish markazi emas</translation> <translation id="6494974875566443634">Moslashtirish</translation> <translation id="6497457470714179223">{NUM_FILES,plural, =0{Bu maʼlumotlarda maxfiy yoki xavfli kontent bor}=1{Bu faylda maxfiy yoki xavfli kontent bor}other{Bu fayllarda maxfiy yoki xavfli kontent bor}}</translation> +<translation id="6497784818439587832">Ekrandagi elementlarni kichiklashtirish yoki kattalashtirish uchun ekran oʻlchamini oʻzgartiring</translation> <translation id="6497789971060331894">Sichqoncha bilan teskari aylantirish</translation> <translation id="6498249116389603658">Barcha tillar</translation> <translation id="6499143127267478107">Proksi-server skriptida host manzili aniqlanmoqda...</translation> @@ -5769,6 +5796,7 @@ <translation id="6582274660680936615">Siz Mehmon rejimidasiz</translation> <translation id="6583328141350416497">Yuklab olishda davom etish</translation> <translation id="6584878029876017575">Microsoft doimiy imzolash vositasi</translation> +<translation id="6585584201072946561">Veb brauzerdagi matn hajmi va shriftni moslash</translation> <translation id="6586099239452884121">Mehmon rejimi</translation> <translation id="6586213706115310390">Asistentdan “Ok Google” deb aytib foydalanish.</translation> <translation id="6586451623538375658">Sichqoncha tugmalarining o‘rnini almashtirish</translation> @@ -6500,6 +6528,7 @@ <translation id="7312210124139670355">Administrator eSIM kartangizni tiklamoqda. Bu bir necha daqiqa vaqt olishi mumkin.</translation> <translation id="7320213904474460808">Standart tarmoqni tanlash</translation> <translation id="7321545336522791733">Server ayni vaqtda ish faoliyatida emas</translation> +<translation id="7323315405936922211">Kursor hududining hajmi</translation> <translation id="7324297612904500502">Beta Forum</translation> <translation id="7325209047678309347">Qogʻoz tiqilib qoldi</translation> <translation id="7326004502692201767">Bu <ph name="DEVICE_TYPE" /> qurilmasini farzand uchun sozlang</translation> @@ -6866,6 +6895,7 @@ <translation id="7665369617277396874">Hisob kiritish</translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{<ph name="DEVICE_TYPE" /> qurilmasini {NUM_WEEKS} hafta ichida qaytaring}other{<ph name="DEVICE_TYPE" /> qurilmasini {NUM_WEEKS} hafta ichida qaytaring}}</translation> <translation id="7668423670802040666"><ph name="ACCOUNT" /> uchun Google Parollar menejerida</translation> +<translation id="7668648754769651616">Qulaylik funksiyalari qurilmadan foydalanishni osonlashtiradi. Tezkor sozlamalarni ochish uchun ekranning quyi qismidagi vaqt ustiga bosing.</translation> <translation id="7669825497510425694">{NUM_ATTEMPTS,plural, =1{PIN kod xato. Yana bir marta urinishingiz mumkin.}other{PIN kod xato. Yana # marta urinishingiz mumkin.}}</translation> <translation id="7670434942695515800">Tizimning barcha imkoniyatlaridan foydalanish uchun uni eng oxirgi versiyaga yangilang. Yangilanish bajarilmay qolganda fayllarni zaxiralash tavsiya etiladi. Yangilanish boshlanganda Linux oʻchiriladi. Davom etishdan oldin ochiq fayllarni saqlang. <ph name="LINK_START" />Batafsil<ph name="LINK_END" /></translation> <translation id="7670483791111801022">Taglavhalar</translation> @@ -6922,6 +6952,7 @@ <translation id="7717014941119698257">Yuklab olinmoqda: <ph name="STATUS" /></translation> <translation id="771721654176725387">Bu foydalanuvchi brauzerining tarixi ushbu qurilmadan butunlay tozalanadi. Axborotlarni tiklash uchun sinxronizatsiyani yoqing</translation> <translation id="7717845620320228976">Yangilanish borligini tekshirish</translation> +<translation id="7718490543420739837">Ekran klaviaturasi, ovoz bilan oʻqish, Switch Access va boshqalar</translation> <translation id="7719367874908701697">Sahifa masshtabi</translation> <translation id="7719588063158526969">Qurilma nomi juda uzun</translation> <translation id="7720216670798402294">ChromeOS qurilmasi haqidagi axborot va qurilmadagi maʼlumotlarni oʻqish.</translation> @@ -7561,6 +7592,7 @@ <translation id="8314835274931377415">Switch Accessni sozlash boshlansinmi?</translation> <translation id="8317582043908962055">P&DF matnni tanitish</translation> <translation id="8317671367883557781">Yangi tarmoqqa ulanish</translation> +<translation id="8318266828739827371">Ekrandagi kattalashtirilgan hududni koʻrish uchun ekranni ikkiga ajrating. Mahkamlangan lupani yoqish yoki oʻchirish uchun Search+Ctrl+D tugmalarini bosing.</translation> <translation id="8319414634934645341">Kalitdan keng miqyosda foydalanish</translation> <translation id="8321837372750396788">Bu <ph name="DEVICE_TYPE" /> <ph name="MANAGER" /> tomonidan boshqariladi.</translation> <translation id="8322814362483282060">Bu sahifaning mikrofoningizdan foydalanishi bloklandi.</translation> @@ -7797,6 +7829,7 @@ <translation id="8574990355410201600"><ph name="HOST" /> saytida tovushni yoqish</translation> <translation id="8575286410928791436">Chiqish uchun <ph name="KEY_EQUIVALENT" /> tugmalarini bosib turing</translation> <translation id="8576885347118332789">{NUM_TABS,plural, =1{Varaqni mutolaa roʻyxatiga kiritish}other{Varaqlarni mutolaa roʻyxatiga kiritish}}</translation> +<translation id="8577052309681449949">Avtomatik kliklar, kursor hajmi, kursor rangi va boshqalar</translation> <translation id="8578639784464423491">99 ta harfdan oshmasligi zarur</translation> <translation id="857943718398505171">Ruxsat berilgan (tavsiya etiladi)</translation> <translation id="8581809080475256101">O‘tish uchun bosing, tarixni ko‘rish uchun kontekst menyusidan foydalaning</translation> @@ -7936,6 +7969,7 @@ <translation id="8708671767545720562">&Qo‘shimcha ma’lumot</translation> <translation id="8711402221661888347">Tuzlamalar</translation> <translation id="8712637175834984815">Tushunarli</translation> +<translation id="8713110120305151436">Tezkor sozlamalarda qulaylik parametrlarini chiqarish</translation> <translation id="8713570323158206935"><ph name="BEGIN_LINK1" />Tizim haqidagi ma’lumotlarni<ph name="END_LINK1" /> jo‘natish</translation> <translation id="8714838604780058252">Orqa fon</translation> <translation id="871515167518607670">Qurilmani tanlang. Keyin sahifani ochish uchun Chromeni oching.</translation> @@ -8081,6 +8115,7 @@ <translation id="8845001906332463065">Yordam</translation> <translation id="8846132060409673887">Kompyuter ishlab chiqaruvchisi va modeli haqidagi axborotni olish</translation> <translation id="8846163936679269230">eSIM profillarini asliga qaytarish</translation> +<translation id="8846239054091760429">Mono audio, boshlanishi, Jonli izoh va boshqalar</translation> <translation id="8847523528195140327">Muqova yopilganda hisobdan chiqish</translation> <translation id="8847988622838149491">USB</translation> <translation id="8849001918648564819">Yashirin</translation> @@ -8095,6 +8130,7 @@ <translation id="8859174528519900719">Subramka: <ph name="SUBFRAME_SITE" /></translation> <translation id="8859402192569844210">Xizmat shartlari yuklanmadi</translation> <translation id="8859662783913000679">Ota-ona hisobi</translation> +<translation id="8861568709166518036">Boshiga, orqaga va ilovalarni almashtirish uchun ekran tugmalaridan foydalanish. ChromeVox yoki avtomatik kliklar yoniq boʻlsa, avtomatik ishga tushadi.</translation> <translation id="8862003515646449717">Tezkor brauzerdan foydalaning</translation> <translation id="8863753581171631212">Havolani yangi <ph name="APP" /> dasturida ochish</translation> <translation id="8864055848767439877"><ph name="TAB_NAME" /> sahifasi <ph name="APP_NAME" /> ilovasiga ulashilmoqda</translation> @@ -8123,6 +8159,7 @@ <translation id="8879921471468674457">Kirish maʼlumotlarini eslab qolish</translation> <translation id="8880054210564666174">Kontaktlar roʻyxati yuklab olinmadi. Tarmoq aloqasini tekshiring yoki <ph name="LINK_BEGIN" />qaytadan urining<ph name="LINK_END" />.</translation> <translation id="8881020143150461183">Qayta urining. Yordam olish uchun <ph name="CARRIER_NAME" /> operatoriga murojaat qiling.</translation> +<translation id="888256071122006425">Sichqoncha va sensorli panel sozlamalari</translation> <translation id="8883273463630735858">Sensorli panelni tezlatkichni yoqish</translation> <translation id="8884023684057697730"><ph name="BEGIN_BOLD" />Maʼlumotlaringizni qanday boshqarish mumkin:<ph name="END_BOLD" /> Mafliylikni himoya qilish maqsadida biz 4 haftadan uzoq saqlangan saytlarni avtomatik oʻchiramiz. Takroriy ochilgan saytlar roʻyxatda qayta chiqishi mumkin. Yoki qiziqishlaringizni aniqlamasligi uchun saytni olib tashlashingiz mumkin.</translation> <translation id="8884570509232205463">Qurilmangiz hozir qulflanadi: <ph name="UNLOCK_TIME" />.</translation> @@ -8309,6 +8346,7 @@ <translation id="9066777626153702300">Nofaol saytlar</translation> <translation id="9066782832737749352">Nutq sintezatori</translation> <translation id="9068298336633421551">Joylashuv axborotiga ruxsati bor Android ilova va xizmatlariga bu qurilma joylashuvi haqidagi axborotdan foydalanishiga ruxsat bering. Joylashuv axborotining aniqligini oshirish hamda ayrim xizmatlar sifatini yaxshilash maqsadida Google vaqti-vaqti bilan foydalanuvchilarning joylashuvi haqidagi anonimlashtirilgan axborotni olib turishi ham mumkin.</translation> +<translation id="9068598199622656904">Tezkor tugma uchun tugmalarni birga bosib turish oʻrniga bir marta bosish</translation> <translation id="9068878141610261315">Bu fayl turi dastaklanmaydi</translation> <translation id="9070342919388027491">Varaq chapga olindi</translation> <translation id="9074739597929991885">Bluetooth</translation> @@ -8434,6 +8472,7 @@ <translation id="9186963452600581158">Farzandingizning Google hisobi bilan kiring</translation> <translation id="9187967020623675250">Kalitlar mos emas. <ph name="RESPONSE" /> uchun istalgan tugmani bosing.</translation> <translation id="9188732951356337132">Foydalanish va diagnostika axborotini yuborish. Bu qurilma hozirda qurilma va ilovalardan foydalanish haqidagi hamda diagnostika axborotini avtomatik tarzda Google kompaniyasiga yubormoqda. Ushbu axborotdan farzandingiz shaxsini aniqlash uchun foydalanilmaydi. Ular tizim va ilovalar barqarorligi kabilarni yaxshilash uchun ishlatiladi. Ayrim toʻplangan maʼlumotlar Android dasturchilar kabi hamkorlarimizga ham oʻz ilovalari va mahsulotlarini yanada yaxshilashga yordam beradi. Agar farzandingiz uchun Kengaytirilgan veb-qidiruv va ilovalar tarixi yoqilgan boʻlsa, bu maʼlumotlar uning Google hisobiga saqlanadi. <ph name="BEGIN_LINK2" />Batafsil<ph name="END_LINK2" /></translation> +<translation id="9192019773545828776">Oʻqib eshittirish orqali qurilmadan ekranga qaramay foydalanish mumkin. Ulangan qurilmada brayl aloqasi ishlaydi. ChromeVoxni yoqib oʻchirish uchun Ctrl+Alt+Z tugmalarini bosing. Yonga harakatlanish uchun Search+Chap strelka yoki Oʻng strelka tugmalarini bosing. Tanlash uchun Search+Boʻshliq (faollashtirish) tugmalarini bosing.</translation> <translation id="919686179725692564">Ilovalar zaxiralanishi haqida batafsil</translation> <translation id="9198090666959937775">Telefonni elektron kalit sifatida ishlatish</translation> <translation id="9199503643457729322">Maxfiylik qoʻllanmasidan chiqish uchun bosing.</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 3cd8dbb4..d4251a9 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -81,6 +81,7 @@ <translation id="1076766328672150609">Con bạn có thể dùng mã PIN để mở khóa thiết bị này.</translation> <translation id="1076818208934827215">Microsoft Internet Explorer</translation> <translation id="1076882167394279216">Không thể tải từ điển kiểm tra lỗi chính tả xuống cho <ph name="LANGUAGE" />. Hãy thử lại.</translation> +<translation id="1078037449555275327">Cài đặt ChromeVox</translation> <translation id="1079766198702302550">Luôn chặn quyền truy cập máy ảnh</translation> <translation id="1081956462909987459">{NUM_TABS,plural, =1{<ph name="GROUP_TITLE" /> – 1 thẻ}other{<ph name="GROUP_TITLE" /> – # thẻ}}</translation> <translation id="1082214733466244292">Quản trị viên của bạn đã chặn một số chức năng của thiết bị này</translation> @@ -400,6 +401,7 @@ <translation id="1390907927270446471"><ph name="PROFILE_USERNAME" /> không được phép in bằng <ph name="PRINTER_NAME" />. Vui lòng liên hệ với quản trị viên của bạn.</translation> <translation id="1393283411312835250">Mặt trời và những đám mây</translation> <translation id="1395730723686586365">Trình cập nhật đã bắt đầu</translation> +<translation id="1395832189806039783">Đánh dấu mục bằng tiêu điểm lấy bằng bàn phím</translation> <translation id="1396139853388185343">Lỗi khi thiết lập máy in</translation> <translation id="1396259464226642517">Đây không phải là kết quả bạn mong muốn? <ph name="BEGIN_LINK" />Gửi phản hồi<ph name="END_LINK" /></translation> <translation id="1396963298126346194">Tên người dùng và mật khẩu bạn đã nhập không khớp</translation> @@ -553,6 +555,7 @@ <translation id="1531734061664070992"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" />, <ph name="THIRD_SWITCH" /></translation> <translation id="1533948060140843887">Tôi hiểu rằng tệp tải xuống này sẽ gây hại cho máy tính của tôi</translation> <translation id="1535228823998016251">Lớn</translation> +<translation id="1535753739390684432">Nghe văn bản cụ thể được đọc thành tiếng. Trước tiên, hãy chọn biểu tượng Chọn để nói ở cuối màn hình, sau đó bôi đen phần văn bản bạn muốn nghe.</translation> <translation id="1536754031901697553">Đang ngắt kết nối...</translation> <translation id="1537254971476575106">Phóng to toàn bộ màn hình</translation> <translation id="15373452373711364">Con trỏ chuột lớn</translation> @@ -711,6 +714,7 @@ <translation id="166278006618318542">Thuật toán Khoá Công cộng Đối tượng</translation> <translation id="1662801900924515589">Đã cài đặt <ph name="APP" /></translation> <translation id="1666232093776384142">Tắt chế độ ngăn thiết bị ngoại vi truy cập vào dữ liệu</translation> +<translation id="1667842670298352129">Nghe văn bản cụ thể được đọc thành tiếng. Trước tiên, hãy chọn biểu tượng Chọn để nói ở cuối màn hình, sau đó bôi đen phần văn bản bạn muốn nghe. Bạn cũng có thể dùng phím tắt: Bôi đen văn bản rồi nhấn tổ hợp phím Tìm kiếm + S.</translation> <translation id="1668435968811469751">Đăng ký theo cách thủ công</translation> <translation id="1668979692599483141">Tìm hiểu về các đề xuất</translation> <translation id="1670399744444387456">Cơ bản</translation> @@ -738,6 +742,7 @@ <translation id="1692115862433274081">Sử dụng một tài khoản khác</translation> <translation id="1692118695553449118">Tính năng đồng bộ hóa đang bật</translation> <translation id="1692210323591458290">Tím đậm</translation> +<translation id="1692713444215319269">Cài đặt tính năng đảo màu, phóng to và chế độ hiển thị</translation> <translation id="1695487653372841667">Bạn có thể kiểm soát những dữ liệu nào được chia sẻ với Google. Bạn có thể thay đổi lựa chọn này bất cứ lúc nào trong phần Cài đặt.</translation> <translation id="1695510246756136088">Không thể kết nối Internet. Hãy thử lại.</translation> <translation id="169675691788639886">Thiết bị đã định cấu hình máy chủ SSH. Không đăng nhập bằng các tài khoản nhạy cảm.</translation> @@ -958,6 +963,7 @@ <translation id="1877520246462554164">Không nhận được mã thông báo xác thực. Vui lòng đăng xuất rồi đăng nhập lại để thử lại.</translation> <translation id="1877860345998737529">Gán công tắc cho hành động</translation> <translation id="1878155070920054810">Có vẻ như Chromebook sẽ hết pin trước khi quá trình cập nhật hoàn tất. Hãy đảm bảo Chromebook đang sạc đúng cách để tránh bị gián đoạn.</translation> +<translation id="1878885068166344708">Mục được đánh dấu khi bạn di chuyển tiêu điểm. Nhấn phím Tab hoặc chọn một mục để thay đổi tiêu điểm.</translation> <translation id="1879000426787380528">Đăng nhập bằng</translation> <translation id="18802377548000045">Các thẻ sẽ thu gọn theo chiều rộng có kích thước lớn</translation> <translation id="1880905663253319515">Xóa chứng chỉ "<ph name="CERTIFICATE_NAME" />"?</translation> @@ -985,6 +991,7 @@ <translation id="1904580727789512086">Các URL bạn truy cập sẽ được lưu vào Tài khoản Google của bạn</translation> <translation id="1905375423839394163">Tên thiết bị Chromebook</translation> <translation id="1906181697255754968">Các trang web thường truy cập vào tệp và thư mục trên thiết bị của bạn để áp dụng những tính năng như tự động lưu công việc</translation> +<translation id="1907044622262489040">Nhập dữ liệu bằng giọng nói. Nhấn tổ hợp phím Tìm kiếm + D, sau đó bắt đầu nói.</translation> <translation id="1908591798274282246">Mở lại nhóm đã đóng</translation> <translation id="1909880997794698664">Bạn có chắc chắn bạn muốn giữ vĩnh viễn thiết bị này ở chế độ kiosk không?</translation> <translation id="1915073950770830761">canary</translation> @@ -1339,6 +1346,7 @@ <translation id="2241053333139545397">Đọc và thay đổi dữ liệu của bạn trên một số trang web</translation> <translation id="2241634353105152135">Chỉ một lần</translation> <translation id="2242687258748107519">Thông tin tệp</translation> +<translation id="2245603955208828424">Nhấn các phím mũi tên để di chuyển qua từng mục theo chữ cái</translation> <translation id="2246129643805925002"><ph name="DEVICE_TYPE" /> của bạn tự động cập nhật ở chế độ nền để đem đến cho bạn những cải tiến về khả năng bảo mật và tính năng mới nhất. Bạn có thể xem xét các lựa chọn ưu tiên về bản cập nhật trong phần Cài đặt.</translation> <translation id="2246549592927364792">Lấy nội dung mô tả hình ảnh từ Google?</translation> <translation id="2247738527273549923">Thiết bị do tổ chức của bạn quản lý</translation> @@ -1444,6 +1452,7 @@ <translation id="2317842250900878657">Đã hoàn tất <ph name="PROGRESS_PERCENT" />%</translation> <translation id="2318143611928805047">Khổ giấy</translation> <translation id="2318817390901984578">Để sử dụng ứng dụng Android, hãy tính phí và cập nhật <ph name="DEVICE_TYPE" /> của bạn.</translation> +<translation id="2319459402137712349">Chọn một trường văn bản để mở bàn phím. Bạn cũng có thể chọn biểu tượng Bàn phím ở cuối màn hình.</translation> <translation id="2319993584768066746">Ảnh trên màn hình đăng nhập</translation> <translation id="2322193970951063277">Đầu trang và chân trang</translation> <translation id="2322318151094136999">Hỏi khi có trang web muốn truy cập vào cổng nối tiếp (khuyên dùng)</translation> @@ -1518,6 +1527,7 @@ <translation id="2379281330731083556">In bằng hộp thoại hệ thống... <ph name="SHORTCUT_KEY" /></translation> <translation id="2381499968174336913">Bản xem trước của thẻ được chia sẻ</translation> <translation id="2381756643783702095">Hỏi trước khi gửi (được đề xuất)</translation> +<translation id="2383825469508278924">Thay đổi sơ đồ phím của bàn phím, phím chức năng và nhiều tính năng khác</translation> <translation id="2386202302581016807">Không thể hoàn tất quá trình thiết lập do dung lượng lưu trữ hiện có của thiết bị quá thấp</translation> <translation id="2387052489799050037">Chuyển đến Màn hình chính</translation> <translation id="2387602571959163792"><ph name="DESK_NAME" /> (Hiện tại)</translation> @@ -1695,6 +1705,7 @@ <translation id="2542050502251273923">Đặt cấp gỡ lỗi cho trình quản lý kết nối mạng và các dịch vụ khác bằng ff_debug.</translation> <translation id="2544352060595557290">Thẻ này</translation> <translation id="2546302722632337735">Không cho phép các trang dùng giá trị nhận dạng để phát nội dung được bảo vệ</translation> +<translation id="2546991196809436099">Phóng to để tăng kích thước các mục trên màn hình. Nhấn tổ hợp phím Tìm kiếm + Ctrl + M để bật và tắt tính năng phóng to.</translation> <translation id="2548347166720081527">Đã cho phép <ph name="PERMISSION" /></translation> <translation id="2548545707296594436">Đặt lại bộ nhớ đệm của hồ sơ eSIM</translation> <translation id="2549985041256363841">Bắt đầu ghi</translation> @@ -1853,6 +1864,7 @@ <translation id="2715640894224696481">Yêu cầu về khóa bảo mật</translation> <translation id="2715751256863167692">Bản nâng cấp này sẽ đặt lại Chromebook và xóa dữ liệu người dùng hiện tại.</translation> <translation id="2716986496990888774">Tùy chọn cài đặt này do cha mẹ quản lý.</translation> +<translation id="271749239614426244">Bỏ qua chuyển động nhỏ của con trỏ</translation> <translation id="2718395828230677721">Ánh sáng đêm</translation> <translation id="2718998670920917754">Phần mềm chống vi-rút đã phát hiện thấy một vi-rút.</translation> <translation id="2719936478972253983">Các cookie sau đã bị chặn</translation> @@ -2421,6 +2433,7 @@ <translation id="3274763671541996799">Bạn đang ở chế độ toàn màn hình.</translation> <translation id="3275778809241512831">Khóa bảo mật nội bộ của bạn hiện không an toàn. Vui lòng xóa khóa khỏi mọi dịch vụ mà bạn đã dùng khóa đó. Để khắc phục sự cố này, vui lòng đặt lại khóa bảo mật.</translation> <translation id="3275778913554317645">Mở dưới dạng cửa sổ</translation> +<translation id="3277214528693754078">Di chuyển bằng con trỏ văn bản (duyệt web bằng con nháy)</translation> <translation id="3278001907972365362">Bạn cần chú ý đến Tài khoản Google của mình</translation> <translation id="3279092821516760512">Những người liên hệ mà bạn đã chọn có thể chia sẻ với bạn khi họ ở gần. Quá trình truyền tệp sẽ bắt đầu khi bạn chấp nhận.</translation> <translation id="3279230909244266691">Quá trình này có thể mất vài phút. Đang khởi động máy ảo.</translation> @@ -2734,6 +2747,7 @@ <translation id="3578874072190212775">Giúp các trang web ngăn chặn hành vi lừa đảo và phân biệt bot với người</translation> <translation id="3581605050355435601">Tự động định cấu hình địa chỉ IP</translation> <translation id="3582057310199111521">Bạn đã nhập mật khẩu vào trang web lừa đảo và mật khẩu này được phát hiện thấy trong một sự cố rò rỉ dữ liệu</translation> +<translation id="3582299299336701326">Làm tối màn hình sáng và làm sáng màn hình tối. Nhấn tổ hợp phím Tìm kiếm + Ctrl + H để bật và tắt tính năng đảo màu.</translation> <translation id="3584169441612580296">Đọc và thay đổi ảnh, nhạc và phương tiện khác từ máy tính của bạn</translation> <translation id="3586806079541226322">Không thể mở tệp này</translation> <translation id="3586931643579894722">Ẩn chi tiết</translation> @@ -2850,6 +2864,7 @@ <translation id="369135240373237088">Đăng nhập lại bằng tài khoản trường học</translation> <translation id="3693415264595406141">Mật khẩu:</translation> <translation id="3694027410380121301">Chọn Thẻ Trước</translation> +<translation id="3694590407685276748">Đánh dấu con trỏ văn bản</translation> <translation id="369489984217678710">Mật khẩu và các dữ liệu đăng nhập khác</translation> <translation id="369522892592566391">{NUM_FILES,plural, =0{Đã kiểm tra bảo mật xong. Dữ liệu của bạn sẽ được tải lên.}=1{Đã kiểm tra bảo mật xong. Tệp của bạn sẽ được tải lên.}other{Đã kiểm tra bảo mật xong. Các tệp của bạn sẽ được tải lên.}}</translation> <translation id="3698471669415859717">Hoàn tất quá trình xem xét</translation> @@ -2985,6 +3000,7 @@ <translation id="3814529970604306954">Tài khoản trường học</translation> <translation id="3816118180265633665">Màu Chrome</translation> <translation id="3817524650114746564">Mở tùy chọn cài đặt proxy trên máy tính của bạn</translation> +<translation id="3819164369574292143">Phóng to để tăng kích thước các mục trên màn hình. Nhấn tổ hợp phím Tìm kiếm + Ctrl + M để bật và tắt tính năng phóng to. Nhấn tổ hợp phím Ctrl + Alt + Phím mũi tên để di chuyển xung quanh khi đã phóng to.</translation> <translation id="3819257035322786455">Sao lưu</translation> <translation id="3819261658055281761">Hệ thống không lưu trữ được mã thông báo truy cập API dài hạn cho thiết bị này.</translation> <translation id="3819800052061700452">&Toàn màn hình</translation> @@ -3232,6 +3248,7 @@ <translation id="403725336528835653">Dùng thử trước</translation> <translation id="4040105702484676956">Xóa tất cả dữ liệu trang web và quyền của <ph name="SITE_NAME" />, cũng như các ứng dụng đã cài đặt của trang web này?</translation> <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Thoát khỏi trang}other{Thoát khỏi trang}}</translation> +<translation id="4043267180218562935">Kích thước con trỏ</translation> <translation id="4044612648082411741">Nhập mật khẩu chứng chỉ của bạn</translation> <translation id="4044708573046946214">Phương thức khóa màn hình: mật khẩu</translation> <translation id="404493185430269859">Công cụ tìm kiếm mặc định</translation> @@ -3350,6 +3367,7 @@ <translation id="4152670763139331043">{NUM_TABS,plural, =1{1 thẻ}other{# thẻ}}</translation> <translation id="4154664944169082762">Dấu vân tay</translation> <translation id="4157869833395312646">Mã hóa Cổng Máy chủ của Microsoft</translation> +<translation id="4158315983204257156">Phông chữ và kích thước văn bản của trang web</translation> <translation id="4158364720893025815">Đạt</translation> <translation id="4159681666905192102">Đây là tài khoản cho trẻ em do <ph name="CUSTODIAN_EMAIL" /> và <ph name="SECOND_CUSTODIAN_EMAIL" /> quản lý.</translation> <translation id="4163560723127662357">Bàn phím không xác định</translation> @@ -3907,6 +3925,7 @@ <translation id="4699357559218762027">(tự động chạy)</translation> <translation id="4701025263201366865">Hoạt động đăng nhập của cha mẹ</translation> <translation id="4701335814944566468">Vừa xem hôm qua</translation> +<translation id="470644585772471629">Đảo màu</translation> <translation id="4707337002099455863">Luôn cho phép trên mọi trang web</translation> <translation id="4708794300267213770">Hiển thị màn hình khóa khi đánh thức từ chế độ ngủ</translation> <translation id="4708849949179781599">Thoát <ph name="PRODUCT_NAME" /></translation> @@ -3920,6 +3939,8 @@ <translation id="4723140812774948886">Hoán đổi với mục tiếp theo</translation> <translation id="4724450788351008910">Đã thay đổi Liên kết</translation> <translation id="4725511304875193254">Chó Corgi</translation> +<translation id="4726710355753484204">Nhấn tổ hợp phím Ctrl + Alt + Tăng độ sáng để phóng to. +Nhấn tổ hợp phím Ctrl + Alt + Giảm độ sáng để thu nhỏ.</translation> <translation id="4726710629007580002">Đã có cảnh báo khi cố cài đặt tiện ích này:</translation> <translation id="4727847987444062305">Phiên khách được quản lý</translation> <translation id="4728558894243024398">Nền tảng</translation> @@ -4261,6 +4282,7 @@ <translation id="5073956501367595100">{0,plural,offset:2 =1{<ph name="FILE1" />}=2{<ph name="FILE1" />, <ph name="FILE2" />}other{<ph name="FILE1" />, <ph name="FILE2" /> và # tệp khác}}</translation> <translation id="5074318175948309511">Có thể cần phải tải lại trang này trước khi cài đặt mới có hiệu lực.</translation> <translation id="5074761966806028321">Vẫn cần quyền để hoàn tất quá trình thiết lập</translation> +<translation id="5075563999073408211">Điều khiển thiết bị bằng một hoặc nhiều công tắc. Công tắc có thể là phím trên bàn phím, nút trên tay điều khiển trò chơi hoặc các thiết bị chuyên dụng.</translation> <translation id="5075910247684008552">Theo mặc định, các trang web an toàn sẽ chặn nội dung không an toàn</translation> <translation id="5078638979202084724">Đánh dấu trang tất cả các thẻ</translation> <translation id="5078796286268621944">Mã PIN không chính xác</translation> @@ -4339,6 +4361,7 @@ <translation id="5154108062446123722">Cài đặt nâng cao cho <ph name="PRINTING_DESTINATION" /></translation> <translation id="5154702632169343078">Chủ đề</translation> <translation id="5155327081870541046">Trong thanh địa chỉ, hãy nhập lối tắt cho trang web bạn muốn tìm kiếm, chẳng hạn như "@bookmarks". Sau đó, nhấn phím tắt ưu tiên của bạn rồi nhập cụm từ tìm kiếm.</translation> +<translation id="5156638757840305347">Con trỏ được đánh dấu khi xuất hiện hoặc di chuyển</translation> <translation id="5157635116769074044">Ghim trang này vào màn hình bắt đầu...</translation> <translation id="5159094275429367735">Thiết lập Crostini</translation> <translation id="5159419673777902220">Cha mẹ của bạn đã tắt quyền sử dụng tiện ích</translation> @@ -4478,6 +4501,7 @@ <translation id="5293170712604732402">Khôi phục cài đặt về mặc định ban đầu</translation> <translation id="5294097441441645251">Phải bắt đầu bằng ký tự viết thường hoặc dấu gạch dưới</translation> <translation id="5294618183559481278"><ph name="DEVICE_TYPE" /> của bạn dùng một cảm biến tích hợp sẵn để phát hiện người ở đối diện thiết bị. Mọi dữ liệu đều được xử lý ngay trên thiết bị và sau đó sẽ được xoá. Dữ liệu cảm biến không bao giờ được gửi cho Google. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation> +<translation id="5296350763804564124">Nghe phản hồi bằng giọng nói để sử dụng thiết bị mà không cần nhìn vào màn hình. Bạn có thể xem phản hồi bằng chữ nổi qua thiết bị đã kết nối.</translation> <translation id="5297082477358294722">Đã lưu mật khẩu. Hãy xem và quản lý mật khẩu đã lưu trong <ph name="SAVED_PASSWORDS_STORE" /> của bạn.</translation> <translation id="5297946558563358707">Khi ai đó nhìn vào màn hình của bạn, hãy làm hiện biểu tượng con mắt Quyền riêng tư ở góc dưới cùng bên phải màn hình</translation> <translation id="5298219193514155779">Chủ đề được tạo bởi</translation> @@ -5231,6 +5255,7 @@ <translation id="6043994281159824495">Đăng xuất bây giờ</translation> <translation id="6045114302329202345">Nút TrackPoint chính</translation> <translation id="6047632800149092791">Tính năng đồng bộ hóa hiện không hoạt động. Hãy thử đăng xuất rồi đăng nhập lại.</translation> +<translation id="6048747414605857443">Chọn và tuỳ chỉnh giọng nói của tính năng chuyển văn bản sang lời nói cho ChromeVox và tính năng Chọn để nói</translation> <translation id="6049797270917061226">Tệp này có thể cho phép kẻ tấn công đánh cắp thông tin cá nhân của bạn.</translation> <translation id="6051354611314852653">Rất tiếc! Hệ thống không cho phép truy cập API cho thiết bị này.</translation> <translation id="6051638103735819069"><ph name="BEGIN_PARAGRAPH1" />Việc cho phép các thiết bị Chrome OS gửi báo cáo tự động sẽ giúp chúng tôi ưu tiên những vấn đề cần khắc phục và cải thiện trong Chrome OS. Các báo cáo này có thể bao gồm những nội dung như thời điểm Chrome OS gặp sự cố, những tính năng nào đã hoạt động, mức bộ nhớ thường được sử dụng cũng như dữ liệu sử dụng và thông tin chẩn đoán ứng dụng Android. Một số dữ liệu tổng hợp cũng sẽ hữu ích cho các ứng dụng và đối tác của Google, chẳng hạn như những nhà phát triển Android.<ph name="END_PARAGRAPH1" /> @@ -5354,6 +5379,7 @@ <translation id="6155141482566063812">Thẻ nền đang chia sẻ màn hình</translation> <translation id="6156323911414505561">Hiển thị thanh dấu trang</translation> <translation id="6156863943908443225">Bộ nhớ đệm tập lệnh</translation> +<translation id="6156944117133588106">Hiện các nút thao tác ở chế độ máy tính bảng</translation> <translation id="615930144153753547">Các trang web có thể hiện hình ảnh</translation> <translation id="6160625263637492097">Cung cấp chứng chỉ để xác thực</translation> <translation id="6163363155248589649">Thườ&ng</translation> @@ -5684,6 +5710,7 @@ <translation id="6494445798847293442">Không phải tổ chức phát hành chứng chỉ</translation> <translation id="6494974875566443634">Tùy chỉnh</translation> <translation id="6497457470714179223">{NUM_FILES,plural, =0{Dữ liệu này có chứa nội dung nhạy cảm hoặc nguy hiểm}=1{Tệp này có chứa nội dung nhạy cảm hoặc nguy hiểm}other{Các tệp này có chứa nội dung nhạy cảm hoặc nguy hiểm}}</translation> +<translation id="6497784818439587832">Thay đổi kích thước hiển thị để thu nhỏ hoặc phóng to các mục trên màn hình</translation> <translation id="6497789971060331894">Đảo ngược hướng cuộn chuột</translation> <translation id="6498249116389603658">&Tất cả ngôn ngữ của bạn</translation> <translation id="6499143127267478107">Đang khắc phục máy chủ trong tập lệnh proxy...</translation> @@ -5777,6 +5804,7 @@ <translation id="6582274660680936615">Bạn đang duyệt web với tư cách Khách</translation> <translation id="6583328141350416497">Tiếp tục tải xuống</translation> <translation id="6584878029876017575">Ký Trọn đời của Microsoft</translation> +<translation id="6585584201072946561">Tuỳ chỉnh phông chữ và kích thước văn bản cho trình duyệt web</translation> <translation id="6586099239452884121">Duyệt với tư cách khách</translation> <translation id="6586213706115310390">Nói "Ok Google" khi bạn muốn dùng Trợ lý.</translation> <translation id="6586451623538375658">Hoán đổi nút chuột chính</translation> @@ -6507,6 +6535,7 @@ <translation id="7312210124139670355">Quản trị viên đang đặt lại eSIM của bạn. Quá trình này có thể mất vài phút.</translation> <translation id="7320213904474460808">Đặt mạng mặc định</translation> <translation id="7321545336522791733">Máy chủ không truy cập được</translation> +<translation id="7323315405936922211">Kích thước vùng con trỏ</translation> <translation id="7324297612904500502">Diễn đàn beta</translation> <translation id="7325209047678309347">Kẹt giấy</translation> <translation id="7326004502692201767">Thiết lập <ph name="DEVICE_TYPE" /> này cho trẻ</translation> @@ -6873,6 +6902,7 @@ <translation id="7665369617277396874">Thêm tài khoản</translation> <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{Trả lại thiết bị <ph name="DEVICE_TYPE" /> trong vòng {NUM_WEEKS} tuần}other{Trả lại thiết bị <ph name="DEVICE_TYPE" /> trong vòng {NUM_WEEKS} tuần}}</translation> <translation id="7668423670802040666">Trong Trình quản lý mật khẩu của Google cho <ph name="ACCOUNT" /></translation> +<translation id="7668648754769651616">Bộ tính năng hỗ trợ tiếp cận giúp thiết bị của bạn dễ sử dụng hơn. Để truy cập phần Cài đặt nhanh, hãy chọn vùng báo thời gian ở cuối màn hình.</translation> <translation id="7669825497510425694">{NUM_ATTEMPTS,plural, =1{Mã PIN không chính xác. Bạn còn một lần thử.}other{Mã PIN không chính xác. Bạn còn # lần thử.}}</translation> <translation id="7670434942695515800">Để có hiệu suất tốt nhất, hãy nâng cấp lên phiên bản mới nhất. Bạn nên sao lưu tệp phòng trường hợp quá trình nâng cấp không thể hoàn tất. Khi quá trình nâng cấp bắt đầu, Linux sẽ tắt. Vui lòng lưu các tệp đang mở trước khi tiếp tục. <ph name="LINK_START" />Tìm hiểu thêm<ph name="LINK_END" /></translation> <translation id="7670483791111801022">Phụ đề</translation> @@ -6929,6 +6959,7 @@ <translation id="7717014941119698257">Đang tải xuống: <ph name="STATUS" /></translation> <translation id="771721654176725387">Thao tác này sẽ xóa vĩnh viễn dữ liệu duyệt web của bạn khỏi thiết bị này. Để khôi phục dữ liệu, hãy bật tùy chọn đồng bộ hóa cho địa chỉ email</translation> <translation id="7717845620320228976">Kiểm tra để tìm bản cập nhật</translation> +<translation id="7718490543420739837">Bàn phím ảo, nhập bằng giọng nói, Tiếp cận bằng công tắc và các tính năng khác</translation> <translation id="7719367874908701697">Thu phóng trang</translation> <translation id="7719588063158526969">Tên thiết bị quá dài</translation> <translation id="7720216670798402294">Đọc thông tin thiết bị và dữ liệu thiết bị ChromeOS.</translation> @@ -7570,6 +7601,7 @@ <translation id="8314835274931377415">Bắt đầu quá trình thiết lập tính năng Tiếp cận bằng công tắc?</translation> <translation id="8317582043908962055">Nhận dạng văn bản PDF</translation> <translation id="8317671367883557781">Thêm kết nối mạng</translation> +<translation id="8318266828739827371">Sử dụng chế độ xem chia đôi màn hình để xem vùng được phóng to trên màn hình. Nhấn tổ hợp phím Tìm kiếm + Ctrl + D để bật và tắt tính năng phóng to ở vị trí cố định.</translation> <translation id="8319414634934645341">Sử dụng Khoá Mở rộng</translation> <translation id="8321837372750396788"><ph name="DEVICE_TYPE" /> này sẽ do <ph name="MANAGER" /> quản lý.</translation> <translation id="8322814362483282060">Trang này đã bị chặn truy cập micrô của bạn.</translation> @@ -7806,6 +7838,7 @@ <translation id="8574990355410201600">Luôn cho phép phát âm thanh trên <ph name="HOST" /></translation> <translation id="8575286410928791436">Giữ phím <ph name="KEY_EQUIVALENT" /> để thoát</translation> <translation id="8576885347118332789">{NUM_TABS,plural, =1{Thêm thẻ vào danh sách đọc}other{Thêm các thẻ vào danh sách đọc}}</translation> +<translation id="8577052309681449949">Tự động nhấp, kích thước con trỏ, màu con trỏ và nhiều tính năng khác</translation> <translation id="8578639784464423491">Không được vượt quá 99 chữ cái</translation> <translation id="857943718398505171">Được phép (nên dùng)</translation> <translation id="8581809080475256101">Nhấn để tiếp tục, nhấn menu ngữ cảnh để xem lịch sử</translation> @@ -7945,6 +7978,7 @@ <translation id="8708671767545720562">&Thông tin khác</translation> <translation id="8711402221661888347">Đồ chua</translation> <translation id="8712637175834984815">Bỏ qua</translation> +<translation id="8713110120305151436">Hiện các tuỳ chọn hỗ trợ tiếp cận trong phần Cài đặt nhanh</translation> <translation id="8713570323158206935">Gửi <ph name="BEGIN_LINK1" />thông tin hệ thống<ph name="END_LINK1" /></translation> <translation id="8714838604780058252">Đồ họa nền</translation> <translation id="871515167518607670">Hãy chọn một thiết bị. Sau đó, hãy mở Chrome trên thiết bị đó để xem trang.</translation> @@ -8090,6 +8124,7 @@ <translation id="8845001906332463065">Nhận trợ giúp</translation> <translation id="8846132060409673887">Đọc thông tin về nhà sản xuất và kiểu máy của máy tính này</translation> <translation id="8846163936679269230">Đặt lại hồ sơ eSIM</translation> +<translation id="8846239054091760429">Âm thanh đơn âm, âm thanh khi khởi động, phụ đề trực tiếp và các tính năng khác</translation> <translation id="8847523528195140327">Đăng xuất khi đóng nắp màn hình</translation> <translation id="8847988622838149491">USB</translation> <translation id="8849001918648564819">Đã ẩn</translation> @@ -8104,6 +8139,7 @@ <translation id="8859174528519900719">Khung phụ: <ph name="SUBFRAME_SITE" /></translation> <translation id="8859402192569844210">Không thể tải Điều khoản dịch vụ</translation> <translation id="8859662783913000679">Tài khoản của cha mẹ</translation> +<translation id="8861568709166518036">Sử dụng các nút trên màn hình để về trang chủ, quay lại và chuyển đổi giữa các ứng dụng. Chế độ này sẽ tự động bật nếu ChromeVox hoặc tính năng tự động nhấp bật.</translation> <translation id="8862003515646449717">Chuyển sang một trình duyệt nhanh</translation> <translation id="8863753581171631212">Mở đường liên kết trong <ph name="APP" /> mới</translation> <translation id="8864055848767439877">Đang chia sẻ <ph name="TAB_NAME" /> với <ph name="APP_NAME" /></translation> @@ -8132,6 +8168,7 @@ <translation id="8879921471468674457">Ghi nhớ thông tin đăng nhập</translation> <translation id="8880054210564666174">Không thể tải danh bạ xuống. Vui lòng kiểm tra kết nối mạng hoặc <ph name="LINK_BEGIN" />thử lại<ph name="LINK_END" />.</translation> <translation id="8881020143150461183">Vui lòng thử lại. Nếu cần hỗ trợ kỹ thuật, hãy liên hệ với <ph name="CARRIER_NAME" />.</translation> +<translation id="888256071122006425">Cài đặt chuột và bàn di chuột</translation> <translation id="8883273463630735858">Bật tính năng tăng tốc bàn di chuột</translation> <translation id="8884023684057697730"><ph name="BEGIN_BOLD" />Cách bạn có thể quản lý dữ liệu của mình:<ph name="END_BOLD" /> Để bảo vệ quyền riêng tư của bạn, chúng tôi tự động xoá khỏi danh sách các trang web không được làm mới sau 4 tuần. Trang web bạn truy cập lại có thể sẽ xuất hiện lại trong danh sách. Bạn cũng có thể xoá một trang web nếu không muốn hệ thống dựa vào trang web đó để ước đoán mối quan tâm của bạn.</translation> <translation id="8884570509232205463">Giờ đây, thiết bị của bạn sẽ khóa lúc <ph name="UNLOCK_TIME" />.</translation> @@ -8318,6 +8355,7 @@ <translation id="9066777626153702300">Trang web không hoạt động</translation> <translation id="9066782832737749352">Chuyển văn bản sang lời nói</translation> <translation id="9068298336633421551">Cho phép các ứng dụng Android và dịch vụ có quyền truy cập thông tin vị trí được dùng thông tin vị trí của thiết bị. Google có thể định kỳ thu thập dữ liệu vị trí và sử dụng dữ liệu này theo cách ẩn danh nhằm cải thiện độ chính xác của vị trí và các dịch vụ dựa trên vị trí.</translation> +<translation id="9068598199622656904">Nhấn lần lượt từng phím để sử dụng phím tắt thay vì nhấn và giữ nhiều phím cùng lúc</translation> <translation id="9068878141610261315">Loại tệp không được hỗ trợ</translation> <translation id="9070342919388027491">Đã di chuyển thẻ sang trái</translation> <translation id="9074739597929991885">Bluetooth</translation> @@ -8443,6 +8481,7 @@ <translation id="9186963452600581158">Đăng nhập bằng Tài khoản Google của trẻ</translation> <translation id="9187967020623675250">Các phím không khớp. Hãy nhấn phím bất kỳ để <ph name="RESPONSE" />.</translation> <translation id="9188732951356337132">Gửi dữ liệu chẩn đoán và dữ liệu về mức sử dụng. Thiết bị này hiện tự động gửi dữ liệu chẩn đoán, dữ liệu về mức sử dụng ứng dụng và thiết bị cho Google. Những thông tin này sẽ không dùng để nhận dạng con bạn mà giúp tăng độ ổn định của hệ thống và ứng dụng cũng như cải thiện các mặt khác. Một số dữ liệu tổng hợp cũng sẽ hữu ích cho các ứng dụng và đối tác của Google, chẳng hạn như những nhà phát triển Android. Nếu bạn bật chế độ cài đặt bổ sung Hoạt động trên web và ứng dụng cho con mình thì dữ liệu này có thể được lưu vào Tài khoản Google của trẻ. <ph name="BEGIN_LINK2" />Tìm hiểu thêm<ph name="END_LINK2" /></translation> +<translation id="9192019773545828776">Nghe phản hồi bằng giọng nói để sử dụng thiết bị mà không cần nhìn vào màn hình. Bạn có thể xem phản hồi bằng chữ nổi qua thiết bị đã kết nối. Nhấn tổ hợp phím Ctrl + Alt + Z để bật và tắt ChromeVox. Nhấn tổ hợp phím Tìm kiếm + Mũi tên trái hoặc Mũi tên phải để di chuyển. Nhấn tổ hợp phím Tìm kiếm + Phím cách để chọn (kích hoạt).</translation> <translation id="919686179725692564">Tìm hiểu thêm về cách sao lưu ứng dụng</translation> <translation id="9198090666959937775">Dùng điện thoại Android làm khóa bảo mật</translation> <translation id="9199503643457729322">Nhấp vào nút này để rời khỏi Hướng dẫn về quyền riêng tư.</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index b5e4b96..9bbcf3d 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -5911,6 +5911,7 @@ <translation id="6709133671862442373">新聞內容</translation> <translation id="6709357832553498500">使用「<ph name="EXTENSIONNAME" />」連線</translation> <translation id="6710213216561001401">上一個</translation> +<translation id="6710394144992407503">在網頁上輸入文字時,檢查是否有拼字錯誤</translation> <translation id="6711146141291425900">連結「<ph name="WEB_DRIVE" />」帳戶即可重新轉送下載檔案</translation> <translation id="6712943853047024245">您已使用此使用者名稱儲存了 <ph name="WEBSITE" /> 的密碼</translation> <translation id="6713233729292711163">新增工作設定檔</translation> @@ -6529,6 +6530,7 @@ <translation id="7340757554212515731">自動將當機報告、診斷和使用情況資料自動傳送給 Google</translation> <translation id="7341834142292923918">需要在此網站上執行</translation> <translation id="7343372807593926528">請在傳送意見前說明問題。</translation> +<translation id="7344585835349671209">管理裝置上的 HTTPS/SSL 憑證</translation> <translation id="7345706641791090287">確認密碼</translation> <translation id="7346909386216857016">好,我知道了</translation> <translation id="7347452120014970266">此操作會清除 <ph name="ORIGIN_NAME" /> 儲存的所有資料和 Cookie,以及該網站所安裝的應用程式</translation> @@ -6658,6 +6660,7 @@ <translation id="7460045493116006516">您目前安裝的主題</translation> <translation id="7461924472993315131">Pin</translation> <translation id="746216226901520237">下次您便可使用手機來解鎖 <ph name="DEVICE_TYPE" />。您可在「設定」中停用 Smart Lock。</translation> +<translation id="7464153996453281700">元件已是最新版本</translation> <translation id="7464637891177137294">將密碼儲存在 Google 帳戶 (<ph name="ACCOUNT" />) 中</translation> <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{已開啟 # 個分頁,按下即可切換標籤列}other{已開啟 # 個分頁,按下即可切換標籤列}}</translation> <translation id="7465635034594602553">發生錯誤,請等候數分鐘,然後再次執行 <ph name="APP_NAME" />。</translation> @@ -7166,6 +7169,7 @@ <translation id="793531125873261495">下載虛擬機器時發生錯誤,請再試一次。</translation> <translation id="7935451262452051102">已完成 <ph name="PERCENT" />%</translation> <translation id="7939062555109487992">進階選項</translation> +<translation id="7939328347457537652">管理裝置憑證</translation> <translation id="7939412583708276221">保留</translation> <translation id="7942349550061667556">紅色</translation> <translation id="7943368935008348579">下載 PDF</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index 43ede88..d64ea879 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -5893,6 +5893,7 @@ <translation id="6709133671862442373">新聞內容</translation> <translation id="6709357832553498500">使用「<ph name="EXTENSIONNAME" />」連線</translation> <translation id="6710213216561001401">返回</translation> +<translation id="6710394144992407503">在網頁上輸入文字時,檢查是否有拼字錯誤</translation> <translation id="6711146141291425900">連結「<ph name="WEB_DRIVE" />」帳戶即可重新轉送下載內容</translation> <translation id="6712943853047024245">你已儲存過這個使用者名稱在「<ph name="WEBSITE" />」的密碼</translation> <translation id="6713233729292711163">新增工作資料夾</translation> @@ -6511,6 +6512,7 @@ <translation id="7340757554212515731">自動將當機報告連同診斷與使用資料傳送給 Google</translation> <translation id="7341834142292923918">需要這個網站的存取權限</translation> <translation id="7343372807593926528">請先說明問題再傳送意見回饋。</translation> +<translation id="7344585835349671209">管理裝置上的 HTTPS/SSL 憑證</translation> <translation id="7345706641791090287">確認您的密碼</translation> <translation id="7346909386216857016">好,我知道了</translation> <translation id="7347452120014970266">這會清除 <ph name="ORIGIN_NAME" /> 儲存的所有資料和 Cookie,以及該網站所安裝的應用程式資料和 Cookie</translation> @@ -6640,6 +6642,7 @@ <translation id="7460045493116006516">你目前安裝的主題</translation> <translation id="7461924472993315131">固定</translation> <translation id="746216226901520237">下次手機會為你的 <ph name="DEVICE_TYPE" /> 解鎖。你可以在「設定」中停用 Smart Lock。</translation> +<translation id="7464153996453281700">元件已是最新版本</translation> <translation id="7464637891177137294">將密碼儲存在你的 Google 帳戶 (<ph name="ACCOUNT" />) 中</translation> <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{已開啟 # 個分頁,按下即可切換分頁列}other{已開啟 # 個分頁,按下即可切換分頁列}}</translation> <translation id="7465635034594602553">發生錯誤,請過幾分鐘後再重新執行「<ph name="APP_NAME" />」。</translation> @@ -7148,6 +7151,7 @@ <translation id="793531125873261495">下載虛擬機器時發生錯誤,請再試一次。</translation> <translation id="7935451262452051102">已完成 <ph name="PERCENT" />%</translation> <translation id="7939062555109487992">進階選項</translation> +<translation id="7939328347457537652">管理裝置憑證</translation> <translation id="7939412583708276221">保留</translation> <translation id="7942349550061667556">紅色</translation> <translation id="7943368935008348579">下載 PDF</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb index 9a18543b..e7bb086 100644 --- a/chrome/app/resources/google_chrome_strings_ca.xtb +++ b/chrome/app/resources/google_chrome_strings_ca.xtb
@@ -65,6 +65,7 @@ <translation id="2139300032719313227">Reinicia Chrome OS</translation> <translation id="2151406531797534936">Reinicia Chrome ara</translation> <translation id="2174917724755363426">La instal·lació no s'ha completat. Confirmes que vols cancel·lar-la?</translation> +<translation id="223889379102603431">Informació sobre com gestiona Chrome els seus certificats arrel</translation> <translation id="2258103955319320201">Per accedir al teu contingut del navegador Chrome des de tots els teus dispositius, inicia la sessió i, després, activa la sincronització</translation> <translation id="2290014774651636340">Falten les claus de l'API de Google. Es desactivaran algunes de les funcionalitats de Google Chrome.</translation> <translation id="2290095356545025170">Confirmeu que voleu desinstal·lar Google Chrome?</translation> @@ -347,6 +348,7 @@ <translation id="8129812357326543296">Quant a &Google Chrome</translation> <translation id="813913629614996137">S'està inicialitzant…</translation> <translation id="8255190535488645436">Google Chrome està utilitzant la càmera i el micròfon.</translation> +<translation id="8270775718612349140">Certificats gestionats per Chrome</translation> <translation id="8286862437124483331">Google Chrome està provant de mostrar contrasenyes. Escriviu la vostra contrasenya de Windows per permetre-ho.</translation> <translation id="828798499196665338">Els teus pares han desactivat Permisos per a llocs web, aplicacions i extensions en relació amb Chrome. No es permet activar aquesta <ph name="EXTENSION_TYPE_PARAMETER" />.</translation> <translation id="8290100596633877290">Google Chrome s'ha bloquejat. Voleu tornar-lo a iniciar?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_cy.xtb b/chrome/app/resources/google_chrome_strings_cy.xtb index 76a9c66..c4bac60 100644 --- a/chrome/app/resources/google_chrome_strings_cy.xtb +++ b/chrome/app/resources/google_chrome_strings_cy.xtb
@@ -70,6 +70,7 @@ <translation id="2139300032719313227">Ailgychwyn ChromeOS</translation> <translation id="2151406531797534936">Ailgychwynnwch Chrome nawr</translation> <translation id="2174917724755363426">Gosod heb ei gwblhau. Ydych chi'n siŵr eich bod am ganslo?</translation> +<translation id="223889379102603431">Gwybodaeth am sut mae Chrome yn rheoli ei dystysgrifau gwraidd</translation> <translation id="2258103955319320201">I gael mynediad at eich holl bethau porwr Chrome ar draws eich holl ddyfeisiau, mewngofnodwch, yna trowch gysoni ymlaen</translation> <translation id="2290014774651636340">Mae allweddi API Google ar goll. Bydd rhywfaint o swyddogaeth Google Chrome wedi'i hanalluogi.</translation> <translation id="2290095356545025170">Ydych chi'n siŵr eich bod eisiau dadosod Google Chrome?</translation> @@ -356,6 +357,7 @@ <translation id="8129812357326543296">Ynghylch &Google Chrome</translation> <translation id="813913629614996137">Wrthi'n cychwyn…</translation> <translation id="8255190535488645436">Mae Google Chrome yn defnyddio'ch camera a'ch meicroffon.</translation> +<translation id="8270775718612349140">Tystysgrifau a reolir gan Chrome</translation> <translation id="8286862437124483331">Mae Google Chrome yn ceisio dangos cyfrineiriau. Teipiwch eich cyfrinair Windows i ganiatáu hyn.</translation> <translation id="828798499196665338">Mae dy riant wedi diffodd "Caniatadau ar gyfer gwefannau, apiau ac estyniadau" ar gyfer Chrome. Ni chaniateir galluogi'r <ph name="EXTENSION_TYPE_PARAMETER" /> hwn.</translation> <translation id="8290100596633877290">Whoa! Mae Google Chrome wedi torri. Ail-lansio nawr?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es-419.xtb b/chrome/app/resources/google_chrome_strings_es-419.xtb index c6b4a6d2..e2bee58 100644 --- a/chrome/app/resources/google_chrome_strings_es-419.xtb +++ b/chrome/app/resources/google_chrome_strings_es-419.xtb
@@ -66,6 +66,7 @@ <translation id="2139300032719313227">Reiniciar Chrome OS</translation> <translation id="2151406531797534936">Reinicia Chrome ahora</translation> <translation id="2174917724755363426">No se completó la instalación. ¿Confirmas que quieres cancelarla?</translation> +<translation id="223889379102603431">Información sobre cómo administra Chrome sus certificados raíz.</translation> <translation id="2258103955319320201">A fin de ver el contenido de tu navegador Chrome en todos tus dispositivos, accede a tu cuenta y activa la sincronización</translation> <translation id="2290014774651636340">Faltan las claves de la API de Google. Se inhabilitarán algunas funciones de Google Chrome.</translation> <translation id="2290095356545025170">¿Estás seguro de que deseas desinstalar Google Chrome?</translation> @@ -348,6 +349,7 @@ <translation id="8129812357326543296">Acerca de &Google Chrome</translation> <translation id="813913629614996137">Inicializando…</translation> <translation id="8255190535488645436">Google Chrome está usando tu cámara y tu micrófono.</translation> +<translation id="8270775718612349140">Certificados administrados por Chrome</translation> <translation id="8286862437124483331">Google Chrome está intentando mostrar contraseñas. Para permitirlo, ingresa tu contraseña de Windows.</translation> <translation id="828798499196665338">Tu padre o madre desactivaron la opción "Permisos para sitios, apps y extensiones" para Chrome. No se permite habilitar esta <ph name="EXTENSION_TYPE_PARAMETER" />.</translation> <translation id="8290100596633877290">¡Vaya! Se ha producido un bloqueo en Google Chrome. ¿Quieres reiniciar el navegador ahora?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fa.xtb b/chrome/app/resources/google_chrome_strings_fa.xtb index 4be5cd5..fa38f6b 100644 --- a/chrome/app/resources/google_chrome_strings_fa.xtb +++ b/chrome/app/resources/google_chrome_strings_fa.xtb
@@ -66,6 +66,7 @@ <translation id="2139300032719313227">بازراهاندازی ChromeOS</translation> <translation id="2151406531797534936">لطفاً اکنون Chrome را بازراهاندازی کنید</translation> <translation id="2174917724755363426">نصب کامل نیست. مطمئنید میخواهید آن را لغو کنید؟</translation> +<translation id="223889379102603431">اطلاعات مربوط به اینکه Chrome چگونه گواهینامههای ریشهاش را مدیریت میکند</translation> <translation id="2258103955319320201">برای دسترسی به چیزهایتان در مرورگر Chrome در همه دستگاههایتان، به سیستم وارد شوید، سپس همگامسازی را روشن کنید</translation> <translation id="2290014774651636340">کلیدهای Google API وجود ندارد. برخی از عملکردهای Google Chrome از کار خواهد افتاد.</translation> <translation id="2290095356545025170">آیا میخواهید Google Chrome را غیر فعال کنید؟</translation> @@ -348,6 +349,7 @@ <translation id="8129812357326543296">درباره &Google Chrome</translation> <translation id="813913629614996137">درحال مقداردهی اولیه…</translation> <translation id="8255190535488645436">Google Chrome درحال استفاده از دوربین و میکروفون شما است.</translation> +<translation id="8270775718612349140">گواهینامههای تحتمدیریت Chrome</translation> <translation id="8286862437124483331">Google Chrome در حال تلاش برای نشان دادن گذرواژههاست. برای اجازه به این کار، گذرواژه Windows خود را تایپ کنید.</translation> <translation id="828798499196665338">ولیتان «اجازههای مربوط به سایتها، برنامهها، و افزونهها» را برای Chrome خاموش کرده است. فعال کردن این <ph name="EXTENSION_TYPE_PARAMETER" /> مجاز نیست.</translation> <translation id="8290100596633877290">اوه! Google Chrome با اشکال مواجه شده است. دوباره راهاندازی شود؟</translation>
diff --git a/chrome/app/resources/google_chrome_strings_id.xtb b/chrome/app/resources/google_chrome_strings_id.xtb index 2aed030..707f9619 100644 --- a/chrome/app/resources/google_chrome_strings_id.xtb +++ b/chrome/app/resources/google_chrome_strings_id.xtb
@@ -66,6 +66,7 @@ <translation id="2139300032719313227">Mulai ulang ChromeOS</translation> <translation id="2151406531797534936">Mulai ulang Chrome sekarang</translation> <translation id="2174917724755363426">Penginstalan tidak selesai. Yakin ingin membatalkan?</translation> +<translation id="223889379102603431">Informasi tentang cara Chrome mengelola root certificate-nya</translation> <translation id="2258103955319320201">Untuk mengakses aktivitas browser Chrome di semua perangkat, login lalu aktifkan sinkronisasi</translation> <translation id="2290014774651636340">Kunci API Google tidak ada. Beberapa fungsi Google Chrome tidak akan berfungsi.</translation> <translation id="2290095356545025170">Apakah Anda yakin ingin mencopot penginstalan Google Chrome?</translation> @@ -348,6 +349,7 @@ <translation id="8129812357326543296">Tentang &Google Chrome</translation> <translation id="813913629614996137">Memulai...</translation> <translation id="8255190535488645436">Google Chrome menggunakan kamera dan mikrofon Anda.</translation> +<translation id="8270775718612349140">Sertifikat yang dikelola oleh Chrome</translation> <translation id="8286862437124483331">Google Chrome mencoba menampilkan sandi. Ketik sandi Windows Anda untuk mengizinkannya.</translation> <translation id="828798499196665338">Orang tuamu telah menonaktifkan "Izin untuk situs, aplikasi, dan ekstensi" untuk Chrome. Tindakan mengaktifkan <ph name="EXTENSION_TYPE_PARAMETER" /> ini tidak diizinkan.</translation> <translation id="8290100596633877290">Aduh! Google Chrome ngadat. Luncurkan ulang sekarang?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ja.xtb b/chrome/app/resources/google_chrome_strings_ja.xtb index 3f87057..10b8157e 100644 --- a/chrome/app/resources/google_chrome_strings_ja.xtb +++ b/chrome/app/resources/google_chrome_strings_ja.xtb
@@ -65,6 +65,7 @@ <translation id="2139300032719313227">Chrome OS を再起動してください</translation> <translation id="2151406531797534936">Chrome を今すぐ再起動してください</translation> <translation id="2174917724755363426">インストールは完了していません。キャンセルしてもよろしいですか?</translation> +<translation id="223889379102603431">Chrome でのルート証明書の管理方法に関する情報</translation> <translation id="2258103955319320201">お使いのすべてのデバイスで Chrome ブラウザの設定やデータを使用するには、ログインして同期を有効にしてください。</translation> <translation id="2290014774651636340">Google API キーが欠落しています。Google Chrome の一部の機能は無効になります。</translation> <translation id="2290095356545025170">Google Chrome をアンインストールしてもよろしいですか?</translation> @@ -346,6 +347,7 @@ <translation id="8129812357326543296">Google Chrome について(&G)</translation> <translation id="813913629614996137">初期化しています...</translation> <translation id="8255190535488645436">Google Chrome がカメラとマイクを使用しています。</translation> +<translation id="8270775718612349140">Chrome で管理されている証明書</translation> <translation id="8286862437124483331">Google Chrome でパスワードを表示しようとしています。続行するには、Windows のパスワードを入力してください。</translation> <translation id="828798499196665338">保護者が Chrome の「サイト、アプリ、拡張機能の権限」をオフにしました。この <ph name="EXTENSION_TYPE_PARAMETER" /> を有効にすることはできません。</translation> <translation id="8290100596633877290">エラー: Google Chrome で問題が発生しました。今すぐ再起動しますか?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_km.xtb b/chrome/app/resources/google_chrome_strings_km.xtb index aae0a31e..4ff15ca 100644 --- a/chrome/app/resources/google_chrome_strings_km.xtb +++ b/chrome/app/resources/google_chrome_strings_km.xtb
@@ -70,6 +70,7 @@ <translation id="2139300032719313227">ចាប់ផ្តើម ChromeOS ឡើងវិញ</translation> <translation id="2151406531797534936">សូមចាប់ផ្ដើម Chrome ឡើងវិញឥឡូវនេះ</translation> <translation id="2174917724755363426">ការដំឡើងមិនទាន់បញ្ចប់ទេ។ តើអ្នកពិតជាចង់បោះបង់មែនឬ?</translation> +<translation id="223889379102603431">ព័ត៌មានអំពីរបៀបដែល Chrome គ្រប់គ្រងវិញ្ញាបនបត្រគោលរបស់ខ្លួន</translation> <translation id="2258103955319320201">ដើម្បីចូលប្រើទិន្នន័យនៃកម្មវិធីរុករកតាមអ៊ីនធឺណិត Chrome នៅលើឧបករណ៍ទាំងអស់របស់អ្នក សូមចូលគណនី រួចបើកសមកាលកម្ម</translation> <translation id="2290014774651636340">សោ Google API បានបាត់។ មុខងារមួយចំនួននៃ Google Chrome នឹងត្រូវបានបិទដំណើរការ។</translation> <translation id="2290095356545025170">តើអ្នកប្រាកដថាចង់លុបការតំឡើង Google Chrome ទេ?</translation> @@ -355,6 +356,7 @@ <translation id="8129812357326543296">អំពី Google Chrome</translation> <translation id="813913629614996137">កំពុងចាប់ផ្ដើម…</translation> <translation id="8255190535488645436">Google Chrome កំពុងប្រើកាមេរ៉ា និងម៉ៃក្រូហ្វូនរបស់អ្នក។</translation> +<translation id="8270775718612349140">វិញ្ញាបនបត្រត្រូវបានគ្រប់គ្រងដោយ Chrome</translation> <translation id="8286862437124483331">Google Chrome កំពុងព្យាយាមបង្ហាញពាក្យសម្ងាត់។ វាយបញ្ចូលពាក្យសម្ងាត់ Windows ដើម្បីអនុញ្ញាត។</translation> <translation id="828798499196665338">មាតាបិតារបស់អ្នកបានបិទ "ការអនុញ្ញាតឱ្យចូលប្រើគេហទំព័រ កម្មវិធី និងកម្មវិធីបន្ថែម" សម្រាប់ Chrome។ ការបើក <ph name="EXTENSION_TYPE_PARAMETER" /> នេះមិនត្រូវបានអនុញ្ញាតទេ។</translation> <translation id="8290100596633877290">អូយ! Google Chrome បានគាំង។ ចាប់ផ្តើមដំណើរការឡើងវិញឥឡូវនេះ?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ko.xtb b/chrome/app/resources/google_chrome_strings_ko.xtb index 60d7e3538..54023393 100644 --- a/chrome/app/resources/google_chrome_strings_ko.xtb +++ b/chrome/app/resources/google_chrome_strings_ko.xtb
@@ -70,6 +70,7 @@ <translation id="2139300032719313227">ChromeOS 다시 시작</translation> <translation id="2151406531797534936">지금 Chrome을 다시 시작하세요</translation> <translation id="2174917724755363426">설치가 완료되지 않았습니다. 취소하시겠습니까?</translation> +<translation id="223889379102603431">Chrome의 루트 인증서 관리 방식에 관한 정보</translation> <translation id="2258103955319320201">모든 기기에서 Chrome 브라우저 데이터에 액세스하려면 로그인한 후 동기화를 사용 설정하세요</translation> <translation id="2290014774651636340">Google API 키가 누락되었습니다. Chrome의 일부 기능이 사용 중지됩니다.</translation> <translation id="2290095356545025170">Chrome을 제거하시겠습니까?</translation> @@ -356,6 +357,7 @@ <translation id="8129812357326543296">Chrome 정보(&G)</translation> <translation id="813913629614996137">초기화 중...</translation> <translation id="8255190535488645436">Chrome에서 카메라와 마이크를 사용 중입니다.</translation> +<translation id="8270775718612349140">Chrome이 관리하는 인증서</translation> <translation id="8286862437124483331">Chrome에서 비밀번호를 표시하려고 합니다. 허용하려면 Windows 비밀번호를 입력하세요.</translation> <translation id="828798499196665338">부모님이 Chrome의 ‘사이트, 앱, 확장 프로그램에 대한 권한’을 사용 중지하셨습니다. 이 <ph name="EXTENSION_TYPE_PARAMETER" /> 사용은 허용되지 않습니다.</translation> <translation id="8290100596633877290">Chrome이 다운되었습니다. 다시 시작하시겠습니까?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lo.xtb b/chrome/app/resources/google_chrome_strings_lo.xtb index 7de30ee1..64b175a7 100644 --- a/chrome/app/resources/google_chrome_strings_lo.xtb +++ b/chrome/app/resources/google_chrome_strings_lo.xtb
@@ -70,6 +70,7 @@ <translation id="2139300032719313227">ຣີສະຕາດ ChromeOS</translation> <translation id="2151406531797534936">ກະລຸນາປິດເປີດ Chrome ຄືນໃໝ່ຕອນນີ້ເລີຍ</translation> <translation id="2174917724755363426">ການຕິດຕັ້ງບໍ່ສຳເລັດ. ທ່ານແນ່ໃຈບໍ່ວ່າທ່ານຕ້ອງການຍົກເລີກ?</translation> +<translation id="223889379102603431">ຂໍ້ມູນກ່ຽວກັບວິທີທີ່ Chrome ຈັດການກັບໃບຮັບຮອງຮາກຖານຂອງມັນ</translation> <translation id="2258103955319320201">ເພື່ອເຂົ້າເຖິງຂໍ້ມູນໂປຣແກຣມທ່ອງເວັບ Chrome ຂອງທ່ານຢູ່ອຸປະກອນທັງໝົດຂອງທ່ານ, ກະລຸນາເຂົ້າສູ່ລະບົບແລ້ວເປີດການຊິ້ງຂໍ້ມູນ</translation> <translation id="2290014774651636340">ລະຫັດ Google API ຫາຍໄປ. ການເຮັດໜ້າທີ່ບາງອັນຂອງ Google Chrom ຈະປິດໃຊ້ງານ.</translation> <translation id="2290095356545025170">ທ່ານແນ່ໃຈບໍວ່າ ທ່ານຕ້ອງການຖອນຕິດຕັ້ງ Google Chrome?</translation> @@ -356,6 +357,7 @@ <translation id="8129812357326543296">ກ່ຽວກັບ Google Chrome</translation> <translation id="813913629614996137">ກຳລັງລິເລີ່ມ...</translation> <translation id="8255190535488645436">Google Chrome ກໍາລັງໃຊ້ກ້ອງຖ່າຍຮູບ ແລະໄມໂຄຣໂຟນຂອງທ່ານ.</translation> +<translation id="8270775718612349140">ໃບຮັບຮອງທີ່ຈັດການໂດຍ Chrome</translation> <translation id="8286862437124483331">Google Chrome ກໍາລັງພະຍາຍາມສະແດງລະຫັດຜ່ານ. ພິມລະຫັດຜ່ານ Windows ຂອງທ່ານ ເພື່ອອະນຸຍາດອັນນີ້.</translation> <translation id="828798499196665338">ພໍ່ແມ່ຂອງທ່ານໄດ້ປິດ "ການອະນຸຍາດສຳລັບເວັບໄຊ, ແອັບ ແລະ ສ່ວນຂະຫຍາຍ" ສຳລັບ Chrome ແລ້ວ. ການເປີດການນຳໃຊ້ <ph name="EXTENSION_TYPE_PARAMETER" /> ນີ້ບໍ່ໄດ້ຮັບອະນຸຍາດ.</translation> <translation id="8290100596633877290">ໂຮ້! Google Chrome ເກີດຂັດຂ້ອງ. ເປີດໃຊ້ໃໝ່ດຽວນີ້ບໍ?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ml.xtb b/chrome/app/resources/google_chrome_strings_ml.xtb index 3a4fad5..c408b91 100644 --- a/chrome/app/resources/google_chrome_strings_ml.xtb +++ b/chrome/app/resources/google_chrome_strings_ml.xtb
@@ -70,6 +70,7 @@ <translation id="2139300032719313227">ChromeOS റീസ്റ്റാർട്ട് ചെയ്യുക</translation> <translation id="2151406531797534936">Chrome ഇപ്പോൾ റീസ്റ്റാർട്ട് ചെയ്യുക</translation> <translation id="2174917724755363426">ഇൻസ്റ്റാൾ ചെയ്യൽ പൂർത്തിയായിട്ടില്ല. റദ്ദാക്കണമെന്ന് ഉറപ്പാണോ?</translation> +<translation id="223889379102603431">Chrome അതിന്റെ റൂട്ട് സർട്ടിഫിക്കറ്റുകൾ മാനേജ് ചെയ്യുന്നത് എങ്ങനെ എന്നതിനെക്കുറിച്ചുള്ള വിവരങ്ങൾ</translation> <translation id="2258103955319320201">നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും Chrome ബ്രൗസർ ഉള്ളടക്കം ആക്സസ് ചെയ്യാൻ, സൈൻ ഇൻ ചെയ്ത ശേഷം സമന്വയിപ്പിക്കൽ ഓണാക്കുക</translation> <translation id="2290014774651636340">Google API കീകൾ നഷ്ടമായി. Google Chrome-ന്റെ ചില പ്രവർത്തനങ്ങൾ പ്രവർത്തനരഹിതമാകും.</translation> <translation id="2290095356545025170">Google Chrome അണിന്സ്റ്റാള് ചെയ്യണമെന്ന് നിങ്ങള്ക്കുറപ്പാണോ?</translation> @@ -356,6 +357,7 @@ <translation id="8129812357326543296">&Google Chrome-നെക്കുറിച്ച്</translation> <translation id="813913629614996137">ആരംഭിക്കുന്നു...</translation> <translation id="8255190535488645436">Google Chrome നിങ്ങളുടെ ക്യാമറയും മൈക്രോഫോണും ഉപയോഗിക്കുന്നു.</translation> +<translation id="8270775718612349140">Chrome മാനേജ് ചെയ്യുന്ന സർട്ടിഫിക്കറ്റുകൾ</translation> <translation id="8286862437124483331">Google Chrome പാസ്വേഡുകൾ ദൃശ്യമാക്കാൻ ശ്രമിക്കുന്നു. ഇത് അനുവദിക്കാൻ നിങ്ങളുടെ Windows പാസ്വേഡ് നൽകുക.</translation> <translation id="828798499196665338">നിങ്ങളുടെ രക്ഷിതാവ് Chrome-നുള്ള "സൈറ്റുകൾക്കും ആപ്പുകൾക്കും വിപുലീകരണങ്ങൾക്കുമുള്ള അനുമതികൾ" ഓഫാക്കി. ഈ <ph name="EXTENSION_TYPE_PARAMETER" /> പ്രവർത്തനക്ഷമമാക്കുന്നത് അനുവദനീയമല്ല.</translation> <translation id="8290100596633877290">ഓ! Google Chrome ക്രാഷുചെയ്തു. ഇപ്പോള് വീണ്ടും സമാരംഭിക്കണോ?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sl.xtb b/chrome/app/resources/google_chrome_strings_sl.xtb index d33ab71c..d01bf80 100644 --- a/chrome/app/resources/google_chrome_strings_sl.xtb +++ b/chrome/app/resources/google_chrome_strings_sl.xtb
@@ -70,6 +70,7 @@ <translation id="2139300032719313227">Vnovičen zagon sistema Chrome OS</translation> <translation id="2151406531797534936">Znova zaženite Chrome</translation> <translation id="2174917724755363426">Namestitev še ni končana. Ali ste prepričani, da jo želite preklicati?</translation> +<translation id="223889379102603431">Informacije o tem, kako Chrome upravlja korenska potrdila.</translation> <translation id="2258103955319320201">Če želite do stvari v brskalniku Chrome dostopati v vseh svojih napravah, se prijavite in nato vklopite sinhronizacijo.</translation> <translation id="2290014774651636340">Manjkajo ključi za Google API. Nekatere funkcije Google Chroma bodo onemogočene.</translation> <translation id="2290095356545025170">Ali ste prepričani, da želite odstraniti Google Chrome?</translation> @@ -356,6 +357,7 @@ <translation id="8129812357326543296">O &Google Chromu</translation> <translation id="813913629614996137">Inicializiranje ...</translation> <translation id="8255190535488645436">Google Chrome uporablja vašo kamero in mikrofon.</translation> +<translation id="8270775718612349140">Potrdila, ki jih upravlja Chrome</translation> <translation id="8286862437124483331">Google Chrome poskuša prikazati gesla. Če želite omogočiti to, vnesite geslo za Windows.</translation> <translation id="828798499196665338">Tvoj starš je izklopil »Dovoljenja za spletna mesta, aplikacije in razširitve« za Chrome. Omogočanje tega ni dovoljeno: <ph name="EXTENSION_TYPE_PARAMETER" />.</translation> <translation id="8290100596633877290">Opa! Google Chrome se je zrušil. Ga želite znova zagnati?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sw.xtb b/chrome/app/resources/google_chrome_strings_sw.xtb index dd41cff..d1f833a 100644 --- a/chrome/app/resources/google_chrome_strings_sw.xtb +++ b/chrome/app/resources/google_chrome_strings_sw.xtb
@@ -70,6 +70,7 @@ <translation id="2139300032719313227">Zima kisha uwashe Mfumo wa Uendeshaji wa Chrome</translation> <translation id="2151406531797534936">Tafadhali zima kisha uwashe Chrome sasa</translation> <translation id="2174917724755363426">Usakinishaji haujakamilika. Je, una uhakika unataka kughairi?</translation> +<translation id="223889379102603431">Maelezo kuhusu jinsi Chrome inavyodhibiti vyeti vyake vya msingi</translation> <translation id="2258103955319320201">Ili uweze kufikia vitu vyako vya kivinjari cha Chrome kwenye vifaa vyako vyote, ingia katika akaunti kisha uwashe kipengele cha kusawazisha.</translation> <translation id="2290014774651636340">Funguo za API za Google zinakosekana. Baadhi ya utendaji wa Google Chrome utazimwa.</translation> <translation id="2290095356545025170">Je, una hakika kuwa ungependa kusanidua Google Chrome?</translation> @@ -356,6 +357,7 @@ <translation id="8129812357326543296">Kuhusu &Google Chrome</translation> <translation id="813913629614996137">Inaanzisha…</translation> <translation id="8255190535488645436">Google Chrome inatumia kamera na maikrofoni yako.</translation> +<translation id="8270775718612349140">Vyeti vinavyodhibitiwa na Chrome</translation> <translation id="8286862437124483331">Google Chrome inajaribu kuonyesha manenosiri. Chapa nenosiri lako la Windows ili uruhusu hili.</translation> <translation id="828798499196665338">Mzazi wako amezima "Ruhusa za tovuti, programu na viendelezi" kwenye Chrome. Huruhusiwi kuwasha <ph name="EXTENSION_TYPE_PARAMETER" /> hii.</translation> <translation id="8290100596633877290">Ho! Google Chrome imezimika. Ianzishe tena sasa?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uk.xtb b/chrome/app/resources/google_chrome_strings_uk.xtb index 35faaaa..4c5b9e85 100644 --- a/chrome/app/resources/google_chrome_strings_uk.xtb +++ b/chrome/app/resources/google_chrome_strings_uk.xtb
@@ -66,6 +66,7 @@ <translation id="2139300032719313227">Перезапустіть ОС Chrome</translation> <translation id="2151406531797534936">Перезапустіть Chrome</translation> <translation id="2174917724755363426">Встановлення не завершено. Скасувати його?</translation> +<translation id="223889379102603431">Інформація про те, як Chrome керує кореневими сертифікатами</translation> <translation id="2258103955319320201">Щоб мати доступ до своїх даних у веб-переглядачі Chrome на всіх пристроях, увійдіть в обліковий запис і ввімкніть синхронізацію</translation> <translation id="2290014774651636340">Ключі API Google відсутні. Деякі функції Google Chrome буде вимкнено.</translation> <translation id="2290095356545025170">Ви дійсно хочете видалити Google Chrome?</translation> @@ -348,6 +349,7 @@ <translation id="8129812357326543296">Про &Google Chrome</translation> <translation id="813913629614996137">Ініціалізація...</translation> <translation id="8255190535488645436">Google Chrome використовує вашу камеру та мікрофон.</translation> +<translation id="8270775718612349140">Сертифікати, якими керує Chrome</translation> <translation id="8286862437124483331">Google Chrome намагається показати паролі. Щоб дозволити, введіть свій пароль Windows.</translation> <translation id="828798499196665338">Хтось із твоїх батьків вимкнув "Дозволи для сайтів, додатків і розширень" у Chrome. Вмикати це <ph name="EXTENSION_TYPE_PARAMETER" /> заборонено.</translation> <translation id="8290100596633877290">Відбулося аварійне завершення роботи Google Chrome. Перезапустити зараз?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-HK.xtb b/chrome/app/resources/google_chrome_strings_zh-HK.xtb index 8636a89..fddc947 100644 --- a/chrome/app/resources/google_chrome_strings_zh-HK.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-HK.xtb
@@ -68,6 +68,7 @@ <translation id="2139300032719313227">重新啟動 Chrome OS</translation> <translation id="2151406531797534936">請立即重新啟動 Chrome</translation> <translation id="2174917724755363426">安裝尚未完成。確定要取消嗎?</translation> +<translation id="223889379102603431">瞭解 Chrome 如何管理根憑證</translation> <translation id="2258103955319320201">如要透過所有裝置存取 Chrome 瀏覽器資料,請登入並開啟同步處理功能</translation> <translation id="2290014774651636340">缺少 Google API 金鑰,系統將停用 Google Chrome 的部分功能。</translation> <translation id="2290095356545025170">確定要解除安裝 Google Chrome 嗎?</translation> @@ -353,6 +354,7 @@ <translation id="8129812357326543296">關於 Google Chrome(&G)</translation> <translation id="813913629614996137">正在初始化…</translation> <translation id="8255190535488645436">Google Chrome 正在使用您的相機和麥克風。</translation> +<translation id="8270775718612349140">由 Chrome 管理的憑證</translation> <translation id="8286862437124483331">Google Chrome 正在嘗試顯示密碼。如果您同意,請輸入您的 Windows 密碼。</translation> <translation id="828798499196665338">您的家長已停用 Chrome 的「網站、應用程式和擴充程式權限」設定,因此您無法啟用此<ph name="EXTENSION_TYPE_PARAMETER" />。</translation> <translation id="8290100596633877290">真糟糕!Google Chrome 當機了,要立即重新啟動嗎?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-TW.xtb b/chrome/app/resources/google_chrome_strings_zh-TW.xtb index 39a147c..9de9d94 100644 --- a/chrome/app/resources/google_chrome_strings_zh-TW.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
@@ -65,6 +65,7 @@ <translation id="2139300032719313227">重新啟動 Chrome OS</translation> <translation id="2151406531797534936">請立即重新啟動 Chrome</translation> <translation id="2174917724755363426">安裝作業尚未完成,確定要取消安裝嗎?</translation> +<translation id="223889379102603431">瞭解 Chrome 如何管理根憑證</translation> <translation id="2258103955319320201">如要透過所有裝置存取你的 Chrome 瀏覽器資料,請登入並開啟同步功能</translation> <translation id="2290014774651636340">缺少 Google API 金鑰,系統將停用 Google Chrome 的部分功能。</translation> <translation id="2290095356545025170">你是否確定要解除安裝 Google Chrome?</translation> @@ -348,6 +349,7 @@ <translation id="8129812357326543296">關於 Google Chrome(&G)</translation> <translation id="813913629614996137">正在初始化...</translation> <translation id="8255190535488645436">Google Chrome 正在使用你的攝影機和麥克風。</translation> +<translation id="8270775718612349140">由 Chrome 管理的憑證</translation> <translation id="8286862437124483331">Google Chrome 現在會嘗試顯示密碼。如果你同意的話,請輸入你的 Windows 密碼。</translation> <translation id="828798499196665338">你的家長已停用 Chrome 的「網站、應用程式和擴充功能的權限」設定,因此你無法啟用這個<ph name="EXTENSION_TYPE_PARAMETER" />。</translation> <translation id="8290100596633877290">真糟糕!Google Chrome 當掉了,要立即重新啟動嗎?</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 05d688ae..7917ba2 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -1444,6 +1444,8 @@ "profiles/profile_manager_observer.h", "profiles/profile_metrics.cc", "profiles/profile_metrics.h", + "profiles/profile_selections.cc", + "profiles/profile_selections.h", "profiles/profiles_state.cc", "profiles/profiles_state.h", "profiles/renderer_updater.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 8fbb614a..fce166c 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -2290,13 +2290,6 @@ std::size(kLensContextMenuSearchOnTablet), nullptr}, }; -const FeatureEntry::FeatureParam kDynamicColorFull[] = { - {"dynamic_color_full", "true"}}; - -const FeatureEntry::FeatureVariation kDynamicColorAndroidVariations[] = { - {"(Full)", kDynamicColorFull, std::size(kDynamicColorFull), nullptr}, -}; - #endif // BUILDFLAG(IS_ANDROID) const FeatureEntry::Choice kNotificationSchedulerChoices[] = { @@ -8243,18 +8236,6 @@ flag_descriptions::kHttpsOnlyModeDescription, kOsDesktop | kOsAndroid, FEATURE_VALUE_TYPE(features::kHttpsOnlyMode)}, -#if BUILDFLAG(IS_ANDROID) - {"dynamic-color-android", flag_descriptions::kDynamicColorAndroidName, - flag_descriptions::kDynamicColorAndroidDescription, kOsAndroid, - FEATURE_WITH_PARAMS_VALUE_TYPE(chrome::android::kDynamicColorAndroid, - kDynamicColorAndroidVariations, - "AndroidDynamicColor")}, - {"dynamic-color-buttons-android", - flag_descriptions::kDynamicColorButtonsAndroidName, - flag_descriptions::kDynamicColorButtonsAndroidDescription, kOsAndroid, - FEATURE_VALUE_TYPE(chrome::android::kDynamicColorButtonsAndroid)}, -#endif // BUILDFLAG(IS_ANDROID) - #if BUILDFLAG(IS_WIN) {"win-10-tab-search-caption-button", flag_descriptions::kWin10TabSearchCaptionButtonName, @@ -8290,13 +8271,6 @@ FEATURE_VALUE_TYPE( autofill::features::kAutofillFillMerchantPromoCodeFields)}, - {"passwords-account-storage-revised-opt-in-flow", - flag_descriptions::kPasswordsAccountStorageRevisedOptInFlowName, - flag_descriptions::kPasswordsAccountStorageRevisedOptInFlowDescription, - kOsDesktop, - FEATURE_VALUE_TYPE( - password_manager::features::kPasswordsAccountStorageRevisedOptInFlow)}, - #if BUILDFLAG(IS_CHROMEOS_ASH) {"traffic-counters", flag_descriptions::kTrafficCountersEnabledName, flag_descriptions::kTrafficCountersEnabledDescription, kOsCrOS,
diff --git a/chrome/browser/apps/app_discovery_service/game_fetcher.cc b/chrome/browser/apps/app_discovery_service/game_fetcher.cc index d773eea..4de73fab 100644 --- a/chrome/browser/apps/app_discovery_service/game_fetcher.cc +++ b/chrome/browser/apps/app_discovery_service/game_fetcher.cc
@@ -156,8 +156,9 @@ base::BindOnce(&DecodeIcon, std::move(callback), size_hint_in_dip)); } -void GameFetcher::OnAppDataUpdated(const proto::AppWithLocaleList& app_data) { - last_results_ = GetAppsForCurrentLocale(app_data); +void GameFetcher::OnAppWithLocaleListUpdated( + const proto::AppWithLocaleList& app_with_locale_list) { + last_results_ = GetAppsForCurrentLocale(app_with_locale_list); std::map<std::string, Result*> map; for (auto& result : last_results_) { map.emplace(result.GetAppId(), &result); @@ -167,9 +168,9 @@ } std::vector<Result> GameFetcher::GetAppsForCurrentLocale( - const proto::AppWithLocaleList& app_data) { + const proto::AppWithLocaleList& app_with_locale_list) { std::vector<Result> results; - for (const auto& app_with_locale : app_data.app_with_locale()) { + for (const auto& app_with_locale : app_with_locale_list.app_with_locale()) { if (!AvailableInCurrentLocale(app_with_locale.locale_availability())) { continue; } @@ -197,8 +198,8 @@ } void GameFetcher::SetResultsForTesting( - const proto::AppWithLocaleList& app_data) { - OnAppDataUpdated(app_data); + const proto::AppWithLocaleList& app_with_locale_list) { + OnAppWithLocaleListUpdated(app_with_locale_list); } void GameFetcher::SetLocaleForTesting(const std::string& country,
diff --git a/chrome/browser/apps/app_discovery_service/game_fetcher.h b/chrome/browser/apps/app_discovery_service/game_fetcher.h index a7c5339c..5f936f11 100644 --- a/chrome/browser/apps/app_discovery_service/game_fetcher.h +++ b/chrome/browser/apps/app_discovery_service/game_fetcher.h
@@ -36,9 +36,11 @@ GetIconCallback callback) override; // AppProvisioningDataManager::Observer: - void OnAppDataUpdated(const proto::AppWithLocaleList& app_data) override; + void OnAppWithLocaleListUpdated( + const proto::AppWithLocaleList& app_with_locale_list) override; - void SetResultsForTesting(const proto::AppWithLocaleList& app_data); + void SetResultsForTesting( + const proto::AppWithLocaleList& app_with_locale_list); void SetLocaleForTesting(const std::string& language, const std::string& country);
diff --git a/chrome/browser/apps/app_provisioning_service/app_provisioning_data_manager.cc b/chrome/browser/apps/app_provisioning_service/app_provisioning_data_manager.cc index f5ede04e..72df0196 100644 --- a/chrome/browser/apps/app_provisioning_service/app_provisioning_data_manager.cc +++ b/chrome/browser/apps/app_provisioning_service/app_provisioning_data_manager.cc
@@ -30,15 +30,15 @@ return; } - std::unique_ptr<proto::AppWithLocaleList> app_data = + std::unique_ptr<proto::AppWithLocaleList> app_with_locale_list = std::make_unique<proto::AppWithLocaleList>(); - if (!app_data->ParseFromString(binary_pb)) { + if (!app_with_locale_list->ParseFromString(binary_pb)) { LOG(ERROR) << "Failed to parse protobuf"; return; } - // TODO(melzhang) : Add check that version of |app_data| is newer. - app_data_ = std::move(app_data); + // TODO(melzhang) : Add check that version of |app_with_locale_list| is newer. + app_with_locale_list_ = std::move(app_with_locale_list); data_dir_ = install_dir; OnAppDataUpdated(); } @@ -48,7 +48,7 @@ } void AppProvisioningDataManager::OnAppDataUpdated() { - if (!app_data_) { + if (!app_with_locale_list_) { return; } for (auto& observer : observers_) { @@ -58,7 +58,7 @@ void AppProvisioningDataManager::AddObserver(Observer* observer) { observers_.AddObserver(observer); - if (app_data_) { + if (app_with_locale_list_) { NotifyObserver(*observer); } } @@ -68,7 +68,7 @@ } void AppProvisioningDataManager::NotifyObserver(Observer& observer) { - observer.OnAppDataUpdated(*app_data_.get()); + observer.OnAppWithLocaleListUpdated(*app_with_locale_list_.get()); } } // namespace apps
diff --git a/chrome/browser/apps/app_provisioning_service/app_provisioning_data_manager.h b/chrome/browser/apps/app_provisioning_service/app_provisioning_data_manager.h index 35858a58..2eeb72c 100644 --- a/chrome/browser/apps/app_provisioning_service/app_provisioning_data_manager.h +++ b/chrome/browser/apps/app_provisioning_service/app_provisioning_data_manager.h
@@ -24,7 +24,8 @@ public: class Observer : public base::CheckedObserver { public: - virtual void OnAppDataUpdated(const proto::AppWithLocaleList& app_data) {} + virtual void OnAppWithLocaleListUpdated( + const proto::AppWithLocaleList& app_with_locale_list) {} }; static AppProvisioningDataManager* Get(); @@ -60,7 +61,7 @@ void NotifyObserver(Observer& observer); // The latest app data. Starts out as null. - std::unique_ptr<proto::AppWithLocaleList> app_data_; + std::unique_ptr<proto::AppWithLocaleList> app_with_locale_list_; base::ObserverList<Observer> observers_;
diff --git a/chrome/browser/apps/app_service/app_service_proxy_unittest.cc b/chrome/browser/apps/app_service/app_service_proxy_unittest.cc index 8468614..b84b737 100644 --- a/chrome/browser/apps/app_service/app_service_proxy_unittest.cc +++ b/chrome/browser/apps/app_service/app_service_proxy_unittest.cc
@@ -372,17 +372,8 @@ // Shortcut for adding apps to App Service without going through a real // Publisher. void OnApps(std::vector<AppPtr> apps, AppType type) { - if (base::FeatureList::IsEnabled(kAppServiceOnAppUpdateWithoutMojom)) { - proxy_->OnApps(std::move(apps), type, - /*should_notify_initialized=*/false); - } else { - std::vector<mojom::AppPtr> mojom_apps; - for (const auto& app : apps) { - mojom_apps.push_back(ConvertAppToMojomApp(app)); - } - proxy_->OnApps(std::move(mojom_apps), ConvertAppTypeToMojomAppType(type), - /*should_notify_initialized=*/false); - } + proxy_->OnApps(std::move(apps), type, + /*should_notify_initialized=*/false); } PreferredAppsList& GetPreferredAppsList() {
diff --git a/chrome/browser/apps/platform_apps/app_load_service_factory.cc b/chrome/browser/apps/platform_apps/app_load_service_factory.cc index c862bfb..d2bb0c9e 100644 --- a/chrome/browser/apps/platform_apps/app_load_service_factory.cc +++ b/chrome/browser/apps/platform_apps/app_load_service_factory.cc
@@ -29,7 +29,7 @@ AppLoadServiceFactory::AppLoadServiceFactory() : ProfileKeyedServiceFactory( "AppLoadService", - ProfileSelections::BuildServicesRedirectedInOTR()) { + ProfileSelections::BuildServicesRedirectedToOriginal()) { DependsOn(extensions::AppWindowRegistry::Factory::GetInstance()); DependsOn(extensions::ExtensionPrefsFactory::GetInstance()); DependsOn(extensions::ExtensionRegistryFactory::GetInstance());
diff --git a/chrome/browser/ash/login/enrollment/enrollment_screen.cc b/chrome/browser/ash/login/enrollment/enrollment_screen.cc index 7c6b9b2..6b3bc10 100644 --- a/chrome/browser/ash/login/enrollment/enrollment_screen.cc +++ b/chrome/browser/ash/login/enrollment/enrollment_screen.cc
@@ -14,6 +14,7 @@ #include "base/location.h" #include "base/logging.h" #include "base/metrics/histogram_macros.h" +#include "base/notreached.h" #include "base/timer/elapsed_timer.h" #include "chrome/browser/ash/login/active_directory_migration_utils.h" #include "chrome/browser/ash/login/configuration_keys.h" @@ -26,6 +27,7 @@ #include "chrome/browser/ash/login/wizard_controller.h" #include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h" #include "chrome/browser/ash/policy/enrollment/account_status_check_fetcher.h" +#include "chrome/browser/ash/policy/enrollment/enrollment_config.h" #include "chrome/browser/ash/policy/enrollment/enrollment_requisition_manager.h" #include "chrome/browser/ash/policy/enrollment/enrollment_status.h" #include "chrome/browser/ash/policy/handlers/tpm_auto_update_mode_policy_handler.h" @@ -187,12 +189,10 @@ void EnrollmentScreen::SetConfig() { config_ = enrollment_config_; - if (current_auth_ == AUTH_OAUTH && config_.is_mode_attestation_server()) { + if (current_auth_ == AUTH_OAUTH && + config_.is_mode_attestation_with_manual_fallback()) { config_.mode = - config_.mode == - policy::EnrollmentConfig::MODE_ATTESTATION_INITIAL_SERVER_FORCED - ? policy::EnrollmentConfig::MODE_ATTESTATION_INITIAL_MANUAL_FALLBACK - : policy::EnrollmentConfig::MODE_ATTESTATION_MANUAL_FALLBACK; + policy::EnrollmentConfig::GetManualFallbackMode(config_.mode); } else if (current_auth_ == AUTH_ATTESTATION && !enrollment_config_.is_mode_attestation()) { config_.mode = config_.is_attestation_auth_forced()
diff --git a/chrome/browser/ash/login/enrollment/enrollment_screen_browsertest.cc b/chrome/browser/ash/login/enrollment/enrollment_screen_browsertest.cc index 9e24a33..a5e05da2 100644 --- a/chrome/browser/ash/login/enrollment/enrollment_screen_browsertest.cc +++ b/chrome/browser/ash/login/enrollment/enrollment_screen_browsertest.cc
@@ -19,8 +19,14 @@ #include "chrome/browser/ash/login/test/oobe_base_test.h" #include "chrome/browser/ash/login/test/oobe_screen_waiter.h" #include "chrome/browser/ash/login/ui/login_display_host.h" +#include "chrome/browser/ash/login/ui/webui_login_view.h" +#include "chrome/browser/ash/login/wizard_context.h" #include "chrome/browser/ash/login/wizard_controller.h" +#include "chrome/browser/ash/policy/enrollment/enrollment_config.h" #include "chrome/browser/ash/policy/enrollment/enrollment_status.h" +#include "chrome/browser/ui/webui/chromeos/login/tpm_error_screen_handler.h" +#include "chromeos/dbus/tpm_manager/fake_tpm_manager_client.h" +#include "chromeos/dbus/tpm_manager/tpm_manager_client.h" #include "chromeos/test/chromeos_test_utils.h" #include "content/public/test/browser_test.h" #include "content/public/test/test_utils.h" @@ -40,11 +46,11 @@ class EnrollmentScreenTest : public OobeBaseTest { public: - EnrollmentScreenTest() = default; - EnrollmentScreenTest(const EnrollmentScreenTest&) = delete; EnrollmentScreenTest& operator=(const EnrollmentScreenTest&) = delete; + protected: + EnrollmentScreenTest() = default; ~EnrollmentScreenTest() override = default; // OobeBaseTest: @@ -52,8 +58,8 @@ if (!OobeBaseTest::SetUpUserDataDirectory()) return false; - // Make sure chrome paths are overridden before proceeding - this is usually - // done in chrome main, which has not happened yet. + // Make sure chrome paths are overridden before proceeding - this is + // usually done in chrome main, which has not happened yet. base::FilePath user_data_dir; EXPECT_TRUE(base::PathService::Get(chrome::DIR_USER_DATA, &user_data_dir)); ash::RegisterStubPathOverrides(user_data_dir); @@ -77,8 +83,8 @@ return enrollment_screen; } - test::EnrollmentHelperMixin enrollment_helper_{&mixin_host_}; test::EnrollmentUIMixin enrollment_ui_{&mixin_host_}; + test::EnrollmentHelperMixin enrollment_helper_{&mixin_host_}; }; IN_PROC_BROWSER_TEST_F(EnrollmentScreenTest, TestCancel) { @@ -116,6 +122,119 @@ enrollment_ui_.WaitForStep(test::ui::kEnrollmentStepSuccess); } +IN_PROC_BROWSER_TEST_F(EnrollmentScreenTest, EnrollAfterRollbackSuccess) { + enrollment_ui_.SetExitHandler(); + policy::EnrollmentConfig enrollment_config; + enrollment_config.mode = + policy::EnrollmentConfig::MODE_ATTESTATION_ROLLBACK_FORCED; + enrollment_config.auth_mechanism = + policy::EnrollmentConfig::AUTH_MECHANISM_BEST_AVAILABLE; + + enrollment_helper_.ExpectEnrollmentMode( + policy::EnrollmentConfig::MODE_ATTESTATION_ROLLBACK_FORCED); + enrollment_helper_.ExpectAttestationEnrollmentSuccess(); + enrollment_helper_.DisableAttributePromptUpdate(); + + enrollment_screen()->SetEnrollmentConfig(enrollment_config); + + WizardContext context; + enrollment_screen()->Show(&context); + + enrollment_ui_.WaitForStep(test::ui::kEnrollmentStepSuccess); + + EXPECT_TRUE(StartupUtils::IsDeviceRegistered()); +} + +IN_PROC_BROWSER_TEST_F(EnrollmentScreenTest, + EnrollAfterRollbackManualFallback) { + enrollment_ui_.SetExitHandler(); + policy::EnrollmentConfig enrollment_config; + enrollment_config.mode = + policy::EnrollmentConfig::MODE_ATTESTATION_ROLLBACK_FORCED; + enrollment_config.auth_mechanism = + policy::EnrollmentConfig::AUTH_MECHANISM_BEST_AVAILABLE; + + enrollment_helper_.ExpectEnrollmentMode( + policy::EnrollmentConfig::MODE_ATTESTATION_ROLLBACK_FORCED); + // Manual fallback automatically happens if the device is not found, otherwise + // error screen is shown. + enrollment_helper_.ExpectAttestationEnrollmentError( + policy::EnrollmentStatus::ForRegistrationError( + policy::DeviceManagementStatus::DM_STATUS_SERVICE_DEVICE_NOT_FOUND)); + enrollment_helper_.SetupClearAuth(); + + enrollment_screen()->SetEnrollmentConfig(enrollment_config); + + WizardContext context; + enrollment_screen()->Show(&context); + + // Expect that the screen ends up on the gaia sign-in page as a manual + // fallback for the failed automatic enrollment. + enrollment_ui_.WaitForStep(test::ui::kEnrollmentStepSignin); + EXPECT_FALSE(StartupUtils::IsDeviceRegistered()); + + // Enrollment helper mock is owned by enrollment screen and released when + // enrollment config changes. Need to prepare a new mock to be consumed. + enrollment_helper_.ResetMock(); + + enrollment_helper_.ExpectEnrollmentMode( + policy::EnrollmentConfig::MODE_ATTESTATION_ROLLBACK_MANUAL_FALLBACK); + enrollment_helper_.ExpectSuccessfulOAuthEnrollment(); + enrollment_helper_.DisableAttributePromptUpdate(); + enrollment_helper_.SetupClearAuth(); + + enrollment_screen()->OnLoginDone( + "testuser@test.com", static_cast<int>(policy::LicenseType::kEnterprise), + test::EnrollmentHelperMixin::kTestAuthCode); + + enrollment_ui_.WaitForStep(test::ui::kEnrollmentStepSuccess); + EXPECT_TRUE(StartupUtils::IsDeviceRegistered()); +} + +IN_PROC_BROWSER_TEST_F(EnrollmentScreenTest, + ErrorInEnrollmentAfterRollbackThenRetry) { + enrollment_ui_.SetExitHandler(); + policy::EnrollmentConfig enrollment_config; + enrollment_config.mode = + policy::EnrollmentConfig::MODE_ATTESTATION_ROLLBACK_FORCED; + enrollment_config.auth_mechanism = + policy::EnrollmentConfig::AUTH_MECHANISM_BEST_AVAILABLE; + + enrollment_helper_.ExpectEnrollmentMode( + policy::EnrollmentConfig::MODE_ATTESTATION_ROLLBACK_FORCED); + enrollment_helper_.ExpectAttestationEnrollmentError( + policy::EnrollmentStatus::ForRegistrationError( + policy::DeviceManagementStatus::DM_STATUS_HTTP_STATUS_ERROR)); + enrollment_helper_.SetupClearAuth(); + + enrollment_screen()->SetEnrollmentConfig(enrollment_config); + + WizardContext context; + enrollment_screen()->Show(&context); + + enrollment_ui_.WaitForStep(test::ui::kEnrollmentStepError); + EXPECT_FALSE(StartupUtils::IsDeviceRegistered()); + + // Retry enrollment and finish successfully. + + // Enrollment helper mock is owned by enrollment screen and released when + // enrollment config changes. Need to prepare a new mock to be consumed. + enrollment_helper_.ResetMock(); + + enrollment_helper_.ExpectEnrollmentMode( + policy::EnrollmentConfig::MODE_ATTESTATION_ROLLBACK_FORCED); + enrollment_helper_.ExpectAttestationEnrollmentSuccess(); + enrollment_helper_.DisableAttributePromptUpdate(); + + enrollment_screen()->SetEnrollmentConfig(enrollment_config); + + enrollment_screen()->OnRetry(); + + enrollment_ui_.WaitForStep(test::ui::kEnrollmentStepSuccess); + + EXPECT_TRUE(StartupUtils::IsDeviceRegistered()); +} + IN_PROC_BROWSER_TEST_F(EnrollmentScreenTest, AttestationEnrollmentSuccess) { enrollment_ui_.SetExitHandler(); policy::EnrollmentConfig enrollment_config; @@ -150,8 +269,8 @@ enrollment_helper_.ExpectEnrollmentMode( policy::EnrollmentConfig::MODE_ATTESTATION_SERVER_FORCED); - // Manual fallback only happens if the device is not found, otherwise - // attestation is retried. + // Manual fallback automatically happens if the device is not found, otherwise + // error screen is shown. enrollment_helper_.ExpectAttestationEnrollmentError( policy::EnrollmentStatus::ForRegistrationError( policy::DeviceManagementStatus::DM_STATUS_SERVICE_DEVICE_NOT_FOUND)); @@ -251,6 +370,8 @@ case policy::EnrollmentConfig::MODE_INITIAL_SERVER_FORCED: case policy::EnrollmentConfig::MODE_ATTESTATION_INITIAL_SERVER_FORCED: case policy::EnrollmentConfig::MODE_ATTESTATION_INITIAL_MANUAL_FALLBACK: + case policy::EnrollmentConfig::MODE_ATTESTATION_ROLLBACK_FORCED: + case policy::EnrollmentConfig::MODE_ATTESTATION_ROLLBACK_MANUAL_FALLBACK: case policy::EnrollmentConfig::MODE_RECOVERY: return false; } @@ -349,6 +470,8 @@ {policy::EnrollmentConfig::MODE_ATTESTATION_MANUAL_FALLBACK, policy::EnrollmentConfig::AUTH_MECHANISM_INTERACTIVE}, {policy::EnrollmentConfig::MODE_ATTESTATION_INITIAL_MANUAL_FALLBACK, + policy::EnrollmentConfig::AUTH_MECHANISM_INTERACTIVE}, + {policy::EnrollmentConfig::MODE_ATTESTATION_ROLLBACK_MANUAL_FALLBACK, policy::EnrollmentConfig::AUTH_MECHANISM_INTERACTIVE}})); INSTANTIATE_TEST_SUITE_P( @@ -437,6 +560,8 @@ policy::EnrollmentConfig::AUTH_MECHANISM_ATTESTATION}, {policy::EnrollmentConfig::MODE_ATTESTATION_SERVER_FORCED, policy::EnrollmentConfig::AUTH_MECHANISM_BEST_AVAILABLE}, + {policy::EnrollmentConfig::MODE_ATTESTATION_ROLLBACK_FORCED, + policy::EnrollmentConfig::AUTH_MECHANISM_BEST_AVAILABLE}, {policy::EnrollmentConfig::MODE_ATTESTATION_INITIAL_SERVER_FORCED, policy::EnrollmentConfig::AUTH_MECHANISM_BEST_AVAILABLE}}));
diff --git a/chrome/browser/ash/login/enrollment/enrollment_screen_unittest.cc b/chrome/browser/ash/login/enrollment/enrollment_screen_unittest.cc index d23ad9cf..7e3d4c2 100644 --- a/chrome/browser/ash/login/enrollment/enrollment_screen_unittest.cc +++ b/chrome/browser/ash/login/enrollment/enrollment_screen_unittest.cc
@@ -23,6 +23,7 @@ #include "chrome/test/base/testing_browser_process.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/system/fake_statistics_provider.h" +#include "components/policy/core/common/cloud/cloud_policy_constants.h" #include "components/prefs/testing_pref_service.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -84,6 +85,9 @@ policy::EnrollmentConfig enrollment_config_; + // Objects required by the EnrollmentScreen that can be re-used. + MockEnrollmentScreenView mock_view_; + private: void HandleScreenExit(EnrollmentScreen::Result screen_result) { EXPECT_FALSE(last_screen_result_.has_value()); @@ -99,11 +103,28 @@ TestingPrefServiceSimple pref_service_; chromeos::system::FakeStatisticsProvider statistics_provider_; - - // Objects required by the EnrollmentScreen that can be re-used. - MockEnrollmentScreenView mock_view_; }; +TEST_F(EnrollmentScreenUnitTest, ConfigAfterRollback) { + enrollment_config_.mode = + policy::EnrollmentConfig::MODE_ATTESTATION_ROLLBACK_FORCED; + enrollment_config_.auth_mechanism = + policy::EnrollmentConfig::AUTH_MECHANISM_BEST_AVAILABLE; + + // Expect that rollback enrollment config is passed to the view. + EXPECT_CALL( + mock_view_, + SetEnrollmentConfig(testing::AllOf( + testing::Field( + &policy::EnrollmentConfig::mode, + policy::EnrollmentConfig::MODE_ATTESTATION_ROLLBACK_FORCED), + testing::Field( + &policy::EnrollmentConfig::auth_mechanism, + policy::EnrollmentConfig::AUTH_MECHANISM_BEST_AVAILABLE)))); + + EnrollmentScreenUnitTest::SetUpEnrollmentScreen(); +} + class ZeroTouchEnrollmentScreenUnitTest : public EnrollmentScreenUnitTest { public: ZeroTouchEnrollmentScreenUnitTest() = default;
diff --git a/chrome/browser/ash/login/enrollment/enrollment_uma.cc b/chrome/browser/ash/login/enrollment/enrollment_uma.cc index 3d32da0..64a88d1b 100644 --- a/chrome/browser/ash/login/enrollment/enrollment_uma.cc +++ b/chrome/browser/ash/login/enrollment/enrollment_uma.cc
@@ -6,6 +6,7 @@ #include "base/metrics/histogram_functions.h" #include "base/notreached.h" +#include "chrome/browser/ash/policy/enrollment/enrollment_config.h" namespace ash { namespace { @@ -25,6 +26,10 @@ const char* const kMetricEnrollmentForcedInitialManualFallback = "Enterprise.EnrollmentForcedInitialManualFallback"; const char* const kMetricEnrollmentRecovery = "Enterprise.EnrollmentRecovery"; +const char* const kMetricEnrollmentRollbackAttestation = + "Enterprise.EnrollmentRollbackAttestation"; +const char* const kMetricEnrollmentRollbackManualFallback = + "Enterprise.EnrollmentRollbackManualFallback"; } // namespace @@ -65,6 +70,12 @@ case policy::EnrollmentConfig::MODE_RECOVERY: base::UmaHistogramSparse(kMetricEnrollmentRecovery, sample); break; + case policy::EnrollmentConfig::MODE_ATTESTATION_ROLLBACK_FORCED: + base::UmaHistogramSparse(kMetricEnrollmentRollbackAttestation, sample); + break; + case policy::EnrollmentConfig::MODE_ATTESTATION_ROLLBACK_MANUAL_FALLBACK: + base::UmaHistogramSparse(kMetricEnrollmentRollbackManualFallback, sample); + break; case policy::EnrollmentConfig::OBSOLETE_MODE_ENROLLED_ROLLBACK: case policy::EnrollmentConfig::MODE_OFFLINE_DEMO_DEPRECATED: case policy::EnrollmentConfig::MODE_NONE:
diff --git a/chrome/browser/ash/login/screens/gaia_password_changed_screen.cc b/chrome/browser/ash/login/screens/gaia_password_changed_screen.cc index 9ef9bd4..e9f846c 100644 --- a/chrome/browser/ash/login/screens/gaia_password_changed_screen.cc +++ b/chrome/browser/ash/login/screens/gaia_password_changed_screen.cc
@@ -15,6 +15,7 @@ constexpr const char kUserActionCancelLogin[] = "cancel"; constexpr const char kUserActionResyncData[] = "resync"; +constexpr const char kUserActionMigrateUserData[] = "migrate-user-data"; } // namespace @@ -25,24 +26,13 @@ GaiaPasswordChangedScreen::GaiaPasswordChangedScreen( const ScreenExitCallback& exit_callback, - GaiaPasswordChangedView* view) + base::WeakPtr<GaiaPasswordChangedView> view) : BaseScreen(GaiaPasswordChangedView::kScreenId, OobeScreenPriority::DEFAULT), - exit_callback_(exit_callback) { - view_ = view; - if (view_) - view_->Bind(this); -} + view_(std::move(view)), + exit_callback_(exit_callback) {} -GaiaPasswordChangedScreen::~GaiaPasswordChangedScreen() { - if (view_) - view_->Unbind(); -} - -void GaiaPasswordChangedScreen::OnViewDestroyed(GaiaPasswordChangedView* view) { - if (view_ == view) - view_ = nullptr; -} +GaiaPasswordChangedScreen::~GaiaPasswordChangedScreen() = default; void GaiaPasswordChangedScreen::ShowImpl() { DCHECK(account_id_.is_valid()); @@ -64,8 +54,9 @@ RecordEulaScreenAction(UserAction::kIncorrectOldPassword); } -void GaiaPasswordChangedScreen::OnUserActionDeprecated( - const std::string& action_id) { +void GaiaPasswordChangedScreen::OnUserAction(const base::Value::List& args) { + const std::string& action_id = args[0].GetString(); + if (action_id == kUserActionCancelLogin) { RecordEulaScreenAction(UserAction::kCancel); CancelPasswordChangedFlow(); @@ -74,6 +65,12 @@ // LDH will pass control to ExistingUserController to proceed with clearing // cryptohome. exit_callback_.Run(Result::RESYNC); + } else if (action_id == kUserActionMigrateUserData) { + CHECK_EQ(args.size(), 2); + const std::string& old_password = args[1].GetString(); + MigrateUserData(old_password); + } else { + BaseScreen::OnUserAction(args); } }
diff --git a/chrome/browser/ash/login/screens/gaia_password_changed_screen.h b/chrome/browser/ash/login/screens/gaia_password_changed_screen.h index 3b0344a7..8b8f64a 100644 --- a/chrome/browser/ash/login/screens/gaia_password_changed_screen.h +++ b/chrome/browser/ash/login/screens/gaia_password_changed_screen.h
@@ -28,8 +28,9 @@ using ScreenExitCallback = base::RepeatingCallback<void(Result result)>; - explicit GaiaPasswordChangedScreen(const ScreenExitCallback& exit_callback, - GaiaPasswordChangedView* view); + explicit GaiaPasswordChangedScreen( + const ScreenExitCallback& exit_callback, + base::WeakPtr<GaiaPasswordChangedView> view); GaiaPasswordChangedScreen(const GaiaPasswordChangedScreen&) = delete; GaiaPasswordChangedScreen& operator=(const GaiaPasswordChangedScreen&) = delete; @@ -47,10 +48,6 @@ kMaxValue = kIncorrectOldPassword }; - // Called when the screen is being destroyed. This should call Unbind() on the - // associated View if this class is destroyed before that. - void OnViewDestroyed(GaiaPasswordChangedView* view); - void MigrateUserData(const std::string& old_password); void Configure(const AccountId& account_id, bool after_incorrect_attempt); @@ -59,7 +56,7 @@ // BaseScreen: void ShowImpl() override; void HideImpl() override; - void OnUserActionDeprecated(const std::string& action_id) override; + void OnUserAction(const base::Value::List& args) override; void CancelPasswordChangedFlow(); void OnCookiesCleared(); @@ -67,7 +64,7 @@ AccountId account_id_; bool show_error_ = false; - GaiaPasswordChangedView* view_ = nullptr; + base::WeakPtr<GaiaPasswordChangedView> view_; ScreenExitCallback exit_callback_; base::WeakPtrFactory<GaiaPasswordChangedScreen> weak_factory_{this};
diff --git a/chrome/browser/ash/login/ui/login_display_host_webui.cc b/chrome/browser/ash/login/ui/login_display_host_webui.cc index a7c9004..b3046720 100644 --- a/chrome/browser/ash/login/ui/login_display_host_webui.cc +++ b/chrome/browser/ash/login/ui/login_display_host_webui.cc
@@ -122,9 +122,6 @@ // Maximum delay for startup sound after 'loginPromptVisible' signal. const int kStartupSoundMaxDelayMs = 4000; -// URL which corresponds to the login WebUI. -const char kLoginURL[] = "chrome://oobe/login"; - // URL which corresponds to the OOBE WebUI. const char kOobeURL[] = "chrome://oobe/oobe"; @@ -601,16 +598,6 @@ VLOG(1) << "Login WebUI >> sign in"; - // TODO(crbug.com/784495): Make sure this is ported to views. - if (!login_window_) { - TRACE_EVENT_NESTABLE_ASYNC_INSTANT0( - "ui", "StartSignInScreen", - TRACE_ID_WITH_SCOPE(kShowLoginWebUIid, TRACE_ID_GLOBAL(1))); - BootTimesRecorder::Get()->RecordCurrentStats("login-start-signin-screen"); - CHECK(base::FeatureList::IsEnabled(features::kOobeLoginUrl)); - LoadURL(GURL(kLoginURL)); - } - DVLOG(1) << "Starting sign in screen"; CreateExistingUserController();
diff --git a/chrome/browser/ash/login/wizard_context.cc b/chrome/browser/ash/login/wizard_context.cc index 21a22267..6b0e7d31 100644 --- a/chrome/browser/ash/login/wizard_context.cc +++ b/chrome/browser/ash/login/wizard_context.cc
@@ -6,6 +6,7 @@ #include "ash/components/login/auth/public/user_context.h" #include "build/branding_buildflags.h" +#include "chrome/browser/ash/login/configuration_keys.h" #include "chrome/browser/ui/webui/chromeos/login/family_link_notice_screen_handler.h" namespace ash { @@ -22,4 +23,9 @@ WizardContext::~WizardContext() = default; +bool IsRollbackFlow(const WizardContext& context) { + return context.configuration.FindBoolKey(configuration::kRestoreAfterRollback) + .value_or(false); +} + } // namespace ash
diff --git a/chrome/browser/ash/login/wizard_context.h b/chrome/browser/ash/login/wizard_context.h index dfadd9b..ff308145f 100644 --- a/chrome/browser/ash/login/wizard_context.h +++ b/chrome/browser/ash/login/wizard_context.h
@@ -120,6 +120,9 @@ absl::optional<bool> is_owner_flow; }; +// Returns |true| if this is an OOBE flow after enterprise enrollment. +bool IsRollbackFlow(const WizardContext& context); + } // namespace ash #endif // CHROME_BROWSER_ASH_LOGIN_WIZARD_CONTEXT_H_
diff --git a/chrome/browser/ash/login/wizard_controller.cc b/chrome/browser/ash/login/wizard_controller.cc index f86cc0f8..4a3d18c 100644 --- a/chrome/browser/ash/login/wizard_controller.cc +++ b/chrome/browser/ash/login/wizard_controller.cc
@@ -730,7 +730,7 @@ std::make_unique<GaiaPasswordChangedScreen>( base::BindRepeating(&WizardController::OnPasswordChangeScreenExit, weak_factory_.GetWeakPtr()), - oobe_ui->GetView<GaiaPasswordChangedScreenHandler>()); + oobe_ui->GetView<GaiaPasswordChangedScreenHandler>()->AsWeakPtr()); append(std::move(gaia_password_change_screen)); append(std::make_unique<ActiveDirectoryPasswordChangeScreen>( @@ -1558,19 +1558,11 @@ void WizardController::OnEnrollmentDone() { PerformOOBECompletedActions(); - // Fetch the rollback flag from `oobe_configuration_`. - bool enrollment_mode_rollback = false; - auto* restore_after_rollback_value = - wizard_context_->configuration.FindKeyOfType( - configuration::kRestoreAfterRollback, base::Value::Type::BOOLEAN); - if (restore_after_rollback_value) - enrollment_mode_rollback = restore_after_rollback_value->GetBool(); - // Restart to make the login page pick up the policy changes resulting from // enrollment recovery. (Not pretty, but this codepath is rarely exercised.) if (prescribed_enrollment_config_.mode == policy::EnrollmentConfig::MODE_RECOVERY || - enrollment_mode_rollback) { + IsRollbackFlow(*wizard_context_)) { LOG(WARNING) << "Restart Chrome to pick up the policy changes"; EnrollmentScreen* screen = EnrollmentScreen::Get(screen_manager()); screen->OnBrowserRestart(); @@ -1909,15 +1901,6 @@ if (start_enrollment_value) configuration_forced_enrollment = start_enrollment_value->GetBool(); - // Fetch the rollback flag from `configuration`. It is not stored in the - // `prescribed_enrollment_config_`. To restore after rollback the enrollment - // screen needs to be started. (crbug.com/1093928) - auto* restore_after_rollback_value = - wizard_context_->configuration.FindKeyOfType( - configuration::kRestoreAfterRollback, base::Value::Type::BOOLEAN); - if (restore_after_rollback_value) - configuration_forced_enrollment |= restore_after_rollback_value->GetBool(); - if (device_disabled) { demo_setup_controller_.reset(); ShowDeviceDisabledScreen();
diff --git a/chrome/browser/ash/policy/enrollment/enrollment_config.cc b/chrome/browser/ash/policy/enrollment/enrollment_config.cc index c49e62f..a23b43c 100644 --- a/chrome/browser/ash/policy/enrollment/enrollment_config.cc +++ b/chrome/browser/ash/policy/enrollment/enrollment_config.cc
@@ -10,6 +10,8 @@ #include "base/logging.h" #include "base/values.h" #include "chrome/browser/ash/login/login_pref_names.h" +#include "chrome/browser/ash/login/ui/login_display_host.h" +#include "chrome/browser/ash/login/wizard_context.h" #include "chrome/browser/ash/policy/core/device_cloud_policy_manager_ash.h" #include "chrome/browser/ash/policy/server_backed_state/server_backed_device_state.h" #include "chrome/browser/browser_process.h" @@ -37,6 +39,14 @@ return value ? *value : std::string(); } +bool IsEnrollingAfterRollback() { + auto* login_display_host = ash::LoginDisplayHost::default_host(); + if (!login_display_host) + return false; + const auto* wizard_context = login_display_host->GetWizardContext(); + return wizard_context && ash::IsRollbackFlow(*wizard_context); +} + } // namespace namespace policy { @@ -156,7 +166,11 @@ true); // Decide enrollment mode. Give precedence to forced variants. - if (device_state_mode == kDeviceStateRestoreModeReEnrollmentEnforced) { + if (IsEnrollingAfterRollback()) { + config.mode = policy::EnrollmentConfig::MODE_ATTESTATION_ROLLBACK_FORCED; + config.auth_mechanism = + policy::EnrollmentConfig::AUTH_MECHANISM_BEST_AVAILABLE; + } else if (device_state_mode == kDeviceStateRestoreModeReEnrollmentEnforced) { config.mode = EnrollmentConfig::MODE_SERVER_FORCED; config.management_domain = device_state_management_domain; } else if (device_state_mode == kDeviceStateInitialModeEnrollmentEnforced) { @@ -193,4 +207,35 @@ return config; } +// static +EnrollmentConfig::Mode EnrollmentConfig::GetManualFallbackMode( + EnrollmentConfig::Mode attestation_mode) { + switch (attestation_mode) { + case EnrollmentConfig::MODE_ATTESTATION_INITIAL_SERVER_FORCED: + return EnrollmentConfig::MODE_ATTESTATION_INITIAL_MANUAL_FALLBACK; + case EnrollmentConfig::MODE_ATTESTATION_SERVER_FORCED: + return EnrollmentConfig::MODE_ATTESTATION_MANUAL_FALLBACK; + case EnrollmentConfig::MODE_ATTESTATION_ROLLBACK_FORCED: + return EnrollmentConfig::MODE_ATTESTATION_ROLLBACK_MANUAL_FALLBACK; + case EnrollmentConfig::MODE_NONE: + case EnrollmentConfig::MODE_MANUAL: + case EnrollmentConfig::MODE_MANUAL_REENROLLMENT: + case EnrollmentConfig::MODE_LOCAL_FORCED: + case EnrollmentConfig::MODE_LOCAL_ADVERTISED: + case EnrollmentConfig::MODE_SERVER_FORCED: + case EnrollmentConfig::MODE_SERVER_ADVERTISED: + case EnrollmentConfig::MODE_RECOVERY: + case EnrollmentConfig::MODE_ATTESTATION: + case EnrollmentConfig::MODE_ATTESTATION_LOCAL_FORCED: + case EnrollmentConfig::MODE_ATTESTATION_MANUAL_FALLBACK: + case EnrollmentConfig::MODE_OFFLINE_DEMO_DEPRECATED: + case EnrollmentConfig::OBSOLETE_MODE_ENROLLED_ROLLBACK: + case EnrollmentConfig::MODE_INITIAL_SERVER_FORCED: + case EnrollmentConfig::MODE_ATTESTATION_INITIAL_MANUAL_FALLBACK: + case EnrollmentConfig::MODE_ATTESTATION_ROLLBACK_MANUAL_FALLBACK: + NOTREACHED(); + } + return EnrollmentConfig::MODE_NONE; +} + } // namespace policy
diff --git a/chrome/browser/ash/policy/enrollment/enrollment_config.h b/chrome/browser/ash/policy/enrollment/enrollment_config.h index f8c0c4f..e492903 100644 --- a/chrome/browser/ash/policy/enrollment/enrollment_config.h +++ b/chrome/browser/ash/policy/enrollment/enrollment_config.h
@@ -84,6 +84,14 @@ // Forced enrollment triggered as a fallback to attestation initial // enrollment, user can't skip. MODE_ATTESTATION_INITIAL_MANUAL_FALLBACK = 16, + // An enterprise rollback just took place and the device was wiped. + // Attempt to re-enroll with attestation. This is forced from the + // client side. Cannot be skipped. + MODE_ATTESTATION_ROLLBACK_FORCED = 17, + // An enterprise rollback just took place and the device was wiped. + // Attestation re-enrollment just failed, attempt manual enrollment as + // fallback. Cannot be skipped. + MODE_ATTESTATION_ROLLBACK_MANUAL_FALLBACK = 18, }; // An enumeration of authentication mechanisms that can be used for @@ -114,6 +122,10 @@ const ash::InstallAttributes& install_attributes, chromeos::system::StatisticsProvider* statistics_provider); + // Returns the respective manual fallback enrollment mode when given an + // attestation mode. + static Mode GetManualFallbackMode(Mode attestation_mode); + EnrollmentConfig(); EnrollmentConfig(const EnrollmentConfig& config); ~EnrollmentConfig(); @@ -134,7 +146,8 @@ // Whether we fell back into manual enrollment. bool is_manual_fallback() const { return mode == MODE_ATTESTATION_MANUAL_FALLBACK || - mode == MODE_ATTESTATION_INITIAL_MANUAL_FALLBACK; + mode == MODE_ATTESTATION_INITIAL_MANUAL_FALLBACK || + mode == MODE_ATTESTATION_ROLLBACK_MANUAL_FALLBACK; } // Whether enrollment is forced. The user can't skip the enrollment step @@ -145,7 +158,8 @@ mode == MODE_ATTESTATION_SERVER_FORCED || mode == MODE_INITIAL_SERVER_FORCED || mode == MODE_ATTESTATION_INITIAL_SERVER_FORCED || - mode == MODE_RECOVERY || is_manual_fallback(); + mode == MODE_ATTESTATION_ROLLBACK_FORCED || mode == MODE_RECOVERY || + is_manual_fallback(); } // Whether attestation-based authentication is forced. The user cannot enroll @@ -160,10 +174,23 @@ mode == MODE_ATTESTATION_INITIAL_SERVER_FORCED; } + // Whether this configuration is in attestation mode per client request. + bool is_mode_attestation_client() const { + return mode == MODE_ATTESTATION || mode == MODE_ATTESTATION_LOCAL_FORCED || + mode == MODE_ATTESTATION_ROLLBACK_FORCED; + } + + // Whether this configuration is an attestation mode that has a manual + // fallback. I.e. after a failed attempt at automatic enrolling, manual + // enrollment will be triggered. + bool is_mode_attestation_with_manual_fallback() const { + return is_mode_attestation_server() || + mode == MODE_ATTESTATION_ROLLBACK_FORCED; + } + // Whether this configuration is in attestation mode. bool is_mode_attestation() const { - return mode == MODE_ATTESTATION || mode == MODE_ATTESTATION_LOCAL_FORCED || - is_mode_attestation_server(); + return is_mode_attestation_client() || is_mode_attestation_server(); } // Whether this configuration is in OAuth mode.
diff --git a/chrome/browser/ash/policy/enrollment/enrollment_handler.cc b/chrome/browser/ash/policy/enrollment/enrollment_handler.cc index 0e9693fc..1cd04c2 100644 --- a/chrome/browser/ash/policy/enrollment/enrollment_handler.cc +++ b/chrome/browser/ash/policy/enrollment/enrollment_handler.cc
@@ -28,6 +28,7 @@ #include "chrome/browser/ash/policy/core/dm_token_storage.h" #include "chrome/browser/ash/policy/dev_mode/dev_mode_policy_util.h" #include "chrome/browser/ash/policy/enrollment/auto_enrollment_type_checker.h" +#include "chrome/browser/ash/policy/enrollment/enrollment_config.h" #include "chrome/browser/ash/policy/enrollment/enrollment_status.h" #include "chrome/browser/ash/policy/enrollment/tpm_enrollment_key_signing_service.h" #include "chrome/browser/ash/policy/server_backed_state/server_backed_state_keys_broker.h" @@ -134,6 +135,12 @@ case EnrollmentConfig::MODE_ATTESTATION_INITIAL_MANUAL_FALLBACK: return em::DeviceRegisterRequest:: FLAVOR_ENROLLMENT_ATTESTATION_INITIAL_MANUAL_FALLBACK; + case EnrollmentConfig::MODE_ATTESTATION_ROLLBACK_FORCED: + return em::DeviceRegisterRequest:: + FLAVOR_ENROLLMENT_ATTESTATION_ROLLBACK_FORCED; + case EnrollmentConfig::MODE_ATTESTATION_ROLLBACK_MANUAL_FALLBACK: + return em::DeviceRegisterRequest:: + FLAVOR_ENROLLMENT_ATTESTATION_ROLLBACK_MANUAL_FALLBACK; } NOTREACHED() << "Bad enrollment mode: " << mode;
diff --git a/chrome/browser/autofill_assistant/password_change/apc_client_impl_unittest.cc b/chrome/browser/autofill_assistant/password_change/apc_client_impl_unittest.cc index 0af442c..e2c83ce 100644 --- a/chrome/browser/autofill_assistant/password_change/apc_client_impl_unittest.cc +++ b/chrome/browser/autofill_assistant/password_change/apc_client_impl_unittest.cc
@@ -50,6 +50,7 @@ } // namespace +using ::testing::_; using ::testing::DoAll; using ::testing::SaveArg; using ::testing::StrEq; @@ -270,7 +271,7 @@ base::OnceCallback<void( autofill_assistant::HeadlessScriptController::ScriptResult)> external_script_controller_callback; - EXPECT_CALL(*external_script_controller(), StartScript) + EXPECT_CALL(*external_script_controller(), StartScript(_, _)) .Times(1) .WillOnce(MoveArg<1>(&external_script_controller_callback)); @@ -300,7 +301,7 @@ // Prepare to extract the script_params to the external script // controller. base::flat_map<std::string, std::string> params_map; - EXPECT_CALL(*external_script_controller(), StartScript) + EXPECT_CALL(*external_script_controller(), StartScript(_, _)) .Times(1) .WillOnce(MoveArg<0>(¶ms_map)); @@ -327,7 +328,7 @@ // Prepare to extract the script_params to the external script // controller. base::flat_map<std::string, std::string> params_map; - EXPECT_CALL(*external_script_controller(), StartScript) + EXPECT_CALL(*external_script_controller(), StartScript(_, _)) .Times(1) .WillOnce(MoveArg<0>(¶ms_map)); @@ -354,7 +355,7 @@ // Prepare to extract the script_params to the external script // controller. base::flat_map<std::string, std::string> params_map; - EXPECT_CALL(*external_script_controller(), StartScript) + EXPECT_CALL(*external_script_controller(), StartScript(_, _)) .Times(1) .WillOnce(MoveArg<0>(¶ms_map));
diff --git a/chrome/browser/chromeos/launcher_search/search_util.cc b/chrome/browser/chromeos/launcher_search/search_util.cc index 8edac59..1322377 100644 --- a/chrome/browser/chromeos/launcher_search/search_util.cc +++ b/chrome/browser/chromeos/launcher_search/search_util.cc
@@ -13,6 +13,7 @@ #include "components/omnibox/browser/autocomplete_provider_client.h" #include "components/omnibox/browser/favicon_cache.h" #include "components/omnibox/browser/suggestion_answer.h" +#include "mojo/public/cpp/bindings/remote.h" #include "ui/base/page_transition_types.h" namespace crosapi { @@ -20,6 +21,7 @@ using mojom::SearchResult; using mojom::SearchResultPtr; +using RemoteConsumer = mojo::Remote<crosapi::mojom::SearchResultConsumer>; SearchResult::AnswerType MatchTypeToAnswerType(const int type) { switch (static_cast<SuggestionAnswer::AnswerType>(type)) { @@ -93,6 +95,38 @@ } } +SearchResult::MetricsType MatchTypeToMetricsType( + AutocompleteMatchType::Type type) { + switch (type) { + case AutocompleteMatchType::URL_WHAT_YOU_TYPED: + return SearchResult::MetricsType::kWhatYouTyped; + case AutocompleteMatchType::HISTORY_URL: + // A recently-visited URL that is also a bookmark is handled manually when + // constructing the result. + return SearchResult::MetricsType::kRecentlyVisitedWebsite; + case AutocompleteMatchType::HISTORY_TITLE: + return SearchResult::MetricsType::kHistoryTitle; + case AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED: + return SearchResult::MetricsType::kSearchWhatYouTyped; + case AutocompleteMatchType::SEARCH_HISTORY: + return SearchResult::MetricsType::kSearchHistory; + case AutocompleteMatchType::SEARCH_SUGGEST: + return SearchResult::MetricsType::kSearchSuggest; + case AutocompleteMatchType::SEARCH_SUGGEST_PERSONALIZED: + return SearchResult::MetricsType::kSearchSuggestPersonalized; + case AutocompleteMatchType::BOOKMARK_TITLE: + return SearchResult::MetricsType::kBookmark; + case AutocompleteMatchType::SEARCH_SUGGEST_ENTITY: + return SearchResult::MetricsType::kSearchSuggestEntity; + case AutocompleteMatchType::NAVSUGGEST: + return SearchResult::MetricsType::kNavSuggest; + case AutocompleteMatchType::CALCULATOR: + return SearchResult::MetricsType::kCalculator; + default: + return SearchResult::MetricsType::kUnset; + } +} + SearchResult::TextType TextStyleToType( const SuggestionAnswer::TextStyle style) { switch (style) { @@ -171,6 +205,20 @@ return providers; } +// Convert from our Mojo page transition type into the UI equivalent. +ui::PageTransition PageTransitionToUiPageTransition( + SearchResult::PageTransition transition) { + switch (transition) { + case SearchResult::PageTransition::kTyped: + return ui::PAGE_TRANSITION_TYPED; + case SearchResult::PageTransition::kGenerated: + return ui::PAGE_TRANSITION_GENERATED; + default: + NOTREACHED(); + return ui::PAGE_TRANSITION_FIRST; + } +} + SearchResultPtr CreateAnswerResult(const AutocompleteMatch& match, AutocompleteController* controller, base::StringPiece16 query, @@ -246,6 +294,7 @@ const AutocompleteInput& input) { SearchResultPtr result = CreateBaseResult(match, controller, input); + result->metrics_type = MatchTypeToMetricsType(match.type); result->is_answer = SearchResult::OptionalBool::kFalse; result->contents = match.contents; result->contents_type = ClassesToType(match.contents_class); @@ -265,11 +314,22 @@ result->omnibox_type == SearchResult::OmniboxType::kDomain || result->omnibox_type == SearchResult::OmniboxType::kOpenTab; if (use_favicon && favicon_cache) { + // Provide hook by which a result object can receive an + // asychronously-fetched favicon. Use a pointer so that our callback can + // own the remote interface. + RemoteConsumer consumer; + result->receiver = consumer.BindNewPipeAndPassReceiver(); + auto emit_favicon = base::BindOnce( + [](RemoteConsumer consumer, const gfx::Image& icon) { + consumer->OnFaviconReceived(icon.AsImageSkia()); + }, + std::move(consumer)); + const auto icon = favicon_cache->GetFaviconForPageUrl( - match.destination_url, base::DoNothing()); + match.destination_url, std::move(emit_favicon)); if (!icon.IsEmpty()) { result->omnibox_type = SearchResult::OmniboxType::kFavicon; - result->favicon = icon.AsImageSkia(); + result->cached_favicon = icon.AsImageSkia(); } } @@ -277,6 +337,7 @@ if (result->omnibox_type != SearchResult::OmniboxType::kFavicon && bookmark_model && bookmark_model->IsBookmarked(match.destination_url)) { result->omnibox_type = SearchResult::OmniboxType::kBookmark; + result->metrics_type = SearchResult::MetricsType::kBookmark; } }
diff --git a/chrome/browser/chromeos/launcher_search/search_util.h b/chrome/browser/chromeos/launcher_search/search_util.h index 3a5532f..929a5d35 100644 --- a/chrome/browser/chromeos/launcher_search/search_util.h +++ b/chrome/browser/chromeos/launcher_search/search_util.h
@@ -25,6 +25,11 @@ // search. int ProviderTypes(); +// Returns the UI page transition that corresponds to the given crosapi page +// transition. +ui::PageTransition PageTransitionToUiPageTransition( + mojom::SearchResult::PageTransition transition); + // Creates an Omnibox answer card result from the AutocompleteMatch. Match must // either have its answer field populated or be a calculator result. mojom::SearchResultPtr CreateAnswerResult(const AutocompleteMatch& match, @@ -40,6 +45,11 @@ bookmarks::BookmarkModel* bookmark_model, const AutocompleteInput& input); +// Convenience function to compare crosapi bools. +inline bool OptionalBoolIsTrue(mojom::SearchResult::OptionalBool b) { + return b == mojom::SearchResult::OptionalBool::kTrue; +} + } // namespace crosapi #endif // CHROME_BROWSER_CHROMEOS_LAUNCHER_SEARCH_SEARCH_UTIL_H_
diff --git a/chrome/browser/device_identity/device_oauth2_token_service_unittest.cc b/chrome/browser/device_identity/device_oauth2_token_service_unittest.cc index 19c642a..d99ad4b 100644 --- a/chrome/browser/device_identity/device_oauth2_token_service_unittest.cc +++ b/chrome/browser/device_identity/device_oauth2_token_service_unittest.cc
@@ -150,6 +150,17 @@ " \"user_id\": \"1234567890\" }"; } + std::string GetInvalidScopeResponse(const std::string& scope) { + return "{ \"error\": \"invalid_scope\", " + "\"error_description\": \"Some requested scopes were invalid. " + "{invalid\\u003d[" + + scope + + "}\", " + "\"error_uri\": " + "\"https://developers.google.com/identity/protocols/oauth2\"" + "}"; + } + bool RefreshTokenIsAvailable() { return oauth2_service_->RefreshTokenIsAvailable(); } @@ -334,6 +345,27 @@ } TEST_F(DeviceOAuth2TokenServiceTest, + RefreshTokenValidation_Failure_InvalidScope) { + SetUpDefaultValues(); + std::unique_ptr<OAuth2AccessTokenManager::Request> request = + StartTokenRequest(); + + PerformURLFetchesWithResults( + net::HTTP_OK, GetValidTokenResponse("tokeninfo_access_token", 3600), + net::HTTP_OK, GetValidTokenInfoResponse(kRobotEmail), + net::HTTP_BAD_REQUEST, GetInvalidScopeResponse("test_scope")); + + AssertConsumerTokensAndErrors(0, 1); + EXPECT_EQ(consumer_.last_error_.state(), + GoogleServiceAuthError::SCOPE_LIMITED_UNRECOVERABLE_ERROR); + EXPECT_EQ( + consumer_.last_error_.error_message(), + "{ \"error\": \"invalid_scope\", \"error_description\": \"Some requested " + "scopes were invalid. {invalid\\u003d[test_scope}\", \"error_uri\": " + "\"https://developers.google.com/identity/protocols/oauth2\"}"); +} + +TEST_F(DeviceOAuth2TokenServiceTest, RefreshTokenValidation_Failure_TokenInfoApiCallHttpError) { SetUpDefaultValues(); std::unique_ptr<OAuth2AccessTokenManager::Request> request =
diff --git a/chrome/browser/enterprise/connectors/enterprise_connectors_policy_handler_unittest.cc b/chrome/browser/enterprise/connectors/enterprise_connectors_policy_handler_unittest.cc index a7f3a30..47e1740 100644 --- a/chrome/browser/enterprise/connectors/enterprise_connectors_policy_handler_unittest.cc +++ b/chrome/browser/enterprise/connectors/enterprise_connectors_policy_handler_unittest.cc
@@ -210,6 +210,9 @@ if (policy_pref() != kOnFileAttachedPref || policy_pref() != kOnFileDownloadedPref || policy_pref() != kOnBulkDataEntryPref || +#if BUILDFLAG(IS_CHROMEOS_ASH) + policy_pref() != kOnFileTransferPref || +#endif policy_pref() != kOnPrintPref) { return false; } @@ -253,6 +256,9 @@ kOnFileDownloadedPref, kOnBulkDataEntryPref, kOnPrintPref, +#if BUILDFLAG(IS_CHROMEOS_ASH) + kOnFileTransferPref, +#endif kOnSecurityEventPref, kSendDownloadToCloudPref), testing::Bool()));
diff --git a/chrome/browser/extensions/api/file_system/request_file_system_notification.cc b/chrome/browser/extensions/api/file_system/request_file_system_notification.cc index de23fdd..18a7403 100644 --- a/chrome/browser/extensions/api/file_system/request_file_system_notification.cc +++ b/chrome/browser/extensions/api/file_system/request_file_system_notification.cc
@@ -8,8 +8,11 @@ #include <utility> #include "ash/constants/notifier_catalogs.h" +#include "base/memory/raw_ptr.h" #include "base/memory/ref_counted.h" +#include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" +#include "build/chromeos_buildflags.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/extensions/chrome_app_icon_loader.h" #include "chrome/browser/notifications/notification_display_service.h" @@ -32,9 +35,10 @@ const int kIconSize = 48; // Loads an app's icon and uses it to display a notification. -class AppNotificationLauncher : public AppIconLoaderDelegate { +class AppNotificationLauncher : public AppIconLoaderDelegate, + public message_center::NotificationDelegate { public: - // This class owns and deletes itself after showing the notification. + // This class owns and deletes itself after the shown notification closes. AppNotificationLauncher() = default; AppNotificationLauncher(const AppNotificationLauncher&) = delete; @@ -49,24 +53,33 @@ icon_loader_ = std::make_unique<ChromeAppIconLoader>(profile, kIconSize, this); icon_loader_->FetchImage(extension_id); - - // |this| may be destroyed! } // AppIconLoaderDelegate overrides: + // This is triggered from FetchImage() in InitAndShow(), and can be called + // multiple times, synchronously or asynchronously. void OnAppImageUpdated(const std::string& id, const gfx::ImageSkia& image) override { pending_notification_->set_icon(ui::ImageModel::FromImageSkia(image)); - NotificationDisplayService::GetForProfile(profile_)->Display( - NotificationHandler::Type::TRANSIENT, *pending_notification_, - /*metadata=*/nullptr); - delete this; + auto* notification_display_service = + NotificationDisplayService::GetForProfile(profile_); + + notification_display_service->Display(NotificationHandler::Type::TRANSIENT, + *pending_notification_, + /*metadata=*/nullptr); + } + + // message_center::NotificationDelegate override. + void Close(bool by_user) override { + // On notification close, free |pending_notification| (which holds a + // reference to this) to trigger self-deletion. + pending_notification_.reset(); } private: ~AppNotificationLauncher() override = default; - Profile* profile_; + base::raw_ptr<Profile> profile_; std::unique_ptr<AppIconLoader> icon_loader_; std::unique_ptr<message_center::Notification> pending_notification_; }; @@ -81,8 +94,14 @@ const std::string& volume_label, bool writable) { DCHECK(profile); + static int sequence = 0; + // Create globally unique |notification_id| so that notifications are not + // suppressed, thus allowing each AppNotificationLauncher instance to + // correspond to an actual notification, and properly deallocated on close. + const std::string notification_id = base::StringPrintf( + "%s-%s-%d", extension_id.c_str(), volume_id.c_str(), sequence); + ++sequence; - const std::string notification_id = extension_id + "-" + volume_id; message_center::RichNotificationData data; // TODO(mtomasz): Share this code with RequestFileSystemDialogView. @@ -94,20 +113,29 @@ : IDS_FILE_SYSTEM_REQUEST_FILE_SYSTEM_NOTIFICATION_MESSAGE, display_name); + // Helper that self-deletes when the displayed notification closes. + scoped_refptr<AppNotificationLauncher> app_notification_launcher = + base::MakeRefCounted<AppNotificationLauncher>(); + std::unique_ptr<message_center::Notification> notification(new Notification( message_center::NOTIFICATION_TYPE_SIMPLE, notification_id, base::UTF8ToUTF16(extension_name), message, ui::ImageModel(), // Updated asynchronously later. std::u16string(), // display_source GURL(), +#if BUILDFLAG(IS_CHROMEOS_ASH) message_center::NotifierId( message_center::NotifierType::SYSTEM_COMPONENT, notification_id, ash::NotificationCatalogName::kRequestFileSystem), - data, base::MakeRefCounted<message_center::NotificationDelegate>())); +#endif // BUILDFLAG(IS_CHROMEOS_ASH) +#if BUILDFLAG(IS_CHROMEOS_LACROS) + message_center::NotifierId(message_center::NotifierType::SYSTEM_COMPONENT, + notification_id), +#endif // BUILDFLAG(IS_CHROMEOS_LACROS) + data, app_notification_launcher)); - // AppNotificationLauncher will delete itself. - (new AppNotificationLauncher()) - ->InitAndShow(profile, extension_id, std::move(notification)); + app_notification_launcher->InitAndShow(profile, extension_id, + std::move(notification)); } } // namespace extensions
diff --git a/chrome/browser/extensions/api/passwords_private/password_check_delegate.cc b/chrome/browser/extensions/api/passwords_private/password_check_delegate.cc index cc2425d..452382e 100644 --- a/chrome/browser/extensions/api/passwords_private/password_check_delegate.cc +++ b/chrome/browser/extensions/api/passwords_private/password_check_delegate.cc
@@ -626,7 +626,7 @@ if (!entry) return nullptr; - if (credential.signon_realm != entry->signon_realm || + if (credential.urls.signon_realm != entry->signon_realm || credential.username != base::UTF16ToUTF8(entry->username) || (credential.password && *credential.password != base::UTF16ToUTF8(entry->password))) { @@ -675,45 +675,20 @@ api::passwords_private::InsecureCredential api_credential; auto facet = password_manager::FacetURI::FromPotentiallyInvalidSpec( entry.signon_realm); - if (facet.IsValidAndroidFacetURI()) { - api_credential.is_android_credential = true; - // |formatted_orgin|, |detailed_origin| and |change_password_url| need - // special handling for Android. Here we use affiliation information - // instead of the origin. + api_credential.is_android_credential = facet.IsValidAndroidFacetURI(); + api_credential.id = insecure_credential_id_generator_.GenerateId(entry); + api_credential.username = base::UTF16ToUTF8(entry.username); + api_credential.urls = CreateUrlCollectionFromCredential(entry); + if (api_credential.is_android_credential) { + // |change_password_url| need special handling for Android. Here we use + // affiliation information instead of the origin. if (!entry.app_display_name.empty()) { - api_credential.formatted_origin = entry.app_display_name; - api_credential.detailed_origin = entry.app_display_name; api_credential.change_password_url = GetChangePasswordUrl(GURL(entry.affiliated_web_realm)); - } else { - // In case no affiliation information could be obtained show the - // formatted package name to the user. An empty change_password_url will - // be handled by the frontend, by not including a link in this case. - api_credential.formatted_origin = l10n_util::GetStringFUTF8( - IDS_SETTINGS_PASSWORDS_ANDROID_APP, - base::UTF8ToUTF16(facet.android_package_name())); - api_credential.detailed_origin = facet.android_package_name(); } } else { - api_credential.is_android_credential = false; - api_credential.formatted_origin = - base::UTF16ToUTF8(url_formatter::FormatUrl( - entry.url.GetWithEmptyPath(), - url_formatter::kFormatUrlOmitDefaults | - url_formatter::kFormatUrlOmitHTTPS | - url_formatter::kFormatUrlOmitTrivialSubdomains | - url_formatter::kFormatUrlTrimAfterHost, - base::UnescapeRule::SPACES, nullptr, nullptr, nullptr)); - api_credential.detailed_origin = - base::UTF16ToUTF8(url_formatter::FormatUrlForSecurityDisplay( - entry.url.GetWithEmptyPath())); api_credential.change_password_url = GetChangePasswordUrl(entry.url); } - - api_credential.id = insecure_credential_id_generator_.GenerateId(entry); - api_credential.signon_realm = entry.signon_realm; - api_credential.username = base::UTF16ToUTF8(entry.username); - // For the time being, the automated password change is restricted to // compromised credentials. In the future, this requirement may be relaxed. if ((entry.IsPhished() || entry.IsLeaked()) && @@ -728,7 +703,6 @@ } else { api_credential.has_startable_script = false; } - return api_credential; }
diff --git a/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc b/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc index af9af55..a8592dcc 100644 --- a/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc +++ b/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc
@@ -87,6 +87,7 @@ using api::passwords_private::CompromisedInfo; using api::passwords_private::InsecureCredential; using api::passwords_private::PasswordCheckStatus; +using api::passwords_private::UrlCollection; using password_manager::BulkLeakCheckDelegateInterface; using password_manager::BulkLeakCheckService; using password_manager::InsecureCredentialTypeFlags; @@ -230,22 +231,10 @@ return form; } -// Creates matcher for a given insecure credential. -auto ExpectInsecureCredential( - const std::string& formatted_origin, - const std::string& detailed_origin, - const absl::optional<std::string>& change_password_url, - const std::u16string& username) { - auto change_password_url_field_matcher = - change_password_url.has_value() - ? Field(&InsecureCredential::change_password_url, - Pointee(change_password_url.value())) - : Field(&InsecureCredential::change_password_url, IsNull()); - return AllOf( - Field(&InsecureCredential::formatted_origin, formatted_origin), - Field(&InsecureCredential::detailed_origin, detailed_origin), - change_password_url_field_matcher, - Field(&InsecureCredential::username, base::UTF16ToASCII(username))); +auto ExpectUrls(const std::string& formatted_origin, + const std::string& detailed_origin) { + return AllOf(Field(&UrlCollection::shown, formatted_origin), + Field(&UrlCollection::link, detailed_origin)); } // Creates matcher for a given compromised info. @@ -262,6 +251,23 @@ } // Creates matcher for a given compromised credential +auto ExpectWeakCredential( + const std::string& formatted_origin, + const std::string& detailed_origin, + const absl::optional<std::string>& change_password_url, + const std::u16string& username) { + auto change_password_url_field_matcher = + change_password_url.has_value() + ? Field(&InsecureCredential::change_password_url, + Pointee(change_password_url.value())) + : Field(&InsecureCredential::change_password_url, IsNull()); + return AllOf( + Field(&InsecureCredential::username, base::UTF16ToASCII(username)), + Field(&InsecureCredential::urls, + ExpectUrls(formatted_origin, detailed_origin))); +} + +// Creates matcher for a given compromised credential auto ExpectCompromisedCredential( const std::string& formatted_origin, const std::string& detailed_origin, @@ -270,12 +276,20 @@ base::TimeDelta elapsed_time_since_compromise, const std::string& elapsed_time_since_compromise_str, api::passwords_private::CompromiseType compromise_type) { - return AllOf(ExpectInsecureCredential(formatted_origin, detailed_origin, - change_password_url, username), - Field(&InsecureCredential::compromised_info, - Pointee(ExpectCompromisedInfo( - elapsed_time_since_compromise, - elapsed_time_since_compromise_str, compromise_type)))); + auto change_password_url_field_matcher = + change_password_url.has_value() + ? Field(&InsecureCredential::change_password_url, + Pointee(change_password_url.value())) + : Field(&InsecureCredential::change_password_url, IsNull()); + return AllOf( + Field(&InsecureCredential::username, base::UTF16ToASCII(username)), + change_password_url_field_matcher, + Field(&InsecureCredential::urls, + ExpectUrls(formatted_origin, detailed_origin)), + Field(&InsecureCredential::compromised_info, + Pointee(ExpectCompromisedInfo(elapsed_time_since_compromise, + elapsed_time_since_compromise_str, + compromise_type)))); } // Creates a simplified matcher that only checks the username name and @@ -372,11 +386,12 @@ EXPECT_THAT( delegate().GetWeakCredentials(), UnorderedElementsAre( - ExpectInsecureCredential( - "example.com", "https://example.com", + ExpectWeakCredential( + "example.com", "https://example.com/", "https://example.com/.well-known/change-password", kUsername1), - ExpectInsecureCredential( - "Example App", "Example App", + ExpectWeakCredential( + "Example App", + "https://play.google.com/store/apps/details?id=com.example.app", "https://example.com/.well-known/change-password", kUsername2))); } @@ -404,8 +419,8 @@ EXPECT_THAT( delegate().GetWeakCredentials(), - ElementsAre(ExpectInsecureCredential( - "example.com", "https://example.com", + ElementsAre(ExpectWeakCredential( + "example.com", "https://example.com/", "https://example.com/.well-known/change-password", kUsername1))); EXPECT_EQ(api::passwords_private::PASSWORD_CHECK_STATE_SIGNED_OUT, delegate().GetPasswordCheckStatus().state); @@ -437,22 +452,22 @@ EXPECT_THAT( delegate().GetCompromisedCredentials(), ElementsAre(ExpectCompromisedCredential( - "example.com", "https://example.com", + "example.com", "https://example.com/", "https://example.com/.well-known/change-password", kUsername2, base::Minutes(2), "2 minutes ago", api::passwords_private::COMPROMISE_TYPE_PHISHED), ExpectCompromisedCredential( - "example.org", "http://www.example.org", + "example.org", "http://www.example.org/", "http://www.example.org/.well-known/change-password", kUsername1, base::Minutes(4), "4 minutes ago", api::passwords_private::COMPROMISE_TYPE_PHISHED), ExpectCompromisedCredential( - "example.com", "https://example.com", + "example.com", "https://example.com/", "https://example.com/.well-known/change-password", kUsername1, base::Minutes(1), "1 minute ago", api::passwords_private::COMPROMISE_TYPE_LEAKED), ExpectCompromisedCredential( - "example.org", "http://www.example.org", + "example.org", "http://www.example.org/", "http://www.example.org/.well-known/change-password", kUsername2, base::Minutes(3), "3 minutes ago", api::passwords_private::COMPROMISE_TYPE_LEAKED))); @@ -483,22 +498,22 @@ EXPECT_THAT( delegate().GetCompromisedCredentials(), ElementsAre(ExpectCompromisedCredential( - "example.com", "https://example.com", + "example.com", "https://example.com/", "https://example.com/.well-known/change-password", kUsername1, base::Seconds(59), "Just now", api::passwords_private::COMPROMISE_TYPE_LEAKED), ExpectCompromisedCredential( - "example.com", "https://example.com", + "example.com", "https://example.com/", "https://example.com/.well-known/change-password", kUsername2, base::Seconds(60), "1 minute ago", api::passwords_private::COMPROMISE_TYPE_LEAKED), ExpectCompromisedCredential( - "example.org", "http://www.example.org", + "example.org", "http://www.example.org/", "http://www.example.org/.well-known/change-password", kUsername1, base::Days(100), "3 months ago", api::passwords_private::COMPROMISE_TYPE_LEAKED), ExpectCompromisedCredential( - "example.org", "http://www.example.org", + "example.org", "http://www.example.org/", "http://www.example.org/.well-known/change-password", kUsername2, base::Days(800), "2 years ago", api::passwords_private::COMPROMISE_TYPE_LEAKED))); @@ -534,22 +549,22 @@ delegate().GetCompromisedCredentials(), ElementsAre( ExpectCompromisedCredential( - "example.com", "https://example.com", + "example.com", "https://example.com/", "https://example.com/.well-known/change-password", kUsername1, base::Minutes(1), "1 minute ago", api::passwords_private::COMPROMISE_TYPE_PHISHED_AND_LEAKED), ExpectCompromisedCredential( - "example.org", "http://www.example.org", + "example.org", "http://www.example.org/", "http://www.example.org/.well-known/change-password", kUsername1, base::Minutes(3), "3 minutes ago", api::passwords_private::COMPROMISE_TYPE_PHISHED), ExpectCompromisedCredential( - "example.org", "http://www.example.org", + "example.org", "http://www.example.org/", "http://www.example.org/.well-known/change-password", kUsername2, base::Minutes(4), "4 minutes ago", api::passwords_private::COMPROMISE_TYPE_PHISHED_AND_LEAKED), ExpectCompromisedCredential( - "example.com", "https://example.com", + "example.com", "https://example.com/", "https://example.com/.well-known/change-password", kUsername2, base::Minutes(2), "2 minutes ago", api::passwords_private::COMPROMISE_TYPE_LEAKED))); @@ -576,20 +591,23 @@ // password store. EXPECT_THAT( delegate().GetCompromisedCredentials(), - ElementsAre(ExpectCompromisedCredential( - "Example App", "Example App", - "https://example.com/.well-known/change-password", - kUsername2, base::Days(3), "3 days ago", - api::passwords_private::COMPROMISE_TYPE_PHISHED), - ExpectCompromisedCredential( - "App (com.example.app)", "com.example.app", absl::nullopt, - kUsername1, base::Days(4), "4 days ago", - api::passwords_private::COMPROMISE_TYPE_PHISHED), - ExpectCompromisedCredential( - "example.com", "https://example.com", - "https://example.com/.well-known/change-password", - kUsername1, base::Minutes(5), "5 minutes ago", - api::passwords_private::COMPROMISE_TYPE_LEAKED))); + ElementsAre( + ExpectCompromisedCredential( + "Example App", + "https://play.google.com/store/apps/details?id=com.example.app", + "https://example.com/.well-known/change-password", kUsername2, + base::Days(3), "3 days ago", + api::passwords_private::COMPROMISE_TYPE_PHISHED), + ExpectCompromisedCredential( + "app.example.com", + "https://play.google.com/store/apps/details?id=com.example.app", + absl::nullopt, kUsername1, base::Days(4), "4 days ago", + api::passwords_private::COMPROMISE_TYPE_PHISHED), + ExpectCompromisedCredential( + "example.com", "https://example.com/", + "https://example.com/.well-known/change-password", kUsername1, + base::Minutes(5), "5 minutes ago", + api::passwords_private::COMPROMISE_TYPE_LEAKED))); } // Test that a change to compromised credential notifies observers. @@ -646,11 +664,11 @@ RunUntilIdle(); InsecureCredential credential = std::move(delegate().GetCompromisedCredentials().at(0)); - EXPECT_EQ(kExampleCom, credential.signon_realm); + EXPECT_EQ(kExampleCom, credential.urls.signon_realm); // Purposefully set a wrong signon realm and verify that trying to get a // plaintext password fails. - credential.signon_realm = kExampleOrg; + credential.urls.signon_realm = kExampleOrg; EXPECT_EQ(absl::nullopt, delegate().GetPlaintextInsecurePassword(std::move(credential))); } @@ -668,7 +686,7 @@ // Purposefully set a wrong username and verify that trying to get a // plaintext password fails. - credential.signon_realm = base::UTF16ToASCII(kUsername2); + credential.urls.signon_realm = base::UTF16ToASCII(kUsername2); EXPECT_EQ(absl::nullopt, delegate().GetPlaintextInsecurePassword(std::move(credential))); } @@ -683,7 +701,7 @@ InsecureCredential credential = std::move(delegate().GetCompromisedCredentials().at(0)); EXPECT_EQ(0, credential.id); - EXPECT_EQ(kExampleCom, credential.signon_realm); + EXPECT_EQ(kExampleCom, credential.urls.signon_realm); EXPECT_EQ(base::UTF16ToASCII(kUsername1), credential.username); EXPECT_EQ(nullptr, credential.password); @@ -691,7 +709,7 @@ delegate().GetPlaintextInsecurePassword(std::move(credential)); ASSERT_TRUE(opt_credential.has_value()); EXPECT_EQ(0, opt_credential->id); - EXPECT_EQ(kExampleCom, opt_credential->signon_realm); + EXPECT_EQ(kExampleCom, opt_credential->urls.signon_realm); EXPECT_EQ(base::UTF16ToASCII(kUsername1), opt_credential->username); EXPECT_EQ(base::UTF16ToASCII(kPassword1), *opt_credential->password); } @@ -738,7 +756,7 @@ InsecureCredential credential = std::move(delegate().GetCompromisedCredentials().at(0)); EXPECT_EQ(0, credential.id); - EXPECT_EQ(kExampleCom, credential.signon_realm); + EXPECT_EQ(kExampleCom, credential.urls.signon_realm); EXPECT_EQ(base::UTF16ToASCII(kUsername1), credential.username); EXPECT_EQ(kPassword1, store().stored_passwords().at(kExampleCom).at(0).password_value);
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc index 3e9b750..0860c41 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
@@ -415,7 +415,7 @@ api::passwords_private::PasswordUiEntry entry; entry.urls = CreateUrlCollectionFromCredential(credential); entry.username = base::UTF16ToUTF8(credential.username); - entry.password_note = base::UTF16ToUTF8(credential.note.value); + entry.note = base::UTF16ToUTF8(credential.note.value); entry.id = id; entry.stored_in = ConvertToAPIStore(credential.stored_in); entry.is_android_credential =
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc index 1871426..adc2ff1 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc
@@ -197,7 +197,7 @@ MATCHER_P(PasswordUiEntryDataEquals, expected, "") { return testing::Value(expected.get().urls.link, arg.urls.link) && testing::Value(expected.get().username, arg.username) && - testing::Value(expected.get().password_note, arg.password_note) && + testing::Value(expected.get().note, arg.note) && testing::Value(expected.get().stored_in, arg.stored_in) && testing::Value(expected.get().is_android_credential, arg.is_android_credential); @@ -381,13 +381,13 @@ api::passwords_private::PasswordUiEntry expected_entry1; expected_entry1.urls.link = "https://example1.com/"; expected_entry1.username = "username1"; - expected_entry1.password_note = ""; + expected_entry1.note = ""; expected_entry1.stored_in = api::passwords_private::PASSWORD_STORE_SET_ACCOUNT; api::passwords_private::PasswordUiEntry expected_entry2; expected_entry2.urls.link = "http://example2.com/login"; expected_entry2.username = ""; - expected_entry2.password_note = "note"; + expected_entry2.note = "note"; expected_entry2.stored_in = api::passwords_private::PASSWORD_STORE_SET_DEVICE; EXPECT_CALL(callback, Run(testing::UnorderedElementsAre( @@ -473,7 +473,7 @@ EXPECT_CALL(callback, Run(SizeIs(1))) .WillOnce([](const PasswordsPrivateDelegate::UiEntries& passwords) { EXPECT_EQ("new_user", passwords[0].username); - EXPECT_EQ("", passwords[0].password_note); + EXPECT_EQ("", passwords[0].note); }); delegate.GetSavedPasswordsList(callback.Get()); } @@ -500,7 +500,7 @@ EXPECT_EQ(sample_form.username_value, base::UTF8ToUTF16(passwords[0].username)); EXPECT_EQ(sample_form.notes[1].value, - base::UTF8ToUTF16(passwords[0].password_note)); + base::UTF8ToUTF16(passwords[0].note)); }); delegate.GetSavedPasswordsList(callback.Get()); int sample_form_id = delegate.GetIdForCredential( @@ -527,7 +527,7 @@ EXPECT_CALL(callback, Run(SizeIs(1))) .WillOnce([](const PasswordsPrivateDelegate::UiEntries& passwords) { EXPECT_EQ("new_user", passwords[0].username); - EXPECT_EQ("new note", passwords[0].password_note); + EXPECT_EQ("new note", passwords[0].note); }); delegate.GetSavedPasswordsList(callback.Get()); } @@ -842,7 +842,7 @@ nullptr, credential_callback.Get()); ASSERT_TRUE(opt_credential.has_value()); - EXPECT_EQ(form.signon_realm, opt_credential->signon_realm); + EXPECT_EQ(form.signon_realm, opt_credential->urls.signon_realm); EXPECT_EQ(form.username_value, base::UTF8ToUTF16(opt_credential->username)); EXPECT_EQ(form.password_value, base::UTF8ToUTF16(*opt_credential->password)); } @@ -854,7 +854,7 @@ delegate.GetUrlCollection("127.0.0.1"); EXPECT_TRUE(urls.has_value()); EXPECT_EQ("127.0.0.1", urls.value().shown); - EXPECT_EQ("http://127.0.0.1/", urls.value().origin); + EXPECT_EQ("http://127.0.0.1/", urls.value().signon_realm); EXPECT_EQ("http://127.0.0.1/", urls.value().link); } @@ -865,7 +865,7 @@ delegate.GetUrlCollection("example.com/login"); EXPECT_TRUE(urls.has_value()); EXPECT_EQ("example.com", urls.value().shown); - EXPECT_EQ("https://example.com/", urls.value().origin); + EXPECT_EQ("https://example.com/", urls.value().signon_realm); EXPECT_EQ("https://example.com/login", urls.value().link); } @@ -877,7 +877,7 @@ "http://username:password@example.com/login?param=value#ref"); EXPECT_TRUE(urls.has_value()); EXPECT_EQ("example.com", urls.value().shown); - EXPECT_EQ("http://example.com/", urls.value().origin); + EXPECT_EQ("http://example.com/", urls.value().signon_realm); EXPECT_EQ("http://example.com/login", urls.value().link); } @@ -966,7 +966,7 @@ expected_entry.urls.link = "https://play.google.com/store/apps/details?id=example.com"; expected_entry.username = "test@gmail.com"; - expected_entry.password_note = ""; + expected_entry.note = ""; expected_entry.is_android_credential = true; expected_entry.stored_in = api::passwords_private::PASSWORD_STORE_SET_DEVICE; EXPECT_CALL(callback, Run(testing::ElementsAre(PasswordUiEntryDataEquals(
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_utils.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_utils.cc index 83e8fe0d..012ffba57 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_utils.cc +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_utils.cc
@@ -23,8 +23,8 @@ const CredentialUIEntry& credential) { api::passwords_private::UrlCollection urls; urls.shown = GetShownOrigin(credential); - urls.origin = credential.signon_realm; urls.link = GetShownUrl(credential).spec(); + urls.signon_realm = credential.signon_realm; return urls; } @@ -32,7 +32,7 @@ const GURL& url) { api::passwords_private::UrlCollection urls; urls.shown = password_manager::GetShownOrigin(url::Origin::Create(url)); - urls.origin = password_manager_util::GetSignonRealm(url); + urls.signon_realm = password_manager_util::GetSignonRealm(url); urls.link = url.spec(); return urls; }
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_utils.h b/chrome/browser/extensions/api/passwords_private/passwords_private_utils.h index d26b4e6..00282ad5 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_utils.h +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_utils.h
@@ -21,9 +21,9 @@ namespace extensions { -// Obtains a collection of URLs from the passed in |form|. This includes an -// origin URL used for internal logic, a human friendly string shown to the user -// as well as a URL that is linked to. +// Obtains a collection of URLs from the passed in |credential|. This includes +// an origin URL used for internal logic, a human friendly string shown to the +// user as well as a URL that is linked to. api::passwords_private::UrlCollection CreateUrlCollectionFromCredential( const password_manager::CredentialUIEntry& credential);
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_utils_unittest.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_utils_unittest.cc index 3d5ace4..d3f5d40e 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_utils_unittest.cc +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_utils_unittest.cc
@@ -25,7 +25,7 @@ api::passwords_private::UrlCollection html_urls = CreateUrlCollectionFromCredential(CredentialUIEntry(html_form)); - EXPECT_EQ(html_urls.origin, "http://example.com/"); + EXPECT_EQ(html_urls.signon_realm, "http://example.com/"); EXPECT_EQ(html_urls.shown, "example.com"); EXPECT_EQ(html_urls.link, "http://example.com/LoginAuth"); } @@ -39,7 +39,7 @@ api::passwords_private::UrlCollection federated_urls = CreateUrlCollectionFromCredential(CredentialUIEntry(federated_form)); - EXPECT_EQ(federated_urls.origin, "federation://example.com/google.com"); + EXPECT_EQ(federated_urls.signon_realm, "federation://example.com/google.com"); EXPECT_EQ(federated_urls.shown, "example.com"); EXPECT_EQ(federated_urls.link, "https://example.com/"); } @@ -51,7 +51,7 @@ api::passwords_private::UrlCollection android_urls = CreateUrlCollectionFromCredential(CredentialUIEntry(android_form)); - EXPECT_EQ("android://example@com.example.android", android_urls.origin); + EXPECT_EQ("android://example@com.example.android", android_urls.signon_realm); EXPECT_EQ("android.example.com", android_urls.shown); EXPECT_EQ("https://play.google.com/store/apps/details?id=com.example.android", android_urls.link); @@ -64,7 +64,7 @@ api::passwords_private::UrlCollection android_urls = CreateUrlCollectionFromCredential(CredentialUIEntry(android_form)); - EXPECT_EQ(android_urls.origin, "android://hash@com.example.android"); + EXPECT_EQ(android_urls.signon_realm, "android://hash@com.example.android"); EXPECT_EQ("Example Android App", android_urls.shown); EXPECT_EQ("https://play.google.com/store/apps/details?id=com.example.android", android_urls.link); @@ -75,7 +75,7 @@ api::passwords_private::UrlCollection urls = CreateUrlCollectionFromGURL(url); EXPECT_EQ(urls.shown, "example.com"); - EXPECT_EQ(urls.origin, "https://example.com/"); + EXPECT_EQ(urls.signon_realm, "https://example.com/"); EXPECT_EQ(urls.link, "https://example.com/login"); }
diff --git a/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.cc b/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.cc index b1725f78..4630051b 100644 --- a/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.cc +++ b/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.cc
@@ -26,8 +26,8 @@ api::passwords_private::PasswordUiEntry CreateEntry(int id) { api::passwords_private::PasswordUiEntry entry; entry.urls.shown = "test" + base::NumberToString(id) + ".com"; - entry.urls.origin = "http://" + entry.urls.shown + "/login"; - entry.urls.link = entry.urls.origin; + entry.urls.signon_realm = "http://" + entry.urls.shown + "/login"; + entry.urls.link = entry.urls.signon_realm; entry.username = "testName" + base::NumberToString(id); entry.id = id; entry.stored_in = api::passwords_private::PASSWORD_STORE_SET_DEVICE; @@ -37,8 +37,8 @@ api::passwords_private::ExceptionEntry CreateException(int id) { api::passwords_private::ExceptionEntry exception; exception.urls.shown = "exception" + base::NumberToString(id) + ".com"; - exception.urls.origin = "http://" + exception.urls.shown + "/login"; - exception.urls.link = exception.urls.origin; + exception.urls.signon_realm = "http://" + exception.urls.shown + "/login"; + exception.urls.link = exception.urls.signon_realm; exception.id = id; return exception; } @@ -199,8 +199,9 @@ TestPasswordsPrivateDelegate::GetCompromisedCredentials() { api::passwords_private::InsecureCredential credential; credential.username = "alice"; - credential.formatted_origin = "example.com"; - credential.detailed_origin = "https://example.com"; + credential.urls.shown = "example.com"; + credential.urls.link = "https://example.com"; + credential.urls.signon_realm = "https://example.com"; credential.is_android_credential = false; credential.change_password_url = std::make_unique<std::string>("https://example.com/change-password"); @@ -222,8 +223,8 @@ TestPasswordsPrivateDelegate::GetWeakCredentials() { api::passwords_private::InsecureCredential credential; credential.username = "bob"; - credential.formatted_origin = "example.com"; - credential.detailed_origin = "https://example.com"; + credential.urls.shown = "example.com"; + credential.urls.link = "https://example.com"; credential.is_android_credential = false; credential.change_password_url = std::make_unique<std::string>("https://example.com/change-password");
diff --git a/chrome/browser/fast_checkout/fast_checkout_client_impl.cc b/chrome/browser/fast_checkout/fast_checkout_client_impl.cc index 2a5e599..d4dd31da9 100644 --- a/chrome/browser/fast_checkout/fast_checkout_client_impl.cc +++ b/chrome/browser/fast_checkout/fast_checkout_client_impl.cc
@@ -37,18 +37,6 @@ is_running_ = true; url_ = url; - // TODO(crbug.com/1338507): Don't run if onboarding was not successful. - OnOnboardingComplete(/*success=*/true); - - return true; -} - -void FastCheckoutClientImpl::OnOnboardingComplete(bool success) { - if (!success) { - Stop(); - return; - } - base::flat_map<std::string, std::string> params_map{ {autofill_assistant::public_script_parameters::kIntentParameterName, kIntentValue}, @@ -69,14 +57,21 @@ fast_checkout_external_action_delegate_ = CreateFastCheckoutExternalActionDelegate(); external_script_controller_ = CreateHeadlessScriptController(); - fast_checkout_controller_ = CreateFastCheckoutController(); - // Show bottomsheet and start script in parallel. This reduces the delay due - // to server requests after selections in the bottomsheet were made. - fast_checkout_controller_->Show(); external_script_controller_->StartScript( - params_map, base::BindOnce(&FastCheckoutClientImpl::OnRunComplete, - base::Unretained(this))); + params_map, + base::BindOnce(&FastCheckoutClientImpl::OnRunComplete, + base::Unretained(this)), + /*use_autofill_assistant_onboarding=*/true, + base::BindOnce(&FastCheckoutClientImpl::OnOnboardingCompletedSuccessfully, + base::Unretained(this))); + + return true; +} + +void FastCheckoutClientImpl::OnOnboardingCompletedSuccessfully() { + fast_checkout_controller_ = CreateFastCheckoutController(); + fast_checkout_controller_->Show(); } void FastCheckoutClientImpl::OnRunComplete(
diff --git a/chrome/browser/fast_checkout/fast_checkout_client_impl.h b/chrome/browser/fast_checkout/fast_checkout_client_impl.h index e0ce4b0..508461f 100644 --- a/chrome/browser/fast_checkout/fast_checkout_client_impl.h +++ b/chrome/browser/fast_checkout/fast_checkout_client_impl.h
@@ -57,7 +57,9 @@ void OnRunComplete( autofill_assistant::HeadlessScriptController::ScriptResult result); - void OnOnboardingComplete(bool success); + // Registers when onboarding was completed successfully and the scripts are + // ready to run. + void OnOnboardingCompletedSuccessfully(); // The delegate is responsible for handling protos received from backend DSL // actions.
diff --git a/chrome/browser/fast_checkout/fast_checkout_client_impl_unittest.cc b/chrome/browser/fast_checkout/fast_checkout_client_impl_unittest.cc index b6298f3..a887d8eb 100644 --- a/chrome/browser/fast_checkout/fast_checkout_client_impl_unittest.cc +++ b/chrome/browser/fast_checkout/fast_checkout_client_impl_unittest.cc
@@ -15,6 +15,8 @@ #include "components/autofill_assistant/browser/public/mock_headless_script_controller.h" #include "ui/gfx/native_widget_types.h" +using ::testing::_; + namespace { constexpr char kUrl[] = "https://www.example.com"; } @@ -193,13 +195,26 @@ // `FastCheckoutClient` is not running initially. EXPECT_FALSE(fast_checkout_client()->IsRunning()); - // Prepare to extract the callback to the external script controller. + // Prepare to extract the callbacks to the external script controller. base::OnceCallback<void( autofill_assistant::HeadlessScriptController::ScriptResult)> external_script_controller_callback; - EXPECT_CALL(*external_script_controller(), StartScript) + base::OnceCallback<void()> onboarding_successful_callback; + EXPECT_CALL(*external_script_controller(), StartScript(_, _, _, _)) .Times(1) - .WillOnce(MoveArg<1>(&external_script_controller_callback)); + .WillOnce( + [&](const base::flat_map<std::string, std::string>& script_parameters, + base::OnceCallback<void( + autofill_assistant::HeadlessScriptController::ScriptResult)> + script_ended_callback, + bool use_autofill_assistant_onboarding, + base::OnceCallback<void()> + onboarding_successful_callback_parameter) { + external_script_controller_callback = + std::move(script_ended_callback); + onboarding_successful_callback = + std::move(onboarding_successful_callback_parameter); + }); // Expect bottomsheet to show up. EXPECT_CALL(*fast_checkout_controller(), Show); @@ -214,6 +229,7 @@ EXPECT_FALSE(fast_checkout_client()->Start(GURL(kUrl))); // Successful run. + std::move(onboarding_successful_callback).Run(); autofill_assistant::HeadlessScriptController::ScriptResult script_result = { /* success= */ true}; std::move(external_script_controller_callback).Run(script_result); @@ -222,6 +238,41 @@ EXPECT_FALSE(fast_checkout_client()->IsRunning()); } +TEST_F(FastCheckoutClientImplTest, + Start_OnboardingNotSuccessful_BottomsheetNotShowing) { + // `FastCheckoutClient` is not running initially. + EXPECT_FALSE(fast_checkout_client()->IsRunning()); + + // Prepare to extract the callbacks to the external script controller. + base::OnceCallback<void( + autofill_assistant::HeadlessScriptController::ScriptResult)> + external_script_controller_callback; + base::OnceCallback<void()> onboarding_successful_callback; + EXPECT_CALL(*external_script_controller(), StartScript(_, _, _, _)) + .Times(1) + .WillOnce(MoveArg<1>(&external_script_controller_callback)); + + // Expect bottomsheet NOT to show up. + EXPECT_CALL(*fast_checkout_controller(), Show).Times(0); + + // Starting the run successfully. + EXPECT_TRUE(fast_checkout_client()->Start(GURL(kUrl))); + + // `FastCheckoutClient` is running. + EXPECT_TRUE(fast_checkout_client()->IsRunning()); + + // Cannot start another run. + EXPECT_FALSE(fast_checkout_client()->Start(GURL(kUrl))); + + // Failed run. + autofill_assistant::HeadlessScriptController::ScriptResult script_result = { + /* success= */ false}; + std::move(external_script_controller_callback).Run(script_result); + + // `FastCheckoutClient` state was reset after run finished. + EXPECT_FALSE(fast_checkout_client()->IsRunning()); +} + TEST_F(FastCheckoutClientImplTest, Stop_WhenIsRunning_CancelsTheRun) { // `FastCheckoutClient` is not running initially. EXPECT_FALSE(fast_checkout_client()->IsRunning());
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index f26283d..c9828f3 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -2762,7 +2762,7 @@ { "name": "enable-restricted-web-apis", "owners": [ "bfranz", "anqing", "apotapchuk" ], - "expiry_milestone": 105 + "expiry_milestone": 115 }, { "name": "enable-retail-coupons", @@ -3593,7 +3593,7 @@ { "name": "forced-colors", "owners": [ "almaher@microsoft.com" ], - "expiry_milestone": 105 + "expiry_milestone": 108 }, { "name": "fractional-scroll-offsets", @@ -4974,9 +4974,11 @@ "expiry_milestone": 105 }, { + // Suggests the Ozone platform to use (desktop Linux only). Can be set on + // chrome://flags. See https://crbug.com/1246928. "name": "ozone-platform-hint", "owners": [ "rjkroege", "thomasanderson", "msisov@igalia.com", "nickdiego@igalia.com", "adunaev@igalia.com" ], - "expiry_milestone": 105 + "expiry_milestone": 110 }, { "name": "page-content-annotations", @@ -5072,8 +5074,8 @@ }, { "name": "password-domain-capabilities-fetching", - "owners": [ "vizcay", "treib", "brunobraga" ], - "expiry_milestone": 105 + "owners": [ "vizcay@google.com", "treib", "brunobraga@google.com", "chrome-duplex@google.com" ], + "expiry_milestone": 112 }, { "name": "password-edit-dialog-with-details", @@ -5094,8 +5096,8 @@ }, { "name": "password-scripts-fetching", - "owners": [ "kolos", "treib", "brunobraga@google.com", "chrome-duplex@google.com" ], - "expiry_milestone": 105 + "owners": [ "vizcay@google.com", "brunobraga@google.com", "chrome-duplex@google.com" ], + "expiry_milestone": 110 }, { "name": "password-strength-indicator", @@ -5108,11 +5110,6 @@ "expiry_milestone": 108 }, { - "name": "passwords-account-storage-revised-opt-in-flow", - "owners": [ "mamir", "treib" ], - "expiry_milestone": 105 - }, - { "name": "pcie-billboard-notification", "owners": [ "jimmyxgong", "cros-peripherals@google.com"], "expiry_milestone": 106 @@ -5955,22 +5952,22 @@ { "name": "sync-android-promos-with-alternative-title", "owners": ["mmrashad@google.com", "chrome-sync-dev@google.com"], - "expiry_milestone": 105 + "expiry_milestone": 107 }, { "name": "sync-android-promos-with-illustration", "owners": ["mmrashad@google.com", "chrome-sync-dev@google.com"], - "expiry_milestone": 105 + "expiry_milestone": 107 }, { "name": "sync-android-promos-with-single-button", "owners": ["mmrashad@google.com", "chrome-sync-dev@google.com"], - "expiry_milestone": 105 + "expiry_milestone": 107 }, { "name": "sync-android-promos-with-title", "owners": ["mmrashad@google.com", "chrome-sync-dev@google.com"], - "expiry_milestone": 105 + "expiry_milestone": 107 }, { "name": "sync-chromeos-explicit-passphrase-sharing", @@ -6109,11 +6106,6 @@ "expiry_milestone": 106 }, { - "name": "theme-refactor-android", - "owners": [ "sinansahin@google.com", "twellington", "clank-app-team@google.com" ], - "expiry_milestone": 100 - }, - { "name": "throttle-foreground-timers", "owners": [ "fdoray", "scheduler-dev" ], "expiry_milestone": 102
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index cc771662..c91ddff 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -2164,12 +2164,6 @@ const char kPasswordImportDescription[] = "Import functionality in password settings."; -const char kPasswordsAccountStorageRevisedOptInFlowName[] = - "Revised opt-in flow for account-scoped passwore storage"; -const char kPasswordsAccountStorageRevisedOptInFlowDescription[] = - "Enables the revised opt-in flow for the account-scoped passwords storage " - "during first-time save."; - const char kPasswordDomainCapabilitiesFetchingName[] = "Fetch credentials' password change capabilities"; const char kPasswordDomainCapabilitiesFetchingDescription[] = @@ -3366,17 +3360,6 @@ "Restricts Chrome threads to LITTLE cores on devices with big.LITTLE or " "similar CPU architectures."; -const char kDynamicColorAndroidName[] = "Dynamic colors on Android"; -const char kDynamicColorAndroidDescription[] = - "Enabled dynamic colors on supported devices, such as Pixel devices " - "running Android 12."; - -const char kDynamicColorButtonsAndroidName[] = - "Dynamic colors for buttons on Android"; -const char kDynamicColorButtonsAndroidDescription[] = - "If enabled, dynamic colors will be enabled for call to action buttons, " - "links and clickable spans."; - const char kAutofillManualFallbackAndroidName[] = "Enable Autofill manual fallback for Addresses and Payments (Android)"; const char kAutofillManualFallbackAndroidDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index b0b3ad1..b1e9328d4 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -1211,9 +1211,6 @@ extern const char kPasswordImportName[]; extern const char kPasswordImportDescription[]; -extern const char kPasswordsAccountStorageRevisedOptInFlowName[]; -extern const char kPasswordsAccountStorageRevisedOptInFlowDescription[]; - extern const char kPasswordDomainCapabilitiesFetchingName[]; extern const char kPasswordDomainCapabilitiesFetchingDescription[]; @@ -1895,12 +1892,6 @@ extern const char kCpuAffinityRestrictToLittleCoresName[]; extern const char kCpuAffinityRestrictToLittleCoresDescription[]; -extern const char kDynamicColorAndroidName[]; -extern const char kDynamicColorAndroidDescription[]; - -extern const char kDynamicColorButtonsAndroidName[]; -extern const char kDynamicColorButtonsAndroidDescription[]; - extern const char kAutofillManualFallbackAndroidName[]; extern const char kAutofillManualFallbackAndroidDescription[];
diff --git a/chrome/browser/privacy_budget/identifiability_study_group_settings.cc b/chrome/browser/privacy_budget/identifiability_study_group_settings.cc index c6af150..440ad8f 100644 --- a/chrome/browser/privacy_budget/identifiability_study_group_settings.cc +++ b/chrome/browser/privacy_budget/identifiability_study_group_settings.cc
@@ -9,6 +9,7 @@ #include "base/containers/flat_map.h" #include "base/cxx17_backports.h" #include "base/metrics/histogram_functions.h" +#include "base/ranges/algorithm.h" #include "chrome/common/privacy_budget/privacy_budget_features.h" #include "chrome/common/privacy_budget/types.h" #include "third_party/blink/public/common/privacy_budget/identifiable_surface.h"
diff --git a/chrome/browser/profiles/profile_keyed_service_factory.cc b/chrome/browser/profiles/profile_keyed_service_factory.cc index 77086652..f2bbec6 100644 --- a/chrome/browser/profiles/profile_keyed_service_factory.cc +++ b/chrome/browser/profiles/profile_keyed_service_factory.cc
@@ -4,143 +4,9 @@ #include "chrome/browser/profiles/profile_keyed_service_factory.h" -#include "base/memory/ptr_util.h" #include "chrome/browser/profiles/profile.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" -#if BUILDFLAG(IS_CHROMEOS_ASH) -#include "chrome/browser/ash/profiles/profile_helper.h" -#endif // !BUILDFLAG(IS_CHROMEOS_ASH) - -namespace { - -Profile* ApplyProfileSelection(Profile* profile, ProfileSelection selection) { - switch (selection) { - case ProfileSelection::kNone: - return nullptr; - case ProfileSelection::kOriginalOnly: - return profile->IsOffTheRecord() ? nullptr : profile; - case ProfileSelection::kOwnInstance: - return profile; - case ProfileSelection::kRedirectedToOriginal: - return profile->GetOriginalProfile(); - case ProfileSelection::kOffTheRecordOnly: - return profile->IsOffTheRecord() ? profile : nullptr; - } -} - -} // namespace - -ProfileSelections::Builder::Builder() - : selections_(base::WrapUnique(new ProfileSelections())) {} - -ProfileSelections::Builder::~Builder() = default; - -ProfileSelections::Builder& ProfileSelections::Builder::WithRegular( - ProfileSelection selection) { - selections_->SetProfileSelectionForRegular(selection); - return *this; -} - -ProfileSelections::Builder& ProfileSelections::Builder::WithGuest( - ProfileSelection selection) { - selections_->SetProfileSelectionForGuest(selection); - return *this; -} - -ProfileSelections::Builder& ProfileSelections::Builder::WithSystem( - ProfileSelection selection) { - selections_->SetProfileSelectionForSystem(selection); - return *this; -} - -ProfileSelections ProfileSelections::Builder::Build() { - DCHECK(selections_) << "Build() already called"; - - ProfileSelections to_return = *selections_; - selections_.reset(); - - return to_return; -} - -ProfileSelections::ProfileSelections() = default; -ProfileSelections::~ProfileSelections() = default; -ProfileSelections::ProfileSelections(const ProfileSelections& other) = default; - -ProfileSelections ProfileSelections::BuildDefault() { - return ProfileSelections::Builder().Build(); -} - -ProfileSelections ProfileSelections::BuildNoServicesForAllProfiles() { - return ProfileSelections::Builder() - .WithRegular(ProfileSelection::kNone) - .Build(); -} - -ProfileSelections ProfileSelections::BuildServicesForRegularProfile() { - return ProfileSelections::Builder() - .WithGuest(ProfileSelection::kNone) - .WithSystem(ProfileSelection::kNone) - .Build(); -} - -ProfileSelections ProfileSelections::BuildServicesRedirectedInIncognito() { - return ProfileSelections::Builder() - .WithRegular(ProfileSelection::kRedirectedToOriginal) - .WithGuest(ProfileSelection::kNone) - .WithSystem(ProfileSelection::kNone) - .Build(); -} - -ProfileSelections ProfileSelections::BuildServicesRedirectedInOTR() { - return ProfileSelections::Builder() - .WithRegular(ProfileSelection::kRedirectedToOriginal) - .Build(); -} - -ProfileSelection ProfileSelections::GetProfileSelection( - Profile* profile) const { - // Treat other off the record profiles as Incognito (primary otr) Profiles. - if (profile->IsRegularProfile() || profile->IsIncognitoProfile() || - profile_metrics::GetBrowserProfileType(profile) == - profile_metrics::BrowserProfileType::kOtherOffTheRecordProfile) - return regular_profile_selection_; - - if (profile->IsGuestSession()) { - // if the default value for GuestProfile is overridden, use it. - // otherwise, redirect to the old behavior (same as regular profile). - // This is used for both original guest profile (not user visible) and for - // the off-the-record guest (user visible, ui guest session). - return guest_profile_selection_.value_or(regular_profile_selection_); - } - - if (profile->IsSystemProfile()) { - // if the default value for SystemProfile is overridden, use it. - // otherwise, redirect to the old behavior (same as regular profile). - // This is used for both original system profile (not user visible) and for - // the off-the-record system profile (used in the Profile Picker). - return system_profile_selection_.value_or(regular_profile_selection_); - } - - NOTREACHED(); - return ProfileSelection::kNone; -} - -void ProfileSelections::SetProfileSelectionForRegular( - ProfileSelection selection) { - regular_profile_selection_ = selection; -} - -void ProfileSelections::SetProfileSelectionForGuest( - ProfileSelection selection) { - guest_profile_selection_ = selection; -} - -void ProfileSelections::SetProfileSelectionForSystem( - ProfileSelection selection) { - system_profile_selection_ = selection; -} - ProfileKeyedServiceFactory::ProfileKeyedServiceFactory(const char* name) : ProfileKeyedServiceFactory(name, ProfileSelections::BuildDefault()) {} @@ -154,11 +20,8 @@ ProfileKeyedServiceFactory::~ProfileKeyedServiceFactory() = default; -// BrowserContextKeyedServiceFactory content::BrowserContext* ProfileKeyedServiceFactory::GetBrowserContextToUse( content::BrowserContext* context) const { Profile* profile = Profile::FromBrowserContext(context); - ProfileSelection selection = profile_selections_.GetProfileSelection(profile); - - return ApplyProfileSelection(profile, selection); + return profile_selections_.ApplyProfileSelection(profile); }
diff --git a/chrome/browser/profiles/profile_keyed_service_factory.h b/chrome/browser/profiles/profile_keyed_service_factory.h index 9441097..e515de3 100644 --- a/chrome/browser/profiles/profile_keyed_service_factory.h +++ b/chrome/browser/profiles/profile_keyed_service_factory.h
@@ -7,122 +7,22 @@ #include "components/keyed_service/content/browser_context_keyed_service_factory.h" -#include "base/containers/flat_map.h" -#include "components/profile_metrics/browser_profile_type.h" - -#include "third_party/abseil-cpp/absl/types/optional.h" +#include "chrome/browser/profiles/profile_selections.h" // Purpose of this API: // Provide a Profile type specific implementation logic for // `KeyedServiceFactory` under chrome/. -// -// - `ProfileSelection`: Enum used to map the logic of selecting the right -// profile for the service to be created for, based on the given profile. -// - `ProfileSelections`: Helper structure that contains a -// `ProfileSelection` value for each main Profile type (Regular, Guest and -// System). -// - `ProfileSelections::Builder`: Used to easily create -// `ProfileSelections`. -// - `ProfileKeyedServiceFactory`: Intermediate Factory class that inherits from -// `BrowserContextKeyedServiceFactory`. Main purpose of this intermediate class -// is to provide an easy and efficient way to provide the redirection logic for -// each main profile types using `ProfileSelections` instance. +// When a KeyedServiceFactory is building a service for a "Profile A", it can +// actually return a service that is attached to a "Profile B". Common +// cases is that an Off-The-Record profile uses it's parent service (redirecting +// to Original) or not use any service at all (no service for OTR). -class Profile; - -// Enum that sets the Profile Redirection logic given a Profile. -enum class ProfileSelection { - kNone, // Original: No Profile -- OTR: No Profile - kOriginalOnly, // Original: Self -- OTR: No Profile - kOwnInstance, // Original: Self -- OTR: Self - kRedirectedToOriginal, // Original: Self -- OTR: Original - kOffTheRecordOnly // Original: No Profile -- OTR: Self -}; - -// Contains the logic for ProfileSelection for the different main Profile types -// (Regular, Guest and System). Each of these profile types also have Off the -// Record profiles equivalent, e.g. Incognito is Off the Record profile for -// Regular profile, the Guest user-visible profile is off-the-record, the -// Profile Picker uses the off-the-record System Profile. -// Maps Profile types to `ProfileSelection`. -class ProfileSelections { - public: - ProfileSelections(const ProfileSelections& other); - ~ProfileSelections(); - - // - Predefined `ProfileSelections` - - // Default implementation, as of now: - // - No services in OTR. - // - Regular profile returns itself (original). - // - Guest and System profiles follow Regular profile behaviour. - // - // After the migration(crbug.com/1284664) this default behaviour will change. - // It will be similar to the current `BuildServicesForRegularProfile()`. - // - No services in OTR. - // - Regular profile returns itself (original). - // - No services for Guest and System profile. - static ProfileSelections BuildDefault(); - - // No services for all profiles. - static ProfileSelections BuildNoServicesForAllProfiles(); - - // Only build services for the regular profile. - static ProfileSelections BuildServicesForRegularProfile(); - - // Redirects building services for incognito profile to regular Profile. - static ProfileSelections BuildServicesRedirectedInIncognito(); - - // Redirects building services for both OTR and Original profile to Original - // Profile for all profile types (Regular, Guest and System). - static ProfileSelections BuildServicesRedirectedInOTR(); - - // Builder to construct the `ProfileSelections` parameters. - class Builder { - public: - Builder(); - ~Builder(); - - // Builder setters - Builder& WithRegular(ProfileSelection selection); - Builder& WithGuest(ProfileSelection selection); - Builder& WithSystem(ProfileSelection selection); - - // Builds the `ProfileSelections`. - ProfileSelections Build(); - - private: - std::unique_ptr<ProfileSelections> selections_; - }; - - // Returns the ProfileSelection based on the profile information through the - // set mapping. - ProfileSelection GetProfileSelection(Profile* profile) const; - - private: - // Default constructor settings sets Regular Profile -> - // `ProfileSelection::kOriginalOnly`. It should be constructed through the - // Builder. Value for Guest and System profile not being overridden will - // default to the behaviour of Regular Profile. - ProfileSelections(); - - void SetProfileSelectionForRegular(ProfileSelection selection); - void SetProfileSelectionForGuest(ProfileSelection selection); - void SetProfileSelectionForSystem(ProfileSelection selection); - - // Default value for the mapping of - // Regular Profile -> `ProfileSelection::kOriginalOnly` - // Not assigning values for Guest and System Profiles now defaults to the - // behavior of regular profiles This will change later on to default to kNone. - ProfileSelection regular_profile_selection_ = ProfileSelection::kOriginalOnly; - absl::optional<ProfileSelection> guest_profile_selection_; - absl::optional<ProfileSelection> system_profile_selection_; -}; - -// An intermediate interface to create KeyedServiceFactory under chrome/ that -// provides a more restricted default creation of services for non regular -// profiles. -// Those profile choices are overridable by setting the proper combination of +// `ProfileKeyedServiceFactory' is an intermediate interface to create +// KeyedServiceFactory under chrome/ that provides a more restricted default +// creation of services for non regular profiles. Main purpose of this class is +// to provide an easy and efficient way to provide the redirection logic for +// each main profile types using `ProfileSelections` instance. Those profile +// choices are overridable by setting the proper combination of // `ProfileSelection` and Profile type in the `ProfileSelections` passed in the // constructor. // @@ -134,10 +34,6 @@ // : ProfileKeyedServiceFactory( // "MyRedirectingKeyedService", // ProfileSelections::BuildServicesRedirectedInIncognito()) {} -// -// KeyedService* BuildServiceInstanceFor( -// content::BrowserContext* context) const override { -// return new MyRedirectingKeyedService(); // } // }; // @@ -148,10 +44,6 @@ // private: // MyDefaultKeyedServiceFactory() // : ProfileKeyedServiceFactory("MyDefaultKeyedService") {} -// -// KeyedService* BuildServiceInstanceFor( -// content::BrowserContext* context) const override { -// return new MyDefaultKeyedService(); // } // }; class ProfileKeyedServiceFactory : public BrowserContextKeyedServiceFactory { @@ -171,7 +63,7 @@ const ProfileSelections& profile_selections); ~ProfileKeyedServiceFactory() override; - // BrowserContextKeyedServiceFactory + // BrowserContextKeyedServiceFactory: // Final implementation of `GetBrowserContextToUse()`. // Selects the given context to proper context to use based on the // mapping in `ProfileSelections`. @@ -179,8 +71,7 @@ content::BrowserContext* context) const final; private: - // Value can only be set at construction. - ProfileSelections profile_selections_; + const ProfileSelections profile_selections_; }; #endif // !CHROME_BROWSER_PROFILES_PROFILE_KEYED_SERVICE_FACTORY_H_
diff --git a/chrome/browser/profiles/profile_selections.cc b/chrome/browser/profiles/profile_selections.cc new file mode 100644 index 0000000..3acce58 --- /dev/null +++ b/chrome/browser/profiles/profile_selections.cc
@@ -0,0 +1,142 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/profiles/profile_selections.h" + +#include "base/memory/ptr_util.h" +#include "chrome/browser/profiles/profile.h" +#include "components/profile_metrics/browser_profile_type.h" + +ProfileSelections::Builder::Builder() + : selections_(base::WrapUnique(new ProfileSelections())) {} + +ProfileSelections::Builder::~Builder() = default; + +ProfileSelections::Builder& ProfileSelections::Builder::WithRegular( + ProfileSelection selection) { + selections_->SetProfileSelectionForRegular(selection); + return *this; +} + +ProfileSelections::Builder& ProfileSelections::Builder::WithGuest( + ProfileSelection selection) { + selections_->SetProfileSelectionForGuest(selection); + return *this; +} + +ProfileSelections::Builder& ProfileSelections::Builder::WithSystem( + ProfileSelection selection) { + selections_->SetProfileSelectionForSystem(selection); + return *this; +} + +ProfileSelections ProfileSelections::Builder::Build() { + DCHECK(selections_) << "Build() already called"; + + ProfileSelections to_return = *selections_; + selections_.reset(); + + return to_return; +} + +ProfileSelections::ProfileSelections() = default; +ProfileSelections::~ProfileSelections() = default; +ProfileSelections::ProfileSelections(const ProfileSelections& other) = default; + +ProfileSelections ProfileSelections::BuildDefault() { + return ProfileSelections::Builder().Build(); +} + +ProfileSelections ProfileSelections::BuildServicesForAllProfiles() { + return ProfileSelections::Builder() + .WithRegular(ProfileSelection::kOwnInstance) + .Build(); +} + +ProfileSelections ProfileSelections::BuildNoServicesForAllProfiles() { + return ProfileSelections::Builder() + .WithRegular(ProfileSelection::kNone) + .Build(); +} + +ProfileSelections ProfileSelections::BuildServicesForRegularProfile() { + return ProfileSelections::Builder() + .WithGuest(ProfileSelection::kNone) + .WithSystem(ProfileSelection::kNone) + .Build(); +} + +ProfileSelections ProfileSelections::BuildServicesRedirectedInIncognito() { + return ProfileSelections::Builder() + .WithRegular(ProfileSelection::kRedirectedToOriginal) + .WithGuest(ProfileSelection::kNone) + .WithSystem(ProfileSelection::kNone) + .Build(); +} + +ProfileSelections ProfileSelections::BuildServicesRedirectedToOriginal() { + return ProfileSelections::Builder() + .WithRegular(ProfileSelection::kRedirectedToOriginal) + .Build(); +} + +Profile* ProfileSelections::ApplyProfileSelection(Profile* profile) const { + ProfileSelection selection = GetProfileSelection(profile); + + switch (selection) { + case ProfileSelection::kNone: + return nullptr; + case ProfileSelection::kOriginalOnly: + return profile->IsOffTheRecord() ? nullptr : profile; + case ProfileSelection::kOwnInstance: + return profile; + case ProfileSelection::kRedirectedToOriginal: + return profile->GetOriginalProfile(); + case ProfileSelection::kOffTheRecordOnly: + return profile->IsOffTheRecord() ? profile : nullptr; + } +} + +ProfileSelection ProfileSelections::GetProfileSelection( + Profile* profile) const { + // Treat other off the record profiles as Incognito (primary otr) Profiles. + if (profile->IsRegularProfile() || profile->IsIncognitoProfile() || + profile_metrics::GetBrowserProfileType(profile) == + profile_metrics::BrowserProfileType::kOtherOffTheRecordProfile) + return regular_profile_selection_; + + if (profile->IsGuestSession()) { + // If the default value for GuestProfile is overridden, use it. + // otherwise, redirect to the old behavior (same as regular profile). + // This is used for both original guest profile (not user visible) and for + // the off-the-record guest (user visible, ui guest session). + return guest_profile_selection_.value_or(regular_profile_selection_); + } + + if (profile->IsSystemProfile()) { + // If the default value for SystemProfile is overridden, use it. + // otherwise, redirect to the old behavior (same as regular profile). + // This is used for both original system profile (not user visible) and for + // the off-the-record system profile (used in the Profile Picker). + return system_profile_selection_.value_or(regular_profile_selection_); + } + + NOTREACHED(); + return ProfileSelection::kNone; +} + +void ProfileSelections::SetProfileSelectionForRegular( + ProfileSelection selection) { + regular_profile_selection_ = selection; +} + +void ProfileSelections::SetProfileSelectionForGuest( + ProfileSelection selection) { + guest_profile_selection_ = selection; +} + +void ProfileSelections::SetProfileSelectionForSystem( + ProfileSelection selection) { + system_profile_selection_ = selection; +}
diff --git a/chrome/browser/profiles/profile_selections.h b/chrome/browser/profiles/profile_selections.h new file mode 100644 index 0000000..523e7d6 --- /dev/null +++ b/chrome/browser/profiles/profile_selections.h
@@ -0,0 +1,112 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_PROFILES_PROFILE_SELECTIONS_H_ +#define CHROME_BROWSER_PROFILES_PROFILE_SELECTIONS_H_ + +#include "third_party/abseil-cpp/absl/types/optional.h" + +class Profile; + +// Enum used to map the logic of selecting the right profile for the service to +// be created for, based on the given profile. +enum class ProfileSelection { + kNone, // Original: No Profile -- OTR: No Profile + kOriginalOnly, // Original: Self -- OTR: No Profile + kOwnInstance, // Original: Self -- OTR: Self + kRedirectedToOriginal, // Original: Self -- OTR: Original + kOffTheRecordOnly // Original: No Profile -- OTR: Self +}; + +// Contains the logic for ProfileSelection for the different main Profile types +// (Regular, Guest and System). Each of these profile types also have Off the +// Record profiles equivalent, e.g. Incognito is Off the Record profile for +// Regular profile, the Guest user-visible profile is off-the-record, the +// Profile Picker uses the off-the-record System Profile. +// Maps Profile types to `ProfileSelection`. +class ProfileSelections { + public: + ProfileSelections(const ProfileSelections& other); + ~ProfileSelections(); + + // - Predefined `ProfileSelections` + + // Default implementation, as of now: + // - No services in OTR. + // - Regular profile returns itself (original). + // - Guest and System profiles follow Regular profile behaviour. + // + // After the migration(crbug.com/1284664) this default behaviour will change. + // It will be similar to the current `BuildServicesForRegularProfile()`. + // - No services in OTR. + // - Regular profile returns itself (original). + // - No services for Guest and System profile. + static ProfileSelections BuildDefault(); + + // Services available for all profiles. + static ProfileSelections BuildServicesForAllProfiles(); + + // No services for all profiles. + static ProfileSelections BuildNoServicesForAllProfiles(); + + // Only build services for the regular profile. + static ProfileSelections BuildServicesForRegularProfile(); + + // Redirects building services for regular off the record profiles (incognito + // and other off the record profiles) to regular Profile. Doesn't build + // services for Guest and System profiles. + static ProfileSelections BuildServicesRedirectedInIncognito(); + + // Redirects building services for both OTR and Original profile to Original + // Profile for all profile types (Regular, Guest and System). + static ProfileSelections BuildServicesRedirectedToOriginal(); + + // Builder to construct the `ProfileSelections` parameters. + class Builder { + public: + Builder(); + ~Builder(); + + // Builder setters + Builder& WithRegular(ProfileSelection selection); + Builder& WithGuest(ProfileSelection selection); + Builder& WithSystem(ProfileSelection selection); + + // Builds the `ProfileSelections`. + ProfileSelections Build(); + + private: + std::unique_ptr<ProfileSelections> selections_; + }; + + // Given a Profile and a ProfileSelection enum, returns the right profile + // (can potentially return nullptr). + Profile* ApplyProfileSelection(Profile* profile) const; + + private: + // Default constructor settings sets Regular Profile -> + // `ProfileSelection::kOriginalOnly`. It should be constructed through the + // Builder. Value for Guest and System profile not being overridden will + // default to the behaviour of Regular Profile. + ProfileSelections(); + + void SetProfileSelectionForRegular(ProfileSelection selection); + void SetProfileSelectionForGuest(ProfileSelection selection); + void SetProfileSelectionForSystem(ProfileSelection selection); + + // Returns the `ProfileSelection` based on the profile information through the + // set mapping. + ProfileSelection GetProfileSelection(Profile* profile) const; + + // Default value for the mapping of + // Regular Profile -> `ProfileSelection::kOriginalOnly` + // Not assigning values for Guest and System Profiles now defaults to the + // behavior of regular profiles. This will change later on to default to + // `ProfileSelection::kNone`. + ProfileSelection regular_profile_selection_ = ProfileSelection::kOriginalOnly; + absl::optional<ProfileSelection> guest_profile_selection_; + absl::optional<ProfileSelection> system_profile_selection_; +}; + +#endif // !CHROME_BROWSER_PROFILES_PROFILE_SELECTIONS_H_
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_lo.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_lo.xtb index fc2eb8fe..f1299c7 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_lo.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_lo.xtb
@@ -511,6 +511,7 @@ <translation id="4300318234632215983">ປະກາດ URL ເບື້ອງຫຼັງລິ້ງ</translation> <translation id="4322625298640984693">ສີນໍ້າຕານດິນ</translation> <translation id="4342180618051828363">{COUNT,plural, =1{ ຈໍ້າ}=3{ ສາມຈໍ້າ}other{ # ຈໍ້າ}}</translation> +<translation id="4352022650330571548">ພິມ <ph name="PHRASE" /></translation> <translation id="4372435075475052704">ຕໍ່າສຸດ: <ph name="X" /></translation> <translation id="4372705107434148843">ຢຸດການເວົ້າ</translation> <translation id="4376316291247992553">ເບິ່ງກຣາຟິກເປັນໜັງສືໂພງສຳລັບຄົນຕາບອດ</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_nl.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_nl.xtb index 0a74002f..44eea43 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_nl.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_nl.xtb
@@ -854,7 +854,7 @@ <translation id="6865519907510167493">Spelfout</translation> <translation id="6873188295213080042">Hint: Houd Zoeken ingedrukt en druk op de pijltoetsen om te navigeren.</translation> <translation id="6894148351896207544">De huidige datum en tijd uitspreken</translation> -<translation id="6896758677409633944">Kopieer</translation> +<translation id="6896758677409633944">Kopiëren</translation> <translation id="6897341342232909480">Naar links verplaatsen</translation> <translation id="6901540140423170855">datum</translation> <translation id="6910211073230771657">Verwijderd</translation>
diff --git a/chrome/browser/resources/chromeos/login/screens/common/theme_selection.html b/chrome/browser/resources/chromeos/login/screens/common/theme_selection.html index b507663..c8f896b 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/theme_selection.html +++ b/chrome/browser/resources/chromeos/login/screens/common/theme_selection.html
@@ -8,7 +8,7 @@ <link rel="import" href="../../components/display_manager_types.html"> <link rel="import" href="../../components/oobe_icons.html"> <link rel="import" href="../../components/behaviors/login_screen_behavior.html"> -<link rel="import" href="../../components/behaviors/oobe_dialog_host_behavior.html"> +<link rel="import" href="../../components/behaviors/multi_step_behavior.html"> <link rel="import" href="../../components/behaviors/oobe_i18n_behavior.html"> <link rel="import" href="../../components/buttons/oobe_text_button.html"> <link rel="import" href="../../components/common_styles/common_styles.html"> @@ -45,7 +45,8 @@ } </style> - <oobe-adaptive-dialog id="themeSelectionDialog" role="presentation"> + <oobe-adaptive-dialog id="themeSelectionDialog" role="presentation" + for-step="overview"> <iron-icon slot="icon" icon="oobe-32:stars"></iron-icon> <h1 slot="title" id="theme-selection-title"> [[i18nDynamic(locale, 'themeSelectionScreenTitle')]]
diff --git a/chrome/browser/resources/chromeos/login/screens/common/theme_selection.js b/chrome/browser/resources/chromeos/login/screens/common/theme_selection.js index 34607a26..dbfd386 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/theme_selection.js +++ b/chrome/browser/resources/chromeos/login/screens/common/theme_selection.js
@@ -13,10 +13,21 @@ * @implements {OobeI18nBehaviorInterface} */ const ThemeSelectionScreenElementBase = Polymer.mixinBehaviors( - [OobeDialogHostBehavior, OobeI18nBehavior, LoginScreenBehavior], + [OobeI18nBehavior, LoginScreenBehavior, MultiStepBehavior], Polymer.Element); /** + * Enum to represent steps on the theme selection screen. + * Currently there is only one step, but we still use + * MultiStepBehavior because it provides implementation of + * things like processing 'focus-on-show' class + * @enum {string} + */ +const ThemeSelectionStep = { + OVERVIEW: 'overview', +}; + +/** * Available themes. The values should be in sync with the enum * defined in theme_selection_screen.h * @enum {number} @@ -69,6 +80,14 @@ super(); } + get UI_STEPS() { + return ThemeSelectionStep; + } + + defaultUIStep() { + return ThemeSelectionStep.OVERVIEW; + } + get EXTERNAL_API() { return []; }
diff --git a/chrome/browser/resources/chromeos/login/screens/login/gaia_password_changed.js b/chrome/browser/resources/chromeos/login/screens/login/gaia_password_changed.js index e25da4d..6bdc8b41 100644 --- a/chrome/browser/resources/chromeos/login/screens/login/gaia_password_changed.js +++ b/chrome/browser/resources/chromeos/login/screens/login/gaia_password_changed.js
@@ -134,8 +134,7 @@ } this.setUIStep(GaiaPasswordChangedUIState.PROGRESS); this.disabled = true; - - chrome.send('migrateUserData', [this.passwordInput_.value]); + this.userActed(['migrate-user-data', this.passwordInput_.value]); } /** @private */
diff --git a/chrome/browser/resources/chromeos/login/test_api/test_api.js b/chrome/browser/resources/chromeos/login/test_api/test_api.js index c83bbed..76d53ba8 100644 --- a/chrome/browser/resources/chromeos/login/test_api/test_api.js +++ b/chrome/browser/resources/chromeos/login/test_api/test_api.js
@@ -322,6 +322,12 @@ } } +class ThemeSelectionScreenTester extends ScreenElementApi { + constructor() { + super('theme-selection'); + } +} + class ConfirmSamlPasswordScreenTester extends ScreenElementApi { constructor() { super('saml-confirm-password'); @@ -593,6 +599,7 @@ OfflineLoginScreen: new OfflineLoginScreenTester(), DemoPreferencesScreen: new DemoPreferencesScreenTester(), ArcTosScreen: new ArcTosScreenTester(), + ThemeSelectionScreen: new ThemeSelectionScreenTester(), }; this.loginWithPin = function(username, pin) {
diff --git a/chrome/browser/resources/settings/autofill_page/autofill_page.ts b/chrome/browser/resources/settings/autofill_page/autofill_page.ts index 7c2a10e..2b86eb96 100644 --- a/chrome/browser/resources/settings/autofill_page/autofill_page.ts +++ b/chrome/browser/resources/settings/autofill_page/autofill_page.ts
@@ -23,7 +23,6 @@ import {Router} from '../router.js'; import {getTemplate} from './autofill_page.html.js'; -import {MultiStorePasswordUiEntry} from './multi_store_password_ui_entry.js'; import {PasswordCheckMixin} from './password_check_mixin.js'; import {PasswordManagerImpl} from './password_manager_proxy.js'; @@ -87,7 +86,7 @@ private focusConfig_: Map<string, string>; private passwordManagerSubLabel_: string; private enablePasswordViewPage_: string; - credential: MultiStorePasswordUiEntry|null; + credential: chrome.passwordsPrivate.PasswordUiEntry|null; /** * Shows the manage addresses sub page.
diff --git a/chrome/browser/resources/settings/autofill_page/merge_passwords_store_copies_mixin.ts b/chrome/browser/resources/settings/autofill_page/merge_passwords_store_copies_mixin.ts index bd0b36a5..0c9d78d2 100644 --- a/chrome/browser/resources/settings/autofill_page/merge_passwords_store_copies_mixin.ts +++ b/chrome/browser/resources/settings/autofill_page/merge_passwords_store_copies_mixin.ts
@@ -12,7 +12,6 @@ import {ListPropertyUpdateMixin, ListPropertyUpdateMixinInterface} from 'chrome://resources/js/list_property_update_mixin.js'; import {dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {MultiStorePasswordUiEntry} from './multi_store_password_ui_entry.js'; import {PasswordManagerImpl} from './password_manager_proxy.js'; type Constructor<T> = new (...args: any[]) => T; @@ -36,7 +35,7 @@ }; } - savedPasswords: MultiStorePasswordUiEntry[] = []; + savedPasswords: chrome.passwordsPrivate.PasswordUiEntry[] = []; private setSavedPasswordsListener_: ((entries: chrome.passwordsPrivate.PasswordUiEntry[]) => void)|null = null; @@ -44,8 +43,11 @@ override connectedCallback() { super.connectedCallback(); this.setSavedPasswordsListener_ = passwordList => { - this.savedPasswords = - passwordList.map(entry => new MultiStorePasswordUiEntry(entry)); + for (const item of passwordList) { + item.password = ''; + } + this.savedPasswords = passwordList; + this.notifySplices('savedPasswords', passwordList); }; PasswordManagerImpl.getInstance().getSavedPasswordList( @@ -70,5 +72,5 @@ export interface MergePasswordsStoreCopiesMixinInterface extends ListPropertyUpdateMixinInterface { - savedPasswords: MultiStorePasswordUiEntry[]; + savedPasswords: chrome.passwordsPrivate.PasswordUiEntry[]; }
diff --git a/chrome/browser/resources/settings/autofill_page/multi_store_password_ui_entry.ts b/chrome/browser/resources/settings/autofill_page/multi_store_password_ui_entry.ts deleted file mode 100644 index 3a2d6dee..0000000 --- a/chrome/browser/resources/settings/autofill_page/multi_store_password_ui_entry.ts +++ /dev/null
@@ -1,57 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview MultiStorePasswordUiEntry is used for showing entries that - * are duplicated across stores as a single item in the UI. - */ - -/** - * A version of chrome.passwordsPrivate.PasswordUiEntry which contains a - * password and some helper methods. - */ -export class MultiStorePasswordUiEntry { - private contents_: chrome.passwordsPrivate.PasswordUiEntry; - private password_: string = ''; - - constructor(entry: chrome.passwordsPrivate.PasswordUiEntry) { - this.contents_ = entry; - } - - get urls(): chrome.passwordsPrivate.UrlCollection { - return this.contents_.urls; - } - - get username(): string { - return this.contents_.username; - } - - get password(): string { - return this.password_; - } - - set password(password: string) { - this.password_ = password; - } - - get federationText(): (string|undefined) { - return this.contents_.federationText; - } - - get note(): string { - return this.contents_.passwordNote; - } - - get id(): number { - return this.contents_.id; - } - - get storedIn(): chrome.passwordsPrivate.PasswordStoreSet { - return this.contents_.storedIn; - } - - get isAndroidCredential(): boolean { - return this.contents_.isAndroidCredential; - } -}
diff --git a/chrome/browser/resources/settings/autofill_page/password_check.html b/chrome/browser/resources/settings/autofill_page/password_check.html index fcf9e1d..1cd9cf3 100644 --- a/chrome/browser/resources/settings/autofill_page/password_check.html +++ b/chrome/browser/resources/settings/autofill_page/password_check.html
@@ -254,7 +254,7 @@ <template is="dom-if" if="[[showPasswordEditDisclaimer_]]" restamp> <settings-password-edit-disclaimer-dialog on-edit-password-click="onEditPasswordClick_" - origin="[[activePassword_.formattedOrigin]]" + origin="[[activePassword_.urls.shown]]" on-close="onEditDisclaimerClosed_"> </settings-password-edit-disclaimer-dialog> </template>
diff --git a/chrome/browser/resources/settings/autofill_page/password_check_edit_dialog.html b/chrome/browser/resources/settings/autofill_page/password_check_edit_dialog.html index 8ec1aad3..fb935e1 100644 --- a/chrome/browser/resources/settings/autofill_page/password_check_edit_dialog.html +++ b/chrome/browser/resources/settings/autofill_page/password_check_edit_dialog.html
@@ -21,7 +21,7 @@ <cr-dialog id="dialog" close-text="$i18n{close}"> <div slot="title">$i18n{editPasswordTitle}</div> <div slot="body"> - <cr-input value="[[item.detailedOrigin]]" readonly + <cr-input value="[[item.urls.link]]" readonly label="[[getSiteOrApp_(item.isAndroidCredential)]]"> </cr-input> <cr-input value="[[item.username]]" readonly @@ -37,7 +37,7 @@ title="[[showPasswordTitle_(visible)]]"> </cr-icon-button> </cr-input> - <div id="footnote">[[getFootnote_(item.formattedOrigin)]]</div> + <div id="footnote">[[getFootnote_(item.urls.formattedOrigin)]]</div> </div> <div slot="button-container"> <cr-button id="cancel" class="cancel-button" on-click="onCancel_">
diff --git a/chrome/browser/resources/settings/autofill_page/password_check_edit_dialog.ts b/chrome/browser/resources/settings/autofill_page/password_check_edit_dialog.ts index a15aade..4df0a2d 100644 --- a/chrome/browser/resources/settings/autofill_page/password_check_edit_dialog.ts +++ b/chrome/browser/resources/settings/autofill_page/password_check_edit_dialog.ts
@@ -145,7 +145,7 @@ * @return The text to be displayed as the dialog's footnote. */ private getFootnote_(): string { - return this.i18n('editPasswordFootnote', this.item!.formattedOrigin); + return this.i18n('editPasswordFootnote', this.item!.urls.shown); } /**
diff --git a/chrome/browser/resources/settings/autofill_page/password_check_list_item.html b/chrome/browser/resources/settings/autofill_page/password_check_list_item.html index 962ca0e..00916336 100644 --- a/chrome/browser/resources/settings/autofill_page/password_check_list_item.html +++ b/chrome/browser/resources/settings/autofill_page/password_check_list_item.html
@@ -92,7 +92,7 @@ <span class="text-elide"> <!-- This bdo tag is necessary to fix the display of domains starting with numbers. --> - <bdo dir="ltr">[[item.formattedOrigin]]</bdo> + <bdo dir="ltr">[[item.urls.shown]]</bdo> </span> </div> <div class="no-min-width" id="insecureUsername" >
diff --git a/chrome/browser/resources/settings/autofill_page/password_check_mixin.ts b/chrome/browser/resources/settings/autofill_page/password_check_mixin.ts index 8ab361191..1795b1a 100644 --- a/chrome/browser/resources/settings/autofill_page/password_check_mixin.ts +++ b/chrome/browser/resources/settings/autofill_page/password_check_mixin.ts
@@ -258,9 +258,9 @@ lhs.compromisedInfo!.compromiseTime; } - // Otherwise sort by origin, or by username in case the origin is - // the same. - return lhs.formattedOrigin.localeCompare(rhs.formattedOrigin) || + // Otherwise sort by shown origin, or by username in case the origin + // is the same. + return lhs.urls.shown.localeCompare(rhs.urls.shown) || lhs.username.localeCompare(rhs.username); }); resultList.push(...addedResults);
diff --git a/chrome/browser/resources/settings/autofill_page/password_edit_dialog.ts b/chrome/browser/resources/settings/autofill_page/password_edit_dialog.ts index 6196a9c..362d01e 100644 --- a/chrome/browser/resources/settings/autofill_page/password_edit_dialog.ts +++ b/chrome/browser/resources/settings/autofill_page/password_edit_dialog.ts
@@ -27,7 +27,6 @@ import {loadTimeData} from '../i18n_setup.js'; -import {MultiStorePasswordUiEntry} from './multi_store_password_ui_entry.js'; import {getTemplate} from './password_edit_dialog.html.js'; import {PasswordManagerImpl} from './password_manager_proxy.js'; import {PasswordRequestorMixin} from './password_requestor_mixin.js'; @@ -267,12 +266,12 @@ }; } - existingEntry: MultiStorePasswordUiEntry|null; + existingEntry: chrome.passwordsPrivate.PasswordUiEntry|null; isAccountStoreUser: boolean; accountEmail: string|null; readonly storeOptionAccountValue: string; readonly storeOptionDeviceValue: string; - savedPasswords: MultiStorePasswordUiEntry[]; + savedPasswords: chrome.passwordsPrivate.PasswordUiEntry[]; private usernamesByOrigin_: Map<string, Set<string>>|null = null; dialogMode: PasswordDialogMode; private isInFederatedViewMode_: boolean; @@ -450,7 +449,7 @@ // credential. return this.existingEntry!.federationText!; case PasswordDialogMode.EDIT: - return this.existingEntry!.password; + return this.existingEntry!.password || ''; case PasswordDialogMode.ADD: return ''; default: @@ -691,7 +690,7 @@ AddCredentialFromSettingsUserInteractions.DUPLICATE_CREDENTIAL_VIEWED, AddCredentialFromSettingsUserInteractions.COUNT); const existingEntry = this.savedPasswords.find(entry => { - return entry.urls.origin === this.websiteUrls_!.origin && + return entry.urls.signonRealm === this.websiteUrls_!.signonRealm && entry.username === this.username_; })!; this.requestPlaintextPassword( @@ -702,7 +701,8 @@ }, () => {}); } - private switchToEditMode_(existingEntry: MultiStorePasswordUiEntry) { + private switchToEditMode_(existingEntry: + chrome.passwordsPrivate.PasswordUiEntry) { this.existingEntry = existingEntry; this.initDialog_(); this.$.dialog.focus(); @@ -722,8 +722,9 @@ return false; } // TODO(crbug.com/1264468): Consider moving duplication check to backend. - const isDuplicate = this.usernamesByOrigin_.has(this.websiteUrls_.origin) && - this.usernamesByOrigin_.get(this.websiteUrls_.origin)!.has( + const isDuplicate = + this.usernamesByOrigin_.has(this.websiteUrls_.signonRealm) && + this.usernamesByOrigin_.get(this.websiteUrls_.signonRealm)!.has( this.username_); if (isDuplicate && this.dialogMode === PasswordDialogMode.ADD) { @@ -752,7 +753,7 @@ // Group existing usernames by origin. return relevantPasswords.reduce(function(usernamesByOrigin, entry) { - const origin = entry.urls.origin; + const origin = entry.urls.signonRealm; if (!usernamesByOrigin.has(origin)) { usernamesByOrigin.set(origin, new Set()); }
diff --git a/chrome/browser/resources/settings/autofill_page/password_move_multiple_passwords_to_account_dialog.ts b/chrome/browser/resources/settings/autofill_page/password_move_multiple_passwords_to_account_dialog.ts index 5bf9bec..5f42dcc 100644 --- a/chrome/browser/resources/settings/autofill_page/password_move_multiple_passwords_to_account_dialog.ts +++ b/chrome/browser/resources/settings/autofill_page/password_move_multiple_passwords_to_account_dialog.ts
@@ -17,7 +17,6 @@ import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {MultiStorePasswordUiEntry} from './multi_store_password_ui_entry.js'; import {PasswordManagerImpl} from './password_manager_proxy.js'; import {getTemplate} from './password_move_multiple_passwords_to_account_dialog.html.js'; import {MoveToAccountStoreTrigger} from './password_move_to_account_dialog.js'; @@ -51,7 +50,7 @@ }; } - passwordsToMove: MultiStorePasswordUiEntry[]; + passwordsToMove: chrome.passwordsPrivate.PasswordUiEntry[]; accountEmail: string; /** @return Whether the user confirmed the dialog. */
diff --git a/chrome/browser/resources/settings/autofill_page/password_move_to_account_dialog.ts b/chrome/browser/resources/settings/autofill_page/password_move_to_account_dialog.ts index 6f0fe3fe..414cba5 100644 --- a/chrome/browser/resources/settings/autofill_page/password_move_to_account_dialog.ts +++ b/chrome/browser/resources/settings/autofill_page/password_move_to_account_dialog.ts
@@ -18,7 +18,6 @@ import {assert} from 'chrome://resources/js/assert_ts.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {MultiStorePasswordUiEntry} from './multi_store_password_ui_entry.js'; import {PasswordManagerImpl} from './password_manager_proxy.js'; import {getTemplate} from './password_move_to_account_dialog.html.js'; @@ -58,7 +57,7 @@ }; } - passwordToMove: MultiStorePasswordUiEntry; + passwordToMove: chrome.passwordsPrivate.PasswordUiEntry; override connectedCallback() { super.connectedCallback();
diff --git a/chrome/browser/resources/settings/autofill_page/password_removal_mixin.ts b/chrome/browser/resources/settings/autofill_page/password_removal_mixin.ts index 96fd9b0c..0f505679 100644 --- a/chrome/browser/resources/settings/autofill_page/password_removal_mixin.ts +++ b/chrome/browser/resources/settings/autofill_page/password_removal_mixin.ts
@@ -4,13 +4,12 @@ /** * @fileoverview This mixin bundles the functionality for removal of a - * MultiStorePasswordUIEntry. The UI elements inheriting this mixin should also - * have a child PasswordRemoveDialogElement. + * chrome.passwordsPrivate.PasswordUiEntry. The UI elements inheriting this + * mixin should also have a child PasswordRemoveDialogElement. */ import {dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {MultiStorePasswordUiEntry} from './multi_store_password_ui_entry.js'; import {PasswordManagerImpl} from './password_manager_proxy.js'; import {PasswordRemoveDialogPasswordsRemovedEvent} from './password_remove_dialog.js'; @@ -28,7 +27,8 @@ showPasswordRemoveDialog: boolean; - removePassword(password: MultiStorePasswordUiEntry): boolean { + removePassword(password: chrome.passwordsPrivate.PasswordUiEntry): + boolean { // TODO(https://crbug.com/1298027): Use Promise API to simplify the // logic. if (password.storedIn === @@ -67,7 +67,7 @@ * to remove. * @return Whether the password was removed. */ - removePassword(password: MultiStorePasswordUiEntry): boolean; + removePassword(password: chrome.passwordsPrivate.PasswordUiEntry): boolean; /** Sets the property |showPasswordRemoveDialog| to false. */
diff --git a/chrome/browser/resources/settings/autofill_page/password_remove_confirmation_dialog.ts b/chrome/browser/resources/settings/autofill_page/password_remove_confirmation_dialog.ts index 3b544a13..e7503e741 100644 --- a/chrome/browser/resources/settings/autofill_page/password_remove_confirmation_dialog.ts +++ b/chrome/browser/resources/settings/autofill_page/password_remove_confirmation_dialog.ts
@@ -83,7 +83,7 @@ const url: string|undefined = this.item.changePasswordUrl; assert(url); - const origin = this.item.formattedOrigin; + const origin = this.item.urls.shown; return this.i18nAdvanced( 'removeCompromisedPasswordConfirmationDescription', { substitutions: @@ -96,7 +96,7 @@ * Used when the change password URL is not present or insecure. */ private getRemovePasswordDescriptionText_(): string { - const origin = this.item.formattedOrigin; + const origin = this.item.urls.shown; return this.i18n( 'removeCompromisedPasswordConfirmationDescription', origin, origin); }
diff --git a/chrome/browser/resources/settings/autofill_page/password_remove_dialog.ts b/chrome/browser/resources/settings/autofill_page/password_remove_dialog.ts index 305d045..69834ed 100644 --- a/chrome/browser/resources/settings/autofill_page/password_remove_dialog.ts +++ b/chrome/browser/resources/settings/autofill_page/password_remove_dialog.ts
@@ -24,7 +24,6 @@ import {SyncBrowserProxyImpl} from '../people_page/sync_browser_proxy.js'; -import {MultiStorePasswordUiEntry} from './multi_store_password_ui_entry.js'; import {PasswordManagerImpl} from './password_manager_proxy.js'; import {getTemplate} from './password_remove_dialog.html.js'; @@ -86,7 +85,7 @@ }; } - duplicatedPassword: MultiStorePasswordUiEntry; + duplicatedPassword: chrome.passwordsPrivate.PasswordUiEntry; private removeFromAccountChecked_: boolean; private removeFromDeviceChecked_: boolean; private accountEmail_: string;
diff --git a/chrome/browser/resources/settings/autofill_page/password_view.ts b/chrome/browser/resources/settings/autofill_page/password_view.ts index dba4d12..f753fda 100644 --- a/chrome/browser/resources/settings/autofill_page/password_view.ts +++ b/chrome/browser/resources/settings/autofill_page/password_view.ts
@@ -35,7 +35,6 @@ import {BlockingRequestManager} from './blocking_request_manager.js'; // </if> import {MergePasswordsStoreCopiesMixin, MergePasswordsStoreCopiesMixinInterface} from './merge_passwords_store_copies_mixin.js'; -import {MultiStorePasswordUiEntry} from './multi_store_password_ui_entry.js'; import {SavedPasswordEditedEvent} from './password_edit_dialog.js'; import {PasswordRemovalMixin, PasswordRemovalMixinInterface} from './password_removal_mixin.js'; import {PasswordRemoveDialogPasswordsRemovedEvent} from './password_remove_dialog.js'; @@ -167,7 +166,7 @@ private id_: number|null|undefined; private activeDialogAnchorStack_: HTMLElement[]; private toastText_: string; - credential: MultiStorePasswordUiEntry|null; + credential: chrome.passwordsPrivate.PasswordUiEntry|null; private isPasswordNotesEnabled_: boolean; private isPasswordVisible_: boolean; private password_: string; @@ -402,9 +401,10 @@ if (!this.savedPasswords.length || this.id_ === undefined) { return; } - const item = this.savedPasswords.find((item: MultiStorePasswordUiEntry) => { - return item.id === this.id_; - }); + const item = this.savedPasswords.find( + (item: chrome.passwordsPrivate.PasswordUiEntry) => { + return item.id === this.id_; + }); if (!item) { if (!this.recentlyEdited_) {
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_device_section.ts b/chrome/browser/resources/settings/autofill_page/passwords_device_section.ts index 78ca39a..b0c28ba 100644 --- a/chrome/browser/resources/settings/autofill_page/passwords_device_section.ts +++ b/chrome/browser/resources/settings/autofill_page/passwords_device_section.ts
@@ -37,7 +37,6 @@ import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js'; import {MergePasswordsStoreCopiesMixin, MergePasswordsStoreCopiesMixinInterface} from './merge_passwords_store_copies_mixin.js'; -import {MultiStorePasswordUiEntry} from './multi_store_password_ui_entry.js'; import {AccountStorageOptInStateChangedListener, PasswordManagerImpl} from './password_manager_proxy.js'; import {getTemplate} from './passwords_device_section.html.js'; import {PasswordsListHandlerElement} from './passwords_list_handler.js'; @@ -213,11 +212,11 @@ subpageRoute: Route; filter: string; - private deviceOnlyPasswords_: MultiStorePasswordUiEntry[]; - private deviceAndAccountPasswords_: MultiStorePasswordUiEntry[]; - private allDevicePasswords_: MultiStorePasswordUiEntry[]; + private deviceOnlyPasswords_: chrome.passwordsPrivate.PasswordUiEntry[]; + private deviceAndAccountPasswords_: chrome.passwordsPrivate.PasswordUiEntry[]; + private allDevicePasswords_: chrome.passwordsPrivate.PasswordUiEntry[]; private shouldShowMoveMultiplePasswordsBanner_: boolean; - private lastFocused_: MultiStorePasswordUiEntry; + private lastFocused_: chrome.passwordsPrivate.PasswordUiEntry; private listBlurred_: boolean; private accountEmail_: string; private isUserAllowedToAccessPage_: boolean; @@ -272,17 +271,20 @@ this.accountStorageOptInStateListener_ = null; } - private computeAllDevicePasswords_(): MultiStorePasswordUiEntry[] { + private computeAllDevicePasswords_(): + chrome.passwordsPrivate.PasswordUiEntry[] { return this.savedPasswords.filter( p => p.storedIn !== chrome.passwordsPrivate.PasswordStoreSet.ACCOUNT); } - private computeDeviceOnlyPasswords_(): MultiStorePasswordUiEntry[] { + private computeDeviceOnlyPasswords_(): + chrome.passwordsPrivate.PasswordUiEntry[] { return this.savedPasswords.filter( p => p.storedIn === chrome.passwordsPrivate.PasswordStoreSet.DEVICE); } - private computeDeviceAndAccountPasswords_(): MultiStorePasswordUiEntry[] { + private computeDeviceAndAccountPasswords_(): + chrome.passwordsPrivate.PasswordUiEntry[] { return this.savedPasswords.filter( p => p.storedIn === chrome.passwordsPrivate.PasswordStoreSet.DEVICE_AND_ACCOUNT); @@ -313,7 +315,7 @@ (this.savedPasswords .filter( p2 => p1.username === p2.username && - p1.urls.origin === p2.urls.origin) + p1.urls.signonRealm === p2.urls.signonRealm) .length === 1)); } @@ -354,13 +356,14 @@ this.accountStorageOptInStateListener_ = setOptedIn; } - private isNonEmpty_(passwords: MultiStorePasswordUiEntry[]): boolean { + private isNonEmpty_(passwords: chrome.passwordsPrivate.PasswordUiEntry[]): + boolean { return passwords.length > 0; } private getFilteredPasswords_( - passwords: MultiStorePasswordUiEntry[], - filter: string): MultiStorePasswordUiEntry[] { + passwords: chrome.passwordsPrivate.PasswordUiEntry[], + filter: string): chrome.passwordsPrivate.PasswordUiEntry[] { if (!filter) { return passwords.slice(); }
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_list_handler.ts b/chrome/browser/resources/settings/autofill_page/passwords_list_handler.ts index 4aaa4ae..39002cc 100644 --- a/chrome/browser/resources/settings/autofill_page/passwords_list_handler.ts +++ b/chrome/browser/resources/settings/autofill_page/passwords_list_handler.ts
@@ -33,7 +33,6 @@ import {routes} from '../route.js'; import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js'; -import {MultiStorePasswordUiEntry} from './multi_store_password_ui_entry.js'; import {PASSWORD_MORE_ACTIONS_CLICKED_EVENT_NAME, PASSWORD_VIEW_PAGE_CLICKED_EVENT_NAME, PasswordListItemElement, PasswordMoreActionsClickedEvent, PasswordViewPageClickedEvent} from './password_list_item.js'; import {PasswordManagerImpl, PasswordManagerProxy} from './password_manager_proxy.js'; import {PasswordRemovalMixin, PasswordRemovalMixinInterface} from './password_removal_mixin.js'; @@ -161,7 +160,7 @@ }; } - savedPasswords: MultiStorePasswordUiEntry[]; + savedPasswords: chrome.passwordsPrivate.PasswordUiEntry[]; isAccountStoreUser: boolean; allowMoveToAccountOption: boolean; @@ -405,7 +404,7 @@ */ private shouldShowMoveToAccountOption_(): boolean { const isFirstSignedInAccountPassword = !!this.activePassword_ && - this.activePassword_.entry.urls.origin.includes( + this.activePassword_.entry.urls.signonRealm.includes( 'accounts.google.com') && this.activePassword_.entry.username === this.firstSignedInAccountEmail_; // It's not useful to move a password for an account into that same account.
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_section.ts b/chrome/browser/resources/settings/autofill_page/passwords_section.ts index 8219278..0cffd10 100644 --- a/chrome/browser/resources/settings/autofill_page/passwords_section.ts +++ b/chrome/browser/resources/settings/autofill_page/passwords_section.ts
@@ -55,7 +55,6 @@ import {BlockingRequestManager} from './blocking_request_manager.js'; // </if> import {MergePasswordsStoreCopiesMixin, MergePasswordsStoreCopiesMixinInterface} from './merge_passwords_store_copies_mixin.js'; -import {MultiStorePasswordUiEntry} from './multi_store_password_ui_entry.js'; import {PasswordCheckMixin, PasswordCheckMixinInterface} from './password_check_mixin.js'; import {AddCredentialFromSettingsUserInteractions, PasswordEditDialogElement} from './password_edit_dialog.js'; import {PasswordCheckReferrer, PasswordExceptionListChangedListener, PasswordManagerImpl, PasswordManagerProxy} from './password_manager_proxy.js'; @@ -635,7 +634,8 @@ } // </if> - private passwordFilter_(): ((entry: MultiStorePasswordUiEntry) => boolean) { + private passwordFilter_(): + ((entry: chrome.passwordsPrivate.PasswordUiEntry) => boolean) { return password => [password.urls.shown, password.username].some( term => term.toLowerCase().includes( this.filter.trim().toLowerCase()));
diff --git a/chrome/browser/resources/settings/autofill_page/show_password_mixin.ts b/chrome/browser/resources/settings/autofill_page/show_password_mixin.ts index 2ff0e19..c19c778 100644 --- a/chrome/browser/resources/settings/autofill_page/show_password_mixin.ts +++ b/chrome/browser/resources/settings/autofill_page/show_password_mixin.ts
@@ -6,7 +6,6 @@ import {loadTimeData} from '../i18n_setup.js'; -import {MultiStorePasswordUiEntry} from './multi_store_password_ui_entry.js'; import {PasswordRequestorMixin, PasswordRequestorMixinInterface} from './password_requestor_mixin.js'; type Constructor<T> = new (...args: any[]) => T; @@ -27,7 +26,7 @@ }; } - entry: MultiStorePasswordUiEntry; + entry: chrome.passwordsPrivate.PasswordUiEntry; getPasswordInputType() { return this.entry.password || this.entry.federationText ? 'text' : @@ -84,7 +83,7 @@ export interface ShowPasswordMixinInterface { - entry: MultiStorePasswordUiEntry; + entry: chrome.passwordsPrivate.PasswordUiEntry; /** * Gets the password input's type. Should be 'text' when password is visible
diff --git a/chrome/browser/resources/settings/settings.gni b/chrome/browser/resources/settings/settings.gni index 55bfd93..02d0b77 100644 --- a/chrome/browser/resources/settings/settings.gni +++ b/chrome/browser/resources/settings/settings.gni
@@ -224,7 +224,6 @@ "appearance_page/fonts_browser_proxy.ts", "autofill_page/autofill_manager_proxy.ts", "autofill_page/merge_passwords_store_copies_mixin.ts", - "autofill_page/multi_store_password_ui_entry.ts", "autofill_page/password_check_mixin.ts", "autofill_page/password_manager_proxy.ts", "autofill_page/password_removal_mixin.ts",
diff --git a/chrome/browser/resources/settings/settings.ts b/chrome/browser/resources/settings/settings.ts index 321fb5c..c336d48 100644 --- a/chrome/browser/resources/settings/settings.ts +++ b/chrome/browser/resources/settings/settings.ts
@@ -23,7 +23,6 @@ export {SettingsAppearancePageElement} from './appearance_page/appearance_page.js'; export {HomeUrlInputElement} from './appearance_page/home_url_input.js'; export {SettingsAutofillPageElement} from './autofill_page/autofill_page.js'; -export {MultiStorePasswordUiEntry} from './autofill_page/multi_store_password_ui_entry.js'; export {AccountStorageOptInStateChangedListener, CredentialsChangedListener, PasswordCheckInteraction, PasswordCheckReferrer, PasswordCheckStatusChangedListener, PasswordExceptionListChangedListener, PasswordManagerImpl, PasswordManagerProxy, PasswordsFileExportProgressListener, SavedPasswordListChangedListener} from './autofill_page/password_manager_proxy.js'; export {BaseMixin} from './base_mixin.js'; export {SettingsBasicPageElement} from './basic_page/basic_page.js';
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.cc b/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.cc index 1088e6e..52a757a 100644 --- a/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.cc +++ b/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.cc
@@ -726,13 +726,17 @@ void CloudBinaryUploadService::SetAuthForTesting(const std::string& dm_token, bool authorized) { - for (enterprise_connectors::AnalysisConnector connector : - {enterprise_connectors::AnalysisConnector:: - ANALYSIS_CONNECTOR_UNSPECIFIED, - enterprise_connectors::AnalysisConnector::FILE_DOWNLOADED, - enterprise_connectors::AnalysisConnector::FILE_ATTACHED, - enterprise_connectors::AnalysisConnector::BULK_DATA_ENTRY, - enterprise_connectors::AnalysisConnector::PRINT}) { + for (enterprise_connectors::AnalysisConnector connector : { + enterprise_connectors::AnalysisConnector:: + ANALYSIS_CONNECTOR_UNSPECIFIED, + enterprise_connectors::AnalysisConnector::FILE_DOWNLOADED, + enterprise_connectors::AnalysisConnector::FILE_ATTACHED, + enterprise_connectors::AnalysisConnector::BULK_DATA_ENTRY, + enterprise_connectors::AnalysisConnector::PRINT, +#if BUILDFLAG(IS_CHROMEOS_ASH) + enterprise_connectors::AnalysisConnector::FILE_TRANSFER, +#endif + }) { TokenAndConnector token_and_connector = {dm_token, connector}; can_upload_enterprise_data_[token_and_connector] = authorized; }
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service_unittest.cc b/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service_unittest.cc index 3586a7e..b8a36d5 100644 --- a/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service_unittest.cc +++ b/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service_unittest.cc
@@ -621,13 +621,17 @@ service_->SetAuthForTesting("valid_dm_token", true); service_->SetAuthForTesting("invalid_dm_token", false); - for (auto connector : - {enterprise_connectors::AnalysisConnector:: - ANALYSIS_CONNECTOR_UNSPECIFIED, - enterprise_connectors::AnalysisConnector::BULK_DATA_ENTRY, - enterprise_connectors::AnalysisConnector::FILE_ATTACHED, - enterprise_connectors::AnalysisConnector::FILE_DOWNLOADED, - enterprise_connectors::AnalysisConnector::PRINT}) { + for (auto connector : { + enterprise_connectors::AnalysisConnector:: + ANALYSIS_CONNECTOR_UNSPECIFIED, + enterprise_connectors::AnalysisConnector::BULK_DATA_ENTRY, + enterprise_connectors::AnalysisConnector::FILE_ATTACHED, + enterprise_connectors::AnalysisConnector::FILE_DOWNLOADED, + enterprise_connectors::AnalysisConnector::PRINT, +#if BUILDFLAG(IS_CHROMEOS_ASH) + enterprise_connectors::AnalysisConnector::FILE_TRANSFER, +#endif + }) { service_->IsAuthorized( GURL(), /*per_profile_request*/ false, base::BindOnce([](bool authorized) { EXPECT_TRUE(authorized); }), @@ -812,6 +816,22 @@ "scan?device_token=fake_token5"), request.GetUrlWithParams()); } +#if BUILDFLAG(IS_CHROMEOS_ASH) + { + MockRequest request( + base::DoNothing(), + CloudAnalysisSettingsWithUrl( + "https://safebrowsing.google.com/safebrowsing/uploads/scan")); + request.set_device_token("fake_token6"); + request.set_analysis_connector(enterprise_connectors::FILE_TRANSFER); + request.add_tag("malware"); + + ASSERT_EQ(GURL("https://safebrowsing.google.com/safebrowsing/uploads/" + "scan?device_token=fake_token6&connector=OnFileTransfer&" + "tag=malware"), + request.GetUrlWithParams()); + } +#endif } TEST_F(CloudBinaryUploadServiceTest, UrlOverride) {
diff --git a/chrome/browser/sync/sync_service_factory.cc b/chrome/browser/sync/sync_service_factory.cc index 2570d93b..a975a51f 100644 --- a/chrome/browser/sync/sync_service_factory.cc +++ b/chrome/browser/sync/sync_service_factory.cc
@@ -281,7 +281,7 @@ // infer the accessible state by looking at prefs/command line flags. syncer::SyncPrefs prefs(profile->GetPrefs()); return syncer::IsSyncAllowedByFlag() && - (!prefs.IsManaged() || prefs.IsLocalSyncEnabled()); + (!prefs.IsSyncClientDisabledByPolicy() || prefs.IsLocalSyncEnabled()); } // static
diff --git a/chrome/browser/sync/test/integration/two_client_search_engines_sync_test.cc b/chrome/browser/sync/test/integration/two_client_search_engines_sync_test.cc index 92e4b99..07f914f 100644 --- a/chrome/browser/sync/test/integration/two_client_search_engines_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_search_engines_sync_test.cc
@@ -295,8 +295,14 @@ // Ensure that we can change the search engine and immediately delete it // without putting the clients out of sync. +// TODO(crbug.com/1347009): Flaky on Mac. +#if BUILDFLAG(IS_MAC) +#define MAYBE_DeleteSyncedDefault DISABLED_DeleteSyncedDefault +#else +#define MAYBE_DeleteSyncedDefault DeleteSyncedDefault +#endif IN_PROC_BROWSER_TEST_F(TwoClientSearchEnginesSyncTest, - E2E_ENABLED(DeleteSyncedDefault)) { + E2E_ENABLED(MAYBE_DeleteSyncedDefault)) { ResetSyncForPrimaryAccount(); ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; // TODO(crbug.com/953711): Ideally we could immediately assert
diff --git a/chrome/browser/task_manager/task_manager_browsertest.cc b/chrome/browser/task_manager/task_manager_browsertest.cc index 78c10483..fa7be27 100644 --- a/chrome/browser/task_manager/task_manager_browsertest.cc +++ b/chrome/browser/task_manager/task_manager_browsertest.cc
@@ -1546,11 +1546,17 @@ } // namespace +// TODO(crbug.com/1346994): Flaky on Windows7. +#if BUILDFLAG(IS_WIN) +#define MAYBE_ProperlyShowsTasks DISABLED_ProperlyShowsTasks +#else +#define MAYBE_ProperlyShowsTasks ProperlyShowsTasks +#endif // Tests that the task manager properly: // 1. shows the Prerender entry when the speculation rule is injected; // 2. shows the Prerender entry when the manager is closed and reopened. // 3. deletes the Prerender entry when the prerendered page is activated. -IN_PROC_BROWSER_TEST_F(PrerenderTaskBrowserTest, ProperlyShowsTasks) { +IN_PROC_BROWSER_TEST_F(PrerenderTaskBrowserTest, MAYBE_ProperlyShowsTasks) { ShowTaskManager(); ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchAboutBlankTab())); @@ -1598,10 +1604,17 @@ WaitForTaskManagerRows(1, MatchBFCache("http://127.0.0.1/"))); } +// TODO(crbug.com/1346994): Flaky on Windows7. +#if BUILDFLAG(IS_WIN) +#define MAYBE_DeletesTaskAfterPrerenderKilled \ + DISABLED_DeletesTaskAfterPrerenderKilled +#else +#define MAYBE_DeletesTaskAfterPrerenderKilled DeletesTaskAfterPrerenderKilled +#endif // Tests that the task manager properly deletes the prerender task once the // prerender is cancelled. IN_PROC_BROWSER_TEST_F(PrerenderTaskBrowserTest, - DeletesTaskAfterPrerenderKilled) { + MAYBE_DeletesTaskAfterPrerenderKilled) { ShowTaskManager(); ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchAboutBlankTab())); @@ -1634,10 +1647,18 @@ } } +// TODO(crbug.com/1346994): Flaky on Windows7. +#if BUILDFLAG(IS_WIN) +#define MAYBE_DeletesTaskAfterTriggerPageKilled \ + DISABLED_DeletesTaskAfterTriggerPageKilled +#else +#define MAYBE_DeletesTaskAfterTriggerPageKilled \ + DeletesTaskAfterTriggerPageKilled +#endif // Tests that the task manager properly deletes the task of the trigger tab and // prerender when the trigger is terminated. IN_PROC_BROWSER_TEST_F(PrerenderTaskBrowserTest, - DeletesTaskAfterTriggerPageKilled) { + MAYBE_DeletesTaskAfterTriggerPageKilled) { ShowTaskManager(); ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchAboutBlankTab())); @@ -1668,10 +1689,19 @@ } } +// TODO(crbug.com/1346994): Flaky on Windows7. +#if BUILDFLAG(IS_WIN) +#define MAYBE_ProperlyShowsPrerenderTaskByAutocompletePredictor \ + DISABLED_ProperlyShowsPrerenderTaskByAutocompletePredictor +#else +#define MAYBE_ProperlyShowsPrerenderTaskByAutocompletePredictor \ + ProperlyShowsPrerenderTaskByAutocompletePredictor +#endif // Test that the autocomplete action predictor trigger Prerender tasks are // properly displayed. Such predictor is used to trigger Omnibox Prerender. -IN_PROC_BROWSER_TEST_F(PrerenderTaskBrowserTest, - ProperlyShowsPrerenderTaskByAutocompletePredictor) { +IN_PROC_BROWSER_TEST_F( + PrerenderTaskBrowserTest, + MAYBE_ProperlyShowsPrerenderTaskByAutocompletePredictor) { ShowTaskManager(); ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchAboutBlankTab())); @@ -1730,10 +1760,18 @@ } } +// TODO(crbug.com/1346994): Flaky on Windows7. +#if BUILDFLAG(IS_WIN) +#define MAYBE_OmniboxPrerenderActivationClearsTask \ + DISABLED_OmniboxPrerenderActivationClearsTask +#else +#define MAYBE_OmniboxPrerenderActivationClearsTask \ + OmniboxPrerenderActivationClearsTask +#endif // Test that the Omnibox-triggered prerender activation clears the prerender // entry in the task manager. IN_PROC_BROWSER_TEST_F(PrerenderTaskBrowserTest, - OmniboxPrerenderActivationClearsTask) { + MAYBE_OmniboxPrerenderActivationClearsTask) { ShowTaskManager(); ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchAboutBlankTab()));
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 3d39f0c..a664bb6 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -2834,8 +2834,6 @@ "webui/chromeos/system_web_dialog_delegate.h", "webui/chromeos/user_image_source.cc", "webui/chromeos/user_image_source.h", - "webui/chromeos/video_source.cc", - "webui/chromeos/video_source.h", "webui/chromeos/vm/vm_ui.cc", "webui/chromeos/vm/vm_ui.h", "webui/extensions/ash/kiosk_apps_handler.cc",
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb index 083e86a..963103e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb
@@ -977,6 +977,7 @@ <translation id="6394791151443660613">সার্চ করুন: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">লিঙ্ক</translation> <translation id="6397616442223433927">আবার অনলাইন হয়েছেন</translation> +<translation id="6401458660421980302">এই ট্যাবটিকে অন্য ডিভাইসে পাঠাতে, সেখানে Chrome-এ সাইন-ইন করুন</translation> <translation id="6402652558933147609"><ph name="VIOLATED_URL" />-এ <ph name="ERROR_CODE" /></translation> <translation id="6404511346730675251">বুকমার্ক সম্পাদনা করুন</translation> <translation id="6406506848690869874">সিঙ্ক</translation> @@ -1028,6 +1029,7 @@ <translation id="6600954340915313787">Chrome-এ প্রতিলিপি করা হয়েছে</translation> <translation id="661266467055912436">ওয়েবে আপনার এবং সকলের জন্য নিরাপত্তা আরও উন্নত করুন।</translation> <translation id="6618554661997243500">আপনার জন্য বেছে নেওয়া সেরা সাইট ও খবর দেখতে 'হোম' বোতাম টিপুন</translation> +<translation id="6621391692573306628">এই ট্যাবটিকে অন্য ডিভাইসে পাঠাতে, উভয় ডিভাইসেই Chrome-এ সাইন-ইন করুন</translation> <translation id="6627583120233659107">ফোল্ডার সম্পাদনা করুন</translation> <translation id="6633067410344541938">'ছদ্মবেশী' মোড আনলক করুন</translation> <translation id="6636623428211296678">নিচে দেওয়া আরও সেটিংস দেখুন অথবা এখনই শেষ করুন</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb index 6bfccaa..f0fc394e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
@@ -975,6 +975,7 @@ <translation id="6394791151443660613">Pretraživanje: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LINK</translation> <translation id="6397616442223433927">Ponovo na mreži</translation> +<translation id="6401458660421980302">Da pošaljete ovu karticu na drugi uređaj, prijavite se na Chrome tamo</translation> <translation id="6402652558933147609"><ph name="ERROR_CODE" /> na <ph name="VIOLATED_URL" /></translation> <translation id="6404511346730675251">Uredite oznaku</translation> <translation id="6406506848690869874">Sinhronizacija</translation> @@ -1026,6 +1027,7 @@ <translation id="6600954340915313787">Kopirano u Chrome</translation> <translation id="661266467055912436">Poboljšava vašu i svačiju sigurnost na webu.</translation> <translation id="6618554661997243500">Da pogledate najpopularnije web lokacije i priče prilagođene vama, dodirnite dugme za početni ekran</translation> +<translation id="6621391692573306628">Da pošaljete ovu karticu na drugi uređaj, prijavite se na Chrome na oba uređaja</translation> <translation id="6627583120233659107">Uredi folder</translation> <translation id="6633067410344541938">Otključaj anonimni način rada</translation> <translation id="6636623428211296678">Istražite više postavki u nastavku ili završite odmah</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb index 88a4d6c..84a2e56 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
@@ -78,6 +78,7 @@ <translation id="1344653310988386453">Isama ang link sa highlight</translation> <translation id="1347468774581902829">Pamahalaan ang aktibidad</translation> <translation id="1360432990279830238">Mag-sign out at i-off ang pag-sync?</translation> +<translation id="1366525380420346469">Kapag naka-on</translation> <translation id="1373696734384179344">Hindi sapat ang memory upang ma-download ang napiling content.</translation> <translation id="1376578503827013741">Kino-compute…</translation> <translation id="1382912999714108023">Hindi mo nakikita ang iyong kasalukuyan impormasyon? Makipag-ugnayan sa iyong bangko para ma-update ito.</translation> @@ -513,6 +514,7 @@ <translation id="3810973564298564668">Pamahalaan</translation> <translation id="3819178904835489326">Na-delete ang <ph name="NUMBER_OF_DOWNLOADS" /> (na) pag-download</translation> <translation id="3819183753496523827">Offline ka. Suriin ang iyong koneksyon sa internet at subukan ulit.</translation> +<translation id="3830886834687455630">I-update ang mga serbisyo ng Google Play para tingnan ang iyong mga password</translation> <translation id="3845098929839618392">Buksan sa Incognito tab</translation> <translation id="3856096718352044181">Paki-verify na valid na provider ito o subukan ulit sa ibang pagkakataon</translation> <translation id="3858860766373142691">Pangalan</translation> @@ -733,6 +735,7 @@ <translation id="5016205925109358554">Serif</translation> <translation id="5032430150487044192">Hindi magawa ang QR Code</translation> <translation id="5039804452771397117">Payagan</translation> +<translation id="504456571576643789">Mga bagay na dapat isaalang-alang</translation> <translation id="5054455334322721892">Posibleng ma-save sa iyong Google Account ang <ph name="BEGIN_LINK1" />iba pang anyo ng aktibidad<ph name="END_LINK1" /> kapag naka-sign in ka. Puwede mong i-delete ang mga ito anumang oras.</translation> <translation id="5061533557687621530">Para tingnan ang lagay ng panahon, i-tap ang mic at sabihing “Ano ang lagay ng panahon ngayon?”</translation> <translation id="506254248375231072">Walang tab</translation> @@ -975,6 +978,7 @@ <translation id="6394791151443660613">Hanapin: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LINK</translation> <translation id="6397616442223433927">Online ulit</translation> +<translation id="6401458660421980302">Para ipadala ang tab na ito sa ibang device, mag-sign in sa Chrome doon</translation> <translation id="6402652558933147609"><ph name="ERROR_CODE" /> sa <ph name="VIOLATED_URL" /></translation> <translation id="6404511346730675251">I-edit ang bookmark</translation> <translation id="6406506848690869874">Pag-sync</translation> @@ -1026,6 +1030,7 @@ <translation id="6600954340915313787">Kinopya sa Chrome</translation> <translation id="661266467055912436">Pinapahusay ang seguridad para sa iyo at sa lahat ng tao sa web.</translation> <translation id="6618554661997243500">Para makita ang mga nangungunang site at kuwento para sa iyo, i-tap ang button ng Home</translation> +<translation id="6621391692573306628">Para ipadala ang tab na ito sa ibang device, mag-sign in sa Chrome sa dalawang device</translation> <translation id="6627583120233659107">I-edit ang folder</translation> <translation id="6633067410344541938">I-unlock ang Incognito</translation> <translation id="6636623428211296678">Mag-explore pa ng mga setting sa ibaba o tapusin ngayon</translation> @@ -1214,6 +1219,7 @@ <translation id="7641339528570811325">I-clear ang data sa pag-browse...</translation> <translation id="7646772052135772216">Hindi gumagana ang pag-sync ng password</translation> <translation id="7655900163790317559">Ino-on ang Bluetooth…</translation> +<translation id="7656862631699126784">I-on ang lock ng Incognito</translation> <translation id="7658239707568436148">Kanselahin</translation> <translation id="7663313374500954251">Pinapamahalaan ni <ph name="PARENT_NAME" /> ang browser na ito.</translation> <translation id="7665369617277396874">Magdagdag ng account</translation> @@ -1516,6 +1522,7 @@ <translation id="9159716826369098114">I-restore ang grupo ng tab na <ph name="TAB_COUNT" /> (na) tab bilang bagong background na grupo ng tab.</translation> <translation id="9169507124922466868">Nakabukas nang kalahati ang history ng pag-navigate</translation> <translation id="9187955620966010988">Naisaayos ang reaksyon</translation> +<translation id="9190276265094487094">Makikita mo ang iyong history sa lahat ng naka-sync mong device, para maipagpatuloy mo ang iyong ginagawa</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{Nagsuri 1 minuto ang nakalipas}one{Nagsuri # minuto ang nakalipas}other{Nagsuri # na minuto ang nakalipas}}</translation> <translation id="9204836675896933765">1 file ang natitira</translation> <translation id="9205933215779845960">Hindi makita ang page na iyon. Suriin ang iyong spelling o subukang maghanap sa <ph name="SEARCH_ENGINE" />.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb index dbaf0b66..9aa69ac 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
@@ -975,6 +975,7 @@ <translation id="6394791151443660613">Pretraživanje: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">VEZA</translation> <translation id="6397616442223433927">Veza je ponovo uspostavljena</translation> +<translation id="6401458660421980302">Da biste poslali ovu karticu na drugi uređaj, prijavite se na Chrome na tom uređaju</translation> <translation id="6402652558933147609"><ph name="ERROR_CODE" /> <ph name="VIOLATED_URL" /></translation> <translation id="6404511346730675251">Uredi oznaku</translation> <translation id="6406506848690869874">Sinkronizacija</translation> @@ -1026,6 +1027,7 @@ <translation id="6600954340915313787">Kopirano u Chrome</translation> <translation id="661266467055912436">Poboljšava sigurnost za vas i sve ostale na webu.</translation> <translation id="6618554661997243500">Za prikaz web-lokacija koje najčešće posjećujete i vijesti prilagođenih vama dodirnite gumb početnog zaslona</translation> +<translation id="6621391692573306628">Da biste poslali ovu karticu na drugi uređaj, prijavite se na Chrome na oba uređaja</translation> <translation id="6627583120233659107">Uredi mapu</translation> <translation id="6633067410344541938">Otključaj anonimni način</translation> <translation id="6636623428211296678">Istražite više postavki u nastavku ili završite odmah</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb index d61dc1b..3db3cfc 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
@@ -78,6 +78,7 @@ <translation id="1344653310988386453">გამოყოფილთან ბმულის დართვა</translation> <translation id="1347468774581902829">აქტივობის მართვა</translation> <translation id="1360432990279830238">გსურთ გამოსვლა და სინქრონიზაციის გამორთვა?</translation> +<translation id="1366525380420346469">როცა ჩართულია</translation> <translation id="1373696734384179344">შერჩეული შემცველობის ჩამოტვირთვისათვის, არ არის საკმარისი მეხსიერება.</translation> <translation id="1376578503827013741">მიმდინარეობს გამოთვლა…</translation> <translation id="1382912999714108023">თქვენი ამჟამინდელი ინფორმაცია არ ჩანს? დაუკავშირდით თქვენს ბანკს ინფორმაციის განახლებისთვის.</translation> @@ -513,6 +514,7 @@ <translation id="3810973564298564668">მართვა</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> ჩამოტვირთული ფაილი წაიშალა</translation> <translation id="3819183753496523827">თქვენ ხაზგარეშე რეჟიმში ხართ. შეამოწმეთ ინტერნეტ-კავშირი და ხელახლა ცადეთ.</translation> +<translation id="3830886834687455630">პაროლების შესამოწმებლად განაახლეთ Google Play services</translation> <translation id="3845098929839618392">ინკოგნიტო ჩანართში გახსნა</translation> <translation id="3856096718352044181">დაადასტურეთ პროვაიდერის სისწორე ან ცადეთ მოგვიანებით</translation> <translation id="3858860766373142691">სახელი</translation> @@ -733,6 +735,7 @@ <translation id="5016205925109358554">Serif</translation> <translation id="5032430150487044192">QR კოდის შექმნა ვერ მოხერხდა</translation> <translation id="5039804452771397117">დაშვება</translation> +<translation id="504456571576643789">გასათვალისწინებელი საკითხები</translation> <translation id="5054455334322721892">თქვენს Google ანგარიშში შეიძლება ინახებოდეს <ph name="BEGIN_LINK1" />სხვა ტიპის აქტივობა<ph name="END_LINK1" />, როცა შესული ხართ სისტემაში. აღნიშნულის წაშლა ნებისმიერ დროს შეგიძლიათ.</translation> <translation id="5061533557687621530">ამინდის პროგნოზის გასაცნობად შეეხეთ მიკროფონს და თქვით: „რა ამინდია დღეს?“</translation> <translation id="506254248375231072">ჩანართები არ არის</translation> @@ -975,6 +978,7 @@ <translation id="6394791151443660613">ძიება: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">ბმული</translation> <translation id="6397616442223433927">კვლავ ონლაინ ხართ</translation> +<translation id="6401458660421980302">ეს ჩანართი სხვა მოწყობილობაზე რომ გაგზავნოთ, შედით იქიდან Chrome-ში</translation> <translation id="6402652558933147609"><ph name="ERROR_CODE" /> (<ph name="VIOLATED_URL" />)</translation> <translation id="6404511346730675251">სანიშნის რედაქტირება</translation> <translation id="6406506848690869874">სინქრონიზაცია</translation> @@ -1026,6 +1030,7 @@ <translation id="6600954340915313787">დაკოპირდა Chrome-ში</translation> <translation id="661266467055912436">უსაფრთხოების გაუმჯობესება თქვენთვის და ვების ყველა მომხმარებლისთვის.</translation> <translation id="6618554661997243500">თქვენთვის შერჩეული საუკეთესო საიტებისა და ამბების სანახავად შეეხეთ საწყისი გვერდის ღილაკს</translation> +<translation id="6621391692573306628">ეს ჩანართი სხვა მოწყობილობაზე რომ გაგზავნოთ, შედით Chrome-ში ორივე მოწყობილობიდან</translation> <translation id="6627583120233659107">საქაღალდის რედაქტირება</translation> <translation id="6633067410344541938">ინკოგნიტო რეჟიმის განბლოკვა</translation> <translation id="6636623428211296678">გაეცანით სხვა ვარიანტებს ქვემოთ, ან დაასრულეთ ახლავე</translation> @@ -1214,6 +1219,7 @@ <translation id="7641339528570811325">დათვალიერების მონაცემების გასუფთავება…</translation> <translation id="7646772052135772216">პაროლების სინქრონიზაცია არ მუშაობს</translation> <translation id="7655900163790317559">მიმდინარეობს Bluetooth-ის ჩართვა…</translation> +<translation id="7656862631699126784">ინკოგნიტოს ჩაკეტვის ჩართვა</translation> <translation id="7658239707568436148">გაუქმება</translation> <translation id="7663313374500954251">ამ ბრაუზერს მართავს <ph name="PARENT_NAME" />.</translation> <translation id="7665369617277396874">ანგარიშის დამატება</translation> @@ -1516,6 +1522,7 @@ <translation id="9159716826369098114">ჩანართების ჯგუფის (<ph name="TAB_COUNT" />), როგორც ფონური რეჟიმის ჩანართების ახალი ჯგუფის აღდგენა.</translation> <translation id="9169507124922466868">ნავიგაციის ისტორია ნახევრადგახსნილია</translation> <translation id="9187955620966010988">რეაქცია კორექტირებულია</translation> +<translation id="9190276265094487094">ისტორია თქვენს ყველა სინქრონიზებულ მოწყობილობაზე გაქვთ ჩართული, ამიტომ შეგიძლიათ არ მოცდეთ</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{შემოწმდა 1 წუთის წინ}other{შემოწმდა # წუთის წინ}}</translation> <translation id="9204836675896933765">დარჩენილია 1 ფაილი</translation> <translation id="9205933215779845960">ამ გვერდის პოვნა ვერ ხერხდება. შეამოწმეთ მართლწერა ან ცადეთ მოძიება აქ: <ph name="SEARCH_ENGINE" />.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb index 8f6d03d..e36c78e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb
@@ -975,6 +975,7 @@ <translation id="6394791151443660613">ស្វែងរក៖ <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">តំណ</translation> <translation id="6397616442223433927">មានអ៊ីនធឺណិតវិញ</translation> +<translation id="6401458660421980302">ដើម្បីបញ្ជូនផ្ទាំងនេះទៅឧបករណ៍ផ្សេង សូមចូល Chrome នៅលើនោះ</translation> <translation id="6402652558933147609"><ph name="ERROR_CODE" /> នៅលើ <ph name="VIOLATED_URL" /></translation> <translation id="6404511346730675251">កែប្រែចំណាំ</translation> <translation id="6406506848690869874">សមកាលកម្ម</translation> @@ -1026,6 +1027,7 @@ <translation id="6600954340915313787">បានចម្លងទៅ Chrome</translation> <translation id="661266467055912436">ពង្រឹងសុវត្ថិភាពសម្រាប់អ្នក និងអ្នកគ្រប់គ្នានៅលើអ៊ីនធឺណិត។</translation> <translation id="6618554661997243500">ដើម្បីមើលឃើញអត្ថបទ និងគេហទំព័រពេញនិយមសម្រាប់អ្នក សូមចុចប៊ូតុងដើម</translation> +<translation id="6621391692573306628">ដើម្បីបញ្ជូនផ្ទាំងនេះទៅឧបករណ៍ផ្សេង សូមចូល Chrome នៅលើឧបករណ៍ទាំងពីរ</translation> <translation id="6627583120233659107">កែសម្រួលថតឯកសារ</translation> <translation id="6633067410344541938">ដោះសោមុខងារឯកជន</translation> <translation id="6636623428211296678">រុករកការកំណត់ច្រើនទៀតខាងក្រោម ឬបញ្ចប់ឥឡូវនេះ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb index c0dc634..53ffac4c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
@@ -975,6 +975,7 @@ <translation id="6394791151443660613">검색: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">링크</translation> <translation id="6397616442223433927">인터넷에 다시 연결됨</translation> +<translation id="6401458660421980302">이 탭을 다른 기기로 보내려면 해당 기기에서 Chrome에 로그인하세요.</translation> <translation id="6402652558933147609"><ph name="VIOLATED_URL" />에 <ph name="ERROR_CODE" /> 오류 발생</translation> <translation id="6404511346730675251">북마크 수정</translation> <translation id="6406506848690869874">동기화</translation> @@ -1026,6 +1027,7 @@ <translation id="6600954340915313787">Chrome에 복사됨</translation> <translation id="661266467055912436">모든 웹 사용자를 위해 보안을 향상합니다.</translation> <translation id="6618554661997243500">맞춤 인기 사이트 및 뉴스를 보려면 홈 버튼 탭하기</translation> +<translation id="6621391692573306628">이 탭을 다른 기기로 보내려면 두 기기 모두에서 Chrome에 로그인하세요.</translation> <translation id="6627583120233659107">폴더 수정</translation> <translation id="6633067410344541938">시크릿 모드 잠금 해제</translation> <translation id="6636623428211296678">아래에서 더 많은 설정을 살펴보거나 지금 완료하세요</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb index 1ca697b..f1641e0a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb
@@ -78,6 +78,7 @@ <translation id="1344653310988386453">Вклучи линк до нагласената ставка</translation> <translation id="1347468774581902829">Управувајте со активноста</translation> <translation id="1360432990279830238">Одјавете се и исклучете синхронизација?</translation> +<translation id="1366525380420346469">Кога е вклучено</translation> <translation id="1373696734384179344">Недоволно меморија за да се преземе избраната содржина.</translation> <translation id="1376578503827013741">Се пресметува…</translation> <translation id="1382912999714108023">Ова не се вашите тековни податоци? Контактирајте со вашата банка за да ги ажурирате.</translation> @@ -513,6 +514,7 @@ <translation id="3810973564298564668">Управувај</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> преземања се избришани</translation> <translation id="3819183753496523827">Офлајн сте. Проверете ја интернет-врската и обидете се повторно.</translation> +<translation id="3830886834687455630">Ажурирајте ги услугите на Google Play за да ги проверите вашите лозинки</translation> <translation id="3845098929839618392">Отвори во картичка „Инкогнито“</translation> <translation id="3856096718352044181">Потврдете дека ова е вистински давател на услуги или обидете се повторно подоцна</translation> <translation id="3858860766373142691">Име</translation> @@ -733,6 +735,7 @@ <translation id="5016205925109358554">Serif</translation> <translation id="5032430150487044192">Не може да се создаде QR-код</translation> <translation id="5039804452771397117">Дозволи</translation> +<translation id="504456571576643789">Нешта што треба да се земат предвид</translation> <translation id="5054455334322721892"><ph name="BEGIN_LINK1" />Други форми на активност<ph name="END_LINK1" /> може да се зачувуваат во вашата сметка на Google кога сте најавени. Може да ги избришете во секое време.</translation> <translation id="5061533557687621530">За да го проверите времето, допрете го микрофонот и кажете „What’s the weather today?“ (Какво е времето денес?)</translation> <translation id="506254248375231072">Нема картички</translation> @@ -975,6 +978,7 @@ <translation id="6394791151443660613">Пребарајте: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">ЛИНК</translation> <translation id="6397616442223433927">Повторно сте онлајн</translation> +<translation id="6401458660421980302">За да ја испратите картичкава на друг уред, најавете се на Chrome таму</translation> <translation id="6402652558933147609"><ph name="ERROR_CODE" /> на <ph name="VIOLATED_URL" /></translation> <translation id="6404511346730675251">Измени обележувач</translation> <translation id="6406506848690869874">Синхронизација</translation> @@ -1026,6 +1030,7 @@ <translation id="6600954340915313787">Копирано на Chrome</translation> <translation id="661266467055912436">Ја подобрува безбедноста за вас и сите останати на интернет.</translation> <translation id="6618554661997243500">За да ги гледате најдобрите сајтови и стории за вас, допрете го копчето за почетен екран</translation> +<translation id="6621391692573306628">За да ја испратите картичкава на друг уред, најавете се на Chrome на двата уреда</translation> <translation id="6627583120233659107">Уредувај папка</translation> <translation id="6633067410344541938">Отклучете го режимот „Инкогнито“</translation> <translation id="6636623428211296678">Истражете други поставки долу или завршете сега</translation> @@ -1214,6 +1219,7 @@ <translation id="7641339528570811325">Исчисти податоци од прелистување…</translation> <translation id="7646772052135772216">Синхронизацијата на лозинките не работи</translation> <translation id="7655900163790317559">Се вклучува Bluetooth…</translation> +<translation id="7656862631699126784">Вклучи заклучување „Инкогнито“</translation> <translation id="7658239707568436148">Откажи</translation> <translation id="7663313374500954251">Со прелистувачов управува <ph name="PARENT_NAME" />.</translation> <translation id="7665369617277396874">Додајте сметка</translation> @@ -1516,6 +1522,7 @@ <translation id="9159716826369098114">Врати ја групата картички од <ph name="TAB_COUNT" /> картички како нова заднинска група картички.</translation> <translation id="9169507124922466868">Историјата на навигација е отворена до половина екран</translation> <translation id="9187955620966010988">Реакцијата е приспособена</translation> +<translation id="9190276265094487094">Историјата ќе ви биде достапна на сите ваши синхронизирани уреди за да може да продолжите со она што сте го правеле</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{Проверено пред 1 минута}one{Проверено пред # минута}other{Проверено пред # минути}}</translation> <translation id="9204836675896933765">Преостанува 1 датотека</translation> <translation id="9205933215779845960">Не може да се најде таа страница. Проверете го правописот или пробајте да пребарувате на <ph name="SEARCH_ENGINE" />.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb index 20b73e6c..eb439b47 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
@@ -78,6 +78,7 @@ <translation id="1344653310988386453">Тодруулсан текстийн холбоосыг багтаах</translation> <translation id="1347468774581902829">Үйл ажиллагааг удирдах</translation> <translation id="1360432990279830238">Гараад синк хийхийг унтраах уу?</translation> +<translation id="1366525380420346469">Асаалттай байх үед</translation> <translation id="1373696734384179344">Сонгосон агуулгыг татаж авахад таны багтаамж хүрэлцэхгүй байна.</translation> <translation id="1376578503827013741">Тооцоолж байна...</translation> <translation id="1382912999714108023">Одоогийн мэдээллээ харахгүй байна уу? Үүнийг шинэчлэхийн тулд банктайгаа холбогдоно уу.</translation> @@ -513,6 +514,7 @@ <translation id="3810973564298564668">удирдах</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> таталтыг устгасан</translation> <translation id="3819183753496523827">Та офлайн байна. Интернэт холболтоо шалгаад, дахин оролдоно уу.</translation> +<translation id="3830886834687455630">Нууц үгнүүдээ шалгахын тулд Google Play үйлчилгээг шинэчилнэ үү</translation> <translation id="3845098929839618392">Нууцлалтай табд нээнэ үү</translation> <translation id="3856096718352044181">Энэ нь хүчинтэй нийлүүлэгч болохыг бататгах эсвэл дараа дахин оролдоно уу</translation> <translation id="3858860766373142691">Нэр</translation> @@ -732,6 +734,7 @@ <translation id="5016205925109358554">Сериф</translation> <translation id="5032430150487044192">QR код үүсгэх боломжгүй байна</translation> <translation id="5039804452771397117">Зөвшөөрөх</translation> +<translation id="504456571576643789">Анхаарч үзэх зүйлс</translation> <translation id="5054455334322721892">Таныг нэвтэрсэн үед <ph name="BEGIN_LINK1" />бусад төрлийн үйл ажиллагааг<ph name="END_LINK1" /> Google Бүртгэлд тань хадгалж магадгүй. Та тэдгээрийг хүссэн үедээ устгах боломжтой.</translation> <translation id="5061533557687621530">Цаг агаарыг шалгахын тулд микрофон дээр товшиж, “Өнөөдөр цаг агаар ямар байна вэ?” гэж хэлнэ үү</translation> <translation id="506254248375231072">Таб байхгүй</translation> @@ -1215,6 +1218,7 @@ <translation id="7641339528570811325">Хайлтын өгөгдлийг цэвэрлэх...</translation> <translation id="7646772052135772216">Нууц үгийг синк хийх ажиллахгүй байна</translation> <translation id="7655900163790317559">Bluetooth-г асааж байна…</translation> +<translation id="7656862631699126784">Нууцлалтай түгжээг асаах</translation> <translation id="7658239707568436148">Болих</translation> <translation id="7663313374500954251">Энэ хөтчийг <ph name="PARENT_NAME" /> удирддаг.</translation> <translation id="7665369617277396874">Бүртгэл нэмэх</translation> @@ -1517,6 +1521,7 @@ <translation id="9159716826369098114"><ph name="TAB_COUNT" /> табтай табын бүлгийг шинэ дэвсгэр табын бүлгээр сэргээнэ үү.</translation> <translation id="9169507124922466868">Навигацын түүхийг хагас нээлээ</translation> <translation id="9187955620966010988">Хариу үйлдлийг тохируулсан</translation> +<translation id="9190276265094487094">Таны синк хийсэн бүх төхөөрөмж дээр таны түүхийг хадгална. Ингэснээр та хийж байсан зүйлээ үргэлжлүүлэх боломжтой</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{1 минутын өмнө шалгасан}other{# минутын өмнө шалгасан}}</translation> <translation id="9204836675896933765">1 файл үлдсэн</translation> <translation id="9205933215779845960">Тухайн хуудсыг олох боломжгүй. Зөв бичсэн эсэхээ шалгах эсвэл <ph name="SEARCH_ENGINE" /> дээр хайж үзнэ үү.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb index 3378f07e..e614b13 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb
@@ -78,6 +78,7 @@ <translation id="1344653310988386453">Sertakan pautan kepada serlahan</translation> <translation id="1347468774581902829">Urus aktiviti</translation> <translation id="1360432990279830238">Log keluar dan matikan penyegerakan?</translation> +<translation id="1366525380420346469">Apabila dihidupkan</translation> <translation id="1373696734384179344">Memori tidak mencukupi untuk memuat turun kandungan yang dipilih.</translation> <translation id="1376578503827013741">Mengira...</translation> <translation id="1382912999714108023">Maklumat yang dipaparkan telah lapuk? Sila hubungi bank anda untuk mengemas kini maklumat.</translation> @@ -513,6 +514,7 @@ <translation id="3810973564298564668">Urus</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> muat turun dipadamkan</translation> <translation id="3819183753496523827">Anda di luar talian. Periksa sambungan Internet anda dan cuba lagi.</translation> +<translation id="3830886834687455630">Kemas kini perkhidmatan Google Play untuk menyemak kata laluan anda</translation> <translation id="3845098929839618392">Buka dalam tab Inkognito</translation> <translation id="3856096718352044181">Sila sahkan bahawa penyedia ini sah atau cuba lagi nanti</translation> <translation id="3858860766373142691">Nama</translation> @@ -733,6 +735,7 @@ <translation id="5016205925109358554">Serif</translation> <translation id="5032430150487044192">Tidak dapat membuat Kod QR</translation> <translation id="5039804452771397117">Benarkan</translation> +<translation id="504456571576643789">Perkara yang perlu dipertimbangkan</translation> <translation id="5054455334322721892"><ph name="BEGIN_LINK1" />Bentuk aktiviti lain<ph name="END_LINK1" /> mungkin disimpan dalam Akaun Google anda semasa anda dilog masuk. Anda boleh memadamkan data tersebut pada bila-bila masa.</translation> <translation id="5061533557687621530">Untuk menyemak cuaca, ketik mikrofon dan sebut “Bagaimanakah cuaca hari ini?”</translation> <translation id="506254248375231072">Tiada tab</translation> @@ -1214,6 +1217,7 @@ <translation id="7641339528570811325">Kosongkan data semakan imbas...</translation> <translation id="7646772052135772216">Penyegerakan kata laluan tidak berfungsi</translation> <translation id="7655900163790317559">Menghidupkan Bluetooth…</translation> +<translation id="7656862631699126784">Hidupkan kunci Inkognito</translation> <translation id="7658239707568436148">Batal</translation> <translation id="7663313374500954251">Penyemak imbas ini diurus oleh <ph name="PARENT_NAME" />.</translation> <translation id="7665369617277396874">Tambah akaun</translation> @@ -1516,6 +1520,7 @@ <translation id="9159716826369098114">Pulihkan kumpulan tab <ph name="TAB_COUNT" /> tab sebagai kumpulan tab latar baharu.</translation> <translation id="9169507124922466868">Sejarah navigasi separa terbuka</translation> <translation id="9187955620966010988">Reaksi dilaraskan</translation> +<translation id="9190276265094487094">Sejarah anda boleh didapati pada semua peranti tersegerak anda supaya anda boleh meneruskan perkara yang sedang anda lakukan</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{Disemak 1 minit yang lalu}other{Disemak # minit yang lalu}}</translation> <translation id="9204836675896933765">1 fail lagi</translation> <translation id="9205933215779845960">Tidak menemukan halaman itu. Semak ejaan anda atau cuba cari pada <ph name="SEARCH_ENGINE" />.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb index 1c3094a..071c4ba 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
@@ -1086,7 +1086,7 @@ <translation id="6883204995689174413">Delen</translation> <translation id="688738109438487280">Bestaande gegevens toevoegen aan <ph name="TO_ACCOUNT" />.</translation> <translation id="6891726759199484455">Ontgrendelen om je wachtwoord te kopiëren</translation> -<translation id="6896758677409633944">Kopieer</translation> +<translation id="6896758677409633944">Kopiëren</translation> <translation id="6900532703269623216">Geoptimaliseerde beveiliging</translation> <translation id="6903907808598579934">Synchronisatie aanzetten</translation> <translation id="6909589135458168665">Pagina's vooraf laden</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb index d5f453a..3af1ea9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
@@ -78,6 +78,7 @@ <translation id="1344653310988386453">Inkluder link til markert tekst</translation> <translation id="1347468774581902829">Administrer aktivitet</translation> <translation id="1360432990279830238">Vil du logge av og slå av synkronisering?</translation> +<translation id="1366525380420346469">Når funksjonen er på</translation> <translation id="1373696734384179344">Det er ikke nok ledig minne til å laste ned det valgte innholdet.</translation> <translation id="1376578503827013741">Beregner …</translation> <translation id="1382912999714108023">Er ikke informasjonen din oppdatert? Kontakt banken din for å oppdatere den.</translation> @@ -513,6 +514,7 @@ <translation id="3810973564298564668">Administrer</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> nedlastinger er slettet</translation> <translation id="3819183753496523827">Du er uten nett. Sjekk internettilkoblingen din, og prøv på nytt.</translation> +<translation id="3830886834687455630">Oppdater Google Play-tjenester for å sjekke passordene dine</translation> <translation id="3845098929839618392">Åpne i inkognitofane</translation> <translation id="3856096718352044181">Verifiser at dette er en gyldig leverandør, eller prøv på nytt senere</translation> <translation id="3858860766373142691">Navn</translation> @@ -733,6 +735,7 @@ <translation id="5016205925109358554">Serif</translation> <translation id="5032430150487044192">Kan ikke opprette QR-kode</translation> <translation id="5039804452771397117">Tillat</translation> +<translation id="504456571576643789">Ting å tenke på</translation> <translation id="5054455334322721892"><ph name="BEGIN_LINK1" />Andre typer aktiviteter<ph name="END_LINK1" /> kan bli lagret i Google-kontoen din når du er pålogget. Du kan slette dem når som helst.</translation> <translation id="5061533557687621530">For å sjekke været, trykk på mikrofonen og si «Hvordan er været i dag?»</translation> <translation id="506254248375231072">Ingen faner</translation> @@ -1214,6 +1217,7 @@ <translation id="7641339528570811325">Slett nettlesingsdata</translation> <translation id="7646772052135772216">Passordsynkronisering fungerer ikke</translation> <translation id="7655900163790317559">Slår på Bluetooth …</translation> +<translation id="7656862631699126784">Slå på inkognitolås</translation> <translation id="7658239707568436148">Avbryt</translation> <translation id="7663313374500954251">Denne nettleseren administreres av <ph name="PARENT_NAME" />.</translation> <translation id="7665369617277396874">Legg til konto</translation> @@ -1516,6 +1520,7 @@ <translation id="9159716826369098114">Gjenopprett fanegruppen med <ph name="TAB_COUNT" /> faner som en ny bakgrunnsfanegruppe.</translation> <translation id="9169507124922466868">Navigasjonshistorikken er halvveis åpnet</translation> <translation id="9187955620966010988">Reaksjonen er justert</translation> +<translation id="9190276265094487094">Du får loggen din på alle synkroniserte enheter, slik at du kan fortsette med det du holdt på med</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{Sjekket for ett minutt siden}other{Sjekket for # minutter siden}}</translation> <translation id="9204836675896933765">1 fil gjenstår</translation> <translation id="9205933215779845960">Finner ikke den siden. Kontroller stavemåten, eller prøv et søk på <ph name="SEARCH_ENGINE" />.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb index 8df3b16..f840251 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
@@ -78,6 +78,7 @@ <translation id="1344653310988386453">Include linkul spre evidențiere</translation> <translation id="1347468774581902829">Gestionează activitatea</translation> <translation id="1360432990279830238">Te deconectezi și dezactivezi sincronizarea?</translation> +<translation id="1366525380420346469">Când opțiunea este activată</translation> <translation id="1373696734384179344">Memorie insuficientă pentru descărcarea conținutului selectat.</translation> <translation id="1376578503827013741">Se calculează…</translation> <translation id="1382912999714108023">Nu apar informațiile curente? Contactează banca pentru a le actualiza.</translation> @@ -513,6 +514,7 @@ <translation id="3810973564298564668">Gestionează</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> descărcări șterse</translation> <translation id="3819183753496523827">Ești offline. Verifică starea conexiunii la internet și încearcă din nou.</translation> +<translation id="3830886834687455630">Actualizează serviciile Google Play pentru a verifica parolele</translation> <translation id="3845098929839618392">Deschide într-o filă incognito</translation> <translation id="3856096718352044181">Confirmă dacă acesta este un furnizor valid sau încearcă din nou mai târziu</translation> <translation id="3858860766373142691">Nume</translation> @@ -733,6 +735,7 @@ <translation id="5016205925109358554">Serif</translation> <translation id="5032430150487044192">Nu s-a putut crea codul QR</translation> <translation id="5039804452771397117">Permite</translation> +<translation id="504456571576643789">De reținut</translation> <translation id="5054455334322721892"><ph name="BEGIN_LINK1" />Alte tipuri de activități<ph name="END_LINK1" /> pot fi salvate în Contul Google dacă te-ai conectat. Le poți șterge oricând.</translation> <translation id="5061533557687621530">Pentru a afla starea vremii, atinge microfonul și rostește „Cum este vremea azi?”</translation> <translation id="506254248375231072">Nicio filă</translation> @@ -1214,6 +1217,7 @@ <translation id="7641339528570811325">Șterge datele de navigare…</translation> <translation id="7646772052135772216">Sincronizarea parolelor nu funcționează</translation> <translation id="7655900163790317559">Se activează Bluetooth…</translation> +<translation id="7656862631699126784">Activează blocarea filelor incognito</translation> <translation id="7658239707568436148">Anulează</translation> <translation id="7663313374500954251">Browserul este gestionat de <ph name="PARENT_NAME" />.</translation> <translation id="7665369617277396874">Adaugă un cont</translation> @@ -1516,6 +1520,7 @@ <translation id="9159716826369098114">Restabilește grupul de <ph name="TAB_COUNT" /> file ca pe un nou grup de file din fundal.</translation> <translation id="9169507124922466868">Istoricul de navigare este pe jumătate deschis</translation> <translation id="9187955620966010988">Reacția a fost ajustată</translation> +<translation id="9190276265094487094">Istoricul apare pe toate dispozitivele tale sincronizate. Astfel, poți continua ceea ce făceai.</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{A rulat acum un minut}few{A rulat acum # minute}other{A rulat acum # de minute}}</translation> <translation id="9204836675896933765">1 fișier rămas</translation> <translation id="9205933215779845960">Pagina nu a fost găsită. Verifică ortografierea sau încearcă o căutare pe <ph name="SEARCH_ENGINE" />.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb index 6a71196f..df47e15 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb
@@ -975,6 +975,7 @@ <translation id="6394791151443660613">Hľadať: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">ODKAZ</translation> <translation id="6397616442223433927">Sme späť online</translation> +<translation id="6401458660421980302">Ak chcete túto kartu odoslať do iného zariadenia, prihláste sa v ňom do Chromu</translation> <translation id="6402652558933147609"><ph name="VIOLATED_URL" />: <ph name="ERROR_CODE" /></translation> <translation id="6404511346730675251">Upraviť záložku</translation> <translation id="6406506848690869874">Synchronizácia</translation> @@ -1026,6 +1027,7 @@ <translation id="6600954340915313787">Skopírovaná do prehliadača Chrome</translation> <translation id="661266467055912436">Zvyšuje zabezpečenie na internete pre vás aj ostatných.</translation> <translation id="6618554661997243500">Ak si chcete zobraziť najobľúbenejšie weby a odporúčané správy, klepnite na tlačidlo plochy</translation> +<translation id="6621391692573306628">Ak chcete túto kartu odoslať do iného zariadenia, prihláste v oboch zariadeniach do Chromu</translation> <translation id="6627583120233659107">Upraviť priečinok</translation> <translation id="6633067410344541938">Odblokovať režim inkognito</translation> <translation id="6636623428211296678">Preskúmajte ďalšie nastavenia nižšie alebo dokončite kontrolu</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb index f68f607..e81790e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb
@@ -975,6 +975,7 @@ <translation id="6394791151443660613">Pretražite: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LINK</translation> <translation id="6397616442223433927">Ponovo ste onlajn</translation> +<translation id="6401458660421980302">Da biste poslali ovu karticu na drugi uređaj, prijavite se u Chrome na tom uređaju</translation> <translation id="6402652558933147609"><ph name="ERROR_CODE" /> <ph name="VIOLATED_URL" /></translation> <translation id="6404511346730675251">Izmena obeleživača</translation> <translation id="6406506848690869874">Sinhronizacija</translation> @@ -1026,6 +1027,7 @@ <translation id="6600954340915313787">Kopirana u Chrome</translation> <translation id="661266467055912436">Poboljšava bezbednost za vas i druge na vebu.</translation> <translation id="6618554661997243500">Da biste videli sajtove koje najčešće posećujete i vesti koje najčešće čitate, dodirnite dugme Početak</translation> +<translation id="6621391692573306628">Da biste poslali ovu karticu na drugi uređaj, prijavite se u Chrome na oba uređaja</translation> <translation id="6627583120233659107">Izmeni direktorijum</translation> <translation id="6633067410344541938">Otključaj kartice bez arhiviranja</translation> <translation id="6636623428211296678">Istražite još podešavanja u nastavku ili završite</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb index 28a94c41..aa279a1a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
@@ -975,6 +975,7 @@ <translation id="6394791151443660613">Претражите: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">ЛИНК</translation> <translation id="6397616442223433927">Поново сте онлајн</translation> +<translation id="6401458660421980302">Да бисте послали ову картицу на други уређај, пријавите се у Chrome на том уређају</translation> <translation id="6402652558933147609"><ph name="ERROR_CODE" /> <ph name="VIOLATED_URL" /></translation> <translation id="6404511346730675251">Измена обележивача</translation> <translation id="6406506848690869874">Синхронизација</translation> @@ -1026,6 +1027,7 @@ <translation id="6600954340915313787">Копирана у Chrome</translation> <translation id="661266467055912436">Побољшава безбедност за вас и друге на вебу.</translation> <translation id="6618554661997243500">Да бисте видели сајтове које најчешће посећујете и вести које најчешће читате, додирните дугме Почетак</translation> +<translation id="6621391692573306628">Да бисте послали ову картицу на други уређај, пријавите се у Chrome на оба уређаја</translation> <translation id="6627583120233659107">Измени директоријум</translation> <translation id="6633067410344541938">Откључај картице без архивирања</translation> <translation id="6636623428211296678">Истражите још подешавања у наставку или завршите</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb index 7754cfa..086face 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
@@ -78,6 +78,7 @@ <translation id="1344653310988386453">รวมลิงก์ไปยังไฮไลต์</translation> <translation id="1347468774581902829">จัดการกิจกรรม</translation> <translation id="1360432990279830238">ออกจากระบบและปิดการซิงค์ไหม</translation> +<translation id="1366525380420346469">เมื่อเปิด</translation> <translation id="1373696734384179344">หน่วยความจำไม่เพียงพอที่จะดาวน์โหลดเนื้อหาที่เลือก</translation> <translation id="1376578503827013741">กำลังประมวลผล…</translation> <translation id="1382912999714108023">หากไม่เห็นข้อมูลปัจจุบันของคุณ โปรดติดต่อธนาคารเพื่ออัปเดต</translation> @@ -513,6 +514,7 @@ <translation id="3810973564298564668">จัดการ</translation> <translation id="3819178904835489326">ลบการดาวน์โหลด <ph name="NUMBER_OF_DOWNLOADS" /> รายการแล้ว</translation> <translation id="3819183753496523827">คุณออฟไลน์อยู่ ตรวจสอบการเชื่อมต่ออินเทอร์เน็ตแล้วลองอีกครั้ง</translation> +<translation id="3830886834687455630">อัปเดตบริการ Google Play เพื่อตรวจสอบรหัสผ่าน</translation> <translation id="3845098929839618392">เปิดในแท็บที่ไม่ระบุตัวตน</translation> <translation id="3856096718352044181">โปรดยืนยันว่านี่เป็นผู้ให้บริการที่ถูกต้องหรือลองอีกครั้งภายหลัง</translation> <translation id="3858860766373142691">ชื่อ</translation> @@ -733,6 +735,7 @@ <translation id="5016205925109358554">Serif</translation> <translation id="5032430150487044192">สร้างคิวอาร์โค้ดไม่ได้</translation> <translation id="5039804452771397117">อนุญาต</translation> +<translation id="504456571576643789">สิ่งที่ควรพิจารณา</translation> <translation id="5054455334322721892">ระบบอาจบันทึก<ph name="BEGIN_LINK1" />กิจกรรมรูปแบบอื่น<ph name="END_LINK1" />ในบัญชี Google เมื่อคุณลงชื่อเข้าใช้ คุณลบข้อมูลนี้ได้ทุกเมื่อ</translation> <translation id="5061533557687621530">หากต้องการดูข้อมูลสภาพอากาศ ให้แตะไมค์แล้วพูดว่า "สภาพอากาศวันนี้เป็นอย่างไร"</translation> <translation id="506254248375231072">ไม่มีแท็บ</translation> @@ -975,6 +978,7 @@ <translation id="6394791151443660613">ค้นหา: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">ลิงก์</translation> <translation id="6397616442223433927">กลับมาออนไลน์แล้ว</translation> +<translation id="6401458660421980302">หากต้องการส่งแท็บนี้ไปยังอุปกรณ์อื่น ให้ลงชื่อเข้าใช้ Chrome ในอุปกรณ์นั้น</translation> <translation id="6402652558933147609"><ph name="ERROR_CODE" /> ใน <ph name="VIOLATED_URL" /></translation> <translation id="6404511346730675251">แก้ไขบุ๊กมาร์ก</translation> <translation id="6406506848690869874">การซิงค์ข้อมูล</translation> @@ -1026,6 +1030,7 @@ <translation id="6600954340915313787">คัดลอกไปยัง Chrome แล้ว</translation> <translation id="661266467055912436">ปรับปรุงความปลอดภัยให้คุณและทุกคนที่ใช้อินเทอร์เน็ต</translation> <translation id="6618554661997243500">หากต้องการดูเว็บไซต์ยอดนิยมและเรื่องราวสำหรับคุณ ให้แตะปุ่มหน้าแรก</translation> +<translation id="6621391692573306628">หากต้องการส่งแท็บนี้ไปยังอุปกรณ์อื่น ให้ลงชื่อเข้าใช้ Chrome ในอุปกรณ์ทั้ง 2 เครื่อง</translation> <translation id="6627583120233659107">แก้ไขโฟลเดอร์</translation> <translation id="6633067410344541938">ปลดล็อกเซสชันที่ไม่ระบุตัวตน</translation> <translation id="6636623428211296678">สำรวจดูการตั้งค่าเพิ่มเติมด้านล่างหรือสิ้นสุดการตรวจสอบเลย</translation> @@ -1214,6 +1219,7 @@ <translation id="7641339528570811325">ล้างข้อมูลการท่องเว็บ…</translation> <translation id="7646772052135772216">การซิงค์รหัสผ่านไม่ทำงาน</translation> <translation id="7655900163790317559">กำลังเปิดบลูทูธ…</translation> +<translation id="7656862631699126784">เปิดการล็อกโหมดไม่ระบุตัวตน</translation> <translation id="7658239707568436148">ยกเลิก</translation> <translation id="7663313374500954251"><ph name="PARENT_NAME" /> เป็นผู้จัดการเบราว์เซอร์นี้</translation> <translation id="7665369617277396874">เพิ่มบัญชี</translation> @@ -1516,6 +1522,7 @@ <translation id="9159716826369098114">คืนค่ากลุ่มแท็บ <ph name="TAB_COUNT" /> แท็บเป็นกลุ่มแท็บใหม่ในเบื้องหลัง</translation> <translation id="9169507124922466868">ประวัติการนำทางเปิดอยู่ครึ่งเดียว</translation> <translation id="9187955620966010988">ปรับความรู้สึกแล้ว</translation> +<translation id="9190276265094487094">อุปกรณ์ทั้งหมดที่ซิงค์ไว้จะมีประวัติการเข้าชม คุณจึงทำสิ่งที่ดำเนินการอยู่ต่อได้</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{ตรวจสอบเมื่อ 1 นาทีที่ผ่านมา}other{ตรวจสอบเมื่อ # นาทีที่ผ่านมา}}</translation> <translation id="9204836675896933765">เหลืออีก 1 ไฟล์</translation> <translation id="9205933215779845960">ไม่พบหน้านั้น โปรดตรวจสอบตัวสะกดหรือลองค้นหาใน <ph name="SEARCH_ENGINE" /></translation>
diff --git a/chrome/browser/ui/app_list/search/omnibox_answer_result.cc b/chrome/browser/ui/app_list/search/omnibox_answer_result.cc index aa9a64f..1da9f293 100644 --- a/chrome/browser/ui/app_list/search/omnibox_answer_result.cc +++ b/chrome/browser/ui/app_list/search/omnibox_answer_result.cc
@@ -13,6 +13,7 @@ #include "base/strings/strcat.h" #include "base/strings/string_util.h" #include "chrome/browser/bitmap_fetcher/bitmap_fetcher.h" +#include "chrome/browser/chromeos/launcher_search/search_util.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/app_list/app_list_controller_delegate.h" #include "chrome/browser/ui/app_list/search/common/icon_constants.h" @@ -43,20 +44,6 @@ constexpr char kOmniboxAnswerSchema[] = "omnibox_answer://"; -// Convert from our Mojo page transition type into the UI equivalent. -ui::PageTransition ToUiPageTransition( - CrosApiSearchResult::PageTransition transition) { - switch (transition) { - case CrosApiSearchResult::PageTransition::kTyped: - return ui::PAGE_TRANSITION_TYPED; - case CrosApiSearchResult::PageTransition::kGenerated: - return ui::PAGE_TRANSITION_GENERATED; - default: - NOTREACHED(); - return ui::PAGE_TRANSITION_FIRST; - } -} - ChromeSearchResult::IconInfo CreateAnswerIconInfo( const gfx::VectorIcon& vector_icon) { const int dimension = GetAnswerCardIconDimension(); @@ -115,27 +102,6 @@ return std::make_pair(text->substr(0, unit_start), text->substr(unit_start)); } -// Returns the tag vector for the given text type. -ash::SearchResultTags TagsForText(const std::u16string& text, - CrosApiSearchResult::TextType type) { - ash::SearchResultTags tags; - const auto length = text.length(); - switch (type) { - case CrosApiSearchResult::TextType::kPositive: - tags.push_back(Tag(Tag::GREEN, 0, length)); - break; - case CrosApiSearchResult::TextType::kNegative: - tags.push_back(Tag(Tag::RED, 0, length)); - break; - case CrosApiSearchResult::TextType::kUrl: - tags.push_back(Tag(Tag::URL, 0, length)); - break; - default: - break; - } - return tags; -} - // Converts the given text into a TextItem and appends it to the supplied // vector. void AppendTextItem(const std::u16string& line, @@ -198,10 +164,8 @@ // Derive relevance from omnibox relevance and normalize it to [0, 1]. set_relevance(search_result_->relevance / kMaxOmniboxScore); - if (search_result_->is_omnibox_search == - CrosApiSearchResult::OptionalBool::kTrue) { + if (crosapi::OptionalBoolIsTrue(search_result_->is_omnibox_search)) SetIsOmniboxSearch(true); - } UpdateIcon(); @@ -222,7 +186,8 @@ void OmniboxAnswerResult::Open(int event_flags) { DCHECK(search_result_->destination_url.has_value()); list_controller_->OpenURL(profile_, *search_result_->destination_url, - ToUiPageTransition(search_result_->page_transition), + crosapi::PageTransitionToUiPageTransition( + search_result_->page_transition), ui::DispositionFromEventFlags(event_flags)); }
diff --git a/chrome/browser/ui/app_list/search/omnibox_provider.cc b/chrome/browser/ui/app_list/search/omnibox_provider.cc index ec4f2a5f..01dd680 100644 --- a/chrome/browser/ui/app_list/search/omnibox_provider.cc +++ b/chrome/browser/ui/app_list/search/omnibox_provider.cc
@@ -10,11 +10,14 @@ #include "ash/constants/ash_features.h" #include "ash/public/cpp/app_list/app_list_features.h" +#include "base/bind.h" +#include "base/callback_forward.h" #include "base/containers/flat_set.h" #include "base/memory/ptr_util.h" #include "base/metrics/histogram_macros.h" #include "chrome/browser/autocomplete/chrome_autocomplete_provider_client.h" #include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h" +#include "chrome/browser/bookmarks/bookmark_model_factory.h" #include "chrome/browser/chromeos/launcher_search/search_util.h" #include "chrome/browser/favicon/favicon_service_factory.h" #include "chrome/browser/history/history_service_factory.h" @@ -206,9 +209,20 @@ profile_, list_controller_, &favicon_cache_, last_tokenized_query_.value(), match)); } else { + // We can use an unretained pointer here since we own both the + // autocomplete controller (which lives for the entirety of our lifetime) + // and the results vector. Results are only externally-visible via the + // `results()` method, which doesn't transfer ownership. + auto remove_closure = + base::BindRepeating(&AutocompleteController::DeleteMatch, + base::Unretained(controller_.get()), match); + list_results.emplace_back(std::make_unique<OmniboxResult>( - profile_, list_controller_, controller_.get(), &favicon_cache_, - input_, match, is_zero_state_input_)); + profile_, list_controller_, std::move(remove_closure), + crosapi::CreateResult( + match, controller_.get(), &favicon_cache_, + BookmarkModelFactory::GetForBrowserContext(profile_), input_), + last_query_, is_zero_state_input_)); } }
diff --git a/chrome/browser/ui/app_list/search/omnibox_result.cc b/chrome/browser/ui/app_list/search/omnibox_result.cc index 1185842..ccb5f6a 100644 --- a/chrome/browser/ui/app_list/search/omnibox_result.cc +++ b/chrome/browser/ui/app_list/search/omnibox_result.cc
@@ -7,11 +7,12 @@ #include "ash/constants/ash_features.h" #include "ash/public/cpp/app_list/vector_icons/vector_icons.h" #include "ash/public/cpp/style/dark_light_mode_controller.h" +#include "base/callback_forward.h" #include "base/strings/strcat.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "chrome/browser/bitmap_fetcher/bitmap_fetcher.h" -#include "chrome/browser/bookmarks/bookmark_model_factory.h" +#include "chrome/browser/chromeos/launcher_search/search_util.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/search_engines/template_url_service_factory.h" #include "chrome/browser/ui/app_list/app_list_controller_delegate.h" @@ -19,11 +20,7 @@ #include "chrome/browser/ui/app_list/search/omnibox_util.h" #include "chrome/browser/ui/app_list/search/search_tags_util.h" #include "chrome/grit/generated_resources.h" -#include "components/bookmarks/browser/bookmark_model.h" -#include "components/omnibox/browser/autocomplete_controller.h" -#include "components/omnibox/browser/autocomplete_match.h" -#include "components/omnibox/browser/autocomplete_match_type.h" -#include "components/omnibox/browser/favicon_cache.h" +#include "chromeos/crosapi/mojom/launcher_search.mojom.h" #include "components/omnibox/browser/vector_icons.h" #include "components/search_engines/util.h" #include "extensions/common/image_util.h" @@ -34,7 +31,7 @@ #include "url/gurl.h" #include "url/url_canon.h" -using bookmarks::BookmarkModel; +using CrosApiSearchResult = crosapi::mojom::SearchResult; namespace app_list { namespace { @@ -52,56 +49,24 @@ kCalculator, }; -Subtype MatchTypeToSubtype(AutocompleteMatchType::Type type) { +Subtype MatchTypeToSubtype(CrosApiSearchResult::OmniboxType type) { switch (type) { - case AutocompleteMatchType::URL_WHAT_YOU_TYPED: - case AutocompleteMatchType::HISTORY_URL: - case AutocompleteMatchType::HISTORY_TITLE: - case AutocompleteMatchType::HISTORY_BODY: - case AutocompleteMatchType::HISTORY_KEYWORD: - case AutocompleteMatchType::NAVSUGGEST: - case AutocompleteMatchType::BOOKMARK_TITLE: - case AutocompleteMatchType::NAVSUGGEST_PERSONALIZED: - case AutocompleteMatchType::CLIPBOARD_URL: - case AutocompleteMatchType::PHYSICAL_WEB_DEPRECATED: - case AutocompleteMatchType::PHYSICAL_WEB_OVERFLOW_DEPRECATED: - case AutocompleteMatchType::TAB_SEARCH_DEPRECATED: - case AutocompleteMatchType::DOCUMENT_SUGGESTION: - case AutocompleteMatchType::PEDAL_DEPRECATED: - case AutocompleteMatchType::HISTORY_CLUSTER: + case CrosApiSearchResult::OmniboxType::kDomain: return Subtype::kDomain; - - case AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED: - case AutocompleteMatchType::SEARCH_SUGGEST: - case AutocompleteMatchType::SEARCH_SUGGEST_ENTITY: - case AutocompleteMatchType::SEARCH_SUGGEST_TAIL: - case AutocompleteMatchType::SEARCH_SUGGEST_PROFILE: - case AutocompleteMatchType::SEARCH_OTHER_ENGINE: - case AutocompleteMatchType::CONTACT_DEPRECATED: - case AutocompleteMatchType::VOICE_SUGGEST: - case AutocompleteMatchType::CLIPBOARD_TEXT: - case AutocompleteMatchType::CLIPBOARD_IMAGE: + case CrosApiSearchResult::OmniboxType::kSearch: return Subtype::kSearch; - - case AutocompleteMatchType::SEARCH_HISTORY: - case AutocompleteMatchType::SEARCH_SUGGEST_PERSONALIZED: + case CrosApiSearchResult::OmniboxType::kHistory: return Subtype::kHistory; - - case AutocompleteMatchType::CALCULATOR: + case CrosApiSearchResult::OmniboxType::kCalculator: return Subtype::kCalculator; - - case AutocompleteMatchType::EXTENSION_APP_DEPRECATED: - case AutocompleteMatchType::TILE_SUGGESTION: - case AutocompleteMatchType::TILE_NAVSUGGEST: - case AutocompleteMatchType::OPEN_TAB: - case AutocompleteMatchType::NUM_TYPES: + default: NOTREACHED(); return Subtype::kDomain; } } // AutocompleteMatchType::Type to vector icon, used for app list. -const gfx::VectorIcon& TypeToVectorIcon(AutocompleteMatchType::Type type) { +const gfx::VectorIcon& TypeToVectorIcon(CrosApiSearchResult::OmniboxType type) { switch (MatchTypeToSubtype(type)) { case Subtype::kDomain: return ash::kOmniboxGenericIcon; @@ -111,58 +76,68 @@ return ash::kHistoryIcon; case Subtype::kCalculator: return ash::kEqualIcon; + default: + NOTREACHED(); + return ash::kOmniboxGenericIcon; } } +// Returns tags for the given text, with match tags manually included for +// compatibility with the classic launcher. +ash::SearchResultTags TagsForTextWithMatchTags( + const std::u16string& query, + const std::u16string& text, + CrosApiSearchResult::TextType type) { + ash::SearchResultTags tags = CalculateTags(query, text); + for (const ash::SearchResultTag tag : TagsForText(text, type)) + tags.push_back(tag); + return tags; +} + } // namespace OmniboxResult::OmniboxResult(Profile* profile, AppListControllerDelegate* list_controller, - AutocompleteController* autocomplete_controller, - FaviconCache* favicon_cache, - const AutocompleteInput& input, - const AutocompleteMatch& match, + base::RepeatingClosure remove_closure, + crosapi::mojom::SearchResultPtr search_result, + const std::u16string& query, bool is_zero_suggestion) - : profile_(profile), + : consumer_receiver_(this, std::move(search_result->receiver)), + profile_(profile), list_controller_(list_controller), - autocomplete_controller_(autocomplete_controller), - favicon_cache_(favicon_cache), - match_(match), - is_zero_suggestion_(is_zero_suggestion) { - if (match_.search_terms_args && autocomplete_controller_) { - match_.search_terms_args->request_source = TemplateURLRef::CROS_APP_LIST; - autocomplete_controller_->SetMatchDestinationURL(&match_); - } + search_result_(std::move(search_result)), + remove_closure_(std::move(remove_closure)), + query_(query), + is_zero_suggestion_(is_zero_suggestion), + contents_(search_result_->contents.value_or(u"")), + description_(search_result_->description.value_or(u"")) { SetDisplayType(DisplayType::kList); SetResultType(ResultType::kOmnibox); SetMetricsType(GetSearchResultType()); - if (match_.stripped_destination_url.spec().empty()) { - match_.ComputeStrippedDestinationURL( - input, autocomplete_controller_->autocomplete_provider_client() - ->GetTemplateURLService()); - } - set_id(match_.stripped_destination_url.spec()); + set_id(search_result_->stripped_destination_url->spec()); // Omnibox results are categorized as Search and Assistant if they are search // suggestions, and Web otherwise. - SetCategory(MatchTypeToSubtype(match_.type) == Subtype::kSearch + SetCategory(search_result_->omnibox_type == + CrosApiSearchResult::OmniboxType::kSearch ? Category::kSearchAndAssistant : Category::kWeb); // Derive relevance from omnibox relevance and normalize it to [0, 1]. - set_relevance(match_.relevance / kMaxOmniboxScore); + set_relevance(search_result_->relevance / kMaxOmniboxScore); if (IsRichEntity()) { dedup_priority_ = kRichEntityPriority; - } else if (MatchTypeToSubtype(match_.type) == Subtype::kHistory) { + } else if (search_result_->omnibox_type == + CrosApiSearchResult::OmniboxType::kHistory) { dedup_priority_ = kHistoryPriority; } else { dedup_priority_ = kDefaultPriority; } - const bool is_omnibox_search = AutocompleteMatch::IsSearchType(match_.type); - SetIsOmniboxSearch(is_omnibox_search); + SetIsOmniboxSearch( + crosapi::OptionalBoolIsTrue(search_result_->is_omnibox_search)); UpdateIcon(); UpdateTitleAndDetails(); @@ -171,7 +146,7 @@ DCHECK(!ash::features::IsProductivityLauncherEnabled()); InitializeButtonActions({ash::SearchResultActionType::kRemove, ash::SearchResultActionType::kAppend}); - } else if (is_omnibox_search && + } else if (crosapi::OptionalBoolIsTrue(search_result_->is_omnibox_search) && ash::features::IsProductivityLauncherEnabled()) { InitializeButtonActions({ash::SearchResultActionType::kRemove}); } @@ -186,18 +161,16 @@ } void OmniboxResult::Open(int event_flags) { - list_controller_->OpenURL(profile_, match_.destination_url, match_.transition, + list_controller_->OpenURL(profile_, *search_result_->destination_url, + crosapi::PageTransitionToUiPageTransition( + search_result_->page_transition), ui::DispositionFromEventFlags(event_flags)); } -void OmniboxResult::Remove() { - autocomplete_controller_->DeleteMatch(match_); -} - void OmniboxResult::InvokeAction(ash::SearchResultActionType action) { switch (action) { case ash::SearchResultActionType::kRemove: - Remove(); + remove_closure_.Run(); break; case ash::SearchResultActionType::kAppend: case ash::SearchResultActionType::kSearchResultActionTypeMax: @@ -206,60 +179,32 @@ } ash::SearchResultType OmniboxResult::GetSearchResultType() const { - switch (match_.type) { - case AutocompleteMatchType::URL_WHAT_YOU_TYPED: + switch (search_result_->metrics_type) { + case CrosApiSearchResult::MetricsType::kWhatYouTyped: return ash::OMNIBOX_URL_WHAT_YOU_TYPED; - case AutocompleteMatchType::HISTORY_URL: { - BookmarkModel* bookmark_model = - BookmarkModelFactory::GetForBrowserContext(profile_); - if (bookmark_model && - bookmark_model->IsBookmarked(match_.destination_url)) { - return ash::OMNIBOX_BOOKMARK; - } + case CrosApiSearchResult::MetricsType::kRecentlyVisitedWebsite: return ash::OMNIBOX_RECENTLY_VISITED_WEBSITE; - } - case AutocompleteMatchType::HISTORY_TITLE: + case CrosApiSearchResult::MetricsType::kHistoryTitle: return ash::OMNIBOX_RECENT_DOC_IN_DRIVE; - case AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED: + case CrosApiSearchResult::MetricsType::kSearchWhatYouTyped: return ash::OMNIBOX_WEB_QUERY; - case AutocompleteMatchType::SEARCH_HISTORY: + case CrosApiSearchResult::MetricsType::kSearchHistory: return ash::OMNIBOX_SEARCH_HISTORY; - case AutocompleteMatchType::SEARCH_SUGGEST: + case CrosApiSearchResult::MetricsType::kSearchSuggest: return ash::OMNIBOX_SEARCH_SUGGEST; - case AutocompleteMatchType::SEARCH_SUGGEST_PERSONALIZED: + case CrosApiSearchResult::MetricsType::kSearchSuggestPersonalized: return ash::OMNIBOX_SUGGEST_PERSONALIZED; - case AutocompleteMatchType::BOOKMARK_TITLE: + case CrosApiSearchResult::MetricsType::kBookmark: return ash::OMNIBOX_BOOKMARK; // SEARCH_SUGGEST_ENTITY corresponds with rich entity results. - case AutocompleteMatchType::SEARCH_SUGGEST_ENTITY: + case CrosApiSearchResult::MetricsType::kSearchSuggestEntity: return ash::OMNIBOX_SEARCH_SUGGEST_ENTITY; - case AutocompleteMatchType::NAVSUGGEST: + case CrosApiSearchResult::MetricsType::kNavSuggest: return ash::OMNIBOX_NAVSUGGEST; - case AutocompleteMatchType::CALCULATOR: + case CrosApiSearchResult::MetricsType::kCalculator: return ash::OMNIBOX_CALCULATOR; - case AutocompleteMatchType::HISTORY_KEYWORD: - case AutocompleteMatchType::SEARCH_SUGGEST_TAIL: - case AutocompleteMatchType::SEARCH_SUGGEST_PROFILE: - case AutocompleteMatchType::SEARCH_OTHER_ENGINE: - case AutocompleteMatchType::CONTACT_DEPRECATED: - case AutocompleteMatchType::NAVSUGGEST_PERSONALIZED: - case AutocompleteMatchType::CLIPBOARD_URL: - case AutocompleteMatchType::VOICE_SUGGEST: - case AutocompleteMatchType::PHYSICAL_WEB_DEPRECATED: - case AutocompleteMatchType::PHYSICAL_WEB_OVERFLOW_DEPRECATED: - case AutocompleteMatchType::EXTENSION_APP_DEPRECATED: - case AutocompleteMatchType::TAB_SEARCH_DEPRECATED: - case AutocompleteMatchType::DOCUMENT_SUGGESTION: - case AutocompleteMatchType::PEDAL_DEPRECATED: - case AutocompleteMatchType::CLIPBOARD_TEXT: - case AutocompleteMatchType::CLIPBOARD_IMAGE: - case AutocompleteMatchType::HISTORY_BODY: - case AutocompleteMatchType::TILE_SUGGESTION: - case AutocompleteMatchType::TILE_NAVSUGGEST: - case AutocompleteMatchType::OPEN_TAB: - case AutocompleteMatchType::HISTORY_CLUSTER: - case AutocompleteMatchType::NUM_TYPES: + default: return ash::SEARCH_RESULT_TYPE_BOUNDARY; } } @@ -269,23 +214,25 @@ SetGenericIcon(); } +void OmniboxResult::OnFaviconReceived(const gfx::ImageSkia& icon) { + // By contract, this is never called with an empty |icon|. + DCHECK(!icon.isNull()); + SetIcon(IconInfo(icon, kFaviconDimension)); +} + void OmniboxResult::UpdateIcon() { if (IsRichEntity()) { - FetchRichEntityImage(match_.image_url); + FetchRichEntityImage(*search_result_->image_url); return; } - // Use a favicon if eligible. If the result should have a favicon but - // there isn't one in the cache, fall through to using a generic icon - // instead. - if (favicon_cache_ && MatchTypeToSubtype(match_.type) == Subtype::kDomain) { - const auto icon = favicon_cache_->GetFaviconForPageUrl( - match_.destination_url, base::BindOnce(&OmniboxResult::OnFaviconFetched, - weak_factory_.GetWeakPtr())); - if (!icon.IsEmpty()) { - SetIcon(IconInfo(icon.AsImageSkia(), kFaviconDimension)); - return; - } + // Use a favicon if eligible. In the event that a favicon becomes available + // asynchronously, it will be sent to us over Mojo and we will update our + // icon. + if (search_result_->omnibox_type == + CrosApiSearchResult::OmniboxType::kFavicon) { + SetIcon(IconInfo(search_result_->cached_favicon, kFaviconDimension)); + return; } SetGenericIcon(); @@ -295,16 +242,15 @@ uses_generic_icon_ = true; // If this is neither a rich entity nor eligible for a favicon, use either // the generic bookmark or another generic icon as appropriate. - BookmarkModel* bookmark_model = - BookmarkModelFactory::GetForBrowserContext(profile_); - if (bookmark_model && bookmark_model->IsBookmarked(match_.destination_url)) { + if (search_result_->omnibox_type == + CrosApiSearchResult::OmniboxType::kBookmark) { SetIcon(IconInfo( gfx::CreateVectorIcon(omnibox::kBookmarkIcon, kSystemIconDimension, GetGenericIconColor()), kSystemIconDimension)); } else { SetIcon(IconInfo( - gfx::CreateVectorIcon(TypeToVectorIcon(match_.type), + gfx::CreateVectorIcon(TypeToVectorIcon(search_result_->omnibox_type), kSystemIconDimension, GetGenericIconColor()), kSystemIconDimension)); } @@ -312,24 +258,20 @@ void OmniboxResult::UpdateTitleAndDetails() { if (!IsUrlResultWithDescription()) { - SetTitle(match_.contents); - ChromeSearchResult::Tags title_tags; - ACMatchClassificationsToTags(match_.contents, match_.contents_class, - &title_tags); - SetTitleTags(title_tags); + SetTitle(contents_); + SetTitleTags(TagsForTextWithMatchTags(query_, contents_, + search_result_->contents_type)); if (IsRichEntity()) { // Only set the details text for rich entities. This prevents default // descriptions such as "Google Search" from being added. - SetDetails(match_.description); - ChromeSearchResult::Tags details_tags; - ACMatchClassificationsToTags(match_.description, match_.description_class, - &details_tags); - SetDetailsTags(details_tags); + SetDetails(description_); + SetDetailsTags(TagsForTextWithMatchTags( + query_, description_, search_result_->description_type)); } - if (AutocompleteMatch::IsSearchType(match_.type)) { - std::u16string accessible_name = + if (crosapi::OptionalBoolIsTrue(search_result_->is_omnibox_search)) { + const std::u16string accessible_name = details().empty() ? title() : base::StrCat({title(), u", ", details()}); SetAccessibleName(l10n_util::GetStringFUTF16( @@ -341,27 +283,24 @@ // For url result with non-empty description, swap title and details. Thus, // the url description is presented as title, and url itself is presented as // details. - SetTitle(match_.description); - ChromeSearchResult::Tags title_tags; - ACMatchClassificationsToTags(match_.description, match_.description_class, - &title_tags); - SetTitleTags(title_tags); + SetTitle(description_); + SetTitleTags(TagsForTextWithMatchTags(query_, description_, + search_result_->description_type)); - SetDetails(match_.contents); - ChromeSearchResult::Tags details_tags; - ACMatchClassificationsToTags(match_.contents, match_.contents_class, - &details_tags); - SetDetailsTags(details_tags); + SetDetails(contents_); + SetDetailsTags(TagsForTextWithMatchTags(query_, contents_, + search_result_->contents_type)); } } bool OmniboxResult::IsUrlResultWithDescription() const { - return !AutocompleteMatch::IsSearchType(match_.type) && - !match_.description.empty(); + return !(crosapi::OptionalBoolIsTrue(search_result_->is_omnibox_search) || + description_.empty()); } bool OmniboxResult::IsRichEntity() const { - return !match_.image_url.is_empty(); + return search_result_->omnibox_type == + CrosApiSearchResult::OmniboxType::kRichImage; } void OmniboxResult::FetchRichEntityImage(const GURL& url) { @@ -383,12 +322,6 @@ SetIcon(icon_info); } -void OmniboxResult::OnFaviconFetched(const gfx::Image& icon) { - // By contract, this is never called with an empty |icon|. - DCHECK(!icon.IsEmpty()); - SetIcon(IconInfo(icon.AsImageSkia(), kFaviconDimension)); -} - void OmniboxResult::InitializeButtonActions( const std::vector<ash::SearchResultActionType>& button_actions) { Actions actions;
diff --git a/chrome/browser/ui/app_list/search/omnibox_result.h b/chrome/browser/ui/app_list/search/omnibox_result.h index 1f4df7c..ff38b64 100644 --- a/chrome/browser/ui/app_list/search/omnibox_result.h +++ b/chrome/browser/ui/app_list/search/omnibox_result.h
@@ -6,17 +6,18 @@ #define CHROME_BROWSER_UI_APP_LIST_SEARCH_OMNIBOX_RESULT_H_ #include <memory> +#include <string> #include <vector> #include "ash/public/cpp/style/color_mode_observer.h" +#include "base/callback_forward.h" #include "base/memory/weak_ptr.h" #include "chrome/browser/bitmap_fetcher/bitmap_fetcher_delegate.h" #include "chrome/browser/ui/app_list/search/chrome_search_result.h" -#include "components/omnibox/browser/autocomplete_match.h" +#include "chromeos/crosapi/mojom/launcher_search.mojom.h" +#include "mojo/public/cpp/bindings/receiver.h" class AppListControllerDelegate; -class AutocompleteController; -class FaviconCache; class BitmapFetcher; class Profile; @@ -24,14 +25,16 @@ class OmniboxResult : public ChromeSearchResult, public BitmapFetcherDelegate, - public ash::ColorModeObserver { + public ash::ColorModeObserver, + public crosapi::mojom::SearchResultConsumer { public: + // `remove_closure` must remove this result from the results list; it is + // called when the "x" button next to the search result is pressed. OmniboxResult(Profile* profile, AppListControllerDelegate* list_controller, - AutocompleteController* autocomplete_controller, - FaviconCache* favicon_cache, - const AutocompleteInput& input, - const AutocompleteMatch& match, + base::RepeatingClosure remove_closure, + crosapi::mojom::SearchResultPtr search_result, + const std::u16string& query, bool is_zero_suggestion); ~OmniboxResult() override; @@ -51,6 +54,9 @@ // ash::ColorModeObserver: void OnColorModeChanged(bool dark_mode_enabled) override; + // crosapi::mojom::SearchResultConsumer: + void OnFaviconReceived(const gfx::ImageSkia& icon) override; + void UpdateIcon(); // Creates a generic backup icon: used when rich icons are not available. void SetGenericIcon(); @@ -58,16 +64,14 @@ void Remove(); - // Returns true if |match_| indicates a url search result with non-empty + // Returns true if match indicates a url search result with non-empty // description. bool IsUrlResultWithDescription() const; - // Returns true if |match| has an image url. + // Returns true if match has an image url. bool IsRichEntity() const; void FetchRichEntityImage(const GURL& url); - void OnFaviconFetched(const gfx::Image& icon); - void InitializeButtonActions( const std::vector<ash::SearchResultActionType>& button_actions); @@ -77,16 +81,24 @@ // ID but lower |dedup_priority| are removed. int dedup_priority_ = 0; - Profile* profile_; - AppListControllerDelegate* list_controller_; - AutocompleteController* autocomplete_controller_; - FaviconCache* favicon_cache_; - AutocompleteMatch match_; + // Handle used to receive asynchronous data about this search result over + // Mojo. + const mojo::Receiver<crosapi::mojom::SearchResultConsumer> consumer_receiver_; + + Profile* const profile_; + AppListControllerDelegate* const list_controller_; + const crosapi::mojom::SearchResultPtr search_result_; + const base::RepeatingClosure remove_closure_; + const std::u16string query_; const bool is_zero_suggestion_; std::unique_ptr<BitmapFetcher> bitmap_fetcher_; // Whether this omnibox result uses a generic backup icon. bool uses_generic_icon_ = false; + // Cached unwrapped search result fields. + const std::u16string contents_; + const std::u16string description_; + base::WeakPtrFactory<OmniboxResult> weak_factory_{this}; };
diff --git a/chrome/browser/ui/app_list/search/omnibox_result_unittest.cc b/chrome/browser/ui/app_list/search/omnibox_result_unittest.cc index b527adeb4..6878048 100644 --- a/chrome/browser/ui/app_list/search/omnibox_result_unittest.cc +++ b/chrome/browser/ui/app_list/search/omnibox_result_unittest.cc
@@ -20,6 +20,7 @@ #include "base/task/cancelable_task_tracker.h" #include "base/test/scoped_feature_list.h" #include "chrome/browser/bookmarks/bookmark_model_factory.h" +#include "chrome/browser/chromeos/launcher_search/search_util.h" #include "chrome/browser/search_engines/template_url_service_factory.h" #include "chrome/browser/ui/app_list/app_list_test_util.h" #include "chrome/browser/ui/app_list/search/chrome_search_result.h" @@ -56,7 +57,7 @@ using testing::_; const char16_t kFullQuery[] = u"match"; -const char16_t kExampleContents[] = u"https://contentsmatchurl.com"; +const char16_t kExampleContents[] = u"matchurl.com/contents.com"; const char16_t kExampleDescription[] = u"description match"; const char kExampleUrl[] = "http://example.com/hello"; const int kRelevance = 750; @@ -69,19 +70,15 @@ // Example contents is a URL, and includes a substring matching the example // query. - const ACMatchClassification kExampleContentsClass[] = { - {/*offset=*/0, /*style=*/ACMatchClassification::URL}, - {/*offset=*/16, + {/*offset=*/0, /*style=*/ACMatchClassification::URL | ACMatchClassification::MATCH}, - {/*offset=*/21, /*style=*/ACMatchClassification::URL}, + {/*offset=*/5, /*style=*/ACMatchClassification::URL}, }; const ash::SearchResultTag kExpectedExampleContentsTags[] = { - {/*styles=*/ash::SearchResultTag::URL, /*start=*/0, /*end=*/16}, - {/*styles=*/ash::SearchResultTag::URL | ash::SearchResultTag::MATCH, - /*start=*/16, /*end=*/21}, - {/*styles=*/ash::SearchResultTag::URL, /*start=*/21, /*end=*/28}, + {/*styles=*/ash::SearchResultTag::MATCH, /*start=*/0, /*end=*/5}, + {/*styles=*/ash::SearchResultTag::URL, /*start=*/0, /*end=*/25}, }; // Example description is not a URL but does include a matching substring. @@ -184,6 +181,11 @@ favicon_cache_ = std::make_unique<FaviconCache>( /*favicon_service=*/&favicon_service_, /*history_service=*/nullptr); + + // Ensure the bookmark model is loaded. + bookmark_model_ = + BookmarkModelFactory::GetForBrowserContext(profile_.get()); + bookmarks::test::WaitForBookmarkModelToLoad(bookmark_model_); } std::unique_ptr<OmniboxResult> CreateOmniboxResult( @@ -212,8 +214,12 @@ match.image_url = image_url; return std::make_unique<OmniboxResult>( - profile_.get(), app_list_controller_delegate_.get(), nullptr, - favicon_cache_.get(), input_, match, false); + profile_.get(), app_list_controller_delegate_.get(), + /*remove_closure=*/base::RepeatingClosure(), + crosapi::CreateResult(match, /*controller=*/nullptr, + favicon_cache_.get(), bookmark_model_, input_), + /*query=*/kFullQuery, + /*is_zero_suggestion=*/false); } const GURL& GetLastOpenedUrl() const { @@ -241,6 +247,8 @@ std::unique_ptr<TestingProfile> profile_; testing::NiceMock<favicon::MockFaviconService> favicon_service_; + + bookmarks::BookmarkModel* bookmark_model_; }; TEST_F(OmniboxResultTest, Basic) { @@ -277,11 +285,8 @@ // answers. TEST_F(OmniboxResultTest, Metrics) { // Add a URL to our bookmarks. - bookmarks::BookmarkModel* bookmark_model = - BookmarkModelFactory::GetForBrowserContext(profile_.get()); - bookmarks::test::WaitForBookmarkModelToLoad(bookmark_model); - bookmark_model->AddURL(bookmark_model->bookmark_bar_node(), 0, u"Title", - GURL("https://example.com")); + bookmark_model_->AddURL(bookmark_model_->bookmark_bar_node(), 0, u"Title", + GURL("https://example.com")); // Bookmarked URLs belong to their own metrics category and have a specific // icon. @@ -349,9 +354,14 @@ const auto result = CreateOmniboxResult("https://example.com", AutocompleteMatchType::HISTORY_URL); + // The mock fetch result. favicon_base::FaviconImageResult mock_icon_result; mock_icon_result.image = gfx::Image(TestIcon()); + + // Transmit fetched image back to the Omnibox result. std::move(return_icon_callback).Run(mock_icon_result); + base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(ImageSkiasEqual(TestIcon(), result->icon().icon)); }
diff --git a/chrome/browser/ui/app_list/search/search_tags_util.cc b/chrome/browser/ui/app_list/search/search_tags_util.cc index 8a273b4..052e6ce4f 100644 --- a/chrome/browser/ui/app_list/search/search_tags_util.cc +++ b/chrome/browser/ui/app_list/search/search_tags_util.cc
@@ -5,11 +5,14 @@ #include "chrome/browser/ui/app_list/search/search_tags_util.h" #include "ash/public/cpp/app_list/app_list_types.h" +#include "chromeos/crosapi/mojom/launcher_search.mojom.h" #include "components/omnibox/browser/autocomplete_match_classification.h" namespace app_list { namespace { +using CrosApiSearchResult = crosapi::mojom::SearchResult; + int ACMatchStyleToTagStyle(int styles) { int tag_styles = 0; if (styles & ACMatchClassification::URL) @@ -78,4 +81,27 @@ ACMatchClassificationsToTags(text, classes, tags); } +ash::SearchResultTags TagsForText(const std::u16string& text, + CrosApiSearchResult::TextType type) { + ash::SearchResultTags tags; + const auto length = text.length(); + switch (type) { + case CrosApiSearchResult::TextType::kPositive: + tags.push_back( + ash::SearchResultTag(ash::SearchResultTag::GREEN, 0, length)); + break; + case CrosApiSearchResult::TextType::kNegative: + tags.push_back( + ash::SearchResultTag(ash::SearchResultTag::RED, 0, length)); + break; + case CrosApiSearchResult::TextType::kUrl: + tags.push_back( + ash::SearchResultTag(ash::SearchResultTag::URL, 0, length)); + break; + default: + break; + } + return tags; +} + } // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/search_tags_util.h b/chrome/browser/ui/app_list/search/search_tags_util.h index 341d7d7..77582739 100644 --- a/chrome/browser/ui/app_list/search/search_tags_util.h +++ b/chrome/browser/ui/app_list/search/search_tags_util.h
@@ -5,7 +5,9 @@ #ifndef CHROME_BROWSER_UI_APP_LIST_SEARCH_SEARCH_TAGS_UTIL_H_ #define CHROME_BROWSER_UI_APP_LIST_SEARCH_SEARCH_TAGS_UTIL_H_ +#include "ash/public/cpp/app_list/app_list_types.h" #include "chrome/browser/ui/app_list/search/chrome_search_result.h" +#include "chromeos/crosapi/mojom/launcher_search.mojom.h" #include "components/omnibox/browser/autocomplete_match.h" namespace app_list { @@ -27,6 +29,10 @@ const std::u16string& text, ChromeSearchResult::Tags* tags); +// Returns the tag vector for the given text type. +ash::SearchResultTags TagsForText(const std::u16string& text, + crosapi::mojom::SearchResult::TextType type); + } // namespace app_list #endif // CHROME_BROWSER_UI_APP_LIST_SEARCH_SEARCH_TAGS_UTIL_H_
diff --git a/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc b/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc index 8e31b5f..e7fbe61 100644 --- a/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc +++ b/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc
@@ -98,6 +98,10 @@ const std::vector<Suggestion>& suggestions, bool autoselect_first_suggestion, PopupType popup_type) { + // TODO(crbug.com/1341374, crbug.com/1277218): Why can `this` be deleted + // synchronously? + WeakPtr<AutofillPopupControllerImpl> weak_this = GetWeakPtr(); + if (IsMouseLocked()) { Hide(PopupHidingReason::kMouseLocked); return; @@ -126,6 +130,11 @@ !suggestions.empty()); #endif view_->Show(); + // TODO(crbug.com/1055981): `this| can be destroyed synchronously at this + // point. + if (!weak_this) + return; + // We only fire the event when a new popup shows. We do not fire the // event when suggestions changed. FireControlsChangedEvent(true); @@ -141,6 +150,11 @@ OnSuggestionsChanged(); } + // TODO(crbug.com/1200766, crbug.com/1276850, crbug.com/1277218): `this` can + // be destroyed synchronously at this point. + if (!weak_this) + return; + absl::visit( [&](auto* driver) { driver->SetKeyPressHandler(base::BindRepeating( @@ -150,7 +164,7 @@ const content::NativeWebKeyboardEvent& event) { return weak_this && weak_this->HandleKeyPressEvent(event); }, - GetWeakPtr())); + weak_this)); }, GetDriver());
diff --git a/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc b/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc index 04993db7..702208b 100644 --- a/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc +++ b/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc
@@ -700,8 +700,6 @@ void ManagePasswordsUIController:: AuthenticateUserForAccountStoreOptInAfterSavingLocallyAndMovePassword() { - DCHECK(base::FeatureList::IsEnabled( - password_manager::features::kPasswordsAccountStorageRevisedOptInFlow)); DCHECK(GetState() == password_manager::ui::MANAGE_STATE) << GetState(); // Note: While saving the password locally earlier, the FormManager has been // updated with any edits the user made in the Save bubble. So at this point, @@ -936,9 +934,6 @@ void ManagePasswordsUIController::MoveJustSavedPasswordAfterAccountStoreOptIn( password_manager::PasswordForm form, password_manager::PasswordManagerClient::ReauthSucceeded reauth_succeeded) { - DCHECK(base::FeatureList::IsEnabled( - password_manager::features::kPasswordsAccountStorageRevisedOptInFlow)); - // Successful opt-in means that the just-saved password should be moved to the // account. if (reauth_succeeded) {
diff --git a/chrome/browser/ui/popup_browsertest.cc b/chrome/browser/ui/popup_browsertest.cc index 46ae199..444ec3d 100644 --- a/chrome/browser/ui/popup_browsertest.cc +++ b/chrome/browser/ui/popup_browsertest.cc
@@ -32,6 +32,10 @@ #include "ui/display/test/display_manager_test_api.h" // nogncheck #endif // BUILDFLAG(IS_CHROMEOS_ASH) +#if BUILDFLAG(IS_MAC) +#include "ui/display/mac/test/virtual_display_mac_util.h" +#endif // BUILDFLAG(IS_MAC) + namespace { // Tests of window placement for popup browser windows. Test fixtures are run @@ -240,19 +244,26 @@ } } -// TODO(crbug.com/1183791): Disabled on non-ChromeOS because of races with -// SetScreenInstance and observers not being notified. -#if !BUILDFLAG(IS_CHROMEOS_ASH) +// TODO(crbug.com/1183791): Disabled everywhere except ChromeOS and Mac because +// of races with SetScreenInstance and observers not being notified. +#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_MAC) +#define MAYBE_AboutBlankCrossScreenPlacement AboutBlankCrossScreenPlacement +#else #define MAYBE_AboutBlankCrossScreenPlacement \ DISABLED_AboutBlankCrossScreenPlacement -#else -#define MAYBE_AboutBlankCrossScreenPlacement AboutBlankCrossScreenPlacement #endif // Tests that an about:blank popup can be moved across screens with permission. IN_PROC_BROWSER_TEST_P(PopupBrowserTest, MAYBE_AboutBlankCrossScreenPlacement) { #if BUILDFLAG(IS_CHROMEOS_ASH) display::test::DisplayManagerTestApi(ash::Shell::Get()->display_manager()) .UpdateDisplay("100+100-801x802,901+100-802x802"); +#elif BUILDFLAG(IS_MAC) + if (!display::test::VirtualDisplayMacUtil::IsAPIAvailable()) { + GTEST_SKIP() << "Skipping test for MacOS 11.0 and older or Arm Macs."; + } + display::test::VirtualDisplayMacUtil virtual_display_mac_util; + virtual_display_mac_util.AddDisplay( + 1, display::test::VirtualDisplayMacUtil::k1920x1080); #else display::ScreenBase test_screen; test_screen.display_list().AddDisplay({1, gfx::Rect(100, 100, 801, 802)}, @@ -301,8 +312,12 @@ auto original_popup_display = GetDisplayNearestBrowser(popup); EXPECT_EQ(opener_display, original_popup_display); + const auto second_display = screen->GetAllDisplays()[1]; + const std::string move_popup_to_the_second_screen_script = base::StringPrintf( + "w.moveTo(%d, %d);", second_display.work_area().x() + 100, + second_display.work_area().y() + 100); // Have the opener try to move the popup to the second screen. - content::ExecuteScriptAsync(opener, "w.moveTo(999, 199);"); + content::ExecuteScriptAsync(opener, move_popup_to_the_second_screen_script); // Wait for the substantial move, widgets may move during initialization. auto* widget = views::Widget::GetWidgetForNativeWindow( @@ -311,6 +326,7 @@ auto new_popup_display = GetDisplayNearestBrowser(popup); // The popup only moves to the second screen with Window Placement permission. EXPECT_EQ(GetParam(), original_popup_display != new_popup_display); + EXPECT_EQ(GetParam(), second_display == new_popup_display); // The popup is always constrained to the bounds of the target display. auto popup_bounds = popup->window()->GetBounds(); EXPECT_TRUE(new_popup_display.work_area().Contains(popup_bounds))
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc b/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc index ec952bc..d253053 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc
@@ -84,6 +84,7 @@ #include "components/signin/public/identity_manager/identity_test_utils.h" #include "components/signin/public/identity_manager/primary_account_mutator.h" #include "components/startup_metric_utils/browser/startup_metric_utils.h" +#include "components/sync/base/pref_names.h" #include "components/sync/base/sync_prefs.h" #include "components/sync/driver/sync_service.h" #include "components/sync/driver/sync_user_settings.h" @@ -1391,8 +1392,8 @@ Profile* profile_being_created = StartDiceSignIn(); // Set the device as managed in prefs. - syncer::SyncPrefs prefs(profile_being_created->GetPrefs()); - prefs.SetManagedForTest(true); + profile_being_created->GetPrefs()->SetBoolean(syncer::prefs::kSyncManaged, + true); syncer::SyncService* sync_service = SyncServiceFactory::GetForProfile(profile_being_created);
diff --git a/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc index 9e06e358..9de36433 100644 --- a/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
@@ -26,6 +26,7 @@ #include "chrome/browser/ash/login/wizard_controller.h" #include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h" #include "chrome/browser/ash/policy/core/policy_oauth2_token_fetcher.h" +#include "chrome/browser/ash/policy/enrollment/enrollment_config.h" #include "chrome/browser/ash/policy/enrollment/enrollment_requisition_manager.h" #include "chrome/browser/ash/policy/enrollment/enrollment_status.h" #include "chrome/browser/browser_process.h" @@ -96,6 +97,8 @@ case policy::EnrollmentConfig::MODE_INITIAL_SERVER_FORCED: case policy::EnrollmentConfig::MODE_ATTESTATION_INITIAL_SERVER_FORCED: case policy::EnrollmentConfig::MODE_ATTESTATION_INITIAL_MANUAL_FALLBACK: + case policy::EnrollmentConfig::MODE_ATTESTATION_ROLLBACK_FORCED: + case policy::EnrollmentConfig::MODE_ATTESTATION_ROLLBACK_MANUAL_FALLBACK: return kEnrollmentModeUIForced; case policy::EnrollmentConfig::MODE_RECOVERY: return kEnrollmentModeUIRecovery;
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_password_changed_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/gaia_password_changed_screen_handler.cc index b741462d7..a8500ca5 100644 --- a/chrome/browser/ui/webui/chromeos/login/gaia_password_changed_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/gaia_password_changed_screen_handler.cc
@@ -16,18 +16,10 @@ namespace chromeos { -constexpr StaticOobeScreenId GaiaPasswordChangedView::kScreenId; - GaiaPasswordChangedScreenHandler::GaiaPasswordChangedScreenHandler() - : BaseScreenHandler(kScreenId) { - set_user_acted_method_path_deprecated( - "login.GaiaPasswordChangedScreen.userActed"); -} + : BaseScreenHandler(kScreenId) {} -GaiaPasswordChangedScreenHandler::~GaiaPasswordChangedScreenHandler() { - if (screen_) - screen_->OnViewDestroyed(this); -} +GaiaPasswordChangedScreenHandler::~GaiaPasswordChangedScreenHandler() = default; void GaiaPasswordChangedScreenHandler::DeclareLocalizedValues( ::login::LocalizedValuesBuilder* builder) { @@ -60,11 +52,6 @@ IDS_LOGIN_PASSWORD_CHANGED_CONTINUE_WITHOUT_LOCAL_DATA_BUTTON); } -void GaiaPasswordChangedScreenHandler::InitializeDeprecated() { - AddCallback("migrateUserData", - &GaiaPasswordChangedScreenHandler::HandleMigrateUserData); -} - void GaiaPasswordChangedScreenHandler::GetAdditionalParameters( base::Value::Dict* dict) { dict->Set("isCryptohomeRecoveryUIFlowEnabled", @@ -80,20 +67,4 @@ ShowInWebUI(std::move(data)); } -void GaiaPasswordChangedScreenHandler::Bind(GaiaPasswordChangedScreen* screen) { - screen_ = screen; - BaseScreenHandler::SetBaseScreenDeprecated(screen_); -} - -void GaiaPasswordChangedScreenHandler::Unbind() { - screen_ = nullptr; - BaseScreenHandler::SetBaseScreenDeprecated(nullptr); -} - -void GaiaPasswordChangedScreenHandler::HandleMigrateUserData( - const std::string& old_password) { - if (screen_) - screen_->MigrateUserData(old_password); -} - } // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_password_changed_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/gaia_password_changed_screen_handler.h index 35bc39d..2fcd76d 100644 --- a/chrome/browser/ui/webui/chromeos/login/gaia_password_changed_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/gaia_password_changed_screen_handler.h
@@ -7,30 +7,23 @@ #include <string> +#include "base/memory/weak_ptr.h" #include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h" -namespace ash { -class GaiaPasswordChangedScreen; -} - namespace chromeos { // Interface for dependency injection between GaiaPasswordChangedScreen and its // WebUI representation. -class GaiaPasswordChangedView { +class GaiaPasswordChangedView + : public base::SupportsWeakPtr<GaiaPasswordChangedView> { public: - constexpr static StaticOobeScreenId kScreenId{"gaia-password-changed"}; + inline constexpr static StaticOobeScreenId kScreenId{ + "gaia-password-changed", "GaiaPasswordChangedScreen"}; - virtual ~GaiaPasswordChangedView() {} + virtual ~GaiaPasswordChangedView() = default; // Shows the contents of the screen. virtual void Show(const std::string& email, bool has_error) = 0; - - // Binds `screen` to the view. - virtual void Bind(ash::GaiaPasswordChangedScreen* screen) = 0; - - // Unbinds the screen from the view. - virtual void Unbind() = 0; }; class GaiaPasswordChangedScreenHandler : public GaiaPasswordChangedView, @@ -47,18 +40,11 @@ private: void Show(const std::string& email, bool has_error) override; - void Bind(ash::GaiaPasswordChangedScreen* screen) override; - void Unbind() override; - - void HandleMigrateUserData(const std::string& old_password); // BaseScreenHandler: void DeclareLocalizedValues( ::login::LocalizedValuesBuilder* builder) override; - void InitializeDeprecated() override; void GetAdditionalParameters(base::Value::Dict* dict) override; - - ash::GaiaPasswordChangedScreen* screen_ = nullptr; }; } // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc index 15b13c8a..67334218 100644 --- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc +++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
@@ -102,7 +102,6 @@ #include "chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/wrong_hwid_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/user_image_source.h" -#include "chrome/browser/ui/webui/chromeos/video_source.h" #include "chrome/browser/ui/webui/metrics_handler.h" #include "chrome/browser/ui/webui/test_files_request_filter.h" #include "chrome/browser/ui/webui/theme_source.h" @@ -563,10 +562,6 @@ content::WebContents* contents = web_ui()->GetWebContents(); extensions::TabHelper::CreateForWebContents(contents); - // // Handler for the oobe video assets which will be shown if available. - content::URLDataSource::Add(profile, - std::make_unique<chromeos::VideoSource>()); - if (policy::EnrollmentRequisitionManager::IsRemoraRequisition()) oobe_display_chooser_ = std::make_unique<OobeDisplayChooser>(); }
diff --git a/chrome/browser/ui/webui/chromeos/video_source.cc b/chrome/browser/ui/webui/chromeos/video_source.cc deleted file mode 100644 index f9cf6f1..0000000 --- a/chrome/browser/ui/webui/chromeos/video_source.cc +++ /dev/null
@@ -1,114 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ui/webui/chromeos/video_source.h" - -#include <vector> - -#include "base/bind.h" -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/location.h" -#include "base/memory/ref_counted_memory.h" -#include "base/task/sequenced_task_runner.h" -#include "base/task/single_thread_task_runner.h" -#include "base/task/task_runner_util.h" -#include "base/task/thread_pool.h" -#include "base/task/thread_pool/thread_pool_instance.h" -#include "base/threading/thread_task_runner_handle.h" -#include "chrome/common/url_constants.h" -#include "net/base/mime_util.h" - -namespace chromeos { -namespace { - -const char kAllowlistedDirectory[] = "oobe_videos"; - -bool IsAllowlisted(const std::string& path) { - base::FilePath file_path(path); - if (file_path.ReferencesParent()) - return false; - - // Check if the path starts with a allowlisted directory. - std::vector<std::string> components = file_path.GetComponents(); - if (components.empty()) - return false; - return components[0] == kAllowlistedDirectory; -} - -// Callback for user_manager::UserImageLoader. -void VideoLoaded(content::URLDataSource::GotDataCallback got_data_callback, - std::unique_ptr<std::string> video_data, - bool did_load_file) { - if (video_data->size() && did_load_file) { - std::move(got_data_callback) - .Run(new base::RefCountedBytes( - reinterpret_cast<const unsigned char*>(video_data->data()), - video_data->size())); - } else { - std::move(got_data_callback).Run(nullptr); - } -} - -} // namespace - -VideoSource::VideoSource() { - task_runner_ = base::ThreadPool::CreateSequencedTaskRunner( - {base::MayBlock(), base::TaskPriority::USER_VISIBLE, - base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}); -} - -VideoSource::~VideoSource() {} - -std::string VideoSource::GetSource() { - return chrome::kChromeOSAssetHost; -} - -void VideoSource::StartDataRequest( - const GURL& url, - const content::WebContents::Getter& wc_getter, - content::URLDataSource::GotDataCallback got_data_callback) { - const std::string path = content::URLDataSource::URLToRequestPath(url); - if (!IsAllowlisted(path)) { - std::move(got_data_callback).Run(nullptr); - return; - } - - const base::FilePath asset_dir(chrome::kChromeOSAssetPath); - const base::FilePath video_path = asset_dir.AppendASCII(path); - base::ThreadPool::PostTaskAndReplyWithResult( - FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_VISIBLE}, - base::BindOnce(&base::PathExists, video_path), - base::BindOnce(&VideoSource::StartDataRequestAfterPathExists, - weak_factory_.GetWeakPtr(), video_path, - std::move(got_data_callback))); -} - -std::string VideoSource::GetMimeType(const GURL& url) { - std::string mime_type; - std::string ext = base::FilePath(url.path_piece()).Extension(); - if (!ext.empty()) - net::GetWellKnownMimeTypeFromExtension(ext.substr(1), &mime_type); - return mime_type; -} - -void VideoSource::StartDataRequestAfterPathExists( - const base::FilePath& video_path, - content::URLDataSource::GotDataCallback got_data_callback, - bool path_exists) { - if (path_exists) { - auto video_data = std::make_unique<std::string>(); - std::string* data = video_data.get(); - base::PostTaskAndReplyWithResult( - task_runner_.get(), FROM_HERE, - base::BindOnce(&base::ReadFileToString, video_path, data), - base::BindOnce(&VideoLoaded, std::move(got_data_callback), - std::move(video_data))); - - } else { - std::move(got_data_callback).Run(nullptr); - } -} - -} // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/video_source.h b/chrome/browser/ui/webui/chromeos/video_source.h deleted file mode 100644 index a435d9af..0000000 --- a/chrome/browser/ui/webui/chromeos/video_source.h +++ /dev/null
@@ -1,56 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_VIDEO_SOURCE_H_ -#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_VIDEO_SOURCE_H_ - -#include <string> - -#include "base/memory/scoped_refptr.h" -#include "base/memory/weak_ptr.h" -#include "content/public/browser/url_data_source.h" - -namespace base { -class FilePath; -class SequencedTaskRunner; -} // namespace base - -namespace chromeos { - -// Data source that reads videos from the file system. -// It provides resources from chrome urls of type: -// chrome://chromeos-asset/<allowlisted directories>/*.webm -class VideoSource : public content::URLDataSource { - public: - VideoSource(); - - VideoSource(const VideoSource&) = delete; - VideoSource& operator=(const VideoSource&) = delete; - - ~VideoSource() override; - - // content::URLDataSource: - std::string GetSource() override; - void StartDataRequest( - const GURL& url, - const content::WebContents::Getter& wc_getter, - content::URLDataSource::GotDataCallback got_data_callback) override; - std::string GetMimeType(const GURL& url) override; - - private: - // Continuation from StartDataRequest(). - void StartDataRequestAfterPathExists( - const base::FilePath& video_path, - content::URLDataSource::GotDataCallback got_data_callback, - bool path_exists); - - // The background task runner on which file I/O is performed. - scoped_refptr<base::SequencedTaskRunner> task_runner_; - - base::WeakPtrFactory<VideoSource> weak_factory_{this}; -}; - -} // namespace chromeos - -#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_VIDEO_SOURCE_H_
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 9018520..053f2c6 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1658728299-c12074c8ca8b3de2b58cb355a4186f99089fe7c5.profdata +chrome-linux-main-1658750173-2eec8f1ea985f8fad2e743e6a9c059e46fa7b84f.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index 69e7acb2..c040dfe 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1658663298-8c86d216d6c5a1e12840a374fb55733a17a8ad8e.profdata +chrome-mac-arm-main-1658728299-3c679a23e6a44f87d2db5a02b688ceafd22ccfc1.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 1a15eaf..5e66e66 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1658675334-9214dfa116a4bcec6368091a26ff52f871c0b677.profdata +chrome-mac-main-1658728299-716902db72425b5beeb45d1c0f60cc50332def39.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 1baec4cb..6a23609 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1658649199-e0f26eb3b04da9b22dfca83d248deea1f1f31781.profdata +chrome-win32-main-1658739531-f90dd72e05f9bbbe508c0821fa793b29c57ed8cf.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 18781bb..fb31e4ec 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1658649199-fc09c33aa627ccdef16f13d9bb82136861374d95.profdata +chrome-win64-main-1658750173-15ad2fd38d13b30fa368a653c0d4a3d23f97b8af.profdata
diff --git a/chrome/common/extensions/api/passwords_private.idl b/chrome/common/extensions/api/passwords_private.idl index 3c2cf015..1896583 100644 --- a/chrome/common/extensions/api/passwords_private.idl +++ b/chrome/common/extensions/api/passwords_private.idl
@@ -117,10 +117,11 @@ }; dictionary UrlCollection { - // The fully specified URL of the credential's origin. - DOMString origin; + // The signon realm of the credential. + DOMString signonRealm; - // A human readable version of the URL of the credential's origin. + // A human readable version of the URL of the credential's origin. For + // android credentials this is usually App name. DOMString shown; // The URL that will be linked to when an entry is clicked. @@ -135,6 +136,10 @@ // The username used in conjunction with the saved password. DOMString username; + // The password of the credential. Empty by default, only set if explicitly + // requested. Populated exclusively by JS. + DOMString? password; + // Text shown if the password was obtained via a federated identity. DOMString? federationText; @@ -148,7 +153,7 @@ boolean isAndroidCredential; // The value of the attached note. - DOMString passwordNote; + DOMString note; }; dictionary ExceptionEntry { @@ -190,21 +195,13 @@ // Information about an insecure credential and relevant information required // for the display in the UI. dictionary InsecureCredential { + // The URL collection corresponding to this insecure credential. + UrlCollection urls; + // An id serving as a mapping to a given insecure credential. This // identifier will remain stable for a single browser session. long id; - // The formatted origin of the insecure credential. Can be the origin of a - // website (excluding scheme) or the name of an app. - DOMString formattedOrigin; - - // The detailed origin of the insecure credential. As opposed to - // formattedOrigin this also includes the scheme and trivial subdomains like - // www. - // For an app this is either the app name or the name of the package, if the - // former could not be retrieved. - DOMString detailedOrigin; - // Indicates whether this credential belongs to an Android app. boolean isAndroidCredential; @@ -216,9 +213,6 @@ // automatically. boolean hasStartableScript; - // The signon realm of the credential. - DOMString signonRealm; - // The username of the credential. DOMString username;
diff --git a/chrome/test/data/extensions/api_test/passwords_private/test.js b/chrome/test/data/extensions/api_test/passwords_private/test.js index 6606570..0d7e672 100644 --- a/chrome/test/data/extensions/api_test/passwords_private/test.js +++ b/chrome/test/data/extensions/api_test/passwords_private/test.js
@@ -206,7 +206,7 @@ for (var i = 0; i < list.length; ++i) { var entry = list[i]; chrome.test.assertTrue(!!entry); - chrome.test.assertTrue(!!entry.urls.origin); + chrome.test.assertTrue(!!entry.urls.signonRealm); chrome.test.assertTrue(!!entry.urls.shown); chrome.test.assertTrue(!!entry.urls.link); idSet.add(entry.id); @@ -229,7 +229,7 @@ var idSet = new Set(); for (var i = 0; i < list.length; ++i) { var exception = list[i]; - chrome.test.assertTrue(!!exception.urls.origin); + chrome.test.assertTrue(!!exception.urls.signonRealm); chrome.test.assertTrue(!!exception.urls.shown); chrome.test.assertTrue(!!exception.urls.link); idSet.add(exception.id); @@ -325,10 +325,9 @@ chrome.test.assertEq(1, compromisedCredentials.length); var compromisedCredential = compromisedCredentials[0]; + chrome.test.assertEq('example.com', compromisedCredential.urls.shown); chrome.test.assertEq( - 'example.com', compromisedCredential.formattedOrigin); - chrome.test.assertEq( - 'https://example.com', compromisedCredential.detailedOrigin); + 'https://example.com', compromisedCredential.urls.link); chrome.test.assertFalse(compromisedCredential.isAndroidCredential); chrome.test.assertEq( 'https://example.com/change-password', @@ -352,8 +351,8 @@ chrome.test.assertEq(1, weakCredentials.length); var weakredential = weakCredentials[0]; - chrome.test.assertEq('example.com', weakredential.formattedOrigin); - chrome.test.assertEq('https://example.com', weakredential.detailedOrigin); + chrome.test.assertEq('example.com', weakredential.urls.shown); + chrome.test.assertEq('https://example.com', weakredential.urls.link); chrome.test.assertFalse(weakredential.isAndroidCredential); chrome.test.assertEq( 'https://example.com/change-password', @@ -366,11 +365,13 @@ function getPlaintextInsecurePassword() { var compromisedCredential = { id: 0, - formattedOrigin: 'example.com', - detailedOrigin: 'https://example.com', + urls: { + shown: 'example.com', + link: 'https://example.com', + signonRealm: 'https://example.com', + }, isAndroidCredential: false, hasStartableScript: false, - signonRealm: 'https://example.com', username: 'alice', compromisedInfo: { compromiseTime: COMPROMISE_TIME, @@ -391,11 +392,13 @@ function getPlaintextInsecurePasswordFails() { var compromisedCredential = { id: 0, - formattedOrigin: 'example.com', - detailedOrigin: 'https://example.com', + urls: { + shown: 'example.com', + link: 'https://example.com', + signonRealm: 'https://example.com', + }, isAndroidCredential: false, hasStartableScript: false, - signonRealm: 'https://example.com', username: 'alice', compromisedInfo: { compromiseTime: COMPROMISE_TIME, @@ -419,11 +422,13 @@ chrome.passwordsPrivate.changeInsecureCredential( { id: 0, - formattedOrigin: 'example.com', - detailedOrigin: 'https://example.com', + urls: { + shown: 'example.com', + link: 'https://example.com', + signonRealm: 'https://example.com', + }, isAndroidCredential: false, hasStartableScript: false, - signonRealm: 'https://example.com', username: 'alice', compromisedInfo: { compromiseTime: COMPROMISE_TIME, @@ -444,11 +449,13 @@ chrome.passwordsPrivate.changeInsecureCredential( { id: 0, - formattedOrigin: 'example.com', - detailedOrigin: 'https://example.com', isAndroidCredential: false, hasStartableScript: false, - signonRealm: 'https://example.com', + urls: { + shown: 'example.com', + link: 'https://example.com', + signonRealm: 'https://example.com', + }, username: 'alice', compromisedInfo: { compromiseTime: COMPROMISE_TIME, @@ -469,11 +476,13 @@ chrome.passwordsPrivate.changeInsecureCredential( { id: 0, - formattedOrigin: 'example.com', - detailedOrigin: 'https://example.com', + urls: { + shown: 'example.com', + link: 'https://example.com', + signonRealm: 'https://example.com', + }, isAndroidCredential: false, hasStartableScript: false, - signonRealm: 'https://example.com', username: 'alice', compromisedInfo: { compromiseTime: COMPROMISE_TIME, @@ -492,11 +501,13 @@ chrome.passwordsPrivate.removeInsecureCredential( { id: 0, - formattedOrigin: 'example.com', - detailedOrigin: 'https://example.com', + urls: { + shown: 'example.com', + link: 'https://example.com', + signonRealm: 'https://example.com', + }, isAndroidCredential: false, hasStartableScript: false, - signonRealm: 'https://example.com', username: 'alice', compromisedInfo: { compromiseTime: COMPROMISE_TIME, @@ -518,11 +529,13 @@ chrome.passwordsPrivate.removeInsecureCredential( { id: 0, - formattedOrigin: 'example.com', - detailedOrigin: 'https://example.com', + urls: { + shown: 'example.com', + link: 'https://example.com', + signonRealm: 'https://example.com', + }, isAndroidCredential: false, hasStartableScript: false, - signonRealm: 'https://example.com', username: 'alice', compromisedInfo: { compromiseTime: COMPROMISE_TIME, @@ -542,11 +555,13 @@ chrome.passwordsPrivate.muteInsecureCredential( { id: 0, - formattedOrigin: 'example.com', - detailedOrigin: 'https://example.com', + urls: { + shown: 'example.com', + link: 'https://example.com', + signonRealm: 'https://example.com', + }, isAndroidCredential: false, hasStartableScript: false, - signonRealm: 'https://example.com', username: 'alice', compromisedInfo: { compromiseTime: COMPROMISE_TIME, @@ -566,11 +581,13 @@ chrome.passwordsPrivate.muteInsecureCredential( { id: 0, - formattedOrigin: 'example.com', - detailedOrigin: 'https://example.com', + urls: { + shown: 'example.com', + link: 'https://example.com', + signonRealm: 'https://example.com', + }, isAndroidCredential: false, hasStartableScript: false, - signonRealm: 'https://example.com', username: 'alice', compromisedInfo: { compromiseTime: COMPROMISE_TIME, @@ -592,11 +609,13 @@ chrome.passwordsPrivate.unmuteInsecureCredential( { id: 0, - formattedOrigin: 'example.com', - detailedOrigin: 'https://example.com', + urls: { + shown: 'example.com', + link: 'https://example.com', + signonRealm: 'https://example.com', + }, isAndroidCredential: false, hasStartableScript: false, - signonRealm: 'https://example.com', username: 'alice', compromisedInfo: { compromiseTime: COMPROMISE_TIME, @@ -616,11 +635,13 @@ chrome.passwordsPrivate.unmuteInsecureCredential( { id: 0, - formattedOrigin: 'example.com', - detailedOrigin: 'https://example.com', + urls: { + shown: 'example.com', + link: 'https://example.com', + signonRealm: 'https://example.com', + }, isAndroidCredential: false, hasStartableScript: false, - signonRealm: 'https://example.com', username: 'alice', compromisedInfo: { compromiseTime: COMPROMISE_TIME, @@ -642,11 +663,13 @@ chrome.passwordsPrivate.recordChangePasswordFlowStarted( { id: 0, - formattedOrigin: 'example.com', - detailedOrigin: 'https://example.com', + urls: { + shown: 'example.com', + link: 'https://example.com', + signonRealm: 'https://example.com', + }, isAndroidCredential: false, hasStartableScript: false, - signonRealm: 'https://example.com', username: 'alice', changePasswordUrl: 'https://example.com/.well-known/change-password', compromisedInfo: { @@ -666,11 +689,13 @@ chrome.passwordsPrivate.recordChangePasswordFlowStarted( { id: 0, - formattedOrigin: 'example.com', - detailedOrigin: 'https://example.com', + urls: { + shown: 'example.com', + link: 'https://example.com', + signonRealm: 'https://example.com', + }, isAndroidCredential: false, hasStartableScript: false, - signonRealm: 'https://example.com', username: 'alice', changePasswordUrl: 'https://example.com/.well-known/change-password', compromisedInfo: { @@ -690,11 +715,13 @@ chrome.passwordsPrivate.recordChangePasswordFlowStarted( { id: 0, - formattedOrigin: 'App (com.example.app)', - detailedOrigin: 'com.example.app', + urls: { + shown: 'example.com', + link: 'https://example.com', + signonRealm: '', + }, isAndroidCredential: true, hasStartableScript: false, - signonRealm: '', username: 'alice', compromisedInfo: { compromiseTime: COMPROMISE_TIME, @@ -749,51 +776,55 @@ function startAutomatedPasswordChange() { chrome.passwordsPrivate.startAutomatedPasswordChange( - { - id: 0, - formattedOrigin: 'example.com', - detailedOrigin: 'https://example.com', - isAndroidCredential: false, - hasStartableScript: true, - signonRealm: 'https://example.com', - username: 'alice', - changePasswordUrl: 'https://example.com/.well-known/change-password', - compromisedInfo: { - compromiseTime: COMPROMISE_TIME, - elapsedTimeSinceCompromise: '3 days ago', - compromiseType: 'LEAKED', - isMuted: false, + { + id: 0, + urls: { + shown: 'example.com', + link: 'https://example.com', + signonRealm: 'https://example.com', + }, + isAndroidCredential: false, + hasStartableScript: true, + username: 'alice', + changePasswordUrl: 'https://example.com/.well-known/change-password', + compromisedInfo: { + compromiseTime: COMPROMISE_TIME, + elapsedTimeSinceCompromise: '3 days ago', + compromiseType: 'LEAKED', + isMuted: false, + }, }, - }, - (status) => { - chrome.test.assertNoLastError(); - chrome.test.assertEq(true, status); - chrome.test.succeed(); - }); + (status) => { + chrome.test.assertNoLastError(); + chrome.test.assertEq(true, status); + chrome.test.succeed(); + }); }, function startAutomatedPasswordChangeWithEmptyUrl() { chrome.passwordsPrivate.startAutomatedPasswordChange( - { - id: 0, - formattedOrigin: 'example.com', - detailedOrigin: 'https://example.com', - isAndroidCredential: false, - hasStartableScript: true, - signonRealm: 'https://example.com', - username: 'alice', - compromisedInfo: { - compromiseTime: COMPROMISE_TIME, - elapsedTimeSinceCompromise: '3 days ago', - compromiseType: 'LEAKED', - isMuted: false, + { + id: 0, + urls: { + shown: 'example.com', + link: 'https://example.com', + signonRealm: 'https://example.com', + }, + isAndroidCredential: false, + hasStartableScript: true, + username: 'alice', + compromisedInfo: { + compromiseTime: COMPROMISE_TIME, + elapsedTimeSinceCompromise: '3 days ago', + compromiseType: 'LEAKED', + isMuted: false, + }, }, - }, - (status) => { - chrome.test.assertNoLastError(); - chrome.test.assertEq(false, status); - chrome.test.succeed(); - }); + (status) => { + chrome.test.assertNoLastError(); + chrome.test.assertEq(false, status); + chrome.test.succeed(); + }); }, function movePasswordsToAccount() {
diff --git a/chrome/test/data/webui/settings/BUILD.gn b/chrome/test/data/webui/settings/BUILD.gn index 3a0fb47..6ca4cbf 100644 --- a/chrome/test/data/webui/settings/BUILD.gn +++ b/chrome/test/data/webui/settings/BUILD.gn
@@ -70,7 +70,6 @@ "fake_settings_private.ts", "help_page_test.ts", "idle_load_tests.ts", - "multi_store_password_ui_entry_test.ts", "on_startup_page_tests.ts", "passwords_and_autofill_fake_data.ts", "passwords_device_section_test.ts",
diff --git a/chrome/test/data/webui/settings/autofill_page_test.ts b/chrome/test/data/webui/settings/autofill_page_test.ts index 4979e4c..a5f39d8 100644 --- a/chrome/test/data/webui/settings/autofill_page_test.ts +++ b/chrome/test/data/webui/settings/autofill_page_test.ts
@@ -7,14 +7,14 @@ import {DomIf, flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {AutofillManagerImpl, PasswordsSectionElement, PaymentsManagerImpl, SettingsAutofillSectionElement, SettingsPaymentsSectionElement} from 'chrome://settings/lazy_load.js'; import {buildRouter, Router, routes} from 'chrome://settings/settings.js'; -import {CrSettingsPrefs, MultiStorePasswordUiEntry, OpenWindowProxyImpl, PasswordManagerImpl, SettingsAutofillPageElement, SettingsPluralStringProxyImpl, SettingsPrefsElement} from 'chrome://settings/settings.js'; +import {CrSettingsPrefs, OpenWindowProxyImpl, PasswordManagerImpl, SettingsAutofillPageElement, SettingsPluralStringProxyImpl, SettingsPrefsElement} from 'chrome://settings/settings.js'; import {SettingsRoutes} from 'chrome://settings/settings_routes.js'; import {assertDeepEquals, assertEquals, assertNotEquals, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {TestPluralStringProxy} from 'chrome://webui-test/test_plural_string_proxy.js'; import {flushTasks} from 'chrome://webui-test/test_util.js'; import {FakeSettingsPrivate} from './fake_settings_private.js'; -import {AutofillManagerExpectations, createAddressEntry, createCreditCardEntry, createExceptionEntry, createMultiStorePasswordEntry, createPasswordEntry, PaymentsManagerExpectations, TestAutofillManager, TestPaymentsManager} from './passwords_and_autofill_fake_data.js'; +import {AutofillManagerExpectations, createAddressEntry, createCreditCardEntry, createExceptionEntry, createPasswordEntry, PaymentsManagerExpectations, TestAutofillManager, TestPaymentsManager} from './passwords_and_autofill_fake_data.js'; import {makeCompromisedCredential} from './passwords_and_autofill_fake_data.js'; import {TestOpenWindowProxy} from './test_open_window_proxy.js'; import {PasswordManagerExpectations,TestPasswordManagerProxy} from './test_password_manager_proxy.js'; @@ -201,7 +201,7 @@ flush(); assertDeepEquals( - list.map(entry => new MultiStorePasswordUiEntry(entry)), + list, element.shadowRoot! .querySelector<PasswordsSectionElement>( '#passwordSection')!.savedPasswords); @@ -375,8 +375,7 @@ const subpage = autofillSection.shadowRoot!.querySelector('settings-subpage'); - autofillSection.credential = - createMultiStorePasswordEntry({url: SHOWN_URL, deviceId: 1}); + autofillSection.credential = createPasswordEntry({url: SHOWN_URL, id: 1}); flush(); assertTrue(!!subpage);
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js index b149f72..8160e9b 100644 --- a/chrome/test/data/webui/settings/cr_settings_browsertest.js +++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -267,18 +267,6 @@ }); GEN('#undef MAYBE_All'); -var CrSettingsMultiStorePasswordUiEntryTest = - class extends CrSettingsBrowserTest { - /** @override */ - get browsePreload() { - return 'chrome://settings/test_loader.html?module=settings/multi_store_password_ui_entry_test.js'; - } -}; - -TEST_F('CrSettingsMultiStorePasswordUiEntryTest', 'All', function() { - mocha.run(); -}); - var CrSettingsPasswordsDeviceSectionTest = class extends CrSettingsBrowserTest { /** @override */ get browsePreload() {
diff --git a/chrome/test/data/webui/settings/multi_store_password_ui_entry_test.ts b/chrome/test/data/webui/settings/multi_store_password_ui_entry_test.ts deleted file mode 100644 index ad1f6d1..0000000 --- a/chrome/test/data/webui/settings/multi_store_password_ui_entry_test.ts +++ /dev/null
@@ -1,48 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import {MultiStorePasswordUiEntry} from 'chrome://settings/settings.js'; -import {assertEquals} from 'chrome://webui-test/chai_assert.js'; - -import {createPasswordEntry} from './passwords_and_autofill_fake_data.js'; - -suite('MultiStorePasswordUiEntry', function() { - test('verifyWhenInBothStores', function() { - const multiStoreEntry = createPasswordEntry({ - url: 'g.com', - username: 'user', - id: 0, - inAccountStore: true, - inProfileStore: true, - }); - - const multiStoreDeviceEntry = - new MultiStorePasswordUiEntry(multiStoreEntry); - assertEquals(multiStoreDeviceEntry.id, 0); - }); - - test('verifyInAccount', function() { - const accountEntry = createPasswordEntry({ - url: 'g.com', - username: 'user', - id: 0, - inAccountStore: true, - }); - - const multiStoreDeviceEntry = new MultiStorePasswordUiEntry(accountEntry); - assertEquals(multiStoreDeviceEntry.id, 0); - }); - - test('verifyInProfile', function() { - const deviceEntry = createPasswordEntry({ - url: 'g.com', - username: 'user', - id: 0, - inProfileStore: true, - }); - - const multiStoreDeviceEntry = new MultiStorePasswordUiEntry(deviceEntry); - assertEquals(multiStoreDeviceEntry.id, 0); - }); -});
diff --git a/chrome/test/data/webui/settings/password_check_test.ts b/chrome/test/data/webui/settings/password_check_test.ts index 0a3b3dd3..c24eebc 100644 --- a/chrome/test/data/webui/settings/password_check_test.ts +++ b/chrome/test/data/webui/settings/password_check_test.ts
@@ -196,7 +196,7 @@ insecureCredentials[index]!.username); assertEquals( node.$.insecureOrigin.textContent!.trim(), - insecureCredentials[index]!.formattedOrigin); + insecureCredentials[index]!.urls.shown); if (isCompromised && !isMuted) { assertEquals(
diff --git a/chrome/test/data/webui/settings/password_edit_dialog_test.ts b/chrome/test/data/webui/settings/password_edit_dialog_test.ts index d94feab..164f126 100644 --- a/chrome/test/data/webui/settings/password_edit_dialog_test.ts +++ b/chrome/test/data/webui/settings/password_edit_dialog_test.ts
@@ -10,11 +10,11 @@ import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {PasswordDialogMode, PasswordEditDialogElement, SettingsTextareaElement} from 'chrome://settings/lazy_load.js'; -import {PasswordManagerImpl, MultiStorePasswordUiEntry} from 'chrome://settings/settings.js'; +import {PasswordManagerImpl} from 'chrome://settings/settings.js'; import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {eventToPromise, flushTasks, isVisible} from 'chrome://webui-test/test_util.js'; -import {createPasswordEntry, createMultiStorePasswordEntry, PasswordSectionElementFactory} from './passwords_and_autofill_fake_data.js'; +import {createPasswordEntry, PasswordSectionElementFactory} from './passwords_and_autofill_fake_data.js'; import {TestPasswordManagerProxy} from './test_password_manager_proxy.js'; // clang-format on @@ -130,7 +130,7 @@ passwordManager.setGetUrlCollectionResponse( isValid ? { // Matches fake data pattern in createPasswordEntry. - origin: `http://${newValue}/login`, + signonRealm: `http://${newValue}/login`, shown: newValue, link: `http://${newValue}/login`, } : @@ -220,8 +220,8 @@ }); test('hasCorrectInitialStateWhenViewFederatedCredential', function() { - const federationEntry = createMultiStorePasswordEntry( - {federationText: 'with chromium.org', username: 'bart', deviceId: 42}); + const federationEntry = createPasswordEntry( + {federationText: 'with chromium.org', username: 'bart', id: 42}); const passwordDialog = elementFactory.createPasswordEditDialog(federationEntry); assertFederatedDialogParts(passwordDialog); @@ -240,8 +240,8 @@ test('hasCorrectInitialStateWhenEditAndroidCredential', function() { const androidEntry = createPasswordEntry( {url: 'app.com', username: 'bart', isAndroidCredential: true}); - const passwordDialog = elementFactory.createPasswordEditDialog( - new MultiStorePasswordUiEntry(androidEntry)); + const passwordDialog = + elementFactory.createPasswordEditDialog(androidEntry); assertEquals(androidEntry.urls.shown, passwordDialog.$.websiteInput.value); assertEquals( passwordDialog.i18n('editPasswordAppLabel'), @@ -249,8 +249,8 @@ }); test('hasCorrectInitialStateWhenEditPassword', function() { - const commonEntry = createMultiStorePasswordEntry( - {url: 'goo.gl', username: 'bart', accountId: 42}); + const commonEntry = + createPasswordEntry({url: 'goo.gl', username: 'bart', id: 42}); const passwordDialog = elementFactory.createPasswordEditDialog(commonEntry); assertEditDialogParts(passwordDialog); assertEquals(commonEntry.urls.link, passwordDialog.$.websiteInput.value); @@ -262,27 +262,36 @@ passwordDialog.$.footnote.innerText.trim()); }); - test('changesPasswordForAccountId', function() { - const accountEntry = createMultiStorePasswordEntry( - {url: 'goo.gl', username: 'bart', accountId: 42}); + test('changesPasswordForAccountStore', function() { + const accountEntry = createPasswordEntry({ + url: 'goo.gl', + username: 'bart', + id: 42, + inAccountStore: true, + }); const editDialog = elementFactory.createPasswordEditDialog(accountEntry); return changeSavedPasswordTestHelper( editDialog, accountEntry.id, passwordManager); }); - test('changesPasswordForDeviceId', function() { - const deviceEntry = createMultiStorePasswordEntry( - {url: 'goo.gl', username: 'bart', deviceId: 42}); + test('changesPasswordForProfileStore', function() { + const deviceEntry = + createPasswordEntry({url: 'goo.gl', username: 'bart', id: 42}); const editDialog = elementFactory.createPasswordEditDialog(deviceEntry); return changeSavedPasswordTestHelper( editDialog, deviceEntry.id, passwordManager); }); - test('changesPasswordForBothId', function() { - const multiEntry = createMultiStorePasswordEntry( - {url: 'goo.gl', username: 'bart', accountId: 41, deviceId: 41}); + test('changesPasswordForBothStores', function() { + const multiEntry = createPasswordEntry({ + url: 'goo.gl', + username: 'bart', + id: 41, + inProfileStore: true, + inAccountStore: true, + }); const editDialog = elementFactory.createPasswordEditDialog(multiEntry); return changeSavedPasswordTestHelper( @@ -291,10 +300,8 @@ test('changeUsernameFailsWhenReused', function() { const accountPasswords = [ - createMultiStorePasswordEntry( - {url: 'goo.gl', username: 'bart', accountId: 0}), - createMultiStorePasswordEntry( - {url: 'goo.gl', username: 'mark', accountId: 1}), + createPasswordEntry({url: 'goo.gl', username: 'bart', id: 0}), + createPasswordEntry({url: 'goo.gl', username: 'mark', id: 1}), ]; const editDialog = elementFactory.createPasswordEditDialog( accountPasswords[0]!, accountPasswords); @@ -313,10 +320,10 @@ test('changesUsernameWhenReusedForDifferentStore', async function() { const passwords = [ - createMultiStorePasswordEntry( - {url: 'goo.gl', username: 'bart', accountId: 0}), - createMultiStorePasswordEntry( - {url: 'goo.gl', username: 'mark', deviceId: 1}), + createPasswordEntry( + {url: 'goo.gl', username: 'bart', id: 0, inAccountStore: true}), + createPasswordEntry( + {url: 'goo.gl', username: 'mark', id: 1, inProfileStore: true}), ]; const editDialog = elementFactory.createPasswordEditDialog(passwords[0], passwords); @@ -331,8 +338,8 @@ // Test verifies that the edit dialog informs the password is stored in the // account. test('showsStorageDetailsForAccountPassword', function() { - const accountPassword = createMultiStorePasswordEntry( - {url: 'goo.gl', username: 'bart', accountId: 42}); + const accountPassword = createPasswordEntry( + {url: 'goo.gl', username: 'bart', id: 42, inAccountStore: true}); const accountPasswordDialog = elementFactory.createPasswordEditDialog(accountPassword); @@ -351,8 +358,8 @@ // Test verifies that the edit dialog informs the password is stored on the // device. test('showsStorageDetailsForDevicePassword', function() { - const devicePassword = createMultiStorePasswordEntry( - {url: 'goo.gl', username: 'bart', deviceId: 42}); + const devicePassword = + createPasswordEntry({url: 'goo.gl', username: 'bart', id: 42}); const devicePasswordDialog = elementFactory.createPasswordEditDialog(devicePassword); @@ -371,8 +378,13 @@ // Test verifies that the edit dialog informs the password is stored both on // the device and in the account. test('showsStorageDetailsForBothLocations', function() { - const accountAndDevicePassword = createMultiStorePasswordEntry( - {url: 'goo.gl', username: 'bart', deviceId: 42, accountId: 43}); + const accountAndDevicePassword = createPasswordEntry({ + url: 'goo.gl', + username: 'bart', + id: 42, + inAccountStore: true, + inProfileStore: true, + }); const accountAndDevicePasswordDialog = elementFactory.createPasswordEditDialog(accountAndDevicePassword); @@ -521,8 +533,8 @@ }); test('validatesUsernameWhenWebsiteOriginChanges', async function() { - const passwords = [createMultiStorePasswordEntry( - {url: 'website.com', username: 'username', accountId: 0})]; + const passwords = [createPasswordEntry( + {url: 'website.com', username: 'username', id: 0})]; const addDialog = elementFactory.createPasswordEditDialog(null, passwords); addDialog.$.usernameInput.value = 'username'; @@ -537,8 +549,8 @@ }); test('validatesUsernameWhenUsernameChanges', async function() { - const passwords = [createMultiStorePasswordEntry( - {url: 'website.com', username: 'username', accountId: 0})]; + const passwords = [createPasswordEntry( + {url: 'website.com', username: 'username', id: 0})]; const addDialog = elementFactory.createPasswordEditDialog(null, passwords); await updateWebsiteInput(addDialog, passwordManager, 'website.com'); @@ -553,10 +565,18 @@ test('addPasswordFailsWhenUsernameReusedForAnyStore', async function() { const passwords = [ - createMultiStorePasswordEntry( - {url: 'website.com', username: 'username1', accountId: 0}), - createMultiStorePasswordEntry( - {url: 'website.com', username: 'username2', deviceId: 0}), + createPasswordEntry({ + url: 'website.com', + username: 'username1', + id: 0, + inAccountStore: true, + }), + createPasswordEntry({ + url: 'website.com', + username: 'username2', + id: 0, + inProfileStore: true, + }), ]; const addDialog = elementFactory.createPasswordEditDialog(null, passwords); await updateWebsiteInput(addDialog, passwordManager, 'website.com'); @@ -610,8 +630,8 @@ test( 'requestsPlaintextPasswordAndSwitchesToEditModeOnViewPasswordClick', async function() { - const existingEntry = createMultiStorePasswordEntry( - {url: 'website.com', username: 'username', accountId: 0}); + const existingEntry = createPasswordEntry( + {url: 'website.com', username: 'username', id: 0}); const addDialog = elementFactory.createPasswordEditDialog(null, [existingEntry]); assertFalse(isElementVisible(addDialog.$.viewExistingPasswordLink)); @@ -638,8 +658,8 @@ test('hasCorrectInitialStateWhenEditModeWhenNotesEnabled', async function() { loadTimeData.overrideValues({enablePasswordNotes: true}); - const commonEntry = createMultiStorePasswordEntry( - {url: 'goo.gl', username: 'bart', accountId: 42}); + const commonEntry = + createPasswordEntry({url: 'goo.gl', username: 'bart', id: 42}); const passwordDialog = elementFactory.createPasswordEditDialog(commonEntry); assertEditDialogParts(passwordDialog); const noteElement = @@ -652,8 +672,8 @@ test('changesPasswordWithNote', async function() { loadTimeData.overrideValues({enablePasswordNotes: true}); loadTimeData.overrideValues({enablePasswordViewPage: true}); - const entry = createMultiStorePasswordEntry( - {url: 'goo.gl', username: 'bart', accountId: 42, note: 'some note'}); + const entry = createPasswordEntry( + {url: 'goo.gl', username: 'bart', id: 42, note: 'some note'}); const editDialog = elementFactory.createPasswordEditDialog(entry); const noteElement = editDialog.shadowRoot!.querySelector<SettingsTextareaElement>('#note')!; @@ -687,8 +707,8 @@ test('noChangesWhenNotesIsNotEnabled', async function() { loadTimeData.overrideValues({enablePasswordNotes: false}); - const commonEntry = createMultiStorePasswordEntry( - {url: 'goo.gl', username: 'bart', accountId: 42}); + const commonEntry = + createPasswordEntry({url: 'goo.gl', username: 'bart', id: 42}); const passwordDialog = elementFactory.createPasswordEditDialog(commonEntry); assertEditDialogParts(passwordDialog); assertFalse( @@ -698,8 +718,8 @@ test('federatedCredentialDoesntHaveNotes', async function() { loadTimeData.overrideValues({enablePasswordNotes: true}); - const federationEntry = createMultiStorePasswordEntry( - {federationText: 'with chromium.org', username: 'bart', deviceId: 42}); + const federationEntry = createPasswordEntry( + {federationText: 'with chromium.org', username: 'bart', id: 42}); const passwordDialog = elementFactory.createPasswordEditDialog(federationEntry); assertFederatedDialogParts(passwordDialog); @@ -710,10 +730,10 @@ test('showNoteWarningInEditModeWhen900Characters', async function() { loadTimeData.overrideValues({enablePasswordNotes: true}); - const commonEntry = createMultiStorePasswordEntry({ + const commonEntry = createPasswordEntry({ url: 'goo.gl', username: 'bart', - accountId: 42, + id: 42, note: 'a'.repeat(900), }); const passwordDialog = @@ -734,10 +754,10 @@ test('disableActionButtonWhenNoteIsLargerThan1000Chars', async function() { loadTimeData.overrideValues({enablePasswordNotes: true}); - const commonEntry = createMultiStorePasswordEntry({ + const commonEntry = createPasswordEntry({ url: 'goo.gl', username: 'bart', - accountId: 42, + id: 42, note: 'a'.repeat(1001), }); const passwordDialog = @@ -750,10 +770,10 @@ test('changingTheTextInTextareaChangesActionButtonStatus', async function() { loadTimeData.overrideValues({enablePasswordNotes: true}); - const commonEntry = createMultiStorePasswordEntry({ + const commonEntry = createPasswordEntry({ url: 'goo.gl', username: 'bart', - accountId: 42, + id: 42, note: 'a'.repeat(1000), }); const passwordDialog = @@ -777,10 +797,10 @@ test('changingUsernameResetsNote', async function() { loadTimeData.overrideValues({enablePasswordNotes: true}); - const commonEntry = createMultiStorePasswordEntry({ + const commonEntry = createPasswordEntry({ url: 'goo.gl', username: 'bart', - accountId: 42, + id: 42, note: 'personal account', }); const passwordDialog = @@ -799,8 +819,8 @@ test( 'notSwitchToEditModeOnViewPasswordClickWhenRequestPlaintextPasswordFailed', async function() { - const existingEntry = createMultiStorePasswordEntry( - {url: 'website.com', username: 'username', accountId: 0}); + const existingEntry = createPasswordEntry( + {url: 'website.com', username: 'username', id: 0}); const addDialog = elementFactory.createPasswordEditDialog(null, [existingEntry]); assertFalse(isElementVisible(addDialog.$.viewExistingPasswordLink));
diff --git a/chrome/test/data/webui/settings/password_view_test.ts b/chrome/test/data/webui/settings/password_view_test.ts index 12d51ce..0f98766e 100644 --- a/chrome/test/data/webui/settings/password_view_test.ts +++ b/chrome/test/data/webui/settings/password_view_test.ts
@@ -15,7 +15,7 @@ import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {flushTasks, isVisible} from 'chrome://webui-test/test_util.js'; -import {createMultiStorePasswordEntry, createPasswordEntry} from './passwords_and_autofill_fake_data.js'; +import {createPasswordEntry} from './passwords_and_autofill_fake_data.js'; import {TestPasswordManagerProxy} from './test_password_manager_proxy.js'; // clang-format on @@ -453,8 +453,13 @@ const dialog = page.shadowRoot!.querySelector('password-remove-dialog'); assertTrue(!!dialog); assertDeepEquals( - createMultiStorePasswordEntry( - {url: SITE, username: USERNAME, deviceId: ID, accountId: ID}), + createPasswordEntry({ + url: SITE, + username: USERNAME, + id: ID, + inAccountStore: true, + inProfileStore: true, + }), dialog.duplicatedPassword); // click delete on the dialog.
diff --git a/chrome/test/data/webui/settings/passwords_and_autofill_fake_data.ts b/chrome/test/data/webui/settings/passwords_and_autofill_fake_data.ts index eae8b0e3..a36370c 100644 --- a/chrome/test/data/webui/settings/passwords_and_autofill_fake_data.ts +++ b/chrome/test/data/webui/settings/passwords_and_autofill_fake_data.ts
@@ -5,7 +5,6 @@ // clang-format off import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {AutofillManagerProxy, PasswordEditDialogElement, PasswordListItemElement, PasswordMoveMultiplePasswordsToAccountDialogElement, PasswordsExportDialogElement, PasswordsImportDialogElement, PasswordsSectionElement, PaymentsManagerProxy, PersonalDataChangedListener} from 'chrome://settings/lazy_load.js'; -import {MultiStorePasswordUiEntry} from 'chrome://settings/settings.js'; import {assertEquals} from 'chrome://webui-test/chai_assert.js'; import {TestPasswordManagerProxy} from './test_password_manager_proxy.js'; @@ -52,7 +51,7 @@ return { urls: { - origin: 'http://' + url + '/login', + signonRealm: 'http://' + url + '/login', shown: url, link: 'http://' + url + '/login', }, @@ -61,47 +60,11 @@ id: id, storedIn: storeType, isAndroidCredential: params.isAndroidCredential || false, - passwordNote: note, + note: note, + password: '', }; } -export type MultyStorePasswordEntryParams = { - url?: string, - username?: string, - federationText?: string, - accountId?: number, - deviceId?: number, - note?: string, -}; - -/** - * Creates a multi-store password item with the same mock data as - * createPasswordEntry(), so can be used for verifying deduplication result. - * At least one of |params.accountId| and |params.deviceId| must be set. - * TODO(vsemeniuk): Clear this method when MultiStorePasswordUiEntry is removed. - */ -export function createMultiStorePasswordEntry( - params: MultyStorePasswordEntryParams): MultiStorePasswordUiEntry { - const entryParams: PasswordEntryParams = { - url: params.url, - username: params.username, - federationText: params.federationText, - note: params.note, - }; - - if (params.deviceId !== undefined) { - entryParams.id = params.deviceId; - entryParams.inProfileStore = true; - } - - if (params.accountId !== undefined) { - entryParams.id = params.accountId; - entryParams.inAccountStore = true; - } - - return new MultiStorePasswordUiEntry(createPasswordEntry(entryParams)); -} - export type ExceptionEntryParams = { url?: string, id?: number, @@ -120,7 +83,7 @@ const id = params.id !== undefined ? params.id : 42; return { urls: { - origin: 'http://' + url + '/login', + signonRealm: 'http://' + url + '/login', shown: url, link: 'http://' + url + '/login', }, @@ -211,13 +174,15 @@ id?: number): chrome.passwordsPrivate.InsecureCredential { return { id: id || 0, - formattedOrigin: url, changePasswordUrl: `http://${url}/`, hasStartableScript: false, + urls: { + signonRealm: `http://${url}/`, + shown: url, + link: `http://${url}/`, + }, username: username, - detailedOrigin: '', isAndroidCredential: false, - signonRealm: '', }; } @@ -320,7 +285,7 @@ chrome.passwordsPrivate.PasswordUiEntry): PasswordListItemElement { const passwordListItem = this.document.createElement('password-list-item'); - passwordListItem.entry = new MultiStorePasswordUiEntry(passwordEntry); + passwordListItem.entry = passwordEntry; this.document.body.appendChild(passwordListItem); flush(); return passwordListItem; @@ -330,8 +295,8 @@ * Helper method used to create a password editing dialog. */ createPasswordEditDialog( - passwordEntry: MultiStorePasswordUiEntry|null = null, - passwords?: MultiStorePasswordUiEntry[], + passwordEntry: chrome.passwordsPrivate.PasswordUiEntry|null = null, + passwords?: chrome.passwordsPrivate.PasswordUiEntry[], isAccountStoreUser: boolean = false): PasswordEditDialogElement { const passwordDialog = this.document.createElement('password-edit-dialog'); passwordDialog.existingEntry = passwordEntry; @@ -388,8 +353,8 @@ * Helper method used to create a move multiple password to the Google Account * dialog. */ - createMoveMultiplePasswordsDialog(passwordsToMove: - MultiStorePasswordUiEntry[]): + createMoveMultiplePasswordsDialog( + passwordsToMove: chrome.passwordsPrivate.PasswordUiEntry[]): PasswordMoveMultiplePasswordsToAccountDialogElement { const moveDialog = this.document.createElement( 'password-move-multiple-passwords-to-account-dialog');
diff --git a/chrome/test/data/webui/settings/passwords_device_section_test.ts b/chrome/test/data/webui/settings/passwords_device_section_test.ts index d9315d7..cb4a0304 100644 --- a/chrome/test/data/webui/settings/passwords_device_section_test.ts +++ b/chrome/test/data/webui/settings/passwords_device_section_test.ts
@@ -9,11 +9,11 @@ import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {IronListElement, PasswordMoveToAccountDialogElement, PasswordsDeviceSectionElement} from 'chrome://settings/lazy_load.js'; -import {MultiStorePasswordUiEntry, PasswordManagerImpl, Router, routes, StatusAction, SyncBrowserProxyImpl} from 'chrome://settings/settings.js'; +import {PasswordManagerImpl, Router, routes, StatusAction, SyncBrowserProxyImpl} from 'chrome://settings/settings.js'; import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {eventToPromise, isVisible} from 'chrome://webui-test/test_util.js'; -import {createMultiStorePasswordEntry, createPasswordEntry, PasswordDeviceSectionElementFactory} from './passwords_and_autofill_fake_data.js'; +import {createPasswordEntry, PasswordDeviceSectionElementFactory} from './passwords_and_autofill_fake_data.js'; import {simulateStoredAccounts, simulateSyncStatus} from './sync_test_util.js'; import {TestPasswordManagerProxy} from './test_password_manager_proxy.js'; import {TestSyncBrowserProxy} from './test_sync_browser_proxy.js'; @@ -49,7 +49,7 @@ */ function validatePasswordsSubsection( subsection: IronListElement, - expectedPasswords: MultiStorePasswordUiEntry[]) { + expectedPasswords: chrome.passwordsPrivate.PasswordUiEntry[]) { assertDeepEquals(expectedPasswords, subsection.items); const listItemElements = subsection.querySelectorAll('password-list-item'); for (let index = 0; index < expectedPasswords.length; ++index) { @@ -126,12 +126,16 @@ validatePasswordsSubsection( passwordsDeviceSection.$.deviceOnlyPasswordList, [ - createMultiStorePasswordEntry({username: 'device', deviceId: 0}), + createPasswordEntry({username: 'device', id: 0}), ]); validatePasswordsSubsection( passwordsDeviceSection.$.deviceAndAccountPasswordList, [ - createMultiStorePasswordEntry( - {username: 'both', deviceId: 2, accountId: 2}), + createPasswordEntry({ + username: 'both', + id: 2, + inProfileStore: true, + inAccountStore: true, + }), ]); assertTrue( passwordsDeviceSection.shadowRoot! @@ -153,8 +157,7 @@ validatePasswordsSubsection( passwordsDeviceSection.$.deviceOnlyPasswordList, []); validatePasswordsSubsection( - passwordsDeviceSection.$.deviceAndAccountPasswordList, - [createMultiStorePasswordEntry({accountId: 10, deviceId: 10})]); + passwordsDeviceSection.$.deviceAndAccountPasswordList, passwordList); // Remove device copy. passwordManager.lastCallback.addSavedPasswordListChangedListener! @@ -180,7 +183,8 @@ passwordsDeviceSection.$.deviceOnlyPasswordList, []); validatePasswordsSubsection( passwordsDeviceSection.$.deviceAndAccountPasswordList, - [createMultiStorePasswordEntry({accountId: 10, deviceId: 10})]); + [createPasswordEntry( + {inAccountStore: true, inProfileStore: true, id: 10})]); // Remove account copy. passwordManager.lastCallback.addSavedPasswordListChangedListener! @@ -189,7 +193,7 @@ validatePasswordsSubsection( passwordsDeviceSection.$.deviceOnlyPasswordList, - [createMultiStorePasswordEntry({deviceId: 10})]); + [createPasswordEntry({id: 10})]); validatePasswordsSubsection( passwordsDeviceSection.$.deviceAndAccountPasswordList, []); }); @@ -310,8 +314,8 @@ // The move multiple password dialog is dismissable. test('moveMultiplePasswordsDialogDismissable', function() { - const deviceEntry = createMultiStorePasswordEntry( - {url: 'goo.gl', username: 'bart', deviceId: 42}); + const deviceEntry = + createPasswordEntry({url: 'goo.gl', username: 'bart', id: 42}); const moveMultipleDialog = elementFactory.createMoveMultiplePasswordsDialog([deviceEntry]); assertTrue(moveMultipleDialog.$.dialog.open); @@ -321,8 +325,8 @@ }); test('moveMultiplePasswordsDialogFiresCloseEventWhenCanceled', function() { - const deviceEntry = createMultiStorePasswordEntry( - {url: 'goo.gl', username: 'bart', deviceId: 42}); + const deviceEntry = + createPasswordEntry({url: 'goo.gl', username: 'bart', id: 42}); const moveMultipleDialog = elementFactory.createMoveMultiplePasswordsDialog([deviceEntry]); moveMultipleDialog.$.cancelButton.click(); @@ -331,10 +335,10 @@ // Testing moving multiple password dialog Move button. test('moveMultiplePasswordsDialogMoveButton', async function() { - const deviceEntry1 = createMultiStorePasswordEntry( - {url: 'goo.gl', username: 'bart1', deviceId: 41}); - const deviceEntry2 = createMultiStorePasswordEntry( - {url: 'goo.gl', username: 'bart2', deviceId: 54}); + const deviceEntry1 = + createPasswordEntry({url: 'goo.gl', username: 'bart1', id: 41}); + const deviceEntry2 = + createPasswordEntry({url: 'goo.gl', username: 'bart2', id: 54}); const moveMultipleDialog = elementFactory.createMoveMultiplePasswordsDialog( [deviceEntry1, deviceEntry2]); // Uncheck the first entry. @@ -360,8 +364,8 @@ `WhenPasswordNotesEnabledIs_${enablePasswordViewPage}`, function() { loadTimeData.overrideValues({enablePasswordViewPage}); - const deviceEntry = createMultiStorePasswordEntry( - {url: 'goo.gl', username: 'bart', deviceId: 42}); + const deviceEntry = + createPasswordEntry({url: 'goo.gl', username: 'bart', id: 42}); const moveMultipleDialog = elementFactory.createMoveMultiplePasswordsDialog([deviceEntry]); const firstPasswordItem =
diff --git a/chrome/test/data/webui/settings/passwords_section_test.ts b/chrome/test/data/webui/settings/passwords_section_test.ts index 36a4214..03b246e 100644 --- a/chrome/test/data/webui/settings/passwords_section_test.ts +++ b/chrome/test/data/webui/settings/passwords_section_test.ts
@@ -11,7 +11,7 @@ import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {PasswordsSectionElement} from 'chrome://settings/lazy_load.js'; -import {buildRouter, HatsBrowserProxyImpl, MultiStorePasswordUiEntry, PasswordCheckReferrer, PasswordManagerImpl, Router, routes, SettingsPluralStringProxyImpl,StatusAction, TrustedVaultBannerState, TrustSafetyInteraction} from 'chrome://settings/settings.js'; +import {buildRouter, HatsBrowserProxyImpl, PasswordCheckReferrer, PasswordManagerImpl, Router, routes, SettingsPluralStringProxyImpl,StatusAction, TrustedVaultBannerState, TrustSafetyInteraction} from 'chrome://settings/settings.js'; import {SettingsRoutes} from 'chrome://settings/settings_routes.js'; import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {TestPluralStringProxy} from 'chrome://webui-test/test_plural_string_proxy.js'; @@ -32,9 +32,9 @@ * @param passwordsSection The passwords section element that will be checked. * @param expectedPasswords The expected data. */ -function validateMultiStorePasswordList( +function validatePasswordList( passwordsSection: PasswordsSectionElement, - expectedPasswords: MultiStorePasswordUiEntry[]) { + expectedPasswords: chrome.passwordsPrivate.PasswordUiEntry[]) { const passwordList = passwordsSection.$.passwordList; if (passwordList.filter) { // `passwordList.items` will always contain all items, even when there is a @@ -43,8 +43,8 @@ assertDeepEquals( expectedPasswords, passwordList.items!.filter( - passwordList.filter as (item: MultiStorePasswordUiEntry) => - boolean)); + passwordList.filter as + (item: chrome.passwordsPrivate.PasswordUiEntry) => boolean)); } else { assertDeepEquals(expectedPasswords, passwordList.items); } @@ -62,20 +62,6 @@ } /** - * Convenience version of validateMultiStorePasswordList() for when store - * duplicates don't exist. - * @param passwordsSection The passwords section element that will be checked. - * @param passwordList The expected data. - */ -function validatePasswordList( - passwordsSection: PasswordsSectionElement, - passwordList: chrome.passwordsPrivate.PasswordUiEntry[]) { - validateMultiStorePasswordList( - passwordsSection, - passwordList.map(entry => new MultiStorePasswordUiEntry(entry))); -} - -/** * Helper method that validates a that elements in the exception list match * the expected data. * @param nodes The nodes that will be checked. @@ -117,10 +103,9 @@ * @param url The URL that is being searched for. */ function listContainsUrl( - passwordList: - (MultiStorePasswordUiEntry[]|chrome.passwordsPrivate.PasswordUiEntry[]), + passwordList: (chrome.passwordsPrivate.PasswordUiEntry[]), url: string): boolean { - return passwordList.some(item => item.urls.origin === url); + return passwordList.some(item => item.urls.signonRealm === url); } /** @@ -172,7 +157,6 @@ passwordListItem.$.moreActionsButton.click(); passwordsSection.$.passwordsListHandler.$.menuEditPassword.click(); flush(); - await passwordManager.whenCalled('requestPlaintextPassword'); await flushTasks(); passwordManager.resetResolver('requestPlaintextPassword'); @@ -309,9 +293,7 @@ // Assert that the data is passed into the iron list. If this fails, // then other expectations will also fail. - assertDeepEquals( - passwordList.map(entry => new MultiStorePasswordUiEntry(entry)), - passwordsSection.$.passwordList.items); + assertDeepEquals(passwordList, passwordsSection.$.passwordList.items); validatePasswordList(passwordsSection, passwordList);
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM index 81b380ba..5f64d63 100644 --- a/chromeos/CHROMEOS_LKGM +++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@ -14996.0.0 \ No newline at end of file +14997.0.0 \ No newline at end of file
diff --git a/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.cc b/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.cc index 45412d3..f6b33f7 100644 --- a/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.cc +++ b/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.cc
@@ -672,6 +672,9 @@ DCHECK_EQ(auth_sessions_.count(auth_session_id), 0u); AuthSessionData& session = auth_sessions_[auth_session_id]; session.id = auth_session_id; + session.ephemeral = + (request.flags() & ::user_data_auth::AUTH_SESSION_FLAGS_EPHEMERAL_USER) != + 0; session.account = request.account_id(); if (cryptohome_error_ != @@ -808,30 +811,35 @@ const ::user_data_auth::PrepareEphemeralVaultRequest& request, PrepareEphemeralVaultCallback callback) { ::user_data_auth::PrepareEphemeralVaultReply reply; + ReplyOnReturn auto_reply(&reply, std::move(callback)); - cryptohome::AccountIdentifier account; - auto auth_session = auth_sessions_.find(request.auth_session_id()); - if (auth_session == auth_sessions_.end()) { + const auto session_it = auth_sessions_.find(request.auth_session_id()); + if (session_it == auth_sessions_.end()) { LOG(ERROR) << "AuthSession not found"; reply.set_sanitized_username(std::string()); reply.set_error(::user_data_auth::CryptohomeErrorCode:: CRYPTOHOME_INVALID_AUTH_SESSION_TOKEN); - } else { - account = auth_session->second.account; - // Ephemeral mount does not require session to be authenticated; - // It authenticates session instead. - if (auth_session->second.authenticated) { - LOG(ERROR) << "AuthSession is authenticated"; - reply.set_error(::user_data_auth::CryptohomeErrorCode:: - CRYPTOHOME_ERROR_INVALID_ARGUMENT); - } else { - auth_session->second.authenticated = true; - } - - reply.set_sanitized_username(GetStubSanitizedUsername(account)); + return; } + AuthSessionData& auth_session = session_it->second; + if (!auth_session.ephemeral) { + LOG(ERROR) << "Non-ephemeral AuthSession used with PrepareEphemeralVault"; + reply.set_error(::user_data_auth::CryptohomeErrorCode:: + CRYPTOHOME_ERROR_INVALID_ARGUMENT); + return; + } + cryptohome::AccountIdentifier account = auth_session.account; + // Ephemeral mount does not require session to be authenticated; + // It authenticates session instead. + if (auth_session.authenticated) { + LOG(ERROR) << "AuthSession is authenticated"; + reply.set_error(::user_data_auth::CryptohomeErrorCode:: + CRYPTOHOME_ERROR_INVALID_ARGUMENT); + return; + } + auth_session.authenticated = true; - ReturnProtobufMethodCallback(reply, std::move(callback)); + reply.set_sanitized_username(GetStubSanitizedUsername(account)); } void FakeUserDataAuthClient::CreatePersistentUser( @@ -850,6 +858,13 @@ } AuthSessionData& auth_session = session_it->second; + if (auth_session.ephemeral) { + LOG(ERROR) << "Ephemeral AuthSession used with CreatePersistentUser"; + reply.set_error(::user_data_auth::CryptohomeErrorCode:: + CRYPTOHOME_ERROR_INVALID_ARGUMENT); + return; + } + const auto [_, was_inserted] = users_.insert({auth_session.account, UserCryptohomeState()}); @@ -878,6 +893,13 @@ return; } + if (authenticated_auth_session->ephemeral) { + LOG(ERROR) << "Ephemeral AuthSession used with PreparePersistentVault"; + reply.set_error(::user_data_auth::CryptohomeErrorCode:: + CRYPTOHOME_ERROR_INVALID_ARGUMENT); + return; + } + if (!users_.contains(authenticated_auth_session->account)) { reply.set_error(::user_data_auth::CryptohomeErrorCode:: CRYPTOHOME_ERROR_ACCOUNT_NOT_FOUND);
diff --git a/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.h b/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.h index fc76223..1f7d1e0 100644 --- a/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.h +++ b/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.h
@@ -132,6 +132,9 @@ struct AuthSessionData { // AuthSession id. std::string id; + // Whether the `AUTH_SESSION_FLAGS_EPHEMERAL_USER` flag was passed on + // creation. + bool ephemeral = false; // Account associated with the session. cryptohome::AccountIdentifier account; // True if session is authenticated.
diff --git a/chromeos/ash/components/network/cellular_metrics_logger.cc b/chromeos/ash/components/network/cellular_metrics_logger.cc index 8adad6f..a5b6b9a2 100644 --- a/chromeos/ash/components/network/cellular_metrics_logger.cc +++ b/chromeos/ash/components/network/cellular_metrics_logger.cc
@@ -8,6 +8,7 @@ #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" +#include "base/notreached.h" #include "base/time/tick_clock.h" #include "chromeos/ash/components/dbus/hermes/hermes_manager_client.h" #include "chromeos/ash/components/feature_usage/feature_usage_metrics.h" @@ -115,6 +116,10 @@ "Network.Cellular.Pin.Restricted.UnblockSuccess"; // static +const char CellularMetricsLogger::kSimLockNotificationLockType[] = + "Network.Ash.Cellular.SimLock.Policy.Notification.LockType"; + +// static const base::TimeDelta CellularMetricsLogger::kInitializationTimeout = base::Seconds(15); @@ -151,6 +156,20 @@ } // static +void CellularMetricsLogger::RecordSimLockNotificationLockType( + const std::string& sim_lock_type) { + if (sim_lock_type == shill::kSIMLockPin) { + base::UmaHistogramEnumeration(kSimLockNotificationLockType, + SimPinLockType::kPinLocked); + } else if (sim_lock_type == shill::kSIMLockPuk) { + base::UmaHistogramEnumeration(kSimLockNotificationLockType, + SimPinLockType::kPukLocked); + } else { + NOTREACHED(); + } +} + +// static void CellularMetricsLogger::RecordSimPinOperationResult( const SimPinOperation& pin_operation, const bool allow_cellular_sim_lock,
diff --git a/chromeos/ash/components/network/cellular_metrics_logger.h b/chromeos/ash/components/network/cellular_metrics_logger.h index 148e024..0a0820c 100644 --- a/chromeos/ash/components/network/cellular_metrics_logger.h +++ b/chromeos/ash/components/network/cellular_metrics_logger.h
@@ -72,6 +72,7 @@ // Histograms associated with SIM Lock notification events. static const char kSimLockNotificationEventHistogram[]; + static const char kSimLockNotificationLockType[]; // PIN operations that are tracked by metrics. enum class SimPinOperation { @@ -90,15 +91,27 @@ kMaxValue = kDismissed }; + // SIM pin lock type. + enum class SimPinLockType { + kPinLocked = 0, + kPukLocked = 1, + kMaxValue = kPukLocked + }; + // Records the result of pin operations performed. static void RecordSimPinOperationResult( const SimPinOperation& pin_operation, const bool allow_cellular_sim_lock, const absl::optional<std::string>& shill_error_name = absl::nullopt); + // Records the SIM lock notification event. static void RecordSimLockNotificationEvent( const SimLockNotificationEvent notification_event); + // Records the SIM lock type when the notification is surfaced. + static void RecordSimLockNotificationLockType( + const std::string& sim_lock_type); + CellularMetricsLogger(); CellularMetricsLogger(const CellularMetricsLogger&) = delete;
diff --git a/chromeos/crosapi/mojom/launcher_search.mojom b/chromeos/crosapi/mojom/launcher_search.mojom index 94d91d43..f949b06 100644 --- a/chromeos/crosapi/mojom/launcher_search.mojom +++ b/chromeos/crosapi/mojom/launcher_search.mojom
@@ -36,8 +36,8 @@ }; // Struct represents search result. -// Next min ID: 20 -// Next min version: 5 +// Next min ID: 22 +// Next min version: 6 [Stable] struct SearchResult { // Type of the result. Used to distinguish between different types of result. @@ -62,6 +62,9 @@ // Whether the result is an answer result or not. Used for kOmniboxResult // type results. OptionalBool is_answer@4; + // The Omnibox search result type as required for metrics logging. Used for + // kOmniboxResult type results. This defaults to kUnset. + [MinVersion=5] MetricsType metrics_type@20; // The Omnibox subtype of the result, used for kOmniboxResult type results. // This defaults to kUnset. OmniboxType omnibox_type@5; @@ -74,8 +77,11 @@ // The image url of the result, if any. Used to download the result image. url.mojom.Url? image_url@7; - // Favicon of the result. - gfx.mojom.ImageSkia? favicon@8; + // Favicon of the result, if one had already been cached. + gfx.mojom.ImageSkia? cached_favicon@8; + // Handle through which to receive asynchronously-fetched data about this + // search result. + [MinVersion=5] pending_receiver<SearchResultConsumer>? receiver@21; // The accessibility label to use for the second image line, if one exists. [MinVersion=3] mojo_base.mojom.String16? description_a11y_label@19; @@ -118,6 +124,23 @@ [MinVersion=1] kOpenTab = 8, }; + // Enum representing the search result type as required for metrics logging. + [Stable, Extensible] + enum MetricsType { + [Default] kUnset = 0, + kWhatYouTyped = 1, + kRecentlyVisitedWebsite = 2, + kHistoryTitle = 3, + kSearchWhatYouTyped = 4, + kSearchHistory = 5, + kSearchSuggest = 6, + kSearchSuggestPersonalized = 7, + kBookmark = 8, + kSearchSuggestEntity = 9, + kNavSuggest = 10, + kCalculator = 11, + }; + // Enum representing the Omnibox answer subtype. [Stable, Extensible] enum AnswerType { @@ -186,3 +209,12 @@ RegisterSearchController@0( pending_remote<SearchController> search_controller); }; + +// Interface implemented by result objects to receive asynchronously-updated +// data for one search result. +// Next min method ID: 1 +[Stable, Uuid="d3294d1e-dadb-4bc2-a1ce-5b731f11cce1"] +interface SearchResultConsumer { + // Called once with a favicon if it was successfully asynchronously fetched. + OnFaviconReceived@0(gfx.mojom.ImageSkia favicon); +};
diff --git a/chromeos/profiles/atom.afdo.newest.txt b/chromeos/profiles/atom.afdo.newest.txt index a45e8cc9..ac095f88 100644 --- a/chromeos/profiles/atom.afdo.newest.txt +++ b/chromeos/profiles/atom.afdo.newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-atom-105-5161.0-1658138909-benchmark-105.0.5195.4-r1-redacted.afdo.xz +chromeos-chrome-amd64-atom-105-5161.0-1658138909-benchmark-105.0.5195.5-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/bigcore.afdo.newest.txt b/chromeos/profiles/bigcore.afdo.newest.txt index 2a8bcf3..d397925cf 100644 --- a/chromeos/profiles/bigcore.afdo.newest.txt +++ b/chromeos/profiles/bigcore.afdo.newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-bigcore-105-5161.0-1658139264-benchmark-105.0.5195.4-r1-redacted.afdo.xz +chromeos-chrome-amd64-bigcore-105-5161.0-1658139264-benchmark-105.0.5195.5-r1-redacted.afdo.xz
diff --git a/chromeos/services/network_config/cros_network_config.cc b/chromeos/services/network_config/cros_network_config.cc index 3cc848ca4..dbb84168 100644 --- a/chromeos/services/network_config/cros_network_config.cc +++ b/chromeos/services/network_config/cros_network_config.cc
@@ -400,6 +400,8 @@ cellular->sim_lock_enabled = sim_is_primary && cellular_device->sim_lock_enabled(); cellular->sim_locked = sim_is_primary && cellular_device->IsSimLocked(); + if (sim_is_primary) + cellular->sim_lock_type = cellular_device->sim_lock_type(); result->type_state = mojom::NetworkTypeStateProperties::NewCellular(std::move(cellular)); break;
diff --git a/chromeos/services/network_config/cros_network_config_unittest.cc b/chromeos/services/network_config/cros_network_config_unittest.cc index 2f4966f..23a3e02 100644 --- a/chromeos/services/network_config/cros_network_config_unittest.cc +++ b/chromeos/services/network_config/cros_network_config_unittest.cc
@@ -842,6 +842,7 @@ EXPECT_EQ(mojom::OncSource::kDevice, network->source); EXPECT_TRUE(cellular->sim_locked); EXPECT_TRUE(cellular->sim_lock_enabled); + EXPECT_EQ(shill::kSIMLockPin, cellular->sim_lock_type); network = GetNetworkState("vpn_l2tp_guid"); ASSERT_TRUE(network);
diff --git a/chromeos/services/network_config/public/mojom/cros_network_config.mojom b/chromeos/services/network_config/public/mojom/cros_network_config.mojom index d3b1f2d..65e982a8 100644 --- a/chromeos/services/network_config/public/mojom/cros_network_config.mojom +++ b/chromeos/services/network_config/public/mojom/cros_network_config.mojom
@@ -195,6 +195,9 @@ bool sim_lock_enabled = false; // True when a SIM is present and locked. bool sim_locked = false; + // String representing the SIM lock type. This will be empty when the SIM + // is unlocked. + string sim_lock_type; }; struct EthernetStateProperties {
diff --git a/chromeos/strings/chromeos_strings_bn.xtb b/chromeos/strings/chromeos_strings_bn.xtb index ef4bc12..f5b8641e 100644 --- a/chromeos/strings/chromeos_strings_bn.xtb +++ b/chromeos/strings/chromeos_strings_bn.xtb
@@ -118,6 +118,7 @@ <translation id="1851218745569890714">ভিডিও কনফারেন্সিং</translation> <translation id="1852934301711881861">ChromeOS Flex ইনস্টল করুন</translation> <translation id="1856388568474281774">নিম্নমুখী তীরচিহ্ন</translation> +<translation id="1858620243986915808">স্ক্রিনশট অ্যাটাচ করুন</translation> <translation id="1871569928317311284">ডার্ক থিম বন্ধ করুন</translation> <translation id="1874612839560830905">MTU</translation> <translation id="188114911237521550">'ডার্ক মোড' বন্ধ করুন</translation>
diff --git a/chromeos/strings/chromeos_strings_bs.xtb b/chromeos/strings/chromeos_strings_bs.xtb index fda0241..2ab1c90 100644 --- a/chromeos/strings/chromeos_strings_bs.xtb +++ b/chromeos/strings/chromeos_strings_bs.xtb
@@ -118,6 +118,7 @@ <translation id="1851218745569890714">Videokonferencija</translation> <translation id="1852934301711881861">Instaliraj ChromeOS Flex</translation> <translation id="1856388568474281774">Strelica nadolje</translation> +<translation id="1858620243986915808">Priloži snimak ekrana</translation> <translation id="1871569928317311284">Isključi tamnu temu</translation> <translation id="1874612839560830905">MTU</translation> <translation id="188114911237521550">Isključi tamni način rada</translation>
diff --git a/chromeos/strings/chromeos_strings_fil.xtb b/chromeos/strings/chromeos_strings_fil.xtb index 94e977f..a7938a78 100644 --- a/chromeos/strings/chromeos_strings_fil.xtb +++ b/chromeos/strings/chromeos_strings_fil.xtb
@@ -92,6 +92,7 @@ <translation id="1644574205037202324">History</translation> <translation id="1645954272419197032">Pakikumpirma ang impormasyon ng device</translation> <translation id="1662989795263954667">Huminto - Wala nang ink</translation> +<translation id="1664796644829245314">I-preview ang <ph name="PREVIEW_OBJECT" /></translation> <translation id="1668469839109562275">Built-in na VPN</translation> <translation id="1672499492233627739">Video feed ng webcam</translation> <translation id="1676557873873341166">Pagkuha ng video</translation> @@ -118,6 +119,7 @@ <translation id="1851218745569890714">Pakikipagkumperensya Gamit ang Video</translation> <translation id="1852934301711881861">I-install ang ChromeOS Flex</translation> <translation id="1856388568474281774">Pababang arrow</translation> +<translation id="1858620243986915808">I-attach ang screenshot</translation> <translation id="1871569928317311284">I-off ang madilim na tema</translation> <translation id="1874612839560830905">MTU</translation> <translation id="188114911237521550">I-off ang dark mode</translation> @@ -797,6 +799,7 @@ <translation id="7978412674231730200">Private na key</translation> <translation id="7982789257301363584">Network</translation> <translation id="7994702968232966508">Pamamaraang EAP</translation> +<translation id="8018928621986160031">Na-save sa "<ph name="FILE_LOCATION" />"</translation> <translation id="802154636333426148">Hindi na-download</translation> <translation id="8031884997696620457">HSPAPlus</translation> <translation id="80398733265834479">I-enable ang auto color mode</translation>
diff --git a/chromeos/strings/chromeos_strings_hr.xtb b/chromeos/strings/chromeos_strings_hr.xtb index 445d6cb..d14b6cb8 100644 --- a/chromeos/strings/chromeos_strings_hr.xtb +++ b/chromeos/strings/chromeos_strings_hr.xtb
@@ -118,6 +118,7 @@ <translation id="1851218745569890714">Videokonferencije</translation> <translation id="1852934301711881861">Instaliraj ChromeOS Flex</translation> <translation id="1856388568474281774">Strelica prema dolje</translation> +<translation id="1858620243986915808">Priloži snimku zaslona</translation> <translation id="1871569928317311284">Isključivanje tamne teme</translation> <translation id="1874612839560830905">MTU</translation> <translation id="188114911237521550">Isključivanje tamnog načina</translation>
diff --git a/chromeos/strings/chromeos_strings_ka.xtb b/chromeos/strings/chromeos_strings_ka.xtb index 8742313..936ab98 100644 --- a/chromeos/strings/chromeos_strings_ka.xtb +++ b/chromeos/strings/chromeos_strings_ka.xtb
@@ -92,6 +92,7 @@ <translation id="1644574205037202324">ისტორია</translation> <translation id="1645954272419197032">დაადასტურეთ მოწყობილობის ინფორმაცია</translation> <translation id="1662989795263954667">გაჩერდა — მელანი გათავდა</translation> +<translation id="1664796644829245314"><ph name="PREVIEW_OBJECT" />-ის გადახედვა</translation> <translation id="1668469839109562275">ჩაშენებული VPN</translation> <translation id="1672499492233627739">ვიდეოს ნაკადი ვებკამერიდან</translation> <translation id="1676557873873341166">მიმდინარეობს ვიდეოს გადაღება</translation> @@ -118,6 +119,7 @@ <translation id="1851218745569890714">ვიდეოკონფერენცია</translation> <translation id="1852934301711881861">ChromeOS Flex-ის ინსტალაცია</translation> <translation id="1856388568474281774">ისარი ქვემოთ</translation> +<translation id="1858620243986915808">ეკრანის ანაბეჭდის დართვა</translation> <translation id="1871569928317311284">მუქი თემის გამორთვა</translation> <translation id="1874612839560830905">MTU</translation> <translation id="188114911237521550">მუქი რეჟიმის გამორთვა</translation> @@ -797,6 +799,7 @@ <translation id="7978412674231730200">პირადი გასაღები</translation> <translation id="7982789257301363584">ქსელი</translation> <translation id="7994702968232966508">EAP მეთოდი</translation> +<translation id="8018928621986160031">შეინახა „<ph name="FILE_LOCATION" />“-ში</translation> <translation id="802154636333426148">ჩამოტვირთვა ვერ მოხერხდა</translation> <translation id="8031884997696620457">HSPAPlus</translation> <translation id="80398733265834479">ავტომატური ფერის რეჟიმის ჩართვა</translation>
diff --git a/chromeos/strings/chromeos_strings_km.xtb b/chromeos/strings/chromeos_strings_km.xtb index 896ad1e..07794bc 100644 --- a/chromeos/strings/chromeos_strings_km.xtb +++ b/chromeos/strings/chromeos_strings_km.xtb
@@ -118,6 +118,7 @@ <translation id="1851218745569890714">ការប្រជុំតាមវីដេអូ</translation> <translation id="1852934301711881861">ដំឡើង ChromeOS Flex</translation> <translation id="1856388568474281774">ព្រួញចុះក្រោម</translation> +<translation id="1858620243986915808">ភ្ជាប់រូបថតអេក្រង់</translation> <translation id="1871569928317311284">បិទរចនាប័ទ្មងងឹត</translation> <translation id="1874612839560830905">MTU</translation> <translation id="188114911237521550">បិទមុខងារងងឹត</translation>
diff --git a/chromeos/strings/chromeos_strings_ko.xtb b/chromeos/strings/chromeos_strings_ko.xtb index d1135b6..706d3831 100644 --- a/chromeos/strings/chromeos_strings_ko.xtb +++ b/chromeos/strings/chromeos_strings_ko.xtb
@@ -118,6 +118,7 @@ <translation id="1851218745569890714">화상 회의</translation> <translation id="1852934301711881861">ChromeOS Flex 설치</translation> <translation id="1856388568474281774">아래쪽 화살표</translation> +<translation id="1858620243986915808">스크린샷 첨부</translation> <translation id="1871569928317311284">어두운 테마 사용 중지</translation> <translation id="1874612839560830905">MTU</translation> <translation id="188114911237521550">어두운 모드 사용 중지</translation>
diff --git a/chromeos/strings/chromeos_strings_mk.xtb b/chromeos/strings/chromeos_strings_mk.xtb index ac306dc..89abe30 100644 --- a/chromeos/strings/chromeos_strings_mk.xtb +++ b/chromeos/strings/chromeos_strings_mk.xtb
@@ -92,6 +92,7 @@ <translation id="1644574205037202324">Историја</translation> <translation id="1645954272419197032">Потврдете ги податоците за уредот</translation> <translation id="1662989795263954667">Запрено - нема мастило</translation> +<translation id="1664796644829245314">Преглед на <ph name="PREVIEW_OBJECT" /></translation> <translation id="1668469839109562275">Вградена VPN</translation> <translation id="1672499492233627739">Видеоактивност на веб-камерата</translation> <translation id="1676557873873341166">Снимање видео</translation> @@ -118,6 +119,7 @@ <translation id="1851218745569890714">Видеоконференција</translation> <translation id="1852934301711881861">Инсталирај ChromeOS Flex</translation> <translation id="1856388568474281774">Стрелка надолу</translation> +<translation id="1858620243986915808">Приложете слика од екранот</translation> <translation id="1871569928317311284">Исклучи темна тема</translation> <translation id="1874612839560830905">MTU</translation> <translation id="188114911237521550">Исклучи темен режим</translation> @@ -797,6 +799,7 @@ <translation id="7978412674231730200">Приватен клуч</translation> <translation id="7982789257301363584">Мрежа</translation> <translation id="7994702968232966508">EAP-метод</translation> +<translation id="8018928621986160031">Зачувано на „<ph name="FILE_LOCATION" />“</translation> <translation id="802154636333426148">Неуспешно преземање</translation> <translation id="8031884997696620457">HSPAPlus</translation> <translation id="80398733265834479">Овозможете режим во автоматска боја</translation>
diff --git a/chromeos/strings/chromeos_strings_mn.xtb b/chromeos/strings/chromeos_strings_mn.xtb index 7b2f80c..57ef2ec7 100644 --- a/chromeos/strings/chromeos_strings_mn.xtb +++ b/chromeos/strings/chromeos_strings_mn.xtb
@@ -92,6 +92,7 @@ <translation id="1644574205037202324">Түүх</translation> <translation id="1645954272419197032">Төхөөрөмжийн мэдээллийг баталгаажуулна уу</translation> <translation id="1662989795263954667">Зогссон - Хэвлэгчийн хор дууссан</translation> +<translation id="1664796644829245314"><ph name="PREVIEW_OBJECT" />-г урьдчилан үзэх</translation> <translation id="1668469839109562275">Бүрэлдэхүүн VPN</translation> <translation id="1672499492233627739">Вебкамерын видео хангамж</translation> <translation id="1676557873873341166">Видео бичиж байна</translation> @@ -798,6 +799,7 @@ <translation id="7978412674231730200">Хувийн түлхүүр</translation> <translation id="7982789257301363584">Сүлжээ</translation> <translation id="7994702968232966508">EAP арга</translation> +<translation id="8018928621986160031">"<ph name="FILE_LOCATION" />"-д хадгалсан</translation> <translation id="802154636333426148">Татаж чадсангүй</translation> <translation id="8031884997696620457">HSPAPlus</translation> <translation id="80398733265834479">Автомат өнгөний горимыг идэвхжүүлэх</translation>
diff --git a/chromeos/strings/chromeos_strings_ms.xtb b/chromeos/strings/chromeos_strings_ms.xtb index 4b4ec06..d23778b 100644 --- a/chromeos/strings/chromeos_strings_ms.xtb +++ b/chromeos/strings/chromeos_strings_ms.xtb
@@ -92,6 +92,7 @@ <translation id="1644574205037202324">Sejarah</translation> <translation id="1645954272419197032">Sila sahkan maklumat peranti</translation> <translation id="1662989795263954667">Dihentikan - Kehabisan dakwat</translation> +<translation id="1664796644829245314">Pratonton <ph name="PREVIEW_OBJECT" /></translation> <translation id="1668469839109562275">VPN terbina dalam</translation> <translation id="1672499492233627739">Suapan video kamera web</translation> <translation id="1676557873873341166">Mengambil video</translation> @@ -797,6 +798,7 @@ <translation id="7978412674231730200">Kunci persendirian</translation> <translation id="7982789257301363584">Rangkaian</translation> <translation id="7994702968232966508">Kaedah EAP</translation> +<translation id="8018928621986160031">Simpan pada "<ph name="FILE_LOCATION" />"</translation> <translation id="802154636333426148">Muat turun gagal</translation> <translation id="8031884997696620457">HSPAPlus</translation> <translation id="80398733265834479">Dayakan mod warna automatik</translation>
diff --git a/chromeos/strings/chromeos_strings_no.xtb b/chromeos/strings/chromeos_strings_no.xtb index 8a30be4..a9045d35 100644 --- a/chromeos/strings/chromeos_strings_no.xtb +++ b/chromeos/strings/chromeos_strings_no.xtb
@@ -92,6 +92,7 @@ <translation id="1644574205037202324">Logg</translation> <translation id="1645954272419197032">Bekreft enhetsinformasjonen</translation> <translation id="1662989795263954667">Stoppet – tom for blekk</translation> +<translation id="1664796644829245314">Forhåndsvis <ph name="PREVIEW_OBJECT" /></translation> <translation id="1668469839109562275">Innebygd VPN</translation> <translation id="1672499492233627739">Videofeed fra nettkameraet</translation> <translation id="1676557873873341166">Tar opp video</translation> @@ -797,6 +798,7 @@ <translation id="7978412674231730200">Privatnøkkel</translation> <translation id="7982789257301363584">Nettverk</translation> <translation id="7994702968232966508">EAP-metode</translation> +<translation id="8018928621986160031">Lagret i «<ph name="FILE_LOCATION" />»</translation> <translation id="802154636333426148">Nedlastingen mislyktes</translation> <translation id="8031884997696620457">HSPAPlus</translation> <translation id="80398733265834479">Slå på automatisk fargemodus</translation>
diff --git a/chromeos/strings/chromeos_strings_ro.xtb b/chromeos/strings/chromeos_strings_ro.xtb index 4083901..2a24f3d 100644 --- a/chromeos/strings/chromeos_strings_ro.xtb +++ b/chromeos/strings/chromeos_strings_ro.xtb
@@ -92,6 +92,7 @@ <translation id="1644574205037202324">Istoric</translation> <translation id="1645954272419197032">Confirmă informațiile dispozitivului</translation> <translation id="1662989795263954667">Oprită – Cerneală epuizată</translation> +<translation id="1664796644829245314">Previzualizează <ph name="PREVIEW_OBJECT" /></translation> <translation id="1668469839109562275">Rețea VPN încorporată</translation> <translation id="1672499492233627739">Feed video de la camera web</translation> <translation id="1676557873873341166">Se înregistrează un videoclip</translation> @@ -797,6 +798,7 @@ <translation id="7978412674231730200">Cheie privată</translation> <translation id="7982789257301363584">Rețea</translation> <translation id="7994702968232966508">Metodă EAP</translation> +<translation id="8018928621986160031">S-au salvat în <ph name="FILE_LOCATION" /></translation> <translation id="802154636333426148">Descărcarea nu a reușit</translation> <translation id="8031884997696620457">HSPAPlus</translation> <translation id="80398733265834479">Activează modul de culoare automată</translation>
diff --git a/chromeos/strings/chromeos_strings_sk.xtb b/chromeos/strings/chromeos_strings_sk.xtb index fbb0683f..9e05414 100644 --- a/chromeos/strings/chromeos_strings_sk.xtb +++ b/chromeos/strings/chromeos_strings_sk.xtb
@@ -118,6 +118,7 @@ <translation id="1851218745569890714">Videokonferencie</translation> <translation id="1852934301711881861">Nainštalovať Chrome OS Flex</translation> <translation id="1856388568474281774">Šípka nadol</translation> +<translation id="1858620243986915808">Priložiť snímku obrazovky</translation> <translation id="1871569928317311284">Vypnúť tmavý motív</translation> <translation id="1874612839560830905">MTU</translation> <translation id="188114911237521550">Vypnúť tmavý režim</translation>
diff --git a/chromeos/strings/chromeos_strings_sr-Latn.xtb b/chromeos/strings/chromeos_strings_sr-Latn.xtb index 21a3b0f..91f62de 100644 --- a/chromeos/strings/chromeos_strings_sr-Latn.xtb +++ b/chromeos/strings/chromeos_strings_sr-Latn.xtb
@@ -118,6 +118,7 @@ <translation id="1851218745569890714">Video konferencije</translation> <translation id="1852934301711881861">Instaliraj Chrome OS Flex</translation> <translation id="1856388568474281774">Strelica nadole</translation> +<translation id="1858620243986915808">Priložite snimak ekrana</translation> <translation id="1871569928317311284">Isključite tamnu temu</translation> <translation id="1874612839560830905">MTU</translation> <translation id="188114911237521550">Isključite tamni režim</translation>
diff --git a/chromeos/strings/chromeos_strings_sr.xtb b/chromeos/strings/chromeos_strings_sr.xtb index 83b2888..3f79203 100644 --- a/chromeos/strings/chromeos_strings_sr.xtb +++ b/chromeos/strings/chromeos_strings_sr.xtb
@@ -118,6 +118,7 @@ <translation id="1851218745569890714">Видео конференције</translation> <translation id="1852934301711881861">Инсталирај Chrome OS Flex</translation> <translation id="1856388568474281774">Стрелица надоле</translation> +<translation id="1858620243986915808">Приложите снимак екрана</translation> <translation id="1871569928317311284">Искључите тамну тему</translation> <translation id="1874612839560830905">MTU</translation> <translation id="188114911237521550">Искључите тамни режим</translation>
diff --git a/chromeos/strings/chromeos_strings_th.xtb b/chromeos/strings/chromeos_strings_th.xtb index 98dc74cb..01cd2fc 100644 --- a/chromeos/strings/chromeos_strings_th.xtb +++ b/chromeos/strings/chromeos_strings_th.xtb
@@ -92,6 +92,7 @@ <translation id="1644574205037202324">ประวัติการเข้าชม</translation> <translation id="1645954272419197032">โปรดยืนยันข้อมูลอุปกรณ์</translation> <translation id="1662989795263954667">หยุดพิมพ์ - หมึกหมด</translation> +<translation id="1664796644829245314">ตัวอย่าง <ph name="PREVIEW_OBJECT" /></translation> <translation id="1668469839109562275">VPN ในตัว</translation> <translation id="1672499492233627739">ฟีดวิดีโอเว็บแคม</translation> <translation id="1676557873873341166">กำลังถ่ายวิดีโอ</translation> @@ -118,6 +119,7 @@ <translation id="1851218745569890714">การประชุมทางวิดีโอ</translation> <translation id="1852934301711881861">ติดตั้ง Chrome OS Flex</translation> <translation id="1856388568474281774">ลูกศรลง</translation> +<translation id="1858620243986915808">แนบภาพหน้าจอ</translation> <translation id="1871569928317311284">ปิดธีมมืด</translation> <translation id="1874612839560830905">MTU</translation> <translation id="188114911237521550">ปิดโหมดมืด</translation> @@ -797,6 +799,7 @@ <translation id="7978412674231730200">กุญแจส่วนตัว</translation> <translation id="7982789257301363584">เครือข่าย</translation> <translation id="7994702968232966508">วิธีการ EAP</translation> +<translation id="8018928621986160031">บันทึกลงใน "<ph name="FILE_LOCATION" />" แล้ว</translation> <translation id="802154636333426148">การดาวน์โหลดล้มเหลว</translation> <translation id="8031884997696620457">HSPAPlus</translation> <translation id="80398733265834479">เปิดใช้โหมดปรับสีอัตโนมัติ</translation>
diff --git a/components/arc/intent_helper/arc_intent_helper_bridge.cc b/components/arc/intent_helper/arc_intent_helper_bridge.cc index 7d3ff083..29b1c2e 100644 --- a/components/arc/intent_helper/arc_intent_helper_bridge.cc +++ b/components/arc/intent_helper/arc_intent_helper_bridge.cc
@@ -276,7 +276,6 @@ int32_t task_id) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - base::DictionaryValue intent_info; std::string mode_str = mode == arc::mojom::CameraIntentMode::PHOTO ? "photo" : "video"; @@ -433,8 +432,8 @@ std::string action = is_video ? "org.chromium.arc.intent_helper.ACTION_SEND_NEW_VIDEO" : "org.chromium.arc.intent_helper.ACTION_SEND_NEW_PICTURE"; - base::DictionaryValue value; - value.SetString("file_path", file_path); + base::Value::Dict value; + value.Set("file_path", file_path); std::string extras; base::JSONWriter::Write(value, &extras);
diff --git a/components/autofill/core/browser/data_model/autofill_profile_comparator.cc b/components/autofill/core/browser/data_model/autofill_profile_comparator.cc index f24164ec..b524e43f 100644 --- a/components/autofill/core/browser/data_model/autofill_profile_comparator.cc +++ b/components/autofill/core/browser/data_model/autofill_profile_comparator.cc
@@ -43,8 +43,6 @@ const ::i18n::phonenumbers::PhoneNumber& n) { os << "country_code: " << n.country_code() << " " << "national_number: " << n.national_number(); - if (n.has_extension()) - os << " extension: \"" << n.extension() << "\""; if (n.has_italian_leading_zero()) os << " italian_leading_zero: " << n.italian_leading_zero(); if (n.has_number_of_leading_zeros()) @@ -718,11 +716,6 @@ HasInternationalCountryCode(n1) ? n1.country_code() : n2.country_code()); merged_number.set_national_number( std::max(n1.national_number(), n2.national_number())); - if (n1.has_extension() && !n1.extension().empty()) { - merged_number.set_extension(n1.extension()); - } else if (n2.has_extension() && !n2.extension().empty()) { - merged_number.set_extension(n2.extension()); - } if (n1.has_italian_leading_zero() || n2.has_italian_leading_zero()) { merged_number.set_italian_leading_zero(n1.italian_leading_zero() || n2.italian_leading_zero());
diff --git a/components/autofill/core/browser/data_model/autofill_profile_comparator_unittest.cc b/components/autofill/core/browser/data_model/autofill_profile_comparator_unittest.cc index 3f9ea80..db7c4de3 100644 --- a/components/autofill/core/browser/data_model/autofill_profile_comparator_unittest.cc +++ b/components/autofill/core/browser/data_model/autofill_profile_comparator_unittest.cc
@@ -45,7 +45,6 @@ using autofill::PHONE_HOME_CITY_AND_NUMBER; using autofill::PHONE_HOME_CITY_CODE; using autofill::PHONE_HOME_COUNTRY_CODE; -using autofill::PHONE_HOME_EXTENSION; using autofill::PHONE_HOME_NUMBER; using autofill::PHONE_HOME_WHOLE_NUMBER; @@ -276,8 +275,6 @@ actual.GetInfo(AutofillType(PHONE_HOME_CITY_CODE), kLocale)); EXPECT_EQ(expected.GetInfo(AutofillType(PHONE_HOME_NUMBER), kLocale), actual.GetInfo(AutofillType(PHONE_HOME_NUMBER), kLocale)); - EXPECT_EQ(expected.GetInfo(AutofillType(PHONE_HOME_EXTENSION), kLocale), - actual.GetInfo(AutofillType(PHONE_HOME_EXTENSION), kLocale)); } void MergeAddressesAndExpect(const AutofillProfile& a, @@ -653,30 +650,14 @@ TEST_P(AutofillProfileComparatorTest, HaveMergeablePhoneNumbers) { AutofillProfile empty = CreateProfileWithPhoneNumber(""); AutofillProfile p1 = CreateProfileWithPhoneNumber("+1 (800) 670-8700"); - AutofillProfile p2 = CreateProfileWithPhoneNumber("800.670.8700x321"); - AutofillProfile p3 = CreateProfileWithPhoneNumber("670-8700 ext321"); - AutofillProfile p4 = CreateProfileWithPhoneNumber("6708700"); + AutofillProfile p2 = CreateProfileWithPhoneNumber("6708700"); AutofillProfile different = CreateProfileWithPhoneNumber("1-800-321-4567"); EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p1, p1)); EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p1, p2)); - EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p1, p3)); - EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p1, p4)); EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p2, p1)); EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p2, p2)); - EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p2, p3)); - EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p2, p4)); - - EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p3, p1)); - EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p3, p2)); - EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p3, p3)); - EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p3, p4)); - - EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p4, p1)); - EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p4, p2)); - EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p4, p3)); - EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p4, p4)); EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p1, empty)); EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(empty, p2)); @@ -780,7 +761,7 @@ {ADDRESS_HOME_LINE1, u"123 zoo st. w., #5"}, {ADDRESS_HOME_LINE1, u""}, {ADDRESS_HOME_STATE, u"california"}, - {PHONE_HOME_WHOLE_NUMBER, u"5678910 ext. 77"}}); + {PHONE_HOME_WHOLE_NUMBER, u"5678910"}}); AutofillProfile not_mergeable_by_name = CopyAndModify(p, {{NAME_FIRST, u"Steven"}, {NAME_FULL, u""}, @@ -1074,143 +1055,50 @@ } TEST_P(AutofillProfileComparatorTest, MergePhoneNumbers_NA) { - static const char kPhoneA[] = "5550199"; - static const char16_t kPhoneA16[] = u"5550199"; - static const char kPhoneB[] = "555.0199"; - static const char16_t kPhoneB16[] = u"555.0199"; - static const char kPhoneC[] = "555-0199 ext321"; - static const char16_t kPhoneC16[] = u"555-0199 ext321"; - static const char kPhoneD[] = "8005550199"; - static const char16_t kPhoneD16[] = u"8005550199"; - static const char kPhoneE[] = "800-555-0199 #321"; - static const char16_t kPhoneE16[] = u"800-555-0199 #321"; - static const char kPhoneF[] = "1-800-555-0199 #321"; - static const char16_t kPhoneF16[] = u"1-800-555-0199 #321"; - static const char kPhoneG[] = "+1 (800) 555.0199;ext=321"; - static const char16_t kPhoneG16[] = u"+1 (800) 555.0199;ext=321"; - static const char16_t kMergedShortNumber[] = u"555-0199"; - static const char16_t kMergedShortNumberExt[] = u"555-0199 ext. 321"; - static const char16_t kMergedNationalNumber[] = u"(800) 555-0199"; - static const char16_t kMergedNationalNumberExt[] = u"(800) 555-0199 ext. 321"; - static const char16_t kMergedFullNumberExt[] = u"+1 800-555-0199 ext. 321"; - - AutofillProfile profile_a = CreateProfileWithPhoneNumber(kPhoneA); - AutofillProfile profile_b = CreateProfileWithPhoneNumber(kPhoneB); - AutofillProfile profile_c = CreateProfileWithPhoneNumber(kPhoneC); - AutofillProfile profile_d = CreateProfileWithPhoneNumber(kPhoneD); - AutofillProfile profile_e = CreateProfileWithPhoneNumber(kPhoneE); - AutofillProfile profile_f = CreateProfileWithPhoneNumber(kPhoneF); - AutofillProfile profile_g = CreateProfileWithPhoneNumber(kPhoneG); + AutofillProfile profile_a = CreateProfileWithPhoneNumber("5550199"); + AutofillProfile profile_b = CreateProfileWithPhoneNumber("555.0199"); + AutofillProfile profile_c = CreateProfileWithPhoneNumber("8005550199"); // Profile A - MergePhoneNumbersAndExpect(profile_a, profile_a, kPhoneA16); - MergePhoneNumbersAndExpect(profile_a, profile_b, kMergedShortNumber); - MergePhoneNumbersAndExpect(profile_a, profile_c, kMergedShortNumberExt); - MergePhoneNumbersAndExpect(profile_a, profile_d, kMergedNationalNumber); - MergePhoneNumbersAndExpect(profile_a, profile_e, kMergedNationalNumberExt); - MergePhoneNumbersAndExpect(profile_a, profile_f, kMergedFullNumberExt); - MergePhoneNumbersAndExpect(profile_a, profile_g, kMergedFullNumberExt); + MergePhoneNumbersAndExpect(profile_a, profile_a, u"5550199"); + MergePhoneNumbersAndExpect(profile_a, profile_b, u"555-0199"); + MergePhoneNumbersAndExpect(profile_a, profile_c, u"(800) 555-0199"); // Profile B - MergePhoneNumbersAndExpect(profile_b, profile_a, kMergedShortNumber); - MergePhoneNumbersAndExpect(profile_b, profile_b, kPhoneB16); - MergePhoneNumbersAndExpect(profile_b, profile_c, kMergedShortNumberExt); - MergePhoneNumbersAndExpect(profile_b, profile_d, kMergedNationalNumber); - MergePhoneNumbersAndExpect(profile_b, profile_e, kMergedNationalNumberExt); - MergePhoneNumbersAndExpect(profile_b, profile_f, kMergedFullNumberExt); - MergePhoneNumbersAndExpect(profile_b, profile_g, kMergedFullNumberExt); - - // Profile C - MergePhoneNumbersAndExpect(profile_c, profile_a, kMergedShortNumberExt); - MergePhoneNumbersAndExpect(profile_c, profile_b, kMergedShortNumberExt); - MergePhoneNumbersAndExpect(profile_c, profile_c, kPhoneC16); - MergePhoneNumbersAndExpect(profile_c, profile_d, kMergedNationalNumberExt); - MergePhoneNumbersAndExpect(profile_c, profile_e, kMergedNationalNumberExt); - MergePhoneNumbersAndExpect(profile_c, profile_f, kMergedFullNumberExt); - MergePhoneNumbersAndExpect(profile_c, profile_g, kMergedFullNumberExt); + MergePhoneNumbersAndExpect(profile_b, profile_a, u"555-0199"); + MergePhoneNumbersAndExpect(profile_b, profile_b, u"555.0199"); + MergePhoneNumbersAndExpect(profile_b, profile_c, u"(800) 555-0199"); // Profile D - MergePhoneNumbersAndExpect(profile_d, profile_a, kMergedNationalNumber); - MergePhoneNumbersAndExpect(profile_d, profile_b, kMergedNationalNumber); - MergePhoneNumbersAndExpect(profile_d, profile_c, kMergedNationalNumberExt); - MergePhoneNumbersAndExpect(profile_d, profile_d, kPhoneD16); - MergePhoneNumbersAndExpect(profile_d, profile_e, kMergedNationalNumberExt); - MergePhoneNumbersAndExpect(profile_d, profile_f, kMergedFullNumberExt); - MergePhoneNumbersAndExpect(profile_d, profile_g, kMergedFullNumberExt); - - // Profile E - MergePhoneNumbersAndExpect(profile_e, profile_a, kMergedNationalNumberExt); - MergePhoneNumbersAndExpect(profile_e, profile_b, kMergedNationalNumberExt); - MergePhoneNumbersAndExpect(profile_e, profile_c, kMergedNationalNumberExt); - MergePhoneNumbersAndExpect(profile_e, profile_d, kMergedNationalNumberExt); - MergePhoneNumbersAndExpect(profile_e, profile_e, kPhoneE16); - MergePhoneNumbersAndExpect(profile_e, profile_f, kMergedFullNumberExt); - MergePhoneNumbersAndExpect(profile_e, profile_g, kMergedFullNumberExt); - - // Profile F - MergePhoneNumbersAndExpect(profile_f, profile_a, kMergedFullNumberExt); - MergePhoneNumbersAndExpect(profile_f, profile_b, kMergedFullNumberExt); - MergePhoneNumbersAndExpect(profile_f, profile_c, kMergedFullNumberExt); - MergePhoneNumbersAndExpect(profile_f, profile_d, kMergedFullNumberExt); - MergePhoneNumbersAndExpect(profile_f, profile_e, kMergedFullNumberExt); - MergePhoneNumbersAndExpect(profile_f, profile_f, kPhoneF16); - MergePhoneNumbersAndExpect(profile_f, profile_g, kMergedFullNumberExt); - - // Profile G - MergePhoneNumbersAndExpect(profile_g, profile_a, kMergedFullNumberExt); - MergePhoneNumbersAndExpect(profile_g, profile_b, kMergedFullNumberExt); - MergePhoneNumbersAndExpect(profile_g, profile_c, kMergedFullNumberExt); - MergePhoneNumbersAndExpect(profile_g, profile_d, kMergedFullNumberExt); - MergePhoneNumbersAndExpect(profile_g, profile_e, kMergedFullNumberExt); - MergePhoneNumbersAndExpect(profile_g, profile_f, kMergedFullNumberExt); - MergePhoneNumbersAndExpect(profile_g, profile_g, kPhoneG16); + MergePhoneNumbersAndExpect(profile_c, profile_a, u"(800) 555-0199"); + MergePhoneNumbersAndExpect(profile_c, profile_b, u"(800) 555-0199"); + MergePhoneNumbersAndExpect(profile_c, profile_c, u"8005550199"); } TEST_P(AutofillProfileComparatorTest, MergePhoneNumbers_Intl) { - const std::u16string kGermany = u"DE"; - const AutofillType kCountry(ADDRESS_HOME_COUNTRY); + AutofillProfile profile_a = CreateProfileWithPhoneNumber("+49492180185611"); + AutofillProfile profile_b = + CreateProfileWithPhoneNumber("+49 4921 801 856-11"); + AutofillProfile profile_c = CreateProfileWithPhoneNumber("04921 80185611"); - static const char kPhoneA[] = "+49492180185611"; - static const char16_t kPhoneA16[] = u"+49492180185611"; - static const char kPhoneB[] = "+49 4921 801 856-11"; - static const char16_t kPhoneB16[] = u"+49 4921 801 856-11"; - static const char kPhoneC[] = "+49 4921 8018 5611;ext=22"; - static const char16_t kPhoneC16[] = u"+49 4921 8018 5611;ext=22"; - static const char kPhoneD[] = "04921 80185611"; // National Format. - static const char16_t kPhoneD16[] = u"04921 80185611"; // National Format. - static const char16_t kMergedFullNumber[] = u"+49 4921 80185611"; - static const char16_t kMergedFullNumberExt[] = u"+49 4921 80185611 ext. 22"; - - AutofillProfile profile_a = CreateProfileWithPhoneNumber(kPhoneA); - AutofillProfile profile_b = CreateProfileWithPhoneNumber(kPhoneB); - AutofillProfile profile_c = CreateProfileWithPhoneNumber(kPhoneC); - AutofillProfile profile_d = CreateProfileWithPhoneNumber(kPhoneD); - - profile_a.SetInfo(kCountry, kGermany, kLocale); - profile_b.SetInfo(kCountry, kGermany, kLocale); - profile_c.SetInfo(kCountry, kGermany, kLocale); - profile_d.SetInfo(kCountry, kGermany, kLocale); + profile_a.SetInfo(ADDRESS_HOME_COUNTRY, u"DE", kLocale); + profile_b.SetInfo(ADDRESS_HOME_COUNTRY, u"DE", kLocale); + profile_c.SetInfo(ADDRESS_HOME_COUNTRY, u"DE", kLocale); // Profile A - MergePhoneNumbersAndExpect(profile_a, profile_a, kPhoneA16); - MergePhoneNumbersAndExpect(profile_a, profile_b, kMergedFullNumber); - MergePhoneNumbersAndExpect(profile_a, profile_c, kMergedFullNumberExt); + MergePhoneNumbersAndExpect(profile_a, profile_a, u"+49492180185611"); + MergePhoneNumbersAndExpect(profile_a, profile_b, u"+49 4921 80185611"); + MergePhoneNumbersAndExpect(profile_a, profile_c, u"+49 4921 80185611"); // Profile B - MergePhoneNumbersAndExpect(profile_b, profile_a, kMergedFullNumber); - MergePhoneNumbersAndExpect(profile_b, profile_b, kPhoneB16); - MergePhoneNumbersAndExpect(profile_b, profile_c, kMergedFullNumberExt); - - // Profile C - MergePhoneNumbersAndExpect(profile_c, profile_a, kMergedFullNumberExt); - MergePhoneNumbersAndExpect(profile_c, profile_b, kMergedFullNumberExt); - MergePhoneNumbersAndExpect(profile_c, profile_c, kPhoneC16); + MergePhoneNumbersAndExpect(profile_b, profile_a, u"+49 4921 80185611"); + MergePhoneNumbersAndExpect(profile_b, profile_b, u"+49 4921 801 856-11"); + MergePhoneNumbersAndExpect(profile_b, profile_c, u"+49 4921 80185611"); // Profile D - MergePhoneNumbersAndExpect(profile_d, profile_a, kMergedFullNumber); - MergePhoneNumbersAndExpect(profile_d, profile_b, kMergedFullNumber); - MergePhoneNumbersAndExpect(profile_d, profile_c, kMergedFullNumberExt); - MergePhoneNumbersAndExpect(profile_d, profile_d, kPhoneD16); + MergePhoneNumbersAndExpect(profile_c, profile_a, u"+49 4921 80185611"); + MergePhoneNumbersAndExpect(profile_c, profile_b, u"+49 4921 80185611"); + MergePhoneNumbersAndExpect(profile_c, profile_c, u"04921 80185611"); } TEST_P(AutofillProfileComparatorTest, MergeAddresses) {
diff --git a/components/autofill/core/browser/data_model/phone_number.cc b/components/autofill/core/browser/data_model/phone_number.cc index ab2cb14..7dfb2bc4 100644 --- a/components/autofill/core/browser/data_model/phone_number.cc +++ b/components/autofill/core/browser/data_model/phone_number.cc
@@ -274,6 +274,8 @@ } case PHONE_HOME_EXTENSION: + // Autofill doesn't support filling extensions, but some basic local + // heuristics classify them. return std::u16string(); default: @@ -306,6 +308,16 @@ // doesn't contain formatting marks. if (base::ContainsOnlyChars(number_, u"+0123456789")) { number_ = cached_parsed_phone_.GetFormattedNumber(); + } else { + // Strip `number_` of extensions, e.g. "(123)-123 ext. 123" -> "(123)-123". + // In the if case, this is done by `GetFormattedNumber()` already. To + // preserve the formatting, everything after the last digit of the whole + // number is removed manually here. The whole number only consists of digits + // and has any extensions removed already. + size_t i = 0; + for (auto digit : cached_parsed_phone_.GetWholeNumber()) + i = number_.find(digit, i) + 1; // Skip `digit`. + number_ = number_.substr(0, i); } return true; }
diff --git a/components/autofill/core/browser/data_model/phone_number_unittest.cc b/components/autofill/core/browser/data_model/phone_number_unittest.cc index 2d753b20..98d7379d 100644 --- a/components/autofill/core/browser/data_model/phone_number_unittest.cc +++ b/components/autofill/core/browser/data_model/phone_number_unittest.cc
@@ -411,6 +411,18 @@ } } +// Tests that extensions are not stored and even stripped from the raw info. +TEST(PhoneNumberTest, Extension) { + AutofillProfile profile; + PhoneNumber phone(&profile); + const std::string locale = "en-US"; + EXPECT_TRUE(phone.SetInfo(PHONE_HOME_WHOLE_NUMBER, u"(650) 234-2345 ext. 234", + locale)); + EXPECT_EQ(u"(650) 234-2345", phone.GetRawInfo(PHONE_HOME_WHOLE_NUMBER)); + EXPECT_EQ(u"6502342345", phone.GetInfo(PHONE_HOME_WHOLE_NUMBER, locale)); + EXPECT_TRUE(phone.GetInfo(PHONE_HOME_EXTENSION, locale).empty()); +} + // Tests whether the |PHONE_HOME_COUNTRY_CODE| is added to the set of matching // types. TEST(PhoneNumberTest, CountryCodeInMatchingTypes) {
diff --git a/components/autofill/core/browser/field_types.h b/components/autofill/core/browser/field_types.h index 5427dec..b68b3ef 100644 --- a/components/autofill/core/browser/field_types.h +++ b/components/autofill/core/browser/field_types.h
@@ -137,6 +137,7 @@ CREDIT_CARD_NAME_FIRST = 91, CREDIT_CARD_NAME_LAST = 92, + // Extensions are detected, but not filled. PHONE_HOME_EXTENSION = 93, // PROBABLY_ACCOUNT_CREATION_PASSWORD value 94 is deprecated.
diff --git a/components/autofill/core/browser/form_parsing/form_field_unittest.cc b/components/autofill/core/browser/form_parsing/form_field_unittest.cc index b9c1673..3c5e8e45 100644 --- a/components/autofill/core/browser/form_parsing/form_field_unittest.cc +++ b/components/autofill/core/browser/form_parsing/form_field_unittest.cc
@@ -12,6 +12,7 @@ #include "components/autofill/core/browser/form_parsing/autofill_scanner.h" #include "components/autofill/core/browser/form_parsing/buildflags.h" #include "components/autofill/core/browser/form_parsing/form_field.h" +#include "components/autofill/core/browser/form_parsing/parsing_test_utils.h" #include "components/autofill/core/browser/form_structure.h" #include "components/autofill/core/common/autofill_features.h" #include "components/autofill/core/common/autofill_payments_features.h" @@ -22,52 +23,46 @@ namespace autofill { -namespace { -FieldRendererId MakeFieldRendererId() { - static uint64_t id_counter_ = 0; - return FieldRendererId(++id_counter_); -} - -// Sets both the field label and parseable label to |label|. -void SetFieldLabels(AutofillField* field, const std::u16string& label) { - field->label = label; - field->set_parseable_label(label); -} - -} // namespace - class FormFieldTest - : public testing::TestWithParam<std::tuple<bool, PatternSource>> { + : public FormFieldTestBase, + public ::testing::TestWithParam<PatternProviderFeatureState> { public: - FormFieldTest() { - scoped_feature_list_.InitWithFeatureState( - features::kAutofillParsingPatternProvider, - enable_parsing_pattern_provider()); - } + FormFieldTest() : FormFieldTestBase(GetParam()) {} FormFieldTest(const FormFieldTest&) = delete; FormFieldTest& operator=(const FormFieldTest&) = delete; - ~FormFieldTest() override = default; - bool enable_parsing_pattern_provider() const { - return std::get<0>(GetParam()); + protected: + // Parses all added fields using `ParseFormFields`. + // Returns the number of fields parsed. + int ParseFormFields() { + field_candidates_map_ = FormField::ParseFormFields(list_, LanguageCode(""), + /*is_form_tag=*/true, + GetActivePatternSource(), + /*log_manager=*/nullptr); + return field_candidates_map_.size(); } - PatternSource pattern_source() const { return std::get<1>(GetParam()); } + // Like `ParseFormFields()`, but using `ParseSingleFieldForms()` instead. + int ParseSingleFieldForms() { + FormField::ParseSingleFieldForms( + list_, LanguageCode(""), + /*is_form_tag=*/true, GetActivePatternSource(), &field_candidates_map_); + return field_candidates_map_.size(); + } - private: - base::test::ScopedFeatureList scoped_feature_list_; + // FormFieldTestBase: + // This function is unused in these unit tests, because FormField is not a + // parser itself, but the infrastructure combining them. + std::unique_ptr<FormField> Parse(AutofillScanner* scanner, + const LanguageCode& page_language) override { + return nullptr; + } }; -INSTANTIATE_TEST_SUITE_P(FormFieldTest, - FormFieldTest, - ::testing::Combine(::testing::Bool(), - ::testing::Values( -#if BUILDFLAG(USE_INTERNAL_AUTOFILL_HEADERS) - PatternSource::kDefault, - PatternSource::kExperimental, - PatternSource::kNextGen, -#endif - PatternSource::kLegacy))); +INSTANTIATE_TEST_SUITE_P( + FormFieldTest, + FormFieldTest, + ::testing::ValuesIn(PatternProviderFeatureState::All())); struct MatchTestCase { std::u16string label; @@ -112,7 +107,8 @@ constexpr MatchParams kMatchLabel{{MatchAttribute::kLabel}, {}}; AutofillField field; SCOPED_TRACE("label = " + base::UTF16ToUTF8(label)); - SetFieldLabels(&field, label); + field.label = label; + field.set_parseable_label(label); for (const auto& pattern : positive_patterns) { SCOPED_TRACE("positive_pattern = " + base::UTF16ToUTF8(pattern)); EXPECT_TRUE(FormField::MatchForTesting(&field, pattern, kMatchLabel)); @@ -124,90 +120,32 @@ } // Test that we ignore checkable elements. -TEST_P(FormFieldTest, ParseFormFields) { - std::vector<std::unique_ptr<AutofillField>> fields; - FormFieldData field_data; - field_data.form_control_type = "text"; - - field_data.check_status = FormFieldData::CheckStatus::kCheckableButUnchecked; - field_data.label = u"Is PO Box"; - field_data.unique_renderer_id = MakeFieldRendererId(); - fields.push_back(std::make_unique<AutofillField>(field_data)); - - // Does not parse since there are only field and it's checkable. - // An empty page_language means the language is unknown and patterns of all - // languages are used. - EXPECT_TRUE(FormField::ParseFormFields(fields, LanguageCode(""), - /*is_form_tag=*/true, pattern_source(), - /*log_manager=*/nullptr) - .empty()); - - // reset |is_checkable| to false. - field_data.check_status = FormFieldData::CheckStatus::kNotCheckable; - field_data.label = u"Address line1"; - field_data.unique_renderer_id = MakeFieldRendererId(); - fields.push_back(std::make_unique<AutofillField>(field_data)); - - // Parse a single address line 1 field. - ASSERT_EQ(0u, - FormField::ParseFormFields(fields, LanguageCode(""), - /*is_form_tag=*/true, pattern_source(), - /*log_manager=*/nullptr) - .size()); - - // Parses address line 1 and 2. - field_data.label = u"Address line2"; - field_data.unique_renderer_id = MakeFieldRendererId(); - fields.push_back(std::make_unique<AutofillField>(field_data)); - - // An empty page_language means the language is unknown and patterns of - // all languages are used. - ASSERT_EQ(0u, - FormField::ParseFormFields(fields, LanguageCode(""), - /*is_form_tag=*/true, pattern_source(), - /*log_manager=*/nullptr) - .size()); +TEST_P(FormFieldTest, ParseFormFieldsIgnoreCheckableElements) { + AddFormFieldData("checkbox", "", "Is PO Box", UNKNOWN_TYPE); + // Add 3 dummy fields to reach kMinRequiredFieldsForHeuristics = 3. + AddTextFormFieldData("", "Address line 1", ADDRESS_HOME_LINE1); + AddTextFormFieldData("", "Address line 2", ADDRESS_HOME_LINE2); + AddTextFormFieldData("", "Address line 3", ADDRESS_HOME_LINE3); + EXPECT_EQ(3, ParseFormFields()); + TestClassificationExpectations(); } // Test that the minimum number of required fields for the heuristics considers // whether a field is actually fillable. -TEST_P(FormFieldTest, ParseFormFieldEnforceMinFillableFields) { - std::vector<std::unique_ptr<AutofillField>> fields; - FormFieldData field_data; - field_data.form_control_type = "text"; - - field_data.label = u"Address line 1"; - field_data.unique_renderer_id = MakeFieldRendererId(); - fields.push_back(std::make_unique<AutofillField>(field_data)); - - field_data.label = u"Address line 2"; - field_data.unique_renderer_id = MakeFieldRendererId(); - fields.push_back(std::make_unique<AutofillField>(field_data)); - +TEST_P(FormFieldTest, ParseFormFieldsEnforceMinFillableFields) { + AddTextFormFieldData("", "Address line 1", ADDRESS_HOME_LINE1); + AddTextFormFieldData("", "Address line 2", ADDRESS_HOME_LINE2); // Don't parse forms with 2 fields. - // An empty page_language means the language is unknown and patterns of all - // languages are used. - EXPECT_EQ(0u, - FormField::ParseFormFields(fields, LanguageCode(""), - /*is_form_tag=*/true, pattern_source(), - /*log_manager=*/nullptr) - .size()); + EXPECT_EQ(0, ParseFormFields()); - field_data.label = u"Search"; - field_data.unique_renderer_id = MakeFieldRendererId(); - fields.push_back(std::make_unique<AutofillField>(field_data)); - + AddTextFormFieldData("", "Search", SEARCH_TERM); // Before the fix in kAutofillFixFillableFieldTypes, we would parse the form // now, although a search field is not fillable. { base::test::ScopedFeatureList feature_list; feature_list.InitAndDisableFeature(kAutofillFixFillableFieldTypes); - // An empty page_language means the language is unknown and patterns of all - // languages are used. - EXPECT_EQ(3u, FormField::ParseFormFields( - fields, LanguageCode(""), /*is_form_tag=*/true, - pattern_source(), /*log_manager=*/nullptr) - .size()); + EXPECT_EQ(3, ParseFormFields()); + TestClassificationExpectations(); } // With the fix, we don't parse the form because search fields are not @@ -215,26 +153,14 @@ { base::test::ScopedFeatureList feature_list; feature_list.InitAndEnableFeature(kAutofillFixFillableFieldTypes); - // An empty page_language means the language is unknown and patterns of all - // languages are used. - const FieldCandidatesMap field_candidates_map = FormField::ParseFormFields( - fields, LanguageCode(""), /*is_form_tag=*/true, pattern_source(), - /*log_manager=*/nullptr); - EXPECT_EQ(0u, FormField::ParseFormFields( - fields, LanguageCode(""), /*is_form_tag=*/true, - pattern_source(), /*log_manager=*/nullptr) - .size()); + EXPECT_EQ(0, ParseFormFields()); } } // Test that the parseable label is used when the feature is enabled. TEST_P(FormFieldTest, TestParseableLabels) { - FormFieldData field_data; - field_data.form_control_type = "text"; - - field_data.label = u"not a parseable label"; - field_data.unique_renderer_id = MakeFieldRendererId(); - auto autofill_field = std::make_unique<AutofillField>(field_data); + AddTextFormFieldData("", "not a parseable label", UNKNOWN_TYPE); + AutofillField* autofill_field = list_.back().get(); autofill_field->set_parseable_label(u"First Name"); constexpr MatchParams kMatchLabel{{MatchAttribute::kLabel}, {}}; @@ -242,80 +168,50 @@ base::test::ScopedFeatureList feature_list; feature_list.InitAndEnableFeature( features::kAutofillEnableSupportForParsingWithSharedLabels); - EXPECT_TRUE(FormField::MatchForTesting(autofill_field.get(), u"First Name", - kMatchLabel)); + EXPECT_TRUE( + FormField::MatchForTesting(autofill_field, u"First Name", kMatchLabel)); } { base::test::ScopedFeatureList feature_list; feature_list.InitAndDisableFeature( features::kAutofillEnableSupportForParsingWithSharedLabels); - EXPECT_FALSE(FormField::MatchForTesting(autofill_field.get(), u"First Name", - kMatchLabel)); + EXPECT_FALSE( + FormField::MatchForTesting(autofill_field, u"First Name", kMatchLabel)); } } -// Test to invoke |ParseSingleFieldForms| in the code path of |ParseFormFields|. +// Tests that `ParseSingleFieldForms` is called as part of `ParseFormFields`. TEST_P(FormFieldTest, ParseSingleFieldFormsInsideParseFormField) { base::test::ScopedFeatureList scoped_feature; scoped_feature.InitAndEnableFeature( features::kAutofillParseMerchantPromoCodeFields); - std::vector<std::unique_ptr<AutofillField>> fields; - FormFieldData field_data; - field_data.form_control_type = "text"; + AddTextFormFieldData("", "Phone", PHONE_HOME_WHOLE_NUMBER); + AddTextFormFieldData("", "Email", EMAIL_ADDRESS); + AddTextFormFieldData("", "Promo code", MERCHANT_PROMO_CODE); - field_data.label = u"phone"; - field_data.unique_renderer_id = MakeFieldRendererId(); - fields.push_back(std::make_unique<AutofillField>(field_data)); - - field_data.label = u"email"; - field_data.unique_renderer_id = MakeFieldRendererId(); - fields.push_back(std::make_unique<AutofillField>(field_data)); - - field_data.label = u"Promo code"; - field_data.unique_renderer_id = MakeFieldRendererId(); - fields.push_back(std::make_unique<AutofillField>(field_data)); - - // |ParseSingleFieldForms| should also detect promo code. - EXPECT_EQ(3u, - FormField::ParseFormFields(fields, LanguageCode(""), - /*is_form_tag=*/true, pattern_source()) - .size()); + // `ParseSingleFieldForms` should detect the promo code. + EXPECT_EQ(3, ParseFormFields()); + TestClassificationExpectations(); } -// Test that |ParseSingleFieldForms| parses single field promo codes. +// Test that `ParseSingleFieldForms` parses single field promo codes. TEST_P(FormFieldTest, ParseSingleFieldFormsPromoCode) { base::test::ScopedFeatureList scoped_feature; scoped_feature.InitAndEnableFeature( features::kAutofillParseMerchantPromoCodeFields); - std::vector<std::unique_ptr<AutofillField>> fields; - FormFieldData field_data; - field_data.form_control_type = "text"; - FieldCandidatesMap field_candidates; - // Parse single field promo code. - field_data.label = u"Promo code"; - field_data.unique_renderer_id = MakeFieldRendererId(); - fields.push_back(std::make_unique<AutofillField>(field_data)); - - FormField::ParseSingleFieldForms(fields, LanguageCode(""), - /*is_form_tag=*/true, pattern_source(), - &field_candidates); - EXPECT_EQ(1u, field_candidates.size()); - - field_candidates.clear(); + AddTextFormFieldData("", "Promo code", MERCHANT_PROMO_CODE); + EXPECT_EQ(1, ParseSingleFieldForms()); + TestClassificationExpectations(); // Don't parse other fields. - field_data.label = u"Address line 1"; - field_data.unique_renderer_id = MakeFieldRendererId(); - fields.push_back(std::make_unique<AutofillField>(field_data)); - - // Still only the promo code field should be parsed. - FormField::ParseSingleFieldForms(fields, LanguageCode(""), - /*is_form_tag=*/true, pattern_source(), - &field_candidates); - EXPECT_EQ(1u, field_candidates.size()); + // UNKNOWN_TYPE is used as the expected type, which prevents it from being + // part of the expectations in `TestClassificationExpectations()`. + AddTextFormFieldData("", "Address line 1", UNKNOWN_TYPE); + EXPECT_EQ(1, ParseSingleFieldForms()); + TestClassificationExpectations(); } struct ParseInAnyOrderTestcase {
diff --git a/components/autofill/core/browser/form_parsing/parsing_test_utils.cc b/components/autofill/core/browser/form_parsing/parsing_test_utils.cc index e4930640..eb2e450 100644 --- a/components/autofill/core/browser/form_parsing/parsing_test_utils.cc +++ b/components/autofill/core/browser/form_parsing/parsing_test_utils.cc
@@ -111,32 +111,22 @@ } void FormFieldTestBase::TestClassificationExpectations() { - for (const auto [field_id, field_type] : expected_classifications_) { - if (field_type != UNKNOWN_TYPE) { - SCOPED_TRACE(testing::Message() - << "Found type " - << AutofillType::ServerFieldTypeToString( - field_candidates_map_[field_id].BestHeuristicType()) - << ", expected type " - << AutofillType::ServerFieldTypeToString(field_type)); - - ASSERT_TRUE(field_candidates_map_.find(field_id) != - field_candidates_map_.end()); - EXPECT_EQ(field_type, - field_candidates_map_[field_id].BestHeuristicType()); - } else { - SCOPED_TRACE( - testing::Message() - << "Expected type UNKNOWN_TYPE but got " - << AutofillType::ServerFieldTypeToString( - field_candidates_map_.find(field_id) != - field_candidates_map_.end() - ? field_candidates_map_[field_id].BestHeuristicType() - : UNKNOWN_TYPE)); - EXPECT_EQ(field_candidates_map_.find(field_id), - field_candidates_map_.end()); - } + size_t num_classifications = 0; + for (const auto [field_id, expected_field_type] : expected_classifications_) { + ServerFieldType actual_field_type = + field_candidates_map_.contains(field_id) + ? field_candidates_map_[field_id].BestHeuristicType() + : UNKNOWN_TYPE; + SCOPED_TRACE(testing::Message() + << "Found type " + << AutofillType::ServerFieldTypeToString(actual_field_type) + << ", expected type " + << AutofillType::ServerFieldTypeToString(expected_field_type)); + EXPECT_EQ(expected_field_type, actual_field_type); + num_classifications += expected_field_type != UNKNOWN_TYPE; } + // There shouldn't be any classifications for other fields. + EXPECT_EQ(num_classifications, field_candidates_map_.size()); } FieldRendererId FormFieldTestBase::MakeFieldRendererId() {
diff --git a/components/autofill/core/browser/form_parsing/phone_field.cc b/components/autofill/core/browser/form_parsing/phone_field.cc index 6015259..2f2a8fa 100644 --- a/components/autofill/core/browser/form_parsing/phone_field.cc +++ b/components/autofill/core/browser/form_parsing/phone_field.cc
@@ -60,79 +60,80 @@ // <ac> - area code field. // <phone> - phone or prefix. // <suffix> - suffix. -// <ext> - extension. // :N means field is limited to N characters, otherwise it is unlimited. // (pattern <field>)? means pattern is optional and matched separately. // static const std::vector<PhoneField::PhoneGrammar>& PhoneField::GetPhoneGrammars() { static const base::NoDestructor<std::vector<PhoneGrammar>> grammars({ - // Country code: <cc> Area Code: <ac> Phone: <phone> (- <suffix> - // (Ext: <ext>)?)? + // Country code: <cc> Area Code: <ac> Phone: <phone> {{REGEX_COUNTRY, FIELD_COUNTRY_CODE}, {REGEX_AREA, FIELD_AREA_CODE}, {REGEX_PHONE, FIELD_PHONE}}, - // \( <ac> \) <phone>:3 <suffix>:4 (Ext: <ext>)? + // \( <ac> \) <phone>:3 <suffix>:4 {{REGEX_AREA_NOTEXT, FIELD_AREA_CODE, 3}, {REGEX_PREFIX_SEPARATOR, FIELD_PHONE, 3}, {REGEX_PHONE, FIELD_SUFFIX, 4}}, - // Phone: <cc> <ac>:3 - <phone>:3 - <suffix>:4 (Ext: <ext>)? + // Phone: <cc> <ac>:3 - <phone>:3 - <suffix>:4 {{REGEX_PHONE, FIELD_COUNTRY_CODE}, {REGEX_PHONE, FIELD_AREA_CODE, 3}, {REGEX_PREFIX_SEPARATOR, FIELD_PHONE, 3}, {REGEX_SUFFIX_SEPARATOR, FIELD_SUFFIX, 4}}, - // Phone: <cc>:3 <ac>:3 <phone>:3 <suffix>:4 (Ext: <ext>)? + // Phone: <cc>:3 <ac>:3 <phone>:3 <suffix>:4 {{REGEX_PHONE, FIELD_COUNTRY_CODE, 3}, {REGEX_PHONE, FIELD_AREA_CODE, 3}, {REGEX_PHONE, FIELD_PHONE, 3}, {REGEX_PHONE, FIELD_SUFFIX, 4}}, - // Area Code: <ac> Phone: <phone> (- <suffix> (Ext: <ext>)?)? + // Area Code: <ac> Phone: <phone> {{REGEX_AREA, FIELD_AREA_CODE}, {REGEX_PHONE, FIELD_PHONE}}, - // Phone: <ac> <phone>:3 <suffix>:4 (Ext: <ext>)? + // Phone: <ac> <phone>:3 <suffix>:4 {{REGEX_PHONE, FIELD_AREA_CODE}, {REGEX_PHONE, FIELD_PHONE, 3}, {REGEX_PHONE, FIELD_SUFFIX, 4}}, - // Phone: <cc> \( <ac> \) <phone> (- <suffix> (Ext: <ext>)?)? + // Phone: <cc> \( <ac> \) <phone> {{REGEX_PHONE, FIELD_COUNTRY_CODE}, {REGEX_AREA_NOTEXT, FIELD_AREA_CODE}, {REGEX_PREFIX_SEPARATOR, FIELD_PHONE}}, - // Phone: \( <ac> \) <phone> (- <suffix> (Ext: <ext>)?)? + // Phone: \( <ac> \) <phone> + // TODO(crbug.com/1311937): This is a duplicate of the grammar above. It + // will be removed with `AutofillMetrics::LogPhoneNumberGrammarMatched()`, + // once collecting data on the grammar usages is complete. {{REGEX_PHONE, FIELD_COUNTRY_CODE}, {REGEX_AREA_NOTEXT, FIELD_AREA_CODE}, {REGEX_PREFIX_SEPARATOR, FIELD_PHONE}}, - // Phone: <cc> - <ac> - <phone> - <suffix> (Ext: <ext>)? + // Phone: <cc> - <ac> - <phone> - <suffix> {{REGEX_PHONE, FIELD_COUNTRY_CODE}, {REGEX_PREFIX_SEPARATOR, FIELD_AREA_CODE}, {REGEX_PREFIX_SEPARATOR, FIELD_PHONE}, {REGEX_SUFFIX_SEPARATOR, FIELD_SUFFIX}}, - // Area code: <ac>:3 Prefix: <prefix>:3 Suffix: <suffix>:4 (Ext: <ext>)? + // Area code: <ac>:3 Prefix: <prefix>:3 Suffix: <suffix>:4 {{REGEX_AREA, FIELD_AREA_CODE, 3}, {REGEX_PREFIX, FIELD_PHONE, 3}, {REGEX_SUFFIX, FIELD_SUFFIX, 4}}, - // Phone: <ac> Prefix: <phone> Suffix: <suffix> (Ext: <ext>)? + // Phone: <ac> Prefix: <phone> Suffix: <suffix> {{REGEX_PHONE, FIELD_AREA_CODE}, {REGEX_PREFIX, FIELD_PHONE}, {REGEX_SUFFIX, FIELD_SUFFIX}}, - // Phone: <ac> - <phone>:3 - <suffix>:4 (Ext: <ext>)? + // Phone: <ac> - <phone>:3 - <suffix>:4 {{REGEX_PHONE, FIELD_AREA_CODE}, {REGEX_PREFIX_SEPARATOR, FIELD_PHONE, 3}, {REGEX_SUFFIX_SEPARATOR, FIELD_SUFFIX, 4}}, - // Phone: <cc> - <ac> - <phone> (Ext: <ext>)? + // Phone: <cc> - <ac> - <phone> {{REGEX_PHONE, FIELD_COUNTRY_CODE}, {REGEX_PREFIX_SEPARATOR, FIELD_AREA_CODE}, {REGEX_SUFFIX_SEPARATOR, FIELD_PHONE}}, - // Phone: <ac> - <phone> (Ext: <ext>)? + // Phone: <ac> - <phone> {{REGEX_AREA, FIELD_AREA_CODE}, {REGEX_PHONE, FIELD_PHONE}}, - // Phone: <cc>:3 - <phone> (Ext: <ext>)? + // Phone: <cc>:3 - <phone> {{REGEX_PHONE, FIELD_COUNTRY_CODE, 3}, {REGEX_PHONE, FIELD_PHONE}}, - // Phone: <cc> <ac> <phone> (Ext: <ext>)? + // Phone: <cc> <ac> <phone> // Indistinguishable from <area> <prefix> <suffix> {{REGEX_PHONE, FIELD_COUNTRY_CODE}, {EMPTY_LABEL, FIELD_AREA_CODE}, {EMPTY_LABEL, FIELD_PHONE}}, - // Phone: <cc> <phone> (Ext: <ext>)? + // Phone: <cc> <phone> // Indistinguishable from <area> <phone> {{REGEX_PHONE, FIELD_COUNTRY_CODE}, {EMPTY_LABEL, FIELD_PHONE}}, - // Phone: <phone> (Ext: <ext>)? + // Phone: <phone> {{REGEX_PHONE, FIELD_PHONE}}, }); return *grammars;
diff --git a/components/autofill/core/browser/geo/phone_number_i18n.cc b/components/autofill/core/browser/geo/phone_number_i18n.cc index 8368f0d6..9fe0465 100644 --- a/components/autofill/core/browser/geo/phone_number_i18n.cc +++ b/components/autofill/core/browser/geo/phone_number_i18n.cc
@@ -386,9 +386,12 @@ i18n_number_->has_country_code()) { country_code_ = base::NumberToString16(i18n_number_->country_code()); } + // Autofill doesn't support filling extensions, so we should not store them. + i18n_number_->clear_extension(); } else { // Parsing failed. Store passed phone "as is" into |whole_number_|. whole_number_ = number; + // We have no way of removing any extensions. } }
diff --git a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantOnboardingHelperImpl.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantOnboardingHelperImpl.java index e2d2aa70..89f6642 100644 --- a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantOnboardingHelperImpl.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantOnboardingHelperImpl.java
@@ -48,7 +48,8 @@ */ @Override public void showOnboarding(boolean useDialogOnboarding, String experimentIds, - Map<String, String> parameters, Callback<Integer> callback) { + Map<String, String> parameters, boolean hideBottomSheetOnOnboardingAccepted, + Callback<Integer> callback) { hideOnboarding(); if (useDialogOnboarding) { mOnboardingCoordinator = @@ -63,7 +64,8 @@ mOnboardingCoordinator.show(result -> { // Note: only transfer the controls in the ACCEPTED case, as it will prevent // the bottom sheet from hiding after the callback is done. - if (result == AssistantOnboardingResult.ACCEPTED) { + if (result == AssistantOnboardingResult.ACCEPTED + && !hideBottomSheetOnOnboardingAccepted) { mOnboardingOverlayCoordinator = mOnboardingCoordinator.transferControls(); } callback.onResult(result);
diff --git a/components/autofill_assistant/android/public/java/src/org/chromium/components/autofill_assistant/AssistantOnboardingHelper.java b/components/autofill_assistant/android/public/java/src/org/chromium/components/autofill_assistant/AssistantOnboardingHelper.java index bb911e34..0ead410c 100644 --- a/components/autofill_assistant/android/public/java/src/org/chromium/components/autofill_assistant/AssistantOnboardingHelper.java +++ b/components/autofill_assistant/android/public/java/src/org/chromium/components/autofill_assistant/AssistantOnboardingHelper.java
@@ -18,10 +18,13 @@ * @param useDialogOnboarding whether to show the dialog or bottom-sheet onboarding. * @param experimentIds the list of active experiment ids. * @param parameters the key/value map of script parameters use. + * @param hideBottomSheetOnOnboardingAccepted true if the bottomsheet is hidden right after + * onboarding was accepted. * @param callback the callback to invoke with the {@code OnboardingResult}. */ void showOnboarding(boolean useDialogOnboarding, String experimentIds, - Map<String, String> parameters, Callback<Integer> callback); + Map<String, String> parameters, boolean hideBottomSheetOnOnboardingAccepted, + Callback<Integer> callback); /** * Hides the onboarding, if currently shown. Does not invoke the callback that was associated
diff --git a/components/autofill_assistant/android/public/java/src/org/chromium/components/autofill_assistant/Starter.java b/components/autofill_assistant/android/public/java/src/org/chromium/components/autofill_assistant/Starter.java index 9f92ed1..21b03c1 100644 --- a/components/autofill_assistant/android/public/java/src/org/chromium/components/autofill_assistant/Starter.java +++ b/components/autofill_assistant/android/public/java/src/org/chromium/components/autofill_assistant/Starter.java
@@ -246,7 +246,7 @@ @CalledByNative private void showOnboarding(AssistantOnboardingHelper onboardingHelper, boolean useDialogOnboarding, String experimentIds, String[] parameterKeys, - String[] parameterValues) { + String[] parameterValues, boolean hideBottomSheetOnOnboardingAccepted) { if (!AutofillAssistantPreferencesUtil.getShowOnboarding()) { safeNativeOnOnboardingFinished( /* shown = */ false, 3 /* AssistantOnboardingResult.ACCEPTED*/); @@ -259,6 +259,7 @@ parameters.put(parameterKeys[i], parameterValues[i]); } onboardingHelper.showOnboarding(useDialogOnboarding, experimentIds, parameters, + hideBottomSheetOnOnboardingAccepted, result -> safeNativeOnOnboardingFinished(true, result)); }
diff --git a/components/autofill_assistant/browser/android/starter_delegate_android.cc b/components/autofill_assistant/browser/android/starter_delegate_android.cc index 0eae543..89d647d 100644 --- a/components/autofill_assistant/browser/android/starter_delegate_android.cc +++ b/components/autofill_assistant/browser/android/starter_delegate_android.cc
@@ -200,7 +200,8 @@ base::android::ConvertUTF8ToJavaString( env, trigger_context.GetExperimentIds()), base::android::ToJavaArrayOfStrings(env, keys), - base::android::ToJavaArrayOfStrings(env, values)); + base::android::ToJavaArrayOfStrings(env, values), + trigger_context.GetIsExternallyTriggered()); } void StarterDelegateAndroid::HideOnboarding() {
diff --git a/components/autofill_assistant/browser/android/ui_controller_android_utils.cc b/components/autofill_assistant/browser/android/ui_controller_android_utils.cc index 88b4310e..398e3fa 100644 --- a/components/autofill_assistant/browser/android/ui_controller_android_utils.cc +++ b/components/autofill_assistant/browser/android/ui_controller_android_utils.cc
@@ -656,7 +656,8 @@ onboarding_shown, is_direct_action, SafeConvertJavaStringToNative(env, jinitial_url), /* is_in_chrome_triggered = */ false, - /* is_externally_triggered = */ false); + /* is_externally_triggered = */ false, + /* skip_autofill_assistant_onboarding = */ false); } std::unique_ptr<Service> GetServiceToInject(JNIEnv* env,
diff --git a/components/autofill_assistant/browser/client_context_unittest.cc b/components/autofill_assistant/browser/client_context_unittest.cc index 219ad16..3ab3aad 100644 --- a/components/autofill_assistant/browser/client_context_unittest.cc +++ b/components/autofill_assistant/browser/client_context_unittest.cc
@@ -117,6 +117,7 @@ /* initial_url = */ "https://www.example.com", /* is_in_chrome_triggered = */ true, /* is_externally_triggered = */ false, + /* skip_autofill_assistant_onboarding = */ false, }); auto actual_client_context = client_context.AsProto(); EXPECT_THAT(actual_client_context.experiment_ids(), Eq("1,2,3")); @@ -166,6 +167,7 @@ /* initial_url = */ "https://www.example.com", /* is_in_chrome_triggered = */ false, /* is_externally_triggered = */ false, + /* skip_autofill_assistant_onboarding = */ false, }); actual_client_context = client_context.AsProto(); @@ -191,6 +193,7 @@ /* initial_url = */ "https://www.example.com", /* is_in_chrome_triggered = */ false, /* is_externally_triggered = */ false, + /* skip_autofill_assistant_onboarding = */ false, }); EXPECT_THAT(client_context.AsProto().accounts_matching_status(), Eq(ClientContextProto::ACCOUNTS_MATCHING)); @@ -206,6 +209,7 @@ /* initial_url = */ "https://www.example.com", /* is_in_chrome_triggered = */ false, /* is_externally_triggered = */ false, + /* skip_autofill_assistant_onboarding = */ false, }); EXPECT_THAT(client_context.AsProto().accounts_matching_status(), Eq(ClientContextProto::ACCOUNTS_NOT_MATCHING));
diff --git a/components/autofill_assistant/browser/headless/headless_script_controller_impl.cc b/components/autofill_assistant/browser/headless/headless_script_controller_impl.cc index de0c37c..fa58c56 100644 --- a/components/autofill_assistant/browser/headless/headless_script_controller_impl.cc +++ b/components/autofill_assistant/browser/headless/headless_script_controller_impl.cc
@@ -4,6 +4,7 @@ #include "components/autofill_assistant/browser/headless/headless_script_controller_impl.h" +#include "base/callback_helpers.h" #include "base/time/default_tick_clock.h" #include "components/autofill_assistant/browser/desktop/starter_delegate_desktop.h" #include "components/autofill_assistant/browser/public/password_change/website_login_manager.h" @@ -31,6 +32,15 @@ void HeadlessScriptControllerImpl::StartScript( const base::flat_map<std::string, std::string>& script_parameters, base::OnceCallback<void(ScriptResult)> script_ended_callback) { + StartScript(script_parameters, std::move(script_ended_callback), + /*use_autofill_assistant_onboarding=*/false, base::DoNothing()); +} + +void HeadlessScriptControllerImpl::StartScript( + const base::flat_map<std::string, std::string>& script_parameters, + base::OnceCallback<void(ScriptResult)> script_ended_callback, + bool use_autofill_assistant_onboarding, + base::OnceCallback<void()> onboarding_successful_callback) { // This HeadlessScriptController is currently executing a script, so we return // an error. if (script_ended_callback_) { @@ -46,6 +56,7 @@ } script_ended_callback_ = std::move(script_ended_callback); + onboarding_successful_callback_ = std::move(onboarding_successful_callback); auto parameters = std::make_unique<ScriptParameters>(script_parameters); auto trigger_context = std::make_unique<TriggerContext>( std::move(parameters), @@ -55,7 +66,9 @@ /*is_direct_action = */ false, /* initial_url = */ "", /* is_in_chrome_triggered = */ true, - /* is_externally_triggered = */ true); + /* is_externally_triggered = */ true, + /* skip_autofill_assistant_onboarding = */ + !use_autofill_assistant_onboarding); starter->CanStart( std::move(trigger_context), base::BindOnce(&HeadlessScriptControllerImpl::OnReadyToStart, @@ -70,6 +83,9 @@ std::move(script_ended_callback_).Run({false}); return; } + + std::move(onboarding_successful_callback_).Run(); + // TODO(b/201964911): At this point we should be sure no other Controller // exists on this tab. Add logic to the starter to check that's the case. client_->Start(*url, std::move(trigger_context));
diff --git a/components/autofill_assistant/browser/headless/headless_script_controller_impl.h b/components/autofill_assistant/browser/headless/headless_script_controller_impl.h index 735589b..87ff55b8 100644 --- a/components/autofill_assistant/browser/headless/headless_script_controller_impl.h +++ b/components/autofill_assistant/browser/headless/headless_script_controller_impl.h
@@ -40,6 +40,11 @@ void StartScript( const base::flat_map<std::string, std::string>& script_parameters, base::OnceCallback<void(ScriptResult)> script_ended_callback) override; + void StartScript( + const base::flat_map<std::string, std::string>& script_parameters, + base::OnceCallback<void(ScriptResult)> script_ended_callback, + bool use_autofill_assistant_onboarding, + base::OnceCallback<void()> onboarding_successful_callback) override; // Notifies the external caller that the script has ended. Note that the // external caller can decide to destroy this instance once it has been @@ -55,6 +60,8 @@ base::OnceCallback<void(ScriptResult)> script_ended_callback_; + base::OnceCallback<void()> onboarding_successful_callback_; + base::WeakPtrFactory<HeadlessScriptControllerImpl> weak_ptr_factory_{this}; };
diff --git a/components/autofill_assistant/browser/js_flow_executor_impl.cc b/components/autofill_assistant/browser/js_flow_executor_impl.cc index ae20fde..bd94d14 100644 --- a/components/autofill_assistant/browser/js_flow_executor_impl.cc +++ b/components/autofill_assistant/browser/js_flow_executor_impl.cc
@@ -56,10 +56,6 @@ } (async () => { - - // Keep the next empty line. The JS flow script should be concatenated - // without leading spaces. - )"; // The code inserted after the JS flow. This closes and executes the arrow @@ -77,8 +73,8 @@ } // The number of lines to subtract from all call stack entries sent to the -// backend. -constexpr int kJsLineOffset = CountLines(kLeadingWrapper); +// backend. We add one line to the wrapper in CreateWrappedJsFlow. +constexpr int kJsLineOffset = CountLines(kLeadingWrapper) + 1; constexpr char kArrayGetNthElement[] = "function(index) { return this[index]; }"; @@ -144,6 +140,31 @@ &JsFlowExecutorImpl::InternalStart, weak_ptr_factory_.GetWeakPtr())); } +// Wraps the main js_flow in an async function as well as making +// runNativeAction, client constants (e.g. LINE_OFFSET) available to the flow. +std::string CreateWrappedJsFlow(const std::string& js_flow) { + return base::StrCat( + {// The leading wrapper contains the runNativeAction + // function as well as the first part of the anonymous + // function call that will wrap the js flow. + kLeadingWrapper, + // The line offset constant. Since compile time string + // concatenation is not straightforward we add it here. + "const LINE_OFFSET = ", base::NumberToString(kJsLineOffset), ";", + // New line so the js flow starts from the first column. + // Added to kJsLineOffset. + "\n", + // The js flow to execute. + js_flow, + // The trailing wrapper closes and executes the anonymous + // function from the leading wrapper. + kTrailingWrapper, + // Devtools source url comment so we can identity this + // snippet. + js_flow_util::GetDevtoolsSourceUrlCommentToAppend( + UnexpectedErrorInfoProto::JS_FLOW)}); +} + void JsFlowExecutorImpl::InternalStart(const ClientStatus& status, DevtoolsClient* devtools_client, const int isolated_world_context_id) { @@ -161,13 +182,7 @@ // the flow may fulfill to request execution of a native action. RefreshNativeActionPromise(); - // Wrap the main js_flow in an async function containing a method to - // request native actions. This is essentially providing |js_flow| with a - // JS API to call native functionality. Also appends the source url. - const auto wrapped_js_flow = - base::StrCat({kLeadingWrapper, *js_flow_, kTrailingWrapper, - js_flow_util::GetDevtoolsSourceUrlCommentToAppend( - UnexpectedErrorInfoProto::JS_FLOW)}); + const auto wrapped_js_flow = CreateWrappedJsFlow(*js_flow_); Metrics::RecordJsFlowStartedEvent( Metrics::JsFlowStartedEvent::SCRIPT_STARTED);
diff --git a/components/autofill_assistant/browser/js_flow_executor_impl_browsertest.cc b/components/autofill_assistant/browser/js_flow_executor_impl_browsertest.cc index 4054052..7460596 100644 --- a/components/autofill_assistant/browser/js_flow_executor_impl_browsertest.cc +++ b/components/autofill_assistant/browser/js_flow_executor_impl_browsertest.cc
@@ -51,6 +51,8 @@ using ::testing::Field; using ::testing::Ne; using ::testing::NiceMock; +using ::testing::NotNull; +using ::testing::Optional; using ::testing::Pair; using ::testing::Pointee; using ::testing::Property; @@ -385,6 +387,25 @@ } IN_PROC_BROWSER_TEST_F(JsFlowExecutorImplBrowserTest, + LineOffsetIsSetCorrectly) { + const std::string js_flow = + // We override the prepareStackTrace function to gain access to the + // CallSite objects (see v8.dev/docs/stack-trace-api). + // NOTE: There is no newline below. + "Error.prepareStackTrace = (_, structuredStack) => structuredStack;" + "const topStackFrame = new Error().stack[0];" + "return topStackFrame.getLineNumber() - LINE_OFFSET;"; + + std::unique_ptr<base::Value> js_return_value; + ASSERT_THAT(RunTest(js_flow, js_return_value), + Property(&ClientStatus::proto_status, ACTION_APPLIED)); + + ASSERT_THAT(js_return_value, NotNull()); + // line number is 1-based in getLineNumber so this is the first line + EXPECT_THAT(js_return_value->GetIfInt(), Optional(1)); +} + +IN_PROC_BROWSER_TEST_F(JsFlowExecutorImplBrowserTest, UnserializableRunNativeActionString) { std::unique_ptr<base::Value> result; EXPECT_CALL(mock_delegate_, RunNativeAction).Times(0);
diff --git a/components/autofill_assistant/browser/public/headless_script_controller.h b/components/autofill_assistant/browser/public/headless_script_controller.h index 1da6daa..e8cf067 100644 --- a/components/autofill_assistant/browser/public/headless_script_controller.h +++ b/components/autofill_assistant/browser/public/headless_script_controller.h
@@ -30,6 +30,14 @@ const base::flat_map<std::string, std::string>& script_parameters, base::OnceCallback<void(ScriptResult)> script_ended_callback) = 0; + // Adds parameters for using autofill assistant's onboarding before a script + // would run. + virtual void StartScript( + const base::flat_map<std::string, std::string>& script_parameters, + base::OnceCallback<void(ScriptResult)> script_ended_callback, + bool use_autofill_assistant_onboarding, + base::OnceCallback<void()> onboarding_successful_callback) = 0; + virtual ~HeadlessScriptController() = default; };
diff --git a/components/autofill_assistant/browser/public/mock_headless_script_controller.h b/components/autofill_assistant/browser/public/mock_headless_script_controller.h index 59355f3..d330d83 100644 --- a/components/autofill_assistant/browser/public/mock_headless_script_controller.h +++ b/components/autofill_assistant/browser/public/mock_headless_script_controller.h
@@ -21,6 +21,14 @@ ((const base::flat_map<std::string, std::string>&), (base::OnceCallback<void(ScriptResult)>)), (override)); + + MOCK_METHOD(void, + StartScript, + ((const base::flat_map<std::string, std::string>&), + (base::OnceCallback<void(ScriptResult)>), + (bool), + (base::OnceCallback<void()>)), + (override)); }; } // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/starter.cc b/components/autofill_assistant/browser/starter.cc index 2b97e5a..3a20a94 100644 --- a/components/autofill_assistant/browser/starter.cc +++ b/components/autofill_assistant/browser/starter.cc
@@ -330,6 +330,7 @@ /* initial_url = */ std::string(), /* is_in_chrome_triggered = */ true, /* is_externally_triggered = */ false, + /* skip_autofill_assistant_onboarding = */ false, })); } @@ -717,9 +718,10 @@ void Starter::MaybeShowOnboarding( absl::optional<TriggerScriptProto> trigger_script) { - // The onboarding is handled externally for external runs. + // For external runs, the onboarding is handled externally unless specified + // otherwise. if (pending_trigger_context_ && - pending_trigger_context_->GetIsExternallyTriggered()) { + pending_trigger_context_->GetSkipAutofillAssistantOnboarding()) { Metrics::RecordRegularScriptOnboarding(ukm_recorder_, current_ukm_source_id_, Metrics::Onboarding::OB_EXTERNAL);
diff --git a/components/autofill_assistant/browser/starter_heuristic_configs/finch_starter_heuristic_config.cc b/components/autofill_assistant/browser/starter_heuristic_configs/finch_starter_heuristic_config.cc index 3e6998105..a922c9b 100644 --- a/components/autofill_assistant/browser/starter_heuristic_configs/finch_starter_heuristic_config.cc +++ b/components/autofill_assistant/browser/starter_heuristic_configs/finch_starter_heuristic_config.cc
@@ -4,6 +4,7 @@ #include "components/autofill_assistant/browser/starter_heuristic_configs/finch_starter_heuristic_config.h" #include "base/json/json_reader.h" +#include "base/no_destructor.h" namespace autofill_assistant { @@ -21,36 +22,38 @@ const base::Value::List& FinchStarterHeuristicConfig::GetConditionSetsForClientState( StarterPlatformDelegate* platform_delegate) const { + static const base::NoDestructor<base::Value> empty_list( + base::Value::Type::LIST); if (platform_delegate->GetIsSupervisedUser()) { - return empty_condition_sets_.GetList(); + return empty_list->GetList(); } if (!platform_delegate->GetProactiveHelpSettingEnabled()) { - return empty_condition_sets_.GetList(); + return empty_list->GetList(); } if (platform_delegate->GetIsCustomTab() && (!platform_delegate->GetIsTabCreatedByGSA() || !enabled_in_custom_tabs_)) { - return empty_condition_sets_.GetList(); + return empty_list->GetList(); } if (!platform_delegate->GetIsCustomTab() && !platform_delegate->GetIsWebLayer() && !enabled_in_regular_tabs_) { - return empty_condition_sets_.GetList(); + return empty_list->GetList(); } if (platform_delegate->GetIsWebLayer() && !enabled_in_weblayer_) { - return empty_condition_sets_.GetList(); + return empty_list->GetList(); } if (!platform_delegate->GetIsLoggedIn() && !enabled_for_signed_out_users_) { - return empty_condition_sets_.GetList(); + return empty_list->GetList(); } if (!platform_delegate->GetMakeSearchesAndBrowsingBetterEnabled() && !enabled_without_msbb_) { - return empty_condition_sets_.GetList(); + return empty_list->GetList(); } return condition_sets_.GetList();
diff --git a/components/autofill_assistant/browser/starter_heuristic_configs/finch_starter_heuristic_config.h b/components/autofill_assistant/browser/starter_heuristic_configs/finch_starter_heuristic_config.h index c714a60..60b311e 100644 --- a/components/autofill_assistant/browser/starter_heuristic_configs/finch_starter_heuristic_config.h +++ b/components/autofill_assistant/browser/starter_heuristic_configs/finch_starter_heuristic_config.h
@@ -78,8 +78,6 @@ bool enabled_in_weblayer_ = false; bool enabled_for_signed_out_users_ = false; bool enabled_without_msbb_ = false; - const base::Value empty_condition_sets_ = - base::Value(base::Value::Type::LIST); std::string intent_; base::Value condition_sets_ = base::Value(base::Value::Type::LIST); base::flat_set<std::string> denylisted_domains_;
diff --git a/components/autofill_assistant/browser/starter_heuristic_configs/legacy_starter_heuristic_config.cc b/components/autofill_assistant/browser/starter_heuristic_configs/legacy_starter_heuristic_config.cc index 562ae9f..81cff999 100644 --- a/components/autofill_assistant/browser/starter_heuristic_configs/legacy_starter_heuristic_config.cc +++ b/components/autofill_assistant/browser/starter_heuristic_configs/legacy_starter_heuristic_config.cc
@@ -5,6 +5,7 @@ #include "components/autofill_assistant/browser/starter_heuristic_configs/legacy_starter_heuristic_config.h" #include "base/json/json_reader.h" #include "base/metrics/field_trial_params.h" +#include "base/no_destructor.h" #include "components/autofill_assistant/browser/features.h" #include "components/autofill_assistant/browser/starter_heuristic_configs/finch_starter_heuristic_config.h" @@ -27,17 +28,19 @@ const base::Value::List& LegacyStarterHeuristicConfig::GetConditionSetsForClientState( StarterPlatformDelegate* platform_delegate) const { + static const base::NoDestructor<base::Value> empty_list( + base::Value::Type::LIST); if (platform_delegate->GetIsSupervisedUser()) { - return empty_condition_sets_.GetList(); + return empty_list->GetList(); } if (!platform_delegate->GetProactiveHelpSettingEnabled()) { - return empty_condition_sets_.GetList(); + return empty_list->GetList(); } if (platform_delegate->GetIsCustomTab() && !platform_delegate->GetIsTabCreatedByGSA()) { - return empty_condition_sets_.GetList(); + return empty_list->GetList(); } // The legacy config used a separate finch feature to gate CCT vs. non-CCT @@ -45,20 +48,20 @@ if (platform_delegate->GetIsCustomTab() && !base::FeatureList::IsEnabled( features::kAutofillAssistantInCCTTriggering)) { - return empty_condition_sets_.GetList(); + return empty_list->GetList(); } if (!platform_delegate->GetIsCustomTab() && !base::FeatureList::IsEnabled( features::kAutofillAssistantInTabTriggering)) { - return empty_condition_sets_.GetList(); + return empty_list->GetList(); } // The legacy config used to only be available for signed-in users in // weblayer. if (platform_delegate->GetIsWebLayer() && !platform_delegate->GetIsLoggedIn()) { - return empty_condition_sets_.GetList(); + return empty_list->GetList(); } return condition_sets_.GetList();
diff --git a/components/autofill_assistant/browser/starter_heuristic_configs/legacy_starter_heuristic_config.h b/components/autofill_assistant/browser/starter_heuristic_configs/legacy_starter_heuristic_config.h index aaa7390..65efcdb 100644 --- a/components/autofill_assistant/browser/starter_heuristic_configs/legacy_starter_heuristic_config.h +++ b/components/autofill_assistant/browser/starter_heuristic_configs/legacy_starter_heuristic_config.h
@@ -42,8 +42,6 @@ absl::optional<std::pair<base::Value, std::string>> ReadConditionSetsAndIntent(const base::Value::Dict& dict) const; - const base::Value empty_condition_sets_ = - base::Value(base::Value::Type::LIST); std::string intent_; base::Value condition_sets_ = base::Value(base::Value::Type::LIST); base::flat_set<std::string> denylisted_domains_;
diff --git a/components/autofill_assistant/browser/starter_unittest.cc b/components/autofill_assistant/browser/starter_unittest.cc index 19a1097c..ea5bf49 100644 --- a/components/autofill_assistant/browser/starter_unittest.cc +++ b/components/autofill_assistant/browser/starter_unittest.cc
@@ -2285,6 +2285,7 @@ TriggerContext::Options options; options.initial_url = "https://redirect.com/to/www/example/com"; options.is_externally_triggered = true; + options.skip_autofill_assistant_onboarding = true; base::MockCallback< base::OnceCallback<void(bool success, absl::optional<GURL> url, std::unique_ptr<TriggerContext> trigger_context)>> @@ -2314,6 +2315,45 @@ {{navigation_ids_[0], {Metrics::Onboarding::OB_EXTERNAL}}}))); } +TEST_F(StarterTest, + FirstTimeUserShowOnboardingIfHandledExternallyWithUseOnboardingFlag) { + SetupPlatformDelegateForFirstTimeUser(); + base::flat_map<std::string, std::string> script_parameters = { + {"ENABLED", "true"}, + {"START_IMMEDIATELY", "true"}, + {"ORIGINAL_DEEPLINK", kExampleDeeplink}}; + TriggerContext::Options options; + options.initial_url = "https://redirect.com/to/www/example/com"; + options.is_externally_triggered = true; + options.skip_autofill_assistant_onboarding = false; + base::MockCallback< + base::OnceCallback<void(bool success, absl::optional<GURL> url, + std::unique_ptr<TriggerContext> trigger_context)>> + mock_preconditions_checked_callback; + EXPECT_CALL(mock_preconditions_checked_callback, + Run(true, Optional(GURL(kExampleDeeplink)), _)); + + starter_->CanStart( + std::make_unique<TriggerContext>( + std::make_unique<ScriptParameters>(script_parameters), options), + mock_preconditions_checked_callback.Get()); + + EXPECT_EQ(fake_platform_delegate_.num_install_feature_module_called_, 1); + EXPECT_THAT(fake_platform_delegate_.num_show_onboarding_called_, Eq(1)); + EXPECT_TRUE(fake_platform_delegate_.GetOnboardingAccepted()); + EXPECT_THAT(GetUkmTriggerScriptStarted(ukm_recorder_), IsEmpty()); + EXPECT_THAT(GetUkmTriggerScriptFinished(ukm_recorder_), IsEmpty()); + EXPECT_THAT(GetUkmTriggerScriptOnboarding(ukm_recorder_), IsEmpty()); + histogram_tester_.ExpectUniqueSample( + "Android.AutofillAssistant.FeatureModuleInstallation", + Metrics::FeatureModuleInstallation::DFM_FOREGROUND_INSTALLATION_SUCCEEDED, + 1u); + EXPECT_THAT(GetUkmRegularScriptOnboarding(ukm_recorder_), + ElementsAreArray(ToHumanReadableMetrics( + {{navigation_ids_[0], {Metrics::Onboarding::OB_ACCEPTED}}, + {navigation_ids_[0], {Metrics::Onboarding::OB_SHOWN}}}))); +} + TEST_F(StarterTest, RegularStartupFailsForSupervisedUser) { SetupPlatformDelegateForFirstTimeUser(); fake_platform_delegate_.is_supervised_user_ = true;
diff --git a/components/autofill_assistant/browser/startup_util_unittest.cc b/components/autofill_assistant/browser/startup_util_unittest.cc index edcfc5f..2929b3a6 100644 --- a/components/autofill_assistant/browser/startup_util_unittest.cc +++ b/components/autofill_assistant/browser/startup_util_unittest.cc
@@ -73,12 +73,16 @@ {"ORIGINAL_DEEPLINK", "https://www.example.com"}}; const TriggerContext::Options kDefaultCCTOptions = { - std::string(), /* is_cct = */ true, false, false, std::string(), false, - false}; + std::string(), /* is_cct = */ true, + false, false, + std::string(), false, + false, false}; const TriggerContext::Options kDefaultNonCCTOptions = { - std::string(), /* is_cct = */ false, false, false, std::string(), false, - false}; + std::string(), /* is_cct = */ false, + false, false, + std::string(), false, + false, false}; // The set of feature combinations to test. const TestFeatureConfig kTestFeatureConfigs[] = { @@ -330,7 +334,8 @@ base::flat_map<std::string, std::string>{ {"ENABLED", "true"}, {"START_IMMEDIATELY", "true"}}), {std::string(), /* is_cct = */ true, false, false, - /* initial_url = */ "https://www.example.com", false, false}}, + /* initial_url = */ "https://www.example.com", false, false, + false}}, {.msbb_setting_enabled = true, .proactive_help_setting_enabled = true, .feature_module_installed = true}),
diff --git a/components/autofill_assistant/browser/trigger_context.cc b/components/autofill_assistant/browser/trigger_context.cc index ee3d3719..5b74196 100644 --- a/components/autofill_assistant/browser/trigger_context.cc +++ b/components/autofill_assistant/browser/trigger_context.cc
@@ -14,14 +14,16 @@ bool _is_direct_action, const std::string& _initial_url, bool _is_in_chrome_triggered, - bool is_externally_triggered) + bool _is_externally_triggered, + bool _skip_autofill_assistant_onboarding) : experiment_ids(_experiment_ids), is_cct(_is_cct), onboarding_shown(_onboarding_shown), is_direct_action(_is_direct_action), initial_url(_initial_url), is_in_chrome_triggered(_is_in_chrome_triggered), - is_externally_triggered(is_externally_triggered) {} + is_externally_triggered(_is_externally_triggered), + skip_autofill_assistant_onboarding(_skip_autofill_assistant_onboarding) {} TriggerContext::Options::Options() = default; TriggerContext::Options::~Options() = default; @@ -39,7 +41,8 @@ options.is_direct_action, options.initial_url, options.is_in_chrome_triggered, - options.is_externally_triggered) {} + options.is_externally_triggered, + options.skip_autofill_assistant_onboarding) {} TriggerContext::TriggerContext( std::unique_ptr<ScriptParameters> script_parameters, @@ -49,7 +52,8 @@ bool is_direct_action, const std::string& initial_url, bool is_in_chrome_triggered, - bool is_externally_triggered) + bool is_externally_triggered, + bool skip_autofill_assistant_onboarding) : script_parameters_(std::move(script_parameters)), experiment_ids_(std::move(experiment_ids)), cct_(is_cct), @@ -57,6 +61,7 @@ direct_action_(is_direct_action), is_in_chrome_triggered_(is_in_chrome_triggered), is_externally_triggered_(is_externally_triggered), + skip_autofill_assistant_onboarding_(skip_autofill_assistant_onboarding), initial_url_(initial_url) {} TriggerContext::TriggerContext(std::vector<const TriggerContext*> contexts) @@ -79,6 +84,8 @@ direct_action_ |= context->GetDirectAction(); is_in_chrome_triggered_ |= context->GetInChromeTriggered(); is_externally_triggered_ |= context->GetIsExternallyTriggered(); + skip_autofill_assistant_onboarding_ |= + context->GetSkipAutofillAssistantOnboarding(); if (initial_url_.empty()) { initial_url_ = context->GetInitialUrl(); } @@ -149,4 +156,8 @@ return is_externally_triggered_; } +bool TriggerContext::GetSkipAutofillAssistantOnboarding() const { + return skip_autofill_assistant_onboarding_; +} + } // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/trigger_context.h b/components/autofill_assistant/browser/trigger_context.h index bb0bfd8..76162d1 100644 --- a/components/autofill_assistant/browser/trigger_context.h +++ b/components/autofill_assistant/browser/trigger_context.h
@@ -24,7 +24,8 @@ bool is_direct_action, const std::string& initial_url, bool is_in_chrome_triggered, - bool is_externally_triggered); + bool is_externally_triggered, + bool skip_autofill_assistant_onboarding); Options(); ~Options(); std::string experiment_ids; @@ -34,6 +35,7 @@ std::string initial_url; bool is_in_chrome_triggered = false; bool is_externally_triggered = false; + bool skip_autofill_assistant_onboarding = false; }; // Creates an empty trigger context. @@ -56,7 +58,8 @@ bool is_direct_action, const std::string& initial_url, bool is_in_chrome_triggered, - bool is_externally_triggered); + bool is_externally_triggered, + bool skip_autofill_assistant_onboarding); // Creates a trigger context that contains the merged contents of all input // instances at the time of calling (does not reference |contexts| after @@ -103,9 +106,12 @@ // i.e., a button or link on a website, or whether this is from within Chrome. virtual bool GetInChromeTriggered() const; + // Returns whether the triggering source is external, i.e. headless. + virtual bool GetIsExternallyTriggered() const; + // Returns whether the triggering source will handle its own onboarding flow // and the default onboarding flow should be skipped. - virtual bool GetIsExternallyTriggered() const; + virtual bool GetSkipAutofillAssistantOnboarding() const; // Returns the trigger type of the trigger script that was shown and accepted // at the beginning of the flow, if any. @@ -127,6 +133,7 @@ bool direct_action_ = false; bool is_in_chrome_triggered_ = false; bool is_externally_triggered_ = false; + bool skip_autofill_assistant_onboarding_ = false; // The initial url at the time of triggering. std::string initial_url_;
diff --git a/components/autofill_assistant/browser/trigger_context_unittest.cc b/components/autofill_assistant/browser/trigger_context_unittest.cc index c5c12e6..38d9ae7 100644 --- a/components/autofill_assistant/browser/trigger_context_unittest.cc +++ b/components/autofill_assistant/browser/trigger_context_unittest.cc
@@ -34,7 +34,8 @@ /* is_direct_action = */ true, /* initial_url = */ "https://www.example.com", /* is_in_chrome_triggered = */ true, - /* is_externally_triggered = */ true}; + /* is_externally_triggered = */ true, + /* skip_autofill_assistant_onboarding = */ true}; EXPECT_THAT( context.GetScriptParameters().ToProto(), UnorderedElementsAreArray(base::flat_map<std::string, std::string>( @@ -46,6 +47,7 @@ EXPECT_EQ(context.GetInitialUrl(), "https://www.example.com"); EXPECT_TRUE(context.GetInChromeTriggered()); EXPECT_TRUE(context.GetIsExternallyTriggered()); + EXPECT_TRUE(context.GetSkipAutofillAssistantOnboarding()); EXPECT_EQ(context.GetTriggerUIType(), TriggerScriptProto::UNSPECIFIED_TRIGGER_UI_TYPE); @@ -108,7 +110,8 @@ /* is_direct_action = */ true, /* initial_url = */ "https://www.example.com", /* is_in_chrome_triggered = */ true, - /* is_externally_triggered = */ true}; + /* is_externally_triggered = */ true, + /* skip_autofill_assistant_onboarding = */ true}; context2.SetTriggerUIType( TriggerScriptProto::SHOPPING_CHECKOUT_FIRST_TIME_USER); @@ -126,6 +129,7 @@ EXPECT_EQ(merged.GetInitialUrl(), "https://www.example.com"); EXPECT_TRUE(merged.GetInChromeTriggered()); EXPECT_TRUE(merged.GetIsExternallyTriggered()); + EXPECT_TRUE(merged.GetSkipAutofillAssistantOnboarding()); EXPECT_EQ(merged.GetTriggerUIType(), TriggerScriptProto::SHOPPING_CHECKOUT_FIRST_TIME_USER); }
diff --git a/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator_unittest.cc b/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator_unittest.cc index 6e4c2da..6ae7e977 100644 --- a/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator_unittest.cc +++ b/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator_unittest.cc
@@ -215,7 +215,8 @@ /* is_direct_action = */ true, /* initial_url = */ "https://www.example.com", /* is_in_chrome_triggered = */ true, - /* is_externally_triggered = */ false), + /* is_externally_triggered = */ false, + /* skip_autofill_assistant_onboarding = */ false), mock_callback_.Get()); }
diff --git a/components/autofill_assistant/browser/ui_controller_unittest.cc b/components/autofill_assistant/browser/ui_controller_unittest.cc index deeee0fd..8acb6eb 100644 --- a/components/autofill_assistant/browser/ui_controller_unittest.cc +++ b/components/autofill_assistant/browser/ui_controller_unittest.cc
@@ -778,7 +778,8 @@ /* onboarding_shown= */ false, /* is_direct_action= */ false, /* initial_url= */ "http://a.example.com/path", /* is_in_chrome_triggered= */ false, - /* is_externally_triggered = */ false)); + /* is_externally_triggered= */ false, + /* skip_autofill_assistant_onboarding = */ false)); EXPECT_CALL(mock_execution_delegate_, GetTriggerContext()) .WillRepeatedly(Return(&trigger_context)); ui_controller_->OnStart(trigger_context);
diff --git a/components/autofill_assistant/core/public/autofill_assistant_intent.cc b/components/autofill_assistant/core/public/autofill_assistant_intent.cc index 9b2fdaf..ac4ae9c 100644 --- a/components/autofill_assistant/core/public/autofill_assistant_intent.cc +++ b/components/autofill_assistant/core/public/autofill_assistant_intent.cc
@@ -15,24 +15,23 @@ // The list of intents that is known at compile-time. Intents not in this list // will be recorded as UNDEFINED_INTENT. -constexpr auto intents = - base::MakeFixedFlatMap<base::StringPiece, AutofillAssistantIntent>( - {{"BUY_MOVIE_TICKET", AutofillAssistantIntent::BUY_MOVIE_TICKET}, - {"RENT_CAR", AutofillAssistantIntent::RENT_CAR}, - {"SHOPPING", AutofillAssistantIntent::SHOPPING}, - {"TELEPORT", AutofillAssistantIntent::TELEPORT}, - {"SHOPPING_ASSISTED_CHECKOUT", - AutofillAssistantIntent::SHOPPING_ASSISTED_CHECKOUT}, - {"FLIGHTS_CHECKIN", AutofillAssistantIntent::FLIGHTS_CHECKIN}, - {"FOOD_ORDERING", AutofillAssistantIntent::FOOD_ORDERING}, - {"PASSWORD_CHANGE", AutofillAssistantIntent::PASSWORD_CHANGE}, - {"FOOD_ORDERING_PICKUP", - AutofillAssistantIntent::FOOD_ORDERING_PICKUP}, - {"FOOD_ORDERING_DELIVERY", - AutofillAssistantIntent::FOOD_ORDERING_DELIVERY}, - {"UNLAUNCHED_VERTICAL_1", - AutofillAssistantIntent::UNLAUNCHED_VERTICAL_1}, - {"FIND_COUPONS", AutofillAssistantIntent::FIND_COUPONS}}); +constexpr auto intents = base::MakeFixedFlatMap<base::StringPiece, + AutofillAssistantIntent>( + {{"BUY_MOVIE_TICKET", AutofillAssistantIntent::BUY_MOVIE_TICKET}, + {"RENT_CAR", AutofillAssistantIntent::RENT_CAR}, + {"SHOPPING", AutofillAssistantIntent::SHOPPING}, + {"TELEPORT", AutofillAssistantIntent::TELEPORT}, + {"SHOPPING_ASSISTED_CHECKOUT", + AutofillAssistantIntent::SHOPPING_ASSISTED_CHECKOUT}, + {"FLIGHTS_CHECKIN", AutofillAssistantIntent::FLIGHTS_CHECKIN}, + {"FOOD_ORDERING", AutofillAssistantIntent::FOOD_ORDERING}, + {"PASSWORD_CHANGE", AutofillAssistantIntent::PASSWORD_CHANGE}, + {"FOOD_ORDERING_PICKUP", AutofillAssistantIntent::FOOD_ORDERING_PICKUP}, + {"FOOD_ORDERING_DELIVERY", + AutofillAssistantIntent::FOOD_ORDERING_DELIVERY}, + {"UNLAUNCHED_VERTICAL_1", AutofillAssistantIntent::UNLAUNCHED_VERTICAL_1}, + {"FIND_COUPONS", AutofillAssistantIntent::FIND_COUPONS}, + {"CHROME_FAST_CHECKOUT", AutofillAssistantIntent::CHROME_FAST_CHECKOUT}}); } // namespace
diff --git a/components/autofill_assistant/core/public/autofill_assistant_intent.h b/components/autofill_assistant/core/public/autofill_assistant_intent.h index 546ae28..aa77bf07c 100644 --- a/components/autofill_assistant/core/public/autofill_assistant_intent.h +++ b/components/autofill_assistant/core/public/autofill_assistant_intent.h
@@ -29,8 +29,9 @@ FOOD_ORDERING_DELIVERY = 20, UNLAUNCHED_VERTICAL_1 = 22, FIND_COUPONS = 25, + CHROME_FAST_CHECKOUT = 32, - kMaxValue = FIND_COUPONS + kMaxValue = CHROME_FAST_CHECKOUT }; // Extracts the enum value corresponding to |intent|.
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json index c84bd39..b969a5d2 100644 --- a/components/certificate_transparency/data/log_list.json +++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@ { - "version": "10.52", - "log_list_timestamp": "2022-07-24T12:55:50Z", + "version": "10.53", + "log_list_timestamp": "2022-07-25T12:54:29Z", "operators": [ { "name": "Google",
diff --git a/components/history/core/browser/history_types.h b/components/history/core/browser/history_types.h index f19f6f8d..9955a6b 100644 --- a/components/history/core/browser/history_types.h +++ b/components/history/core/browser/history_types.h
@@ -130,6 +130,11 @@ // `originator_cache_guid` is the originator machine's unique client ID. It's // called a "cache" just to match Chrome Sync's terminology. std::string originator_cache_guid; + // The visit ID of this visit on the originating device, which is *not* + // comparable to local visit IDs (as in `visit_id` / `referring_visit` / + // `opener_visit`). + // Note that even for synced visits, this may be 0, if the visit came from a + // "legacy" client (which was using Sessions sync rather than History sync). VisitID originator_visit_id = 0; // `originator_referring_visit` and `originator_opener_visit` are similar to // the non-"originator" versions, but their contents refer to originator visit
diff --git a/components/history/core/browser/sync/history_sync_bridge.cc b/components/history/core/browser/sync/history_sync_bridge.cc index 034d09c9..45f9ec1 100644 --- a/components/history/core/browser/sync/history_sync_bridge.cc +++ b/components/history/core/browser/sync/history_sync_bridge.cc
@@ -73,7 +73,7 @@ row.originator_cache_guid = specifics.originator_cache_guid(); // The `originator_visit_id` should always exist for visits coming from modern - // clients, but it may be missing in visits from legacy clients (i.e. clients + // clients, but it may be missing in legacy visits (i.e. those from clients // committing history data via the SESSIONS data type). row.originator_visit_id = specifics.redirect_entries(redirect_index).originator_visit_id(); @@ -123,9 +123,10 @@ } else { // All later visits in the chain are implicitly referred to by the preceding // visit. - // TODO(crbug.com/1335055): For visits coming from legacy devices (i.e. - // using the Sessions integration), originator_visit_id will be unset, so - // we're losing the redirect chain links here. + // Note: For legacy visits (i.e. coming from older clients still using the + // Sessions integration), originator_visit_id will be unset, so redirect + // chain links are lost here. They'll be populated in AddEntityInBackend() + // instead. row.originator_referring_visit = specifics.redirect_entries(redirect_index - 1).originator_visit_id(); } @@ -641,8 +642,17 @@ VisitIDRemapper* id_remapper, const sync_pb::HistorySpecifics& specifics) { // Add all the visits in the redirect chain. + VisitID referring_visit_id = 0; for (int i = 0; i < specifics.redirect_entries_size(); i++) { VisitRow visit_row = MakeVisitRow(specifics, i); + // Trivial in-chain remapping: Populate the `referring_visit` IDs along the + // redirect chain. Do this here because old clients don't fill originator + // visits IDs, so the remapper can't help. For such clients we can at least + // do this to have the links inside this redirect chain. For new clients, + // might as well do this part here too since it's correct. + if (i > 0) { + visit_row.referring_visit = referring_visit_id; + } VisitID added_visit_id = history_backend_->AddSyncedVisit( GURL(specifics.redirect_entries(i).url()), base::UTF8ToUTF16(specifics.redirect_entries(i).title()), @@ -651,10 +661,18 @@ // Visit failed to be added to the DB - unclear if/how this can happen. return false; } - id_remapper->RegisterVisit(added_visit_id, visit_row.originator_cache_guid, - visit_row.originator_visit_id, - visit_row.originator_referring_visit, - visit_row.originator_opener_visit); + referring_visit_id = added_visit_id; + + // Remapping chain extremities (i.e. first and last visit in the chain) via + // `id_remapper`: The first visit in the chain can refer to a visit outside + // of the chain. Similarly, the last visit can be referred to by a visit + // outside of the chain (its referring visit ID was already set though). + if (i == 0 || i == specifics.redirect_entries_size() - 1) { + id_remapper->RegisterVisit( + added_visit_id, visit_row.originator_cache_guid, + visit_row.originator_visit_id, visit_row.originator_referring_visit, + visit_row.originator_opener_visit); + } } return true; @@ -669,18 +687,17 @@ // is indeed sufficient. VisitRow final_visit_row = MakeVisitRow(specifics, specifics.redirect_entries_size() - 1); + // Note: UpdateSyncedVisit() keeps any existing local referrer/opener IDs in + // place, and the originator IDs are never updated in practice, so there's no + // need to invoke the ID remapper here (in contrast to AddEntityInBackend()). + // TODO(crbug.com/1341636): Add an integration test to ensure that updates + // don't break referrer/opener links. VisitID updated_visit_id = history_backend_->UpdateSyncedVisit(final_visit_row); if (updated_visit_id == 0) { return false; } - id_remapper->RegisterVisit(updated_visit_id, - final_visit_row.originator_cache_guid, - final_visit_row.originator_visit_id, - final_visit_row.originator_referring_visit, - final_visit_row.originator_opener_visit); - // TODO(crbug.com/1318028): Handle updates to the URL-related fields // (notably the title - other fields probably can't change). return true;
diff --git a/components/history/core/browser/sync/history_sync_bridge_unittest.cc b/components/history/core/browser/sync/history_sync_bridge_unittest.cc index 5139f9c2..b5e1035c 100644 --- a/components/history/core/browser/sync/history_sync_bridge_unittest.cc +++ b/components/history/core/browser/sync/history_sync_bridge_unittest.cc
@@ -43,10 +43,14 @@ specifics.set_visit_time_windows_epoch_micros( visit_time.ToDeltaSinceWindowsEpoch().InMicroseconds()); specifics.set_originator_cache_guid(originator_cache_guid); + specifics.mutable_page_transition()->set_core_transition( + sync_pb::SyncEnums_PageTransition_LINK); for (size_t i = 0; i < urls.size(); ++i) { auto* redirect_entry = specifics.add_redirect_entries(); redirect_entry->set_originator_visit_id(originator_visit_ids[i]); redirect_entry->set_url(urls[i].spec()); + redirect_entry->set_redirect_type( + sync_pb::SyncEnums_PageTransitionRedirectType_SERVER_REDIRECT); } return specifics; } @@ -820,9 +824,6 @@ entity_chain.set_originator_referring_visit_id( entity_first.redirect_entries(0).originator_visit_id()); - // TODO(crbug.com/1335055): Add another test case where the originator visit - // IDs in a chain are empty, to simulate a legacy (Sessions) client. - const base::Time last_visit_time = base::Time::Now() - base::Minutes(8); const VisitID last_visit_originator_id = 104; sync_pb::HistorySpecifics entity_last = @@ -857,6 +858,31 @@ EXPECT_EQ(last_row.opener_visit, chain_rows.back().visit_id); } +TEST_F(HistorySyncBridgeTest, RemapsLegacyRedirectChain) { + const std::string remote_cache_guid("remote_cache_guid"); + + // Situation: There's a redirect chain of 3 visits, coming from a legacy + // client, meaning that their originator visit IDs are unset (zero). + + const base::Time visit_time = base::Time::Now() - base::Minutes(9); + const std::vector<GURL> urls{GURL("https://start.chain.url"), + GURL("https://middle.chain.url"), + GURL("https://end.chain.url")}; + const std::vector<VisitID> originator_visit_ids{0, 0, 0}; + sync_pb::HistorySpecifics entity = CreateSpecifics( + visit_time, remote_cache_guid, urls, originator_visit_ids); + + // Start syncing - this should trigger the creation of local referrer IDs. + MergeSyncData({entity}); + + VisitRow chain_end_row; + ASSERT_TRUE(backend()->GetLastVisitByTime(visit_time, &chain_end_row)); + // Make sure the chain got preserved (even though there were no originator + // visit IDs, and thus no explicit links between the individual visits). + VisitVector chain_rows = backend()->GetRedirectChain(chain_end_row); + EXPECT_EQ(chain_rows.size(), 3u); +} + } // namespace } // namespace history
diff --git a/components/history/core/browser/sync/test_history_backend_for_sync.cc b/components/history/core/browser/sync/test_history_backend_for_sync.cc index 8e7c6f9..8a9846c 100644 --- a/components/history/core/browser/sync/test_history_backend_for_sync.cc +++ b/components/history/core/browser/sync/test_history_backend_for_sync.cc
@@ -167,11 +167,16 @@ for (VisitRow& existing_visit : visits_) { if (existing_visit.originator_cache_guid == visit.originator_cache_guid && existing_visit.originator_visit_id == visit.originator_visit_id) { + VisitRow new_visit = visit; // `visit_id` and `url_id` aren't set in visits coming from Sync, so // keep those from the existing row. - VisitRow new_visit = visit; new_visit.visit_id = existing_visit.visit_id; new_visit.url_id = existing_visit.url_id; + // Similarly, any `referring_visit` and `opener_visit` should be retained. + // Note that these are the *local* versions of these IDs, not the + // originator ones. + new_visit.referring_visit = existing_visit.referring_visit; + new_visit.opener_visit = existing_visit.opener_visit; existing_visit = new_visit; return existing_visit.visit_id; }
diff --git a/components/password_manager/core/browser/login_database.cc b/components/password_manager/core/browser/login_database.cc index 9256701..e80a68e 100644 --- a/components/password_manager/core/browser/login_database.cc +++ b/components/password_manager/core/browser/login_database.cc
@@ -990,15 +990,15 @@ } PasswordStoreChangeList LoginDatabase::AddLogin(const PasswordForm& form, - AddLoginError* error) { + AddCredentialError* error) { TRACE_EVENT0("passwords", "LoginDatabase::AddLogin"); if (error) { - *error = AddLoginError::kNone; + *error = AddCredentialError::kNone; } PasswordStoreChangeList list; if (!DoesMatchConstraints(form)) { if (error) { - *error = AddLoginError::kConstraintViolation; + *error = AddCredentialError::kConstraintViolation; } return list; } @@ -1014,7 +1014,7 @@ if (DecryptedString(form.encrypted_password, &decrypted_password) != ENCRYPTION_RESULT_SUCCESS) { if (error) { - *error = AddLoginError::kEncryptionServiceFailure; + *error = AddCredentialError::kEncryptionServiceFailure; } return list; } @@ -1024,7 +1024,7 @@ if (EncryptedString(form.password_value, &encrypted_password) != ENCRYPTION_RESULT_SUCCESS) { if (error) { - *error = AddLoginError::kEncryptionServiceFailure; + *error = AddCredentialError::kEncryptionServiceFailure; } return list; } @@ -1081,25 +1081,26 @@ password_changed, insecure_changed); } else if (error) { if (db_error_handler.get_error_code() == 19 /*SQLITE_CONSTRAINT*/) { - *error = AddLoginError::kConstraintViolation; + *error = AddCredentialError::kConstraintViolation; } else { - *error = AddLoginError::kDbError; + *error = AddCredentialError::kDbError; } } return list; } -PasswordStoreChangeList LoginDatabase::UpdateLogin(const PasswordForm& form, - UpdateLoginError* error) { +PasswordStoreChangeList LoginDatabase::UpdateLogin( + const PasswordForm& form, + UpdateCredentialError* error) { TRACE_EVENT0("passwords", "LoginDatabase::UpdateLogin"); if (error) { - *error = UpdateLoginError::kNone; + *error = UpdateCredentialError::kNone; } std::string encrypted_password; if (EncryptedString(form.password_value, &encrypted_password) != ENCRYPTION_RESULT_SUCCESS) { if (error) { - *error = UpdateLoginError::kEncryptionServiceFailure; + *error = UpdateCredentialError::kEncryptionServiceFailure; } return PasswordStoreChangeList(); } @@ -1159,7 +1160,7 @@ if (!s.Run()) { if (error) { - *error = UpdateLoginError::kDbError; + *error = UpdateCredentialError::kDbError; } return PasswordStoreChangeList(); } @@ -1169,7 +1170,7 @@ // the notes table. if (db_.GetLastChangeCount() == 0) { if (error) { - *error = UpdateLoginError::kNoUpdatedRecords; + *error = UpdateCredentialError::kNoUpdatedRecords; } return PasswordStoreChangeList(); }
diff --git a/components/password_manager/core/browser/login_database.h b/components/password_manager/core/browser/login_database.h index 3ea08ca..e0caab8a 100644 --- a/components/password_manager/core/browser/login_database.h +++ b/components/password_manager/core/browser/login_database.h
@@ -41,6 +41,9 @@ extern const int kCurrentVersionNumber; extern const int kCompatibleVersionNumber; +using PrimaryKeyToFormMap = + std::map<FormPrimaryKey, std::unique_ptr<PasswordForm>>; + // Interface to the database storage of login information, intended as a helper // for PasswordStore on platforms that need internal storage of some or all of // the login information. @@ -74,7 +77,7 @@ // case of error, it sets |error| if |error| isn't null. [[nodiscard]] PasswordStoreChangeList AddLogin( const PasswordForm& form, - AddLoginError* error = nullptr); + AddCredentialError* error = nullptr); // Updates existing password form. Returns the list of applied changes ({}, // {UPDATE}). The password is looked up by the tuple {origin, @@ -83,7 +86,7 @@ // null. [[nodiscard]] PasswordStoreChangeList UpdateLogin( const PasswordForm& form, - UpdateLoginError* error = nullptr); + UpdateCredentialError* error = nullptr); // Removes |form| from the list of remembered password forms. Returns true if // |form| was successfully removed from the database. If |changes| is not be
diff --git a/components/password_manager/core/browser/login_database_async_helper.cc b/components/password_manager/core/browser/login_database_async_helper.cc index dc13cb7..54f587e 100644 --- a/components/password_manager/core/browser/login_database_async_helper.cc +++ b/components/password_manager/core/browser/login_database_async_helper.cc
@@ -8,6 +8,7 @@ #include "base/task/sequenced_task_runner.h" #include "components/os_crypt/os_crypt.h" #include "components/password_manager/core/browser/login_database.h" +#include "components/password_manager/core/browser/sync/password_proto_utils.h" #include "components/password_manager/core/browser/sync/password_sync_bridge.h" #include "components/sync/model/client_tag_based_model_type_processor.h" #include "components/sync/model/model_type_controller_delegate.h" @@ -136,8 +137,8 @@ const PasswordForm& form) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); BeginTransaction(); - AddLoginError error = AddLoginError::kNone; - PasswordStoreChangeList changes = AddLoginSync(form, &error); + AddCredentialError error = AddCredentialError::kNone; + PasswordStoreChangeList changes = AddLoginImpl(form, &error); if (sync_bridge_ && !changes.empty()) sync_bridge_->ActOnPasswordStoreChanges(changes); // Sync metadata get updated in ActOnPasswordStoreChanges(). Therefore, @@ -145,7 +146,7 @@ // because sync codebase needs to update metadata atomically together with // the login data. CommitTransaction(); - return error == AddLoginError::kNone + return error == AddCredentialError::kNone ? changes : PasswordChangesOrError( PasswordStoreBackendError::kUnrecoverable); @@ -155,8 +156,8 @@ const PasswordForm& form) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); BeginTransaction(); - UpdateLoginError error = UpdateLoginError::kNone; - PasswordStoreChangeList changes = UpdateLoginSync(form, &error); + UpdateCredentialError error = UpdateCredentialError::kNone; + PasswordStoreChangeList changes = UpdateLoginImpl(form, &error); if (sync_bridge_ && !changes.empty()) sync_bridge_->ActOnPasswordStoreChanges(changes); // Sync metadata get updated in ActOnPasswordStoreChanges(). Therefore, @@ -164,7 +165,7 @@ // because sync codebase needs to update metadata atomically together with // the login data. CommitTransaction(); - return error == UpdateLoginError::kNone + return error == UpdateCredentialError::kNone ? changes : PasswordChangesOrError( PasswordStoreBackendError::kUnrecoverable); @@ -343,33 +344,21 @@ return sync_bridge_->change_processor()->GetControllerDelegate(); } -PasswordStoreChangeList LoginDatabaseAsyncHelper::AddLoginSync( - const PasswordForm& form, - AddLoginError* error) { +PasswordStoreChangeList LoginDatabaseAsyncHelper::AddCredentialSync( + const sync_pb::PasswordSpecificsData& password, + AddCredentialError* error) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (!login_db_) { - if (error) { - *error = AddLoginError::kDbNotAvailable; - } - return PasswordStoreChangeList(); - } - return login_db_->AddLogin(form, error); + return AddLoginImpl(PasswordFromSpecifics(password), error); } -PasswordStoreChangeList LoginDatabaseAsyncHelper::UpdateLoginSync( - const PasswordForm& form, - UpdateLoginError* error) { +PasswordStoreChangeList LoginDatabaseAsyncHelper::UpdateCredentialSync( + const sync_pb::PasswordSpecificsData& password, + UpdateCredentialError* error) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (!login_db_) { - if (error) { - *error = UpdateLoginError::kDbNotAvailable; - } - return PasswordStoreChangeList(); - } - return login_db_->UpdateLogin(form, error); + return UpdateLoginImpl(PasswordFromSpecifics(password), error); } -void LoginDatabaseAsyncHelper::NotifyLoginsChanged( +void LoginDatabaseAsyncHelper::NotifyCredentialsChanged( const PasswordStoreChangeList& changes) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!remote_forms_changes_received_callback_) @@ -427,15 +416,25 @@ return false; } -FormRetrievalResult LoginDatabaseAsyncHelper::ReadAllLogins( - PrimaryKeyToFormMap* key_to_form_map) { +FormRetrievalResult LoginDatabaseAsyncHelper::ReadAllCredentials( + PrimaryKeyToPasswordSpecificsDataMap* key_to_specifics_map) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!login_db_) return FormRetrievalResult::kDbError; - return login_db_->GetAllLogins(key_to_form_map); + PrimaryKeyToFormMap key_to_form_map; + FormRetrievalResult result = login_db_->GetAllLogins(&key_to_form_map); + for (const auto& [primary_key, form] : key_to_form_map) { + key_to_specifics_map->emplace( + primary_key, + std::make_unique<sync_pb::PasswordSpecificsData>( + SpecificsDataFromPassword(*form, /*base_password_data=*/{}))); + } + + return result; } -PasswordStoreChangeList LoginDatabaseAsyncHelper::RemoveLoginByPrimaryKeySync( +PasswordStoreChangeList +LoginDatabaseAsyncHelper::RemoveCredentialByPrimaryKeySync( FormPrimaryKey primary_key) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); PasswordStoreChangeList changes; @@ -460,13 +459,40 @@ return login_db_ && login_db_->DeleteAndRecreateDatabaseFile(); } -DatabaseCleanupResult LoginDatabaseAsyncHelper::DeleteUndecryptableLogins() { +DatabaseCleanupResult +LoginDatabaseAsyncHelper::DeleteUndecryptableCredentials() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!login_db_) return DatabaseCleanupResult::kDatabaseUnavailable; return login_db_->DeleteUndecryptableLogins(); } +PasswordStoreChangeList LoginDatabaseAsyncHelper::AddLoginImpl( + const PasswordForm& form, + AddCredentialError* error) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (!login_db_) { + if (error) { + *error = AddCredentialError::kDbNotAvailable; + } + return PasswordStoreChangeList(); + } + return login_db_->AddLogin(form, error); +} + +PasswordStoreChangeList LoginDatabaseAsyncHelper::UpdateLoginImpl( + const PasswordForm& form, + UpdateCredentialError* error) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (!login_db_) { + if (error) { + *error = UpdateCredentialError::kDbNotAvailable; + } + return PasswordStoreChangeList(); + } + return login_db_->UpdateLogin(form, error); +} + // Reports password store metrics that aren't reported by the // StoreMetricsReporter. Namely, metrics related to inaccessible passwords, // and bubble statistics.
diff --git a/components/password_manager/core/browser/login_database_async_helper.h b/components/password_manager/core/browser/login_database_async_helper.h index f3aa267..268fcf5 100644 --- a/components/password_manager/core/browser/login_database_async_helper.h +++ b/components/password_manager/core/browser/login_database_async_helper.h
@@ -80,25 +80,33 @@ private: // Implements PasswordStoreSync interface. - PasswordStoreChangeList AddLoginSync(const PasswordForm& form, - AddLoginError* error) override; - PasswordStoreChangeList UpdateLoginSync(const PasswordForm& form, - UpdateLoginError* error) override; - void NotifyLoginsChanged(const PasswordStoreChangeList& changes) override; + PasswordStoreChangeList AddCredentialSync( + const sync_pb::PasswordSpecificsData& password, + AddCredentialError* error) override; + PasswordStoreChangeList UpdateCredentialSync( + const sync_pb::PasswordSpecificsData& password, + UpdateCredentialError* error) override; + void NotifyCredentialsChanged( + const PasswordStoreChangeList& changes) override; void NotifyDeletionsHaveSynced(bool success) override; void NotifyUnsyncedCredentialsWillBeDeleted( std::vector<PasswordForm> unsynced_credentials) override; bool BeginTransaction() override; void RollbackTransaction() override; bool CommitTransaction() override; - FormRetrievalResult ReadAllLogins( - PrimaryKeyToFormMap* key_to_form_map) override; - PasswordStoreChangeList RemoveLoginByPrimaryKeySync( + FormRetrievalResult ReadAllCredentials( + PrimaryKeyToPasswordSpecificsDataMap* key_to_form_map) override; + PasswordStoreChangeList RemoveCredentialByPrimaryKeySync( FormPrimaryKey primary_key) override; PasswordStoreSync::MetadataStore* GetMetadataStore() override; bool IsAccountStore() const override; bool DeleteAndRecreateDatabaseFile() override; - DatabaseCleanupResult DeleteUndecryptableLogins() override; + DatabaseCleanupResult DeleteUndecryptableCredentials() override; + + PasswordStoreChangeList AddLoginImpl(const PasswordForm& form, + AddCredentialError* error); + PasswordStoreChangeList UpdateLoginImpl(const PasswordForm& form, + UpdateCredentialError* error); // Reports password store metrics that aren't reported by the // StoreMetricsReporter. Namely, metrics related to inaccessible passwords,
diff --git a/components/password_manager/core/browser/password_account_storage_settings_watcher_unittest.cc b/components/password_manager/core/browser/password_account_storage_settings_watcher_unittest.cc index ff412a9c..393c06c 100644 --- a/components/password_manager/core/browser/password_account_storage_settings_watcher_unittest.cc +++ b/components/password_manager/core/browser/password_account_storage_settings_watcher_unittest.cc
@@ -55,14 +55,8 @@ EXPECT_CALL(change_callback, Run()).WillOnce([&]() { EXPECT_FALSE(feature_manager.IsOptedInForAccountStorage()); EXPECT_FALSE(feature_manager.IsDefaultPasswordStoreSet()); - if (base::FeatureList::IsEnabled( - features::kPasswordsAccountStorageRevisedOptInFlow)) { - EXPECT_EQ(feature_manager.GetDefaultPasswordStore(), - PasswordForm::Store::kProfileStore); - } else { - EXPECT_EQ(feature_manager.GetDefaultPasswordStore(), - PasswordForm::Store::kAccountStore); - } + EXPECT_EQ(feature_manager.GetDefaultPasswordStore(), + PasswordForm::Store::kProfileStore); }); sync_service.FireStateChanged();
diff --git a/components/password_manager/core/browser/password_feature_manager_impl.cc b/components/password_manager/core/browser/password_feature_manager_impl.cc index 1a421b8d..7c91b68 100644 --- a/components/password_manager/core/browser/password_feature_manager_impl.cc +++ b/components/password_manager/core/browser/password_feature_manager_impl.cc
@@ -66,9 +66,7 @@ bool PasswordFeatureManagerImpl:: ShouldOfferOptInAndMoveToAccountStoreAfterSavingLocally() const { - return base::FeatureList::IsEnabled( - features::kPasswordsAccountStorageRevisedOptInFlow) && - ShouldShowAccountStorageOptIn() && !IsDefaultPasswordStoreSet(); + return ShouldShowAccountStorageOptIn() && !IsDefaultPasswordStoreSet(); } PasswordForm::Store PasswordFeatureManagerImpl::GetDefaultPasswordStore()
diff --git a/components/password_manager/core/browser/password_form.cc b/components/password_manager/core/browser/password_form.cc index 663360b7..ecc5eca 100644 --- a/components/password_manager/core/browser/password_form.cc +++ b/components/password_manager/core/browser/password_form.cc
@@ -303,10 +303,6 @@ return !password_value.empty() || !new_password_value.empty(); } -bool PasswordForm::IsInsecureCredential(InsecureType insecure_type) const { - return password_issues.find(insecure_type) != password_issues.end(); -} - bool ArePasswordFormUniqueKeysEqual(const PasswordForm& left, const PasswordForm& right) { return PasswordFormUniqueKey(left) == PasswordFormUniqueKey(right);
diff --git a/components/password_manager/core/browser/password_form.h b/components/password_manager/core/browser/password_form.h index b907812..0b36d7d8 100644 --- a/components/password_manager/core/browser/password_form.h +++ b/components/password_manager/core/browser/password_form.h
@@ -447,10 +447,6 @@ // Returns true when |password_value| or |new_password_value| are non-empty. bool HasNonEmptyPasswordValue() const; - // Utility method to check whether the form represents an insecure credential - // of insecure type `type`. - bool IsInsecureCredential(InsecureType insecure_type) const; - PasswordForm(); PasswordForm(const PasswordForm& other); PasswordForm(PasswordForm&& other);
diff --git a/components/password_manager/core/browser/password_manager_features_util.cc b/components/password_manager/core/browser/password_manager_features_util.cc index 504e6783..dfd1674 100644 --- a/components/password_manager/core/browser/password_manager_features_util.cc +++ b/components/password_manager/core/browser/password_manager_features_util.cc
@@ -356,10 +356,6 @@ // If none of the early-outs above triggered, then we *can* save to the // account store in principle (though the user might not have opted in to that // yet). - // Note: Check the feature flag unconditionally to make sure there's no bias - // in group assignments. - bool revised_opt_in_flow_enabled = base::FeatureList::IsEnabled( - features::kPasswordsAccountStorageRevisedOptInFlow); if (default_store == PasswordForm::Store::kNotSet) { // In the original flow: Always default to saving to the account if the user // hasn't made an explicit choice yet. (If they haven't opted in, they'll @@ -369,7 +365,6 @@ // default. If the user *has* opted in, then they've chosen to save to the // account, so that becomes the default. bool save_to_profile_store = - revised_opt_in_flow_enabled && !IsOptedInForAccountStorage(pref_service, sync_service); return save_to_profile_store ? PasswordForm::Store::kProfileStore : PasswordForm::Store::kAccountStore;
diff --git a/components/password_manager/core/browser/password_manager_features_util_unittest.cc b/components/password_manager/core/browser/password_manager_features_util_unittest.cc index 76c2d5b..139f90d 100644 --- a/components/password_manager/core/browser/password_manager_features_util_unittest.cc +++ b/components/password_manager/core/browser/password_manager_features_util_unittest.cc
@@ -91,30 +91,12 @@ }; // Test fixture where the account-scoped password storage is *enabled*. -// The parameter specifies whether the original or the revised opt-in flow are -// active. class PasswordManagerFeaturesUtilTest : public PasswordManagerFeaturesUtilTestBase, - public testing::TestWithParam<bool> { - public: - PasswordManagerFeaturesUtilTest() { - bool use_revised_flow = GetParam(); - if (use_revised_flow) { - features_.InitWithFeatures( - /*enabled_features=*/{features::kEnablePasswordsAccountStorage, - features:: - kPasswordsAccountStorageRevisedOptInFlow}, - /*disabled_features=*/{}); - } else { - features_.InitWithFeatures( - /*enabled_features=*/{features::kEnablePasswordsAccountStorage}, - /*disabled_features=*/{ - features::kPasswordsAccountStorageRevisedOptInFlow}); - } - } - + public testing::Test { private: - base::test::ScopedFeatureList features_; + base::test::ScopedFeatureList features_{ + features::kEnablePasswordsAccountStorage}; }; TEST_F(PasswordManagerFeaturesUtilWithoutAccountStorageTest, @@ -141,7 +123,7 @@ PasswordForm::Store::kProfileStore); } -TEST_P(PasswordManagerFeaturesUtilTest, ShowAccountStorageResignIn) { +TEST_F(PasswordManagerFeaturesUtilTest, ShowAccountStorageResignIn) { // Add an account to prefs which opted into using the account-storage. pref_service_.SetDict(prefs::kAccountStoragePerAccountSettings, CreateOptedInAccountPref()); @@ -166,7 +148,7 @@ ShouldShowAccountStorageReSignin(&pref_service_, &sync_service_, GURL())); } -TEST_P(PasswordManagerFeaturesUtilTest, +TEST_F(PasswordManagerFeaturesUtilTest, DontShowAccountStorageResignIn_SyncActive) { // Add an account to prefs which opted into using the account-storage. pref_service_.SetDict(prefs::kAccountStoragePerAccountSettings, @@ -183,7 +165,7 @@ ShouldShowAccountStorageReSignin(&pref_service_, &sync_service_, GURL())); } -TEST_P(PasswordManagerFeaturesUtilTest, +TEST_F(PasswordManagerFeaturesUtilTest, DontShowAccountStorageResignIn_NoPrefs) { // Pref is not set for any account. @@ -194,7 +176,7 @@ ShouldShowAccountStorageReSignin(&pref_service_, &sync_service_, GURL())); } -TEST_P(PasswordManagerFeaturesUtilTest, +TEST_F(PasswordManagerFeaturesUtilTest, DontShowAccountStorageResignIn_GaiaUrl) { // Add an account to prefs which opted into using the account-storage. pref_service_.SetDict(prefs::kAccountStoragePerAccountSettings, @@ -220,7 +202,7 @@ GURL("https://accounts.google.com/some/path"))); } -TEST_P(PasswordManagerFeaturesUtilTest, AccountStoragePerAccountSettings) { +TEST_F(PasswordManagerFeaturesUtilTest, AccountStoragePerAccountSettings) { CoreAccountInfo first_account; first_account.email = "first@account.com"; first_account.gaia = "first"; @@ -247,16 +229,9 @@ // By default, the user is not opted in, but eligible. EXPECT_FALSE(IsOptedInForAccountStorage(&pref_service_, &sync_service_)); EXPECT_TRUE(ShouldShowAccountStorageOptIn(&pref_service_, &sync_service_)); - // The default store depends on the original vs. revised opt-in flow. EXPECT_FALSE(IsDefaultPasswordStoreSet(&pref_service_, &sync_service_)); - if (base::FeatureList::IsEnabled( - features::kPasswordsAccountStorageRevisedOptInFlow)) { - EXPECT_EQ(GetDefaultPasswordStore(&pref_service_, &sync_service_), - PasswordForm::Store::kProfileStore); - } else { - EXPECT_EQ(GetDefaultPasswordStore(&pref_service_, &sync_service_), - PasswordForm::Store::kAccountStore); - } + EXPECT_EQ(GetDefaultPasswordStore(&pref_service_, &sync_service_), + PasswordForm::Store::kProfileStore); // Opt in! OptInToAccountStorage(&pref_service_, &sync_service_); @@ -300,7 +275,7 @@ PasswordForm::Store::kProfileStore); } -TEST_P(PasswordManagerFeaturesUtilTest, +TEST_F(PasswordManagerFeaturesUtilTest, AccountStorageKeepSettingsOnlyForUsers) { CoreAccountInfo first_account; first_account.email = "first@account.com"; @@ -338,7 +313,7 @@ EXPECT_FALSE(IsOptedInForAccountStorage(&pref_service_, &sync_service_)); } -TEST_P(PasswordManagerFeaturesUtilTest, SyncSuppressesAccountStorageOptIn) { +TEST_F(PasswordManagerFeaturesUtilTest, SyncSuppressesAccountStorageOptIn) { CoreAccountInfo account; account.email = "name@account.com"; account.gaia = "name"; @@ -364,7 +339,7 @@ ShouldShowAccountStorageBubbleUi(&pref_service_, &sync_service_)); } -TEST_P(PasswordManagerFeaturesUtilTest, SyncDisablesAccountStorage) { +TEST_F(PasswordManagerFeaturesUtilTest, SyncDisablesAccountStorage) { CoreAccountInfo account; account.email = "name@account.com"; account.gaia = "name"; @@ -401,7 +376,7 @@ PasswordForm::Store::kProfileStore); } -TEST_P(PasswordManagerFeaturesUtilTest, LocalSyncDisablesAccountStorage) { +TEST_F(PasswordManagerFeaturesUtilTest, LocalSyncDisablesAccountStorage) { CoreAccountInfo account; account.email = "name@account.com"; account.gaia = "name"; @@ -436,7 +411,7 @@ PasswordForm::Store::kProfileStore); } -TEST_P(PasswordManagerFeaturesUtilTest, OptOutClearsStorePreference) { +TEST_F(PasswordManagerFeaturesUtilTest, OptOutClearsStorePreference) { base::HistogramTester histogram_tester; CoreAccountInfo account; @@ -459,14 +434,8 @@ // The default store pref should have been erased. EXPECT_FALSE(IsDefaultPasswordStoreSet(&pref_service_, &sync_service_)); EXPECT_FALSE(IsOptedInForAccountStorage(&pref_service_, &sync_service_)); - if (base::FeatureList::IsEnabled( - features::kPasswordsAccountStorageRevisedOptInFlow)) { - EXPECT_EQ(GetDefaultPasswordStore(&pref_service_, &sync_service_), - PasswordForm::Store::kProfileStore); - } else { - EXPECT_EQ(GetDefaultPasswordStore(&pref_service_, &sync_service_), - PasswordForm::Store::kAccountStore); - } + EXPECT_EQ(GetDefaultPasswordStore(&pref_service_, &sync_service_), + PasswordForm::Store::kProfileStore); histogram_tester.ExpectUniqueSample( "PasswordManager.AccountStorage.SignedInAccountFoundDuringOptOut", true, @@ -477,7 +446,7 @@ PasswordForm::Store::kProfileStore, 1); } -TEST_P(PasswordManagerFeaturesUtilTest, OptInOutHistograms) { +TEST_F(PasswordManagerFeaturesUtilTest, OptInOutHistograms) { base::HistogramTester histogram_tester; CoreAccountInfo first_account; @@ -531,7 +500,7 @@ "PasswordManager.AccountStorage.ClearedOptInForAllAccounts", 1, 1); } -TEST_P(PasswordManagerFeaturesUtilTest, +TEST_F(PasswordManagerFeaturesUtilTest, MovePasswordToAccountStoreOfferedCount) { // Set up a user signed-in, not syncing and not opted-in. CoreAccountInfo account; @@ -551,13 +520,5 @@ 2, GetMoveOfferedToNonOptedInUserCount(&pref_service_, &sync_service_)); } -INSTANTIATE_TEST_SUITE_P(, - PasswordManagerFeaturesUtilTest, - testing::Bool(), - [](const ::testing::TestParamInfo<bool>& info) { - return info.param ? "RevisedOptInFlow" - : "OriginalOptInFlow"; - }); - } // namespace features_util } // namespace password_manager
diff --git a/components/password_manager/core/browser/password_store_sync.h b/components/password_manager/core/browser/password_store_sync.h index 8b9cbbb..292fb09 100644 --- a/components/password_manager/core/browser/password_store_sync.h +++ b/components/password_manager/core/browser/password_store_sync.h
@@ -16,15 +16,17 @@ class MetadataBatch; } +namespace sync_pb { +class PasswordSpecificsData; +} + namespace password_manager { -struct PasswordForm; - -using PrimaryKeyToFormMap = - std::map<FormPrimaryKey, std::unique_ptr<PasswordForm>>; +using PrimaryKeyToPasswordSpecificsDataMap = + std::map<FormPrimaryKey, std::unique_ptr<sync_pb::PasswordSpecificsData>>; // This enum is used to determine result status when deleting undecryptable -// logins from database. +// credentials from database. enum class DatabaseCleanupResult { kSuccess, kItemFailure, @@ -45,12 +47,12 @@ kEncryptionServiceFailureWithPartialData, }; -// Error values for adding a login to the store. +// Error values for adding a credential to the store. // Used in metrics: "PasswordManager.MergeSyncData.AddLoginSyncError" and // "PasswordManager.ApplySyncChanges.AddLoginSyncError". These values are // persisted to logs. Entries should not be renumbered and numeric values should // never be reused. -enum class AddLoginError { +enum class AddCredentialError { // Success. kNone = 0, // Database not available. @@ -66,12 +68,12 @@ kMaxValue = kDbError, }; -// Error values for updating a login in the store. +// Error values for updating a credential in the store. // Used in metrics: "PasswordManager.MergeSyncData.UpdateLoginSyncError" and // "PasswordManager.ApplySyncChanges.UpdateLoginSyncError". These values are // persisted to logs. Entries should not be renumbered and numeric values should // never be reused. -enum class UpdateLoginError { +enum class UpdateCredentialError { // Success. kNone = 0, // Database not available. @@ -121,30 +123,32 @@ PasswordStoreSync(const PasswordStoreSync&) = delete; PasswordStoreSync& operator=(const PasswordStoreSync&) = delete; - // Overwrites |key_to_form_map| with a map from the DB primary key to the + // Overwrites |key_to_specifics_map| with a map from the DB primary key to the // corresponding form for all stored credentials. Returns true on success. - [[nodiscard]] virtual FormRetrievalResult ReadAllLogins( - PrimaryKeyToFormMap* key_to_form_map) = 0; + [[nodiscard]] virtual FormRetrievalResult ReadAllCredentials( + PrimaryKeyToPasswordSpecificsDataMap* key_to_specifics_map) = 0; - // Deletes logins that cannot be decrypted. - virtual DatabaseCleanupResult DeleteUndecryptableLogins() = 0; + // Deletes credentials that cannot be decrypted. + virtual DatabaseCleanupResult DeleteUndecryptableCredentials() = 0; - // Synchronous implementation to add the given login. - virtual PasswordStoreChangeList AddLoginSync( - const PasswordForm& form, - AddLoginError* error = nullptr) = 0; + // Synchronous implementation to add the given credential. + virtual PasswordStoreChangeList AddCredentialSync( + const sync_pb::PasswordSpecificsData& specifics, + AddCredentialError* error = nullptr) = 0; - // Synchronous implementation to update the given login. - virtual PasswordStoreChangeList UpdateLoginSync( - const PasswordForm& form, - UpdateLoginError* error = nullptr) = 0; + // Synchronous implementation to update the given credential. + virtual PasswordStoreChangeList UpdateCredentialSync( + const sync_pb::PasswordSpecificsData& specifics, + UpdateCredentialError* error = nullptr) = 0; - // Synchronous implementation to remove the login with the given primary key. - virtual PasswordStoreChangeList RemoveLoginByPrimaryKeySync( + // Synchronous implementation to remove the credential with the given primary + // key. + virtual PasswordStoreChangeList RemoveCredentialByPrimaryKeySync( FormPrimaryKey primary_key) = 0; // Notifies observers that password store data may have been changed. - virtual void NotifyLoginsChanged(const PasswordStoreChangeList& changes) = 0; + virtual void NotifyCredentialsChanged( + const PasswordStoreChangeList& changes) = 0; // Notifies any waiting callback that all pending deletions have been // committed to the Sync server now, or that Sync definitely won't commit @@ -160,8 +164,8 @@ // The methods below adds transaction support to the password store that's // required by sync to guarantee atomic writes of data and sync metadata. // TODO(crbug.com/902349): The introduction of the three functions below - // question the existence of NotifyLoginsChanged() above and all the round - // trips with PasswordStoreChangeList in the earlier functions. Instead, + // question the existence of NotifyCredentialsChanged() above and all the + // round trips with PasswordStoreChangeList in the earlier functions. Instead, // observers could be notified inside CommitTransaction(). virtual bool BeginTransaction() = 0; virtual void RollbackTransaction() = 0;
diff --git a/components/password_manager/core/browser/sync/password_proto_utils.h b/components/password_manager/core/browser/sync/password_proto_utils.h index d2dc4691..36b1fd8 100644 --- a/components/password_manager/core/browser/sync/password_proto_utils.h +++ b/components/password_manager/core/browser/sync/password_proto_utils.h
@@ -52,7 +52,9 @@ // Returns sync_pb::PasswordSpecificsData based on given `password_form`. // `base_password_data` is intended for carrying over unknown and unsupported -// fields when there is a local modification to an existing sync entity. +// fields when there is a local modification to an existing sync entity. The +// resulting proto contains all supported fields from `password_form` combined +// with unsupported from `base_password_data` sync_pb::PasswordSpecificsData SpecificsDataFromPassword( const PasswordForm& password_form, const sync_pb::PasswordSpecificsData& base_password_data);
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge.cc b/components/password_manager/core/browser/sync/password_sync_bridge.cc index 13a17d1..f1870be 100644 --- a/components/password_manager/core/browser/sync/password_sync_bridge.cc +++ b/components/password_manager/core/browser/sync/password_sync_bridge.cc
@@ -71,21 +71,18 @@ base::EscapePath(password_data.signon_realm()); } -base::Time ConvertToBaseTime(uint64_t time) { - return base::Time::FromDeltaSinceWindowsEpoch( - // Use FromDeltaSinceWindowsEpoch because create_time_us has - // always used the Windows epoch. - base::Microseconds(time)); -} - -PasswordForm PasswordFromEntityChange( +sync_pb::PasswordSpecificsData PasswordFromEntityChange( const syncer::EntityChange& entity_change) { DCHECK(entity_change.data().specifics.has_password()); - const sync_pb::PasswordSpecificsData& password_data = - entity_change.data().specifics.password().client_only_encrypted_data(); - return PasswordFromSpecifics(password_data); + return entity_change.data().specifics.password().client_only_encrypted_data(); } +// Returns syncer::EntityData based on given `form`. +// `base_password_data` is intended for carrying over unknown and unsupported +// fields when there is a local modification to an existing sync entity. `form` +// and `base_password_data` are combined such that all supported proto fields +// are read from `form` while unsupported field are read from +// `base_password_data`. std::unique_ptr<syncer::EntityData> CreateEntityData( const PasswordForm& form, const sync_pb::PasswordSpecificsData& base_password_data) { @@ -96,6 +93,15 @@ return entity_data; } +// Similar to the method above but acts on sync_pb::PasswordSpecificsData +// instead. +std::unique_ptr<syncer::EntityData> CreateEntityData( + const sync_pb::PasswordSpecificsData& password_data, + const sync_pb::PasswordSpecificsData& base_password_data) { + return CreateEntityData(PasswordFromSpecifics(password_data), + base_password_data); +} + FormPrimaryKey ParsePrimaryKey(const std::string& storage_key) { int primary_key = 0; bool success = base::StringToInt(storage_key, &primary_key); @@ -105,54 +111,63 @@ return FormPrimaryKey(primary_key); } -// Returns true iff |password_specifics| and |password_form| are equal -// memberwise. It doesn't compare |password_issues|. +// Returns true iff |remote_password_specifics| and |local_password_specifics| +// are equal memberwise. It doesn't compare |password_issues|. bool AreLocalAndRemotePasswordsEqualExcludingIssues( - const sync_pb::PasswordSpecificsData& password_specifics, - const PasswordForm& password_form) { - return (static_cast<int>(password_form.scheme) == - password_specifics.scheme() && - password_form.signon_realm == password_specifics.signon_realm() && - password_form.url.spec() == password_specifics.origin() && - password_form.action.spec() == password_specifics.action() && - base::UTF16ToUTF8(password_form.username_element) == - password_specifics.username_element() && - base::UTF16ToUTF8(password_form.password_element) == - password_specifics.password_element() && - base::UTF16ToUTF8(password_form.username_value) == - password_specifics.username_value() && - base::UTF16ToUTF8(password_form.password_value) == - password_specifics.password_value() && - password_form.date_last_used == - ConvertToBaseTime(password_specifics.date_last_used()) && - password_form.date_password_modified == - ConvertToBaseTime( - password_specifics - .date_password_modified_windows_epoch_micros()) && - password_form.date_created == - ConvertToBaseTime(password_specifics.date_created()) && - password_form.blocked_by_user == password_specifics.blacklisted() && - static_cast<int>(password_form.type) == password_specifics.type() && - password_form.times_used == password_specifics.times_used() && - base::UTF16ToUTF8(password_form.display_name) == - password_specifics.display_name() && - password_form.icon_url.spec() == password_specifics.avatar_url() && - url::Origin::Create(GURL(password_specifics.federation_url())) - .Serialize() == - password_form.federation_origin.Serialize()) && - password_form.notes == - PasswordNotesFromProto(password_specifics.notes()); + const sync_pb::PasswordSpecificsData& remote_password_specifics, + const sync_pb::PasswordSpecificsData& local_password_specifics) { + return local_password_specifics.scheme() == + remote_password_specifics.scheme() && + local_password_specifics.signon_realm() == + remote_password_specifics.signon_realm() && + local_password_specifics.origin() == + remote_password_specifics.origin() && + local_password_specifics.action() == + remote_password_specifics.action() && + local_password_specifics.username_element() == + remote_password_specifics.username_element() && + local_password_specifics.password_element() == + remote_password_specifics.password_element() && + local_password_specifics.username_value() == + remote_password_specifics.username_value() && + local_password_specifics.password_value() == + remote_password_specifics.password_value() && + local_password_specifics.date_last_used() == + remote_password_specifics.date_last_used() && + local_password_specifics + .date_password_modified_windows_epoch_micros() == + remote_password_specifics + .date_password_modified_windows_epoch_micros() && + local_password_specifics.date_created() == + remote_password_specifics.date_created() && + local_password_specifics.blacklisted() == + remote_password_specifics.blacklisted() && + local_password_specifics.type() == remote_password_specifics.type() && + local_password_specifics.times_used() == + remote_password_specifics.times_used() && + local_password_specifics.display_name() == + remote_password_specifics.display_name() && + local_password_specifics.avatar_url() == + remote_password_specifics.avatar_url() && + local_password_specifics.federation_url() == + remote_password_specifics.federation_url() && + PasswordNotesFromProto(local_password_specifics.notes()) == + PasswordNotesFromProto(remote_password_specifics.notes()); } -// Returns true iff |password_specifics| and |password_form| are equal -// memberwise. +// Returns true iff |remote_password_specifics| and |local_password_specifics| +// are equal memberwise. bool AreLocalAndRemotePasswordsEqual( - const sync_pb::PasswordSpecificsData& password_specifics, - const PasswordForm& password_form) { - return AreLocalAndRemotePasswordsEqualExcludingIssues(password_specifics, - password_form) && - password_form.password_issues == - PasswordIssuesMapFromProto(password_specifics); + const sync_pb::PasswordSpecificsData& remote_password_specifics, + const sync_pb::PasswordSpecificsData& local_password_specifics) { + return AreLocalAndRemotePasswordsEqualExcludingIssues( + remote_password_specifics, local_password_specifics) && + PasswordIssuesMapFromProto(remote_password_specifics) == + PasswordIssuesMapFromProto(local_password_specifics); +} + +bool IsCredentialPhished(const sync_pb::PasswordSpecificsData& specifics) { + return specifics.password_issues().has_phished_password_issue(); } // Whether we should try to recover undecryptable local passwords by deleting @@ -182,9 +197,9 @@ bool DoesPasswordStoreHaveEncryptionServiceFailures( PasswordStoreSync* password_store_sync) { - PrimaryKeyToFormMap key_to_form_map; + PrimaryKeyToPasswordSpecificsDataMap key_to_specifics_map; FormRetrievalResult result = - password_store_sync->ReadAllLogins(&key_to_form_map); + password_store_sync->ReadAllCredentials(&key_to_specifics_map); if (result == FormRetrievalResult::kEncryptionServiceFailure || result == FormRetrievalResult::kEncryptionServiceFailureWithPartialData) { return true; @@ -254,8 +269,8 @@ } else if (ShouldCleanSyncMetadataDuringStartupWhenDecryptionFails() && DoesPasswordStoreHaveEncryptionServiceFailures( password_store_sync_)) { - // Some logins in the passwords store cannot be read, force initial sync - // by dropping the metadata. + // Some Credentials in the passwords store cannot be read, force initial + // sync by dropping the metadata. password_store_sync_->GetMetadataStore()->DeleteAllSyncMetadata(); batch = std::make_unique<syncer::MetadataBatch>(); sync_metadata_read_error = SyncMetadataReadError::kReadSuccessButCleared; @@ -342,8 +357,8 @@ // tags. For a form |F|, there are three cases to handle: // 1. |F| exists only in the local model --> |F| should be Put() in the change // processor. - // 2. |F| exists only in the remote model --> |F| should be AddLoginSync() to - // the local password store. + // 2. |F| exists only in the remote model --> |F| should be + // AddCredentialSync() to the local password store. // 3. |F| exists in both the local and the remote models --> both versions // should be merged by accepting the most recently created one, and update // local and remote models accordingly. @@ -351,9 +366,9 @@ true); // Read all local passwords. - PrimaryKeyToFormMap key_to_local_form_map; + PrimaryKeyToPasswordSpecificsDataMap key_to_local_specifics_map; FormRetrievalResult read_result = - password_store_sync_->ReadAllLogins(&key_to_local_form_map); + password_store_sync_->ReadAllCredentials(&key_to_local_specifics_map); if (read_result == FormRetrievalResult::kDbError) { metrics_util::LogPasswordSyncState( @@ -377,7 +392,8 @@ return cleanup_result_error; } // Clean up done successfully, try to read again. - read_result = password_store_sync_->ReadAllLogins(&key_to_local_form_map); + read_result = + password_store_sync_->ReadAllCredentials(&key_to_local_specifics_map); if (read_result != FormRetrievalResult::kSuccess) { metrics_util::LogPasswordSyncState( metrics_util::PasswordSyncState::kNotSyncingFailedRead); @@ -409,12 +425,12 @@ // created version. Password comparison is done by comparing the client // tags. In addition, collect the client tags of local passwords. std::unordered_set<std::string> client_tags_of_local_passwords; - for (const auto& [primary_key, local_password_form] : - key_to_local_form_map) { + for (const auto& [primary_key, local_password_specifics] : + key_to_local_specifics_map) { const std::string storage_key = base::NumberToString(primary_key.value()); std::unique_ptr<syncer::EntityData> local_form_entity_data = CreateEntityData( - *local_password_form, + *local_password_specifics, GetPossiblyTrimmedPasswordSpecificsData(storage_key)); const std::string client_tag_of_local_password = @@ -443,17 +459,17 @@ remote_entity_change.data(), storage_key, metadata_change_list.get()); if (AreLocalAndRemotePasswordsEqual(remote_password_specifics, - *local_password_form)) { + *local_password_specifics)) { // Passwords are identical, nothing else to do. continue; } // Passwords or insecure credentials aren't identical. - if (ConvertToBaseTime(remote_password_specifics.date_created()) < - local_password_form->date_created || + if (remote_password_specifics.date_created() < + local_password_specifics->date_created() || (AreLocalAndRemotePasswordsEqualExcludingIssues( - remote_password_specifics, *local_password_form) && - local_password_form->IsInsecureCredential(InsecureType::kPhished))) { + remote_password_specifics, *local_password_specifics) && + IsCredentialPhished(*local_password_specifics))) { // Either the local password is more recent, or they are equal but the // local password has been marked as phished. While all other types of // issues are easy to recompute (e.g. via Password Check) phished @@ -462,15 +478,16 @@ metadata_change_list.get()); } else { // The remote password is more recent, update the local model. - UpdateLoginError update_login_error; - const PasswordForm form = + UpdateCredentialError update_credential_error; + const sync_pb::PasswordSpecificsData password_specifics = PasswordFromEntityChange(remote_entity_change); PasswordStoreChangeList changes = - password_store_sync_->UpdateLoginSync(form, &update_login_error); + password_store_sync_->UpdateCredentialSync( + password_specifics, &update_credential_error); DCHECK_LE(changes.size(), 1U); base::UmaHistogramEnumeration( "PasswordManager.MergeSyncData.UpdateLoginSyncError", - update_login_error); + update_credential_error); if (changes.empty()) { metrics_util::LogPasswordSyncState( metrics_util::PasswordSyncState::kNotSyncingFailedUpdate); @@ -488,7 +505,7 @@ // local model. // For any remote password that doesn't exist in the local passwords, issue - // a password_store_sync_->AddLoginSync() and invoke the + // a password_store_sync_->AddCredentialSync() and invoke the // change_processor()->UpdateStorageKey(). Password comparison is done by // comparing the client tags. for (const std::unique_ptr<syncer::EntityChange>& entity_change : @@ -502,26 +519,27 @@ continue; } - AddLoginError add_login_error; - PasswordStoreChangeList changes = password_store_sync_->AddLoginSync( - PasswordFromEntityChange(*entity_change), &add_login_error); + AddCredentialError add_credential_error; + PasswordStoreChangeList changes = password_store_sync_->AddCredentialSync( + PasswordFromEntityChange(*entity_change), &add_credential_error); base::UmaHistogramEnumeration( - "PasswordManager.MergeSyncData.AddLoginSyncError", add_login_error); + "PasswordManager.MergeSyncData.AddLoginSyncError", + add_credential_error); // TODO(crbug.com/939302): It's not yet clear if the DCHECK_LE below is // legit. However, recent crashes suggest that 2 changes are returned - // when trying to AddLoginSync (details are in the bug). Once this is + // when trying to AddCredentialSync (details are in the bug). Once this is // resolved, we should update the call the UpdateStorageKey() if // necessary and remove unnecessary DCHECKs below. // DCHECK_LE(changes.size(), 1U); DCHECK_LE(changes.size(), 2U); if (changes.empty()) { - DCHECK_NE(add_login_error, AddLoginError::kNone); + DCHECK_NE(add_credential_error, AddCredentialError::kNone); metrics_util::LogPasswordSyncState( metrics_util::PasswordSyncState::kNotSyncingFailedAdd); // If the remote update is invalid, direct the processor to ignore and // move on. - if (add_login_error == AddLoginError::kConstraintViolation) { + if (add_credential_error == AddCredentialError::kConstraintViolation) { change_processor()->UntrackEntityForClientTagHash( entity_change->data().client_tag_hash); continue; @@ -573,7 +591,7 @@ // there would be no changes to the password store other than the sync // metadata changes, and no need to notify observers since they aren't // interested in changes to sync metadata. - password_store_sync_->NotifyLoginsChanged(password_store_changes); + password_store_sync_->NotifyCredentialsChanged(password_store_changes); } metrics_util::LogPasswordSyncState( @@ -616,23 +634,24 @@ PasswordStoreChangeList changes; switch (entity_change->type()) { case syncer::EntityChange::ACTION_ADD: - AddLoginError add_login_error; - changes = password_store_sync_->AddLoginSync( - PasswordFromEntityChange(*entity_change), &add_login_error); + AddCredentialError add_credential_error; + changes = password_store_sync_->AddCredentialSync( + PasswordFromEntityChange(*entity_change), &add_credential_error); base::UmaHistogramEnumeration( "PasswordManager.ApplySyncChanges.AddLoginSyncError", - add_login_error); + add_credential_error); // If the addition has been successful, inform the processor about the - // assigned storage key. AddLoginSync() might return multiple changes - // and the last one should be the one representing the actual addition - // in the DB. + // assigned storage key. AddCredentialSync() might return multiple + // changes and the last one should be the one representing the actual + // addition in the DB. if (changes.empty()) { - DCHECK_NE(add_login_error, AddLoginError::kNone); + DCHECK_NE(add_credential_error, AddCredentialError::kNone); metrics_util::LogApplySyncChangesState( metrics_util::ApplySyncChangesState::kApplyAddFailed); // If the remote update is invalid, direct the processor to ignore // and move on. - if (add_login_error == AddLoginError::kConstraintViolation) { + if (add_credential_error == + AddCredentialError::kConstraintViolation) { change_processor()->UntrackEntityForClientTagHash( entity_change->data().client_tag_hash); continue; @@ -643,10 +662,10 @@ } // TODO(crbug.com/939302): It's not yet clear if the DCHECK_LE below // is legit. However, recent crashes suggest that 2 changes are - // returned when trying to AddLoginSync (details are in the bug). Once - // this is resolved, we should update the call the UpdateStorageKey() - // if necessary and remove unnecessary DCHECKs below. - // DCHECK_EQ(1U, changes.size()); + // returned when trying to AddCredentialSync (details are in the bug). + // Once this is resolved, we should update the call the + // UpdateStorageKey() if necessary and remove unnecessary DCHECKs + // below. DCHECK_EQ(1U, changes.size()); DCHECK_LE(changes.size(), 2U); if (changes.size() == 1) { DCHECK_EQ(changes[0].type(), PasswordStoreChange::ADD); @@ -669,18 +688,20 @@ if (entity_change->storage_key().empty()) { continue; } - UpdateLoginError update_login_error; - PasswordForm form = PasswordFromEntityChange(*entity_change); - changes = - password_store_sync_->UpdateLoginSync(form, &update_login_error); + UpdateCredentialError update_credential_error; + sync_pb::PasswordSpecificsData password_specifics = + PasswordFromEntityChange(*entity_change); + changes = password_store_sync_->UpdateCredentialSync( + password_specifics, &update_credential_error); FormPrimaryKey primary_key = FormPrimaryKey(ParsePrimaryKey(entity_change->storage_key())); base::UmaHistogramEnumeration( "PasswordManager.ApplySyncChanges.UpdateLoginSyncError", - update_login_error); + update_credential_error); // If there are no entries to update, direct the processor to ignore // and move on. - if (update_login_error == UpdateLoginError::kNoUpdatedRecords) { + if (update_credential_error == + UpdateCredentialError::kNoUpdatedRecords) { change_processor()->UntrackEntityForClientTagHash( entity_change->data().client_tag_hash); continue; @@ -704,8 +725,8 @@ } FormPrimaryKey primary_key = ParsePrimaryKey(entity_change->storage_key()); - changes = - password_store_sync_->RemoveLoginByPrimaryKeySync(primary_key); + changes = password_store_sync_->RemoveCredentialByPrimaryKeySync( + primary_key); if (changes.empty()) { metrics_util::LogApplySyncChangesState( metrics_util::ApplySyncChangesState::kApplyDeleteFailed); @@ -744,7 +765,7 @@ // It could be the case that there are no password store changes, and all // changes are only metadata changes. In such case, no need to notify // observers since they aren't interested in changes to sync metadata. - password_store_sync_->NotifyLoginsChanged(password_store_changes); + password_store_sync_->NotifyCredentialsChanged(password_store_changes); } metrics_util::LogApplySyncChangesState( metrics_util::ApplySyncChangesState::kApplyOK); @@ -756,8 +777,8 @@ // This method is called only when there are uncommitted changes on startup. // There are more efficient implementations, but since this method is rarely // called, simplicity is preferred over efficiency. - PrimaryKeyToFormMap key_to_form_map; - if (password_store_sync_->ReadAllLogins(&key_to_form_map) != + PrimaryKeyToPasswordSpecificsDataMap key_to_specifics_map; + if (password_store_sync_->ReadAllCredentials(&key_to_specifics_map) != FormRetrievalResult::kSuccess) { change_processor()->ReportError( {FROM_HERE, "Failed to load entries from the password store."}); @@ -767,10 +788,10 @@ auto batch = std::make_unique<syncer::MutableDataBatch>(); for (const std::string& storage_key : storage_keys) { FormPrimaryKey primary_key = ParsePrimaryKey(storage_key); - if (key_to_form_map.count(primary_key) != 0) { + if (key_to_specifics_map.count(primary_key) != 0) { batch->Put(storage_key, CreateEntityData( - *key_to_form_map[primary_key], + *key_to_specifics_map[primary_key], GetPossiblyTrimmedPasswordSpecificsData(storage_key))); } } @@ -780,8 +801,8 @@ void PasswordSyncBridge::GetAllDataForDebugging(DataCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - PrimaryKeyToFormMap key_to_form_map; - if (password_store_sync_->ReadAllLogins(&key_to_form_map) != + PrimaryKeyToPasswordSpecificsDataMap key_to_specifics_map; + if (password_store_sync_->ReadAllCredentials(&key_to_specifics_map) != FormRetrievalResult::kSuccess) { change_processor()->ReportError( {FROM_HERE, "Failed to load entries from the password store."}); @@ -789,15 +810,17 @@ } auto batch = std::make_unique<syncer::MutableDataBatch>(); - for (const auto& [primary_key, form] : key_to_form_map) { - form->password_value = u"<redacted>"; + for (const auto& [primary_key, specifics] : key_to_specifics_map) { + specifics->set_password_value("<redacted>"); const std::string storage_key = base::NumberToString(primary_key.value()); - for (PasswordNote& note : form->notes) { - note.value = u"<redacted>"; + for (sync_pb::PasswordSpecificsData_Notes_Note& note : + *specifics->mutable_notes()->mutable_note()) { + note.set_value("<redacted>"); } - batch->Put(storage_key, - CreateEntityData(*form, GetPossiblyTrimmedPasswordSpecificsData( - storage_key))); + batch->Put( + storage_key, + CreateEntityData(*specifics, + GetPossiblyTrimmedPasswordSpecificsData(storage_key))); } std::move(callback).Run(std::move(batch)); } @@ -843,32 +866,34 @@ true); PasswordStoreChangeList password_store_changes; - std::vector<PasswordForm> unsynced_logins_being_deleted; - PrimaryKeyToFormMap logins; - FormRetrievalResult result = password_store_sync_->ReadAllLogins(&logins); + std::vector<PasswordForm> unsynced_credentials_being_deleted; + PrimaryKeyToPasswordSpecificsDataMap credentials; + FormRetrievalResult result = + password_store_sync_->ReadAllCredentials(&credentials); if (result == FormRetrievalResult::kSuccess) { std::set<FormPrimaryKey> unsynced_passwords_storage_keys = GetUnsyncedPasswordsStorageKeys(); - for (const auto& [primary_key, form] : logins) { - password_store_changes.emplace_back(PasswordStoreChange::REMOVE, *form, + for (const auto& [primary_key, specifics] : credentials) { + PasswordForm form = PasswordFromSpecifics(*specifics); + password_store_changes.emplace_back(PasswordStoreChange::REMOVE, form, primary_key); if (unsynced_passwords_storage_keys.count(primary_key) != 0 && - !form->blocked_by_user) { - unsynced_logins_being_deleted.push_back(*form); + !form.blocked_by_user) { + unsynced_credentials_being_deleted.push_back(std::move(form)); } } } password_store_sync_->GetMetadataStore()->DeleteAllSyncMetadata(); password_store_sync_->DeleteAndRecreateDatabaseFile(); - password_store_sync_->NotifyLoginsChanged(password_store_changes); + password_store_sync_->NotifyCredentialsChanged(password_store_changes); base::UmaHistogramCounts100( "PasswordManager.AccountStorage.UnsyncedPasswordsFoundDuringSignOut", - unsynced_logins_being_deleted.size()); + unsynced_credentials_being_deleted.size()); - if (!unsynced_logins_being_deleted.empty()) { + if (!unsynced_credentials_being_deleted.empty()) { password_store_sync_->NotifyUnsyncedCredentialsWillBeDeleted( - std::move(unsynced_logins_being_deleted)); + std::move(unsynced_credentials_being_deleted)); } sync_enabled_or_disabled_cb_.Run(); @@ -953,7 +978,7 @@ absl::optional<syncer::ModelError> PasswordSyncBridge::CleanupPasswordStore() { DatabaseCleanupResult cleanup_result = - password_store_sync_->DeleteUndecryptableLogins(); + password_store_sync_->DeleteUndecryptableCredentials(); switch (cleanup_result) { case DatabaseCleanupResult::kSuccess: break;
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc b/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc index a267fd27..7ef08d57 100644 --- a/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc +++ b/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc
@@ -18,8 +18,10 @@ #include "base/test/mock_callback.h" #include "base/test/scoped_feature_list.h" #include "build/build_config.h" +#include "components/password_manager/core/browser/login_database.h" #include "components/password_manager/core/browser/password_form.h" #include "components/password_manager/core/browser/password_store_sync.h" +#include "components/password_manager/core/browser/sync/password_proto_utils.h" #include "components/password_manager/core/common/password_manager_features.h" #include "components/sync/base/client_tag_hash.h" #include "components/sync/base/features.h" @@ -86,14 +88,14 @@ expected_issue_types); } -// |*arg| must be of type PasswordForm. +// |*arg| must be of type sync_pb::PasswordSpecificsData. MATCHER_P(FormHasSignonRealm, expected_signon_realm, "") { - return arg.signon_realm == expected_signon_realm; + return arg.signon_realm() == expected_signon_realm; } -// |*arg| must be of type PasswordForm. +// |*arg| must be of type sync_pb::PasswordSpecificsData.. MATCHER_P(FormHasPasswordIssues, expected_issues, "") { - return arg.password_issues == expected_issues; + return PasswordFromSpecifics(arg).password_issues == expected_issues; } // |*arg| must be of type PasswordStoreChange. @@ -216,20 +218,26 @@ ~FakeDatabase() = default; - FormRetrievalResult ReadAllLogins(PrimaryKeyToFormMap* map) { + FormRetrievalResult ReadAllCredentials( + PrimaryKeyToPasswordSpecificsDataMap* map) { map->clear(); for (const auto& [primary_key, form] : data_) { - map->emplace(primary_key, std::make_unique<PasswordForm>(*form)); + map->emplace( + primary_key, + std::make_unique<sync_pb::PasswordSpecificsData>( + SpecificsDataFromPassword(*form, /*base_password_data=*/{}))); } return FormRetrievalResult::kSuccess; } - PasswordStoreChangeList AddLogin(const PasswordForm& form, - AddLoginError* error) { + PasswordStoreChangeList AddCredential( + const sync_pb::PasswordSpecificsData& specifics, + AddCredentialError* error) { if (error) { *error = error_; } - if (error_ == AddLoginError::kNone) { + if (error_ == AddCredentialError::kNone) { + PasswordForm form = PasswordFromSpecifics(specifics); data_[FormPrimaryKey(primary_key_)] = std::make_unique<PasswordForm>(form); return {PasswordStoreChange(PasswordStoreChange::ADD, form, @@ -247,11 +255,13 @@ PasswordStoreChange(PasswordStoreChange::ADD, form, form_primary_key)}; } - PasswordStoreChangeList UpdateLogin(const PasswordForm& form, - UpdateLoginError* error) { + PasswordStoreChangeList UpdateCredential( + const sync_pb::PasswordSpecificsData& specifics, + UpdateCredentialError* error) { if (error) { - *error = UpdateLoginError::kNone; + *error = UpdateCredentialError::kNone; } + PasswordForm form = PasswordFromSpecifics(specifics); FormPrimaryKey key = GetPrimaryKey(form); DCHECK_NE(-1, key.value()); bool password_changed = data_[key]->password_value != form.password_value; @@ -267,14 +277,14 @@ InsecureCredentialsChanged(insecure_changed))}; } - PasswordStoreChangeList RemoveLogin(FormPrimaryKey key) { + PasswordStoreChangeList RemoveCredential(FormPrimaryKey key) { DCHECK_NE(0U, data_.count(key)); PasswordForm form = *data_[key]; data_.erase(key); return {PasswordStoreChange(PasswordStoreChange::REMOVE, form, key)}; } - void SetAddLoginError(AddLoginError error) { error_ = error; } + void SetAddLoginError(AddCredentialError error) { error_ = error; } private: FormPrimaryKey GetPrimaryKey(const PasswordForm& form) const { @@ -288,7 +298,7 @@ int primary_key_ = 1; PrimaryKeyToFormMap data_; - AddLoginError error_ = AddLoginError::kNone; + AddCredentialError error_ = AddCredentialError::kNone; }; class MockSyncMetadataStore : public PasswordStoreSync::MetadataStore { @@ -323,24 +333,27 @@ class MockPasswordStoreSync : public PasswordStoreSync { public: MOCK_METHOD(FormRetrievalResult, - ReadAllLogins, - (PrimaryKeyToFormMap*), + ReadAllCredentials, + (PrimaryKeyToPasswordSpecificsDataMap*), (override)); MOCK_METHOD(PasswordStoreChangeList, - RemoveLoginByPrimaryKeySync, + RemoveCredentialByPrimaryKeySync, (FormPrimaryKey), (override)); - MOCK_METHOD(DatabaseCleanupResult, DeleteUndecryptableLogins, (), (override)); - MOCK_METHOD(PasswordStoreChangeList, - AddLoginSync, - (const PasswordForm&, AddLoginError*), + MOCK_METHOD(DatabaseCleanupResult, + DeleteUndecryptableCredentials, + (), (override)); MOCK_METHOD(PasswordStoreChangeList, - UpdateLoginSync, - (const PasswordForm&, UpdateLoginError*), + AddCredentialSync, + (const sync_pb::PasswordSpecificsData&, AddCredentialError*), + (override)); + MOCK_METHOD(PasswordStoreChangeList, + UpdateCredentialSync, + (const sync_pb::PasswordSpecificsData&, UpdateCredentialError*), (override)); MOCK_METHOD(void, - NotifyLoginsChanged, + NotifyCredentialsChanged, (const PasswordStoreChangeList&), (override)); MOCK_METHOD(void, NotifyDeletionsHaveSynced, (bool), (override)); @@ -366,14 +379,14 @@ PasswordSyncBridgeTest() { ON_CALL(mock_password_store_sync_, GetMetadataStore()) .WillByDefault(testing::Return(&mock_sync_metadata_store_sync_)); - ON_CALL(mock_password_store_sync_, ReadAllLogins) - .WillByDefault(Invoke(&fake_db_, &FakeDatabase::ReadAllLogins)); - ON_CALL(mock_password_store_sync_, AddLoginSync) - .WillByDefault(Invoke(&fake_db_, &FakeDatabase::AddLogin)); - ON_CALL(mock_password_store_sync_, UpdateLoginSync) - .WillByDefault(Invoke(&fake_db_, &FakeDatabase::UpdateLogin)); - ON_CALL(mock_password_store_sync_, RemoveLoginByPrimaryKeySync) - .WillByDefault(Invoke(&fake_db_, &FakeDatabase::RemoveLogin)); + ON_CALL(mock_password_store_sync_, ReadAllCredentials) + .WillByDefault(Invoke(&fake_db_, &FakeDatabase::ReadAllCredentials)); + ON_CALL(mock_password_store_sync_, AddCredentialSync) + .WillByDefault(Invoke(&fake_db_, &FakeDatabase::AddCredential)); + ON_CALL(mock_password_store_sync_, UpdateCredentialSync) + .WillByDefault(Invoke(&fake_db_, &FakeDatabase::UpdateCredential)); + ON_CALL(mock_password_store_sync_, RemoveCredentialByPrimaryKeySync) + .WillByDefault(Invoke(&fake_db_, &FakeDatabase::RemoveCredential)); bridge_ = std::make_unique<PasswordSyncBridge>( mock_processor_.CreateForwardingProcessor(), &mock_password_store_sync_, @@ -383,7 +396,7 @@ // about changes in the password store. The bridge notifies the // PasswordStoreSync about the new changes even if they are initiated by the // bridge itself. - ON_CALL(mock_password_store_sync_, NotifyLoginsChanged) + ON_CALL(mock_password_store_sync_, NotifyCredentialsChanged) .WillByDefault( Invoke(bridge(), &PasswordSyncBridge::ActOnPasswordStoreChanges)); @@ -535,7 +548,7 @@ std::make_unique<syncer::InMemoryMetadataChangeList>(); metadata_change_list->UpdateMetadata(kStorageKey, metadata); - EXPECT_CALL(*mock_password_store_sync(), NotifyLoginsChanged).Times(0); + EXPECT_CALL(*mock_password_store_sync(), NotifyCredentialsChanged).Times(0); EXPECT_CALL(*mock_sync_metadata_store_sync(), UpdateSyncMetadata(syncer::PASSWORDS, kStorageKey, _)); @@ -557,12 +570,12 @@ testing::InSequence in_sequence; EXPECT_CALL(*mock_password_store_sync(), BeginTransaction()); EXPECT_CALL(*mock_password_store_sync(), - AddLoginSync(FormHasSignonRealm(kSignonRealm1), _)); + AddCredentialSync(FormHasSignonRealm(kSignonRealm1), _)); EXPECT_CALL(mock_processor(), UpdateStorageKey(_, kStorageKey, _)); EXPECT_CALL(*mock_password_store_sync(), CommitTransaction()); EXPECT_CALL( *mock_password_store_sync(), - NotifyLoginsChanged(UnorderedElementsAre(ChangeHasPrimaryKey(1)))); + NotifyCredentialsChanged(UnorderedElementsAre(ChangeHasPrimaryKey(1)))); // Processor shouldn't be notified about remote changes. EXPECT_CALL(mock_processor(), Put).Times(0); @@ -578,7 +591,7 @@ TEST_F(PasswordSyncBridgeTest, ShouldIgnoreAndUntrackRemoteCreationWithInvalidData) { ON_CALL(mock_processor(), IsTrackingMetadata()).WillByDefault(Return(true)); - fake_db()->SetAddLoginError(AddLoginError::kConstraintViolation); + fake_db()->SetAddLoginError(AddCredentialError::kConstraintViolation); sync_pb::PasswordSpecifics specifics = CreateSpecificsWithSignonRealm(kSignonRealm1); @@ -609,12 +622,12 @@ base::flat_map<InsecureType, InsecurityMetadata> no_issues; EXPECT_CALL(*mock_password_store_sync(), BeginTransaction()); EXPECT_CALL(*mock_password_store_sync(), - UpdateLoginSync(AllOf(FormHasSignonRealm(kSignonRealm1), - FormHasPasswordIssues(no_issues)), - _)); + UpdateCredentialSync(AllOf(FormHasSignonRealm(kSignonRealm1), + FormHasPasswordIssues(no_issues)), + _)); EXPECT_CALL(*mock_password_store_sync(), CommitTransaction()); EXPECT_CALL(*mock_password_store_sync(), - NotifyLoginsChanged( + NotifyCredentialsChanged( UnorderedElementsAre(ChangeHasPrimaryKey(kPrimaryKey)))); // Processor shouldn't be notified about remote changes. @@ -639,10 +652,10 @@ testing::InSequence in_sequence; EXPECT_CALL(*mock_password_store_sync(), BeginTransaction()); EXPECT_CALL(*mock_password_store_sync(), - RemoveLoginByPrimaryKeySync(FormPrimaryKey(kPrimaryKey))); + RemoveCredentialByPrimaryKeySync(FormPrimaryKey(kPrimaryKey))); EXPECT_CALL(*mock_password_store_sync(), CommitTransaction()); EXPECT_CALL(*mock_password_store_sync(), - NotifyLoginsChanged( + NotifyCredentialsChanged( UnorderedElementsAre(ChangeHasPrimaryKey(kPrimaryKey)))); // Processor shouldn't be notified about remote changes. @@ -725,13 +738,13 @@ // the password store sync. // Interactions should happen in this order: - // +--> Put(1) ------------------------------------+ - // | | - // |--> UpdateStorageKey(2) -----------------------| - // Begin() --| |--> Commit() - // |--> UpdateLoginSync(3) ------------------------| - // | | - // +--> AddLoginSync (4) ---> UpdateStorageKey(4)--+ + // +--> Put(1) ----------------------------------------+ + // | | + // |--> UpdateStorageKey(2) ---------------------------| + // Begin() --| |--> Commit() + // |--> UpdateCredentialSync(3) -----------------------| + // | | + // +--> AddCredentialSync (4) ---> UpdateStorageKey(4)-+ testing::Sequence s1, s2, s3, s4; EXPECT_CALL(*mock_password_store_sync(), BeginTransaction()) @@ -744,11 +757,11 @@ .InSequence(s2); EXPECT_CALL(*mock_password_store_sync(), - UpdateLoginSync(FormHasSignonRealm(kSignonRealm2), _)) + UpdateCredentialSync(FormHasSignonRealm(kSignonRealm2), _)) .InSequence(s3); EXPECT_CALL(*mock_password_store_sync(), - AddLoginSync(FormHasSignonRealm(kSignonRealm3), _)) + AddCredentialSync(FormHasSignonRealm(kSignonRealm3), _)) .InSequence(s4); EXPECT_CALL(mock_processor(), UpdateStorageKey(_, kExpectedPrimaryKeyStr3, _)) .InSequence(s4); @@ -757,7 +770,7 @@ .InSequence(s1, s2, s3, s4); EXPECT_CALL(*mock_password_store_sync(), - NotifyLoginsChanged(UnorderedElementsAre( + NotifyCredentialsChanged(UnorderedElementsAre( ChangeHasPrimaryKey(kPrimaryKey2), ChangeHasPrimaryKey(kExpectedPrimaryKey3)))) .InSequence(s1, s2, s3, s4); @@ -820,7 +833,7 @@ // Since the remote Form 2 is more recent, it will be updated in the password // store. EXPECT_CALL(*mock_password_store_sync(), - UpdateLoginSync(FormHasSignonRealm(kSignonRealm2), _)); + UpdateCredentialSync(FormHasSignonRealm(kSignonRealm2), _)); syncer::EntityChangeList entity_change_list; entity_change_list.push_back(syncer::EntityChange::CreateAdd( /*storage_key=*/"", SpecificsToEntity(specifics1))); @@ -853,8 +866,8 @@ // ShouldMergeSync() would return an error without crashing. TEST_F(PasswordSyncBridgeTest, ShouldMergeSyncRemoteAndLocalPasswordsWithErrorWhenStoreReadFails) { - // Simulate a failed ReadAllLogins() by returning a kDbError. - ON_CALL(*mock_password_store_sync(), ReadAllLogins) + // Simulate a failed ReadAllCredentials() by returning a kDbError. + ON_CALL(*mock_password_store_sync(), ReadAllCredentials) .WillByDefault(testing::Return(FormRetrievalResult::kDbError)); absl::optional<syncer::ModelError> error = bridge()->MergeSyncData(bridge()->CreateMetadataChangeList(), {}); @@ -871,12 +884,12 @@ features::kSyncUndecryptablePasswordsLinux, }, {}); - ON_CALL(*mock_password_store_sync(), ReadAllLogins) + ON_CALL(*mock_password_store_sync(), ReadAllCredentials) .WillByDefault( testing::Return(FormRetrievalResult::kEncryptionServiceFailure)); EXPECT_CALL(*mock_sync_metadata_store_sync(), GetAllSyncMetadata()); - EXPECT_CALL(*mock_password_store_sync(), ReadAllLogins) + EXPECT_CALL(*mock_password_store_sync(), ReadAllCredentials) .WillOnce(Return(FormRetrievalResult::kEncryptionServiceFailure)); EXPECT_CALL(*mock_sync_metadata_store_sync(), DeleteAllSyncMetadata()); @@ -1001,7 +1014,7 @@ {}); EXPECT_CALL(*mock_sync_metadata_store_sync(), GetAllSyncMetadata()); - EXPECT_CALL(*mock_password_store_sync(), ReadAllLogins) + EXPECT_CALL(*mock_password_store_sync(), ReadAllCredentials) .WillOnce(Return(FormRetrievalResult::kSuccess)); EXPECT_CALL(*mock_sync_metadata_store_sync(), DeleteAllSyncMetadata()) .Times(0); @@ -1015,7 +1028,7 @@ // ShouldMergeSync() would return an error without crashing. TEST_F(PasswordSyncBridgeTest, ShouldMergeSyncRemoteAndLocalPasswordsWithErrorWhenStoreAddFails) { - fake_db()->SetAddLoginError(AddLoginError::kDbError); + fake_db()->SetAddLoginError(AddCredentialError::kDbError); syncer::EntityChangeList entity_change_list; entity_change_list.push_back(syncer::EntityChange::CreateAdd( @@ -1052,7 +1065,7 @@ TEST_F(PasswordSyncBridgeTest, ShouldMergeAndIgnoreAndUntrackRemotePasswordWithInvalidData) { - fake_db()->SetAddLoginError(AddLoginError::kConstraintViolation); + fake_db()->SetAddLoginError(AddCredentialError::kConstraintViolation); sync_pb::PasswordSpecifics specifics = CreateSpecificsWithSignonRealm(kSignonRealm1); @@ -1118,8 +1131,8 @@ } #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) -// Tests that in case ReadAllLogins() during initial merge returns encryption -// service failure, the bridge would try to do a DB clean up. +// Tests that in case ReadAllCredentials() during initial merge returns +// encryption service failure, the bridge would try to do a DB clean up. class PasswordSyncBridgeMergeTest : public PasswordSyncBridgeTest, public testing::WithParamInterface<FormRetrievalResult> { @@ -1130,17 +1143,17 @@ feature_list.InitAndEnableFeature( features::kSyncUndecryptablePasswordsLinux); #endif - ON_CALL(*mock_password_store_sync(), DeleteUndecryptableLogins()) + ON_CALL(*mock_password_store_sync(), DeleteUndecryptableCredentials()) .WillByDefault(Return(DatabaseCleanupResult::kSuccess)); // We should try to read first, and simulate an encryption failure. Then, // cleanup the database and try to read again which should be successful // now. testing::InSequence in_sequence; - EXPECT_CALL(*mock_password_store_sync(), ReadAllLogins) + EXPECT_CALL(*mock_password_store_sync(), ReadAllCredentials) .WillOnce(Return(GetParam())); - EXPECT_CALL(*mock_password_store_sync(), DeleteUndecryptableLogins()); - EXPECT_CALL(*mock_password_store_sync(), ReadAllLogins) + EXPECT_CALL(*mock_password_store_sync(), DeleteUndecryptableCredentials()); + EXPECT_CALL(*mock_password_store_sync(), ReadAllCredentials) .WillOnce(Return(FormRetrievalResult::kSuccess)); absl::optional<syncer::ModelError> error = @@ -1376,8 +1389,9 @@ testing::InSequence in_sequence; EXPECT_CALL(*mock_password_store_sync(), BeginTransaction()); - EXPECT_CALL(*mock_password_store_sync(), - AddLoginSync(FormHasPasswordIssues(kForm.password_issues), _)); + EXPECT_CALL( + *mock_password_store_sync(), + AddCredentialSync(FormHasPasswordIssues(kForm.password_issues), _)); EXPECT_CALL(*mock_password_store_sync(), CommitTransaction()); @@ -1406,8 +1420,9 @@ testing::Sequence in_sequence; EXPECT_CALL(*mock_password_store_sync(), BeginTransaction()); - EXPECT_CALL(*mock_password_store_sync(), - AddLoginSync(FormHasPasswordIssues(kForm.password_issues), _)); + EXPECT_CALL( + *mock_password_store_sync(), + AddCredentialSync(FormHasPasswordIssues(kForm.password_issues), _)); EXPECT_CALL(*mock_password_store_sync(), CommitTransaction()); syncer::EntityChangeList entity_change_list; @@ -1495,9 +1510,9 @@ // but with added password issues. const PasswordForm kExpectedForm = MakePasswordFormWithIssues(kSignonRealm1, kIssuesTypes); - EXPECT_CALL( - *mock_password_store_sync(), - UpdateLoginSync(FormHasPasswordIssues(kExpectedForm.password_issues), _)); + EXPECT_CALL(*mock_password_store_sync(), + UpdateCredentialSync( + FormHasPasswordIssues(kExpectedForm.password_issues), _)); sync_pb::PasswordSpecifics specifics = CreateSpecificsWithSignonRealmAndIssues(kSignonRealm1, kIssuesTypes); @@ -1561,7 +1576,7 @@ now.ToDeltaSinceWindowsEpoch().InMicroseconds()); // Test that neither password store nor processor is invoked. - EXPECT_CALL(*mock_password_store_sync(), UpdateLoginSync).Times(0); + EXPECT_CALL(*mock_password_store_sync(), UpdateCredentialSync).Times(0); EXPECT_CALL(mock_processor(), Put).Times(0); syncer::EntityChangeList entity_change_list;
diff --git a/components/password_manager/core/common/password_manager_features.cc b/components/password_manager/core/common/password_manager_features.cc index 974ffec..26550cf 100644 --- a/components/password_manager/core/common/password_manager_features.cc +++ b/components/password_manager/core/common/password_manager_features.cc
@@ -154,11 +154,6 @@ const base::Feature kPasswordReuseDetectionEnabled = { "PasswordReuseDetectionEnabled", base::FEATURE_ENABLED_BY_DEFAULT}; -// Enables a revised opt-in flow for the account-scoped password storage. -const base::Feature kPasswordsAccountStorageRevisedOptInFlow = { - "PasswordsAccountStorageRevisedOptInFlow", - base::FEATURE_ENABLED_BY_DEFAULT}; - // Enables password scripts fetching for the |PasswordChangeInSettings| feature. const base::Feature kPasswordScriptsFetching = { "PasswordScriptsFetching", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/components/password_manager/core/common/password_manager_features.h b/components/password_manager/core/common/password_manager_features.h index 80588f1..bd29be7 100644 --- a/components/password_manager/core/common/password_manager_features.h +++ b/components/password_manager/core/common/password_manager_features.h
@@ -50,7 +50,6 @@ extern const base::Feature kPasswordDomainCapabilitiesFetching; extern const base::Feature kPasswordImport; extern const base::Feature kPasswordReuseDetectionEnabled; -extern const base::Feature kPasswordsAccountStorageRevisedOptInFlow; extern const base::Feature kPasswordScriptsFetching; extern const base::Feature kPasswordStrengthIndicator; extern const base::Feature kRecoverFromNeverSaveAndroid;
diff --git a/components/password_manager/ios/password_form_helper.mm b/components/password_manager/ios/password_form_helper.mm index fbbe82c..033606c 100644 --- a/components/password_manager/ios/password_form_helper.mm +++ b/components/password_manager/ios/password_form_helper.mm
@@ -7,6 +7,7 @@ #include <stddef.h> #include "base/bind.h" +#include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/strings/sys_string_conversions.h" #include "base/strings/utf_string_conversions.h" @@ -316,6 +317,9 @@ ->FillPasswordForm(mainFrame, formData, UTF16ToUTF8(usernameValue), UTF16ToUTF8(passwordValue), base::BindOnce(^(BOOL success) { + base::UmaHistogramBoolean("PasswordManager." + "FillingSuccessIOS", + success); if (success) { weakSelf.fieldDataManager->UpdateFieldDataMap( usernameID, usernameValue, @@ -388,6 +392,9 @@ ->FillPasswordForm( mainFrame, fillData, fillUsername, UTF16ToUTF8(usernameValue), UTF16ToUTF8(passwordValue), base::BindOnce(^(BOOL success) { + base::UmaHistogramBoolean("PasswordManager." + "FillingSuccessIOS", + success); if (success) { weakSelf.fieldDataManager->UpdateFieldDataMap( usernameID, usernameValue,
diff --git a/components/password_manager/ios/password_form_helper_unittest.mm b/components/password_manager/ios/password_form_helper_unittest.mm index 6aa0472d..170708ae 100644 --- a/components/password_manager/ios/password_form_helper_unittest.mm +++ b/components/password_manager/ios/password_form_helper_unittest.mm
@@ -10,6 +10,7 @@ #include "base/strings/sys_string_conversions.h" #include "base/strings/utf_string_conversions.h" #include "base/test/ios/wait_util.h" +#include "base/test/metrics/histogram_tester.h" #include "components/autofill/core/browser/logging/log_manager.h" #include "components/autofill/core/common/form_data.h" #include "components/autofill/core/common/password_form_fill_data.h" @@ -237,6 +238,7 @@ // Tests that filling password forms with fill data works correctly. TEST_F(PasswordFormHelperTest, FillPasswordFormWithFillData) { + base::HistogramTester histogram_tester; LoadHtml( @"<form><input id='u1' type='text' name='un1'>" "<input id='p1' type='password' name='pw1'></form>"); @@ -261,11 +263,44 @@ })); id result = ExecuteJavaScript(kInputFieldValueVerificationScript); EXPECT_NSEQ(@"u1=john.doe@gmail.com;p1=super!secret;", result); + + histogram_tester.ExpectUniqueSample("PasswordManager.FillingSuccessIOS", true, + 1); +} + +// Tests that failure in filling password forms with fill data is recorded. +TEST_F(PasswordFormHelperTest, FillPasswordFormWithFillDataFillingFailure) { + base::HistogramTester histogram_tester; + LoadHtml(@"<form><input id='u1' type='text' name='un1'>" + "<input id='p1' type='password' name='pw1'></form>"); + + ASSERT_TRUE(SetUpUniqueIDs()); + const std::string base_url = BaseUrl(); + FieldRendererId username_field_id(2); + // The password renderer id does not exist, that's why the filling will fail + FieldRendererId password_field_id(404); + FillData fill_data; + SetFillData(base_url, 1, username_field_id.value(), "john.doe@gmail.com", + password_field_id.value(), "super!secret", &fill_data); + + __block int call_counter = 0; + [helper_ fillPasswordFormWithFillData:fill_data + triggeredOnField:username_field_id + completionHandler:^(BOOL complete) { + ++call_counter; + }]; + EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForJSCompletionTimeout, ^{ + return call_counter == 1; + })); + + histogram_tester.ExpectUniqueSample("PasswordManager.FillingSuccessIOS", + false, 1); } // Tests that a form is found and the found form is filled in with the given // username and password. TEST_F(PasswordFormHelperTest, FindAndFillOnePasswordForm) { + base::HistogramTester histogram_tester; LoadHtml( @"<form><input id='u1' type='text' name='un1'>" "<input id='p1' type='password' name='pw1'></form>"); @@ -292,6 +327,35 @@ EXPECT_EQ(1, success_counter); id result = ExecuteJavaScript(kInputFieldValueVerificationScript); EXPECT_NSEQ(@"u1=john.doe@gmail.com;p1=super!secret;", result); + histogram_tester.ExpectUniqueSample("PasswordManager.FillingSuccessIOS", true, + 1); +} + +// Tests that failure in filling password form with the given +// username and password is recorded. +TEST_F(PasswordFormHelperTest, FindAndFillOnePasswordFormFillingFailure) { + base::HistogramTester histogram_tester; + LoadHtml(@"<form><input id='u1' type='text' name='un1'>" + "<input id='p1' type='password' name='pw1'></form>"); + + ASSERT_TRUE(SetUpUniqueIDs()); + + PasswordFormFillData form_data; + // The password renderer id does not exist, that's why the filling will fail + SetPasswordFormFillData(BaseUrl(), "gChrome~form~0", 1, "u1", 2, + "john.doe@gmail.com", "p404", 404, "super!secret", + nullptr, nullptr, false, &form_data); + + __block int call_counter = 0; + [helper_ fillPasswordForm:form_data + completionHandler:^(BOOL complete) { + ++call_counter; + }]; + EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForJSCompletionTimeout, ^{ + return call_counter == 1; + })); + histogram_tester.ExpectUniqueSample("PasswordManager.FillingSuccessIOS", + false, 1); } // Tests that extractPasswordFormData extracts wanted form on page with mutiple
diff --git a/components/policy/core/common/policy_loader_lacros.h b/components/policy/core/common/policy_loader_lacros.h index 2e9199f3..1180e9d 100644 --- a/components/policy/core/common/policy_loader_lacros.h +++ b/components/policy/core/common/policy_loader_lacros.h
@@ -32,9 +32,8 @@ // task_runner is used to have in sequence the process of policy parsing and // validation. The |per_profile| parameter specifies which policy should be // installed. - explicit PolicyLoaderLacros( - scoped_refptr<base::SequencedTaskRunner> task_runner, - PolicyPerProfileFilter per_profile); + PolicyLoaderLacros(scoped_refptr<base::SequencedTaskRunner> task_runner, + PolicyPerProfileFilter per_profile); // Not copyable or movable PolicyLoaderLacros(const PolicyLoaderLacros&) = delete; PolicyLoaderLacros& operator=(const PolicyLoaderLacros&) = delete;
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index 359a79e..d1215b1 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -13,6 +13,7 @@ Si el valor de la política no es un dominio válido, no se aplicará la política.</translation> <translation id="1004590217607585595">Configuración de la administración de aplicaciones web</translation> <translation id="1006218396155867129">Impedir que los usuarios de acceso remoto transfieran archivos desde y hacia el host remoto</translation> +<translation id="1007149936182752368">Inhabilitar la edición de favoritos</translation> <translation id="1010151305531217567">Cambia el botón principal del mouse al botón derecho</translation> <translation id="1011266755572744012">Especifica la cantidad máxima de hojas que el usuario puede imprimir en un mismo trabajo de impresión. @@ -75,6 +76,7 @@ Consulta https://support.google.com/chrome/a?p=Supported_directory_variables para ver una lista de las variables que se pueden usar. Si no estableces esta configuración, se utilizará el directorio de perfil predeterminado.</translation> +<translation id="1059069692400941670">Inhabilitar la importación del motor de búsqueda predeterminado en la primera ejecución</translation> <translation id="1062011392452772310">Habilita la atestación remota para el dispositivo.</translation> <translation id="1062407476771304334">Reemplazar</translation> <translation id="1069489575852947981">Si habilitas la política o no la estableces, se definirá una cuenta local del dispositivo para el acceso automático sin tiempos de espera. <ph name="PRODUCT_OS_NAME" /> permitirá usar la combinación de teclas Ctrl+Alt+S para omitir el acceso automático y mostrar la pantalla de acceso. @@ -93,6 +95,7 @@ <translation id="1082802595100075771">Permite que los usuarios usen un servicio anónimo de Google para obtener descripciones automáticas de las imágenes sin etiquetar</translation> <translation id="1087437665304381368">Esta política controla solo el modo de desarrollador de <ph name="PRODUCT_OS_NAME" />. Si quieres impedir el acceso a las Opciones para desarrolladores de Android, deberás configurar la política <ph name="DEVELOPER_TOOLS_DISABLED_POLICY_NAME" />.</translation> <translation id="1087707496788636333">La lista de políticas de Chrome Enterprise cambia de sitio. Guarda <ph name="POLICY_DOCUMENTATION_URL" /> en tus favoritos.</translation> +<translation id="1089150222292592899">Autocompletar el nombre de usuario en la página del IdP de SAML</translation> <translation id="1091765729282771296">Permitir que los sitios soliciten al usuario acceso a un dispositivo HID</translation> <translation id="1095209545735032039">Bloquea la API de Serial en estos sitios</translation> <translation id="1096105751829466145">Proveedor de búsqueda predeterminado</translation> @@ -1897,6 +1900,7 @@ Si la inhabilitas, no se permitirán las actualizaciones. Sin embargo, algunos componentes están exceptuados de esta política: no se inhabilitarán las actualizaciones de componentes que no contengan código ejecutable y que sean fundamentales para la seguridad del navegador. Los ejemplos de estos componentes incluyen las listas de revocación de certificados y los filtros de subrecursos.</translation> +<translation id="2939335382784544151">Habilitar la importación del historial de navegación en la primera ejecución</translation> <translation id="2940127076681735544">Si estableces esta política con una URL válida, <ph name="PRODUCT_NAME" /> descargará la lista de sitios de esa URL y aplicará las reglas como si se hubieran configurado con la política <ph name="SITELIST_POLICY_NAME" />. Si no la estableces (o determinas una URL no válida), <ph name="PRODUCT_NAME" /> no utilizará la política como fuente de reglas para cambiar de navegador. @@ -2335,6 +2339,7 @@ Si no estableces la política, los usuarios podrán elegir la imagen de fondo para la pantalla de acceso y el escritorio.</translation> <translation id="3315324240256767419">Habilitar la función de ventana fantasma</translation> +<translation id="3323819750604111729">Habilitar la importación de favoritos en la primera ejecución</translation> <translation id="332771718998993005">Determina el nombre anunciado como un destino de <ph name="PRODUCT_NAME" />. Si esta política se establece con una string no vacía, esa string se usará como el nombre del destino de <ph name="PRODUCT_NAME" />. De lo contrario, el nombre del destino será el nombre del dispositivo. Si esta política no se establece, el nombre del destino será el nombre del dispositivo, y el propietario del dispositivo (o un usuario del dominio que administre el dispositivo) podrá cambiarlo. El nombre tiene un límite máximo de 24 caracteres.</translation> @@ -2810,6 +2815,7 @@ Si estableces la política en 2, se bloquearán los anuncios en sitios con anuncios intrusivos.</translation> <translation id="3877517141460819966">Modo de autenticación de dos factores integrado</translation> <translation id="3879208481373875102">Configura la lista de aplicaciones web instaladas de manera automática</translation> +<translation id="3879700444818346084">Inhabilitar la importación de contraseñas guardadas en la primera ejecución</translation> <translation id="388237772682176890">Esta política ya no está disponible en M53 y se quitó en M54 porque se quitó la compatibilidad con SPDY/3.1. Inhabilita el uso del protocolo SPDY en <ph name="PRODUCT_NAME" />. @@ -3090,6 +3096,7 @@ En las sesiones en modo kiosco, no hay períodos de gracia ni notificaciones sobre el reinicio. </translation> <translation id="4187576366596772431">Bloquear la API de WebHID en estos sitios</translation> +<translation id="4190316993598857632">Habilitar la edición de favoritos</translation> <translation id="4192388905594723944">URL para la validación del token de autenticación del cliente de acceso remoto</translation> <translation id="4203055629055264833">Si habilitas la política o no la estableces, los usuarios podrán obtener la página de resultados más reciente del motor de búsqueda predeterminado en un panel lateral que podrán activar o desactivar mediante un ícono de la barra de herramientas. @@ -3785,6 +3792,7 @@ <translation id="5105313908130842249">Demora de bloqueo de pantalla con batería</translation> <translation id="5108031557082757679">Impresoras empresariales inhabilitadas asociadas a dispositivos</translation> <translation id="5109383437323376357">Determina la disponibilidad de las variantes</translation> +<translation id="5120168808610189805">Habilitar la importación de la página principal en la primera ejecución</translation> <translation id="5124368997194894978">Habilitar el inicio mediante CA (corriente alterna)</translation> <translation id="5130213897914754028">Impedir que los sitios utilicen la política SharedArrayBuffers</translation> <translation id="5130935469849337738">Ofrecer siempre la traducción</translation> @@ -4472,6 +4480,7 @@ No se activará este comportamiento si la Navegación segura está inhabilitada (ya sea por la política o el usuario). Si quieres forzar la Navegación segura, usa la política <ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" /> o <ph name="SAFE_BROWSING_PROTETION_LEVEL_POLICY_NAME" />.</translation> <translation id="5835312413892670446">Configuración de Captura de pantalla</translation> <translation id="5836064773277134605">Restringir el intervalo de puertos UDP que utiliza el host de acceso remoto</translation> +<translation id="583627479140113555">Habilitar la importación de contraseñas guardadas en la primera ejecución</translation> <translation id="5837898601525273156">Si estableces <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_DAY_CONFIG_POLICY_NAME" /> y habilitas <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_POLICY_NAME" />, se mantendrá activada la política para administrar la energía en el modo avanzado de carga de la batería (cuando lo admita el dispositivo). Gracias a un algoritmo para la carga estándar y otras técnicas durante las horas en que no se utilice el dispositivo, este modo permite que los usuarios optimicen el estado de la batería. Durante las horas de funcionamiento, el sistema utiliza una carga rápida, la cual permite que la batería se cargue en menos tiempo. Debes especificar el período en que el sistema tendrá más actividad cada día, mediante la hora de inicio y la duración. Si se inhabilita la política o no se establece, se mantendrá desactivado el modo avanzado de carga de la batería. @@ -4795,6 +4804,13 @@ Especifica las apps de Chrome por ID, como pjkljhegncpnkpknbcohdijeoejaedia; las apps para Android por nombre de paquete, como com.google.android.gm; y las aplicaciones web por la URL utilizada en <ph name="WEB_APP_INSTALL_FORCE_LIST_POLICY_NAME" />, como https://google.com/maps. Si no estableces la política, los usuarios podrán cambiar la lista de apps fijas en el Selector.</translation> +<translation id="6183409603139321084"><ph name="PRODUCT_OS_NAME" /> puede intentar autocompletar el campo de nombre de usuario en la página del IdP de SAML durante la autenticación en línea en la pantalla de acceso y la pantalla de bloqueo. + + Se usará el correo electrónico del usuario asociado con su perfil de <ph name="PRODUCT_OS_NAME" />, por lo que esta configuración debe estar inhabilitada si se espera que los usuarios usen otros correos electrónicos en la página del IdP de SAML. + + La string recibida a través de esta política se utilizará como el nombre de un parámetro de URL en la página del IdP con el correo electrónico del usuario como valor. + + Se espera que el servidor sea responsable de la asignación entre los proveedores de identidad y los parámetros de URL que admiten.</translation> <translation id="6190367314942602985">Enviar la información de identificación del usuario</translation> <translation id="6191963383731098056">Esta política permite a los administradores configurar el color del tema de <ph name="PRODUCT_NAME" />. La string de entrada debe ser una string válida de un código hexadecimal de color que coincida con el formato "#RRGGBB". @@ -5340,6 +5356,7 @@ Para especificar un hash de <ph name="SUBJECT_PUBLIC_KEY_INFO" />, se debe vincular el nombre del algoritmo del hash, una barra y la codificación de Base64 de ese algoritmo aplicada al campo <ph name="SUBJECT_PUBLIC_KEY_INFO" /> codificado con DER del certificado específico. Esta codificación de Base64 tiene el mismo formato que una SPKI Fingerprint. El único algoritmo de hash compatible es sha256; se ignorarán los demás. Si no estableces esta política, <ph name="PRODUCT_NAME" /> considerará que no son de confianza los certificados que no se divulguen, a pesar de requerir divulgación mediante el Certificado de transparencia.</translation> +<translation id="6703381779632216549">Habilitar la importación del motor de búsqueda predeterminado en la primera ejecución</translation> <translation id="6704445641918520643">Habilitar la carga diferida de la WebUI de acceso</translation> <translation id="6704515759227307131">Esta política es obsoleta y se reemplazó por AdvancedProtectionAllowed. @@ -6332,6 +6349,7 @@ <translation id="77379430721695807">Si estableces la política, especificarás la lista de URL cuyos patrones buscarán coincidencia con el origen de seguridad de la URL de solicitud. En caso de haber coincidencia, se otorgará acceso a los dispositivos de captura de video sin necesidad de un mensaje. Para obtener información detallada sobre los patrones válidos de <ph name="URL_LABEL" />, consulta https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> +<translation id="7740644123648617252">Habilitar la importación de datos para autocompletar formularios en la primera ejecución</translation> <translation id="7744253761377202223">El porcentaje de brillo de la pantalla cuando el dispositivo esté funcionando con CA.</translation> <translation id="7747447585227954402">Permitir que los dispositivos usen un <ph name="PLUGIN_VM_NAME" /> en <ph name="PRODUCT_OS_NAME" /></translation> <translation id="7749024457938190837">Incluye las extensiones que pueden omitir el cuadro de diálogo de confirmación cuando envían trabajos de impresión a través de la API chrome.printing</translation> @@ -6489,6 +6507,7 @@ <translation id="7925224837072026018">Si estableces la política, se habilitará el acceso a claves empresariales desde extensiones o aplicaciones para Android. Solo se designan las claves para uso corporativo si se generan con la API chrome.enterprise.platformKeys en una cuenta administrada. Los usuarios no pueden otorgar ni quitar acceso a claves empresariales desde extensiones ni aplicaciones para Android. De forma predeterminada, una extensión o una aplicación para Android no puede usar claves designadas para uso empresarial, lo cual equivale a establecer la política allowCorporateKeyUsage como falsa. Solo si estableces allowCorporateKeyUsage como verdadera para una extensión o una aplicación para Android, estas podrán usar cualquier clave de plataforma designada para uso empresarial a fin de firmar datos arbitrarios. Otorga este permiso solo si la extensión o la aplicación para Android es de confianza, a fin de proteger el acceso a la clave ante posibles atacantes.</translation> +<translation id="793188693675675950">Inhabilitar la importación de la página principal en la primera ejecución</translation> <translation id="7933141401888114454">Habilita la creación de usuarios supervisados.</translation> <translation id="793473937901685727">Establecer la disponibilidad de certificados para apps de ARC</translation> <translation id="7936302526928951356">El string usuario-agente no bloqueará los cambios para la versión principal</translation> @@ -7163,6 +7182,7 @@ A partir de la versión 92 de <ph name="PRODUCT_NAME" />, esta política también es compatible en el modo sin interfaz gráfica. Nota: Si bloqueas las URL internas de chrome://*, se pueden generar errores inesperados.</translation> +<translation id="8619748440665904084">Inhabilitar la importación de datos para autocompletar formularios en la primera ejecución</translation> <translation id="8623672932476443039">Si habilitas la política, los usuarios podrán acceder al modo de desarrollador de apps aisladas. Si inhabilitas la política, los usuarios no podrán acceder a esa función. Si no estableces la política, no se permitirá la acción predeterminada para los usuarios administrados por empresas en Chrome OS, pero sí estará permitida para todos los demás usuarios y sistemas operativos.</translation> @@ -7209,6 +7229,7 @@ Si inhabilitas la política o no la estableces, el host de acceso remoto podrá asociarse a cualquier usuario local.</translation> <translation id="867708016260789630">Forzar que el modo restringido de YouTube sea, al menos, moderado</translation> <translation id="8677853537025397834">Permitir la API de WebHID en estos sitios</translation> +<translation id="8685018726115727387">Inhabilitar la importación del historial de navegación en la primera ejecución</translation> <translation id="8685024486845674965">La advertencia de la protección de la contraseña se activa cuando se vuelve a usar la contraseña</translation> <translation id="8685680544554917389">Si estableces la política como verdadera, <ph name="PRODUCT_NAME" /> podrá reproducir contenido multimedia de forma automática. Si estableces la política como falsa, <ph name="PRODUCT_NAME" /> dejará de reproducir contenido multimedia de forma automática. @@ -7580,6 +7601,7 @@ Si inhabilitas la política, los dispositivos inscritos no registrarán ni informarán los tiempos de actividad.</translation> <translation id="9077227880520270584">Temporizador para el acceso automático de la cuenta local del dispositivo</translation> +<translation id="9079531125758468956">Inhabilitar la importación de favoritos en la primera ejecución</translation> <translation id="9084985621503260744">Especificar si la actividad de video afecta a la administración de energía</translation> <translation id="9087434639296483430">Informa a los usuarios sobre eventos de acceso y salida (incluidos accesos fallidos) desde dispositivos inscritos.
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index 8cd3fa9d..91bf308 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -13,6 +13,7 @@ Jika nilai kebijakan bukan domain yang valid, kebijakan tidak akan diterapkan.</translation> <translation id="1004590217607585595">Setelan pengelolaan Aplikasi Web</translation> <translation id="1006218396155867129">Cegah pengguna akses jarak jauh mentransfer file ke dan dari host jarak jauh</translation> +<translation id="1007149936182752368">Nonaktifkan pengeditan bookmark</translation> <translation id="1010151305531217567">Mengalihkan tombol mouse utama ke tombol kanan</translation> <translation id="1011266755572744012">Menentukan jumlah lembar maksimal yang boleh dicetak pengguna untuk satu pekerjaan cetak. @@ -75,6 +76,7 @@ Lihat https://support.google.com/chrome/a?p=Supported_directory_variables untuk mengetahui daftar variabel yang dapat digunakan. Jika setelan ini tidak disetel, direktori profil default akan digunakan.</translation> +<translation id="1059069692400941670">Nonaktifkan impor mesin telusur default saat browser pertama kali dijalankan</translation> <translation id="1062011392452772310">Mengaktifkan pengesahan jarak jauh untuk perangkat tersebut</translation> <translation id="1062407476771304334">Ganti</translation> <translation id="1069489575852947981">Jika kebijakan disetel ke Aktif atau tidak disetel, akun lokal perangkat akan disiapkan untuk login otomatis tanpa penundaan. <ph name="PRODUCT_OS_NAME" /> akan mematuhi pintasan keyboard Ctrl+Alt+S untuk melewati login otomatis dan menampilkan layar login. @@ -93,6 +95,7 @@ <translation id="1082802595100075771">Izinkan pengguna memilih menggunakan layanan Google anonim untuk memberikan deskripsi otomatis untuk gambar tanpa label</translation> <translation id="1087437665304381368">Kebijakan ini hanya mengontrol mode developer<ph name="PRODUCT_OS_NAME" />. Jika ingin mencegah akses ke Opsi Developer Android, Anda perlu menetapkan kebijakan <ph name="DEVELOPER_TOOLS_DISABLED_POLICY_NAME" />.</translation> <translation id="1087707496788636333">Daftar kebijakan Chrome Enterprise berpindah! Update bookmark ke <ph name="POLICY_DOCUMENTATION_URL" />.</translation> +<translation id="1089150222292592899">Mengisi otomatis nama pengguna di halaman IdP SAML</translation> <translation id="1091765729282771296">Izinkan situs meminta kepada pengguna untuk memberikan akses ke perangkat HID</translation> <translation id="1095209545735032039">Memblokir Serial API di situs ini</translation> <translation id="1096105751829466145">Penyedia penelusuran default</translation> @@ -1902,6 +1905,7 @@ Jika disetel ke nonaktif, update komponen akan dinonaktifkan. Namun, beberapa komponen akan dikecualikan dari kebijakan ini: update komponen apa pun yang tidak berisi kode yang dapat dieksekusi dan yang penting bagi keamanan browser, tidak akan dinonaktifkan. Contoh komponen tersebut meliputi daftar pencabutan sertifikat dan filter subresource.</translation> +<translation id="2939335382784544151">Aktifkan impor histori penjelajahan saat browser pertama kali dijalankan</translation> <translation id="2940127076681735544">Jika kebijakan disetel ke URL yang valid, <ph name="PRODUCT_NAME" /> akan mendownload daftar situs dari URL tersebut dan menerapkan aturan seolah-olah aturan tersebut disiapkan dengan kebijakan <ph name="SITELIST_POLICY_NAME" />. Jika kebijakan tidak disetel (atau disetel ke URL yang tidak valid), <ph name="PRODUCT_NAME" /> tidak akan menggunakannya sebagai sumber aturan untuk beralih browser. @@ -2339,6 +2343,7 @@ Jika tidak ditetapkan, pengguna akan memilih gambar untuk latar belakang desktop dan layar login.</translation> <translation id="3315324240256767419">Aktifkan fitur jendela bayangan.</translation> +<translation id="3323819750604111729">Aktifkan impor bookmark saat browser pertama kali dijalankan</translation> <translation id="332771718998993005">Tentukan nama yang diiklankan sebagai tujuan <ph name="PRODUCT_NAME" />. Jika kebijakan ini disetel ke string yang tidak kosong, string tersebut akan digunakan sebagai nama tujuan <ph name="PRODUCT_NAME" />. Jika tidak, nama tujuan akan menjadi nama perangkat. Jika kebijakan ini tidak disetel, nama tujuan akan menjadi nama perangkat, dan pemilik perangkat (atau pengguna dari domain yang mengelola perangkat) akan diizinkan untuk mengubahnya. Karakter nama dibatasi hingga 24 karakter.</translation> @@ -2818,6 +2823,7 @@ Jika kebijakan disetel ke 2, iklan akan diblokir di situs yang menayangkan iklan mengganggu.</translation> <translation id="3877517141460819966">Mode autentikasi faktor kedua yang terintegrasi</translation> <translation id="3879208481373875102">Konfigurasi daftar Aplikasi Web yang diinstal otomatis</translation> +<translation id="3879700444818346084">Nonaktifkan impor sandi tersimpan saat browser pertama kali dijalankan</translation> <translation id="388237772682176890">Kebijakan ini sudah tidak digunakan di M53 dan dihapus di M54, karena dukungan SPDY/3.1 telah dihapus. Menonaktifkan penggunaan protokol SPDY di <ph name="PRODUCT_NAME" />. @@ -3098,6 +3104,7 @@ Dalam sesi kios, tidak ada masa tenggang dan tidak ada notifikasi tentang mulai ulang. </translation> <translation id="4187576366596772431">Memblokir WebHID API di situs ini</translation> +<translation id="4190316993598857632">Aktifkan pengeditan bookmark</translation> <translation id="4192388905594723944">URL untuk memvalidasi token autentikasi klien akses jarak jauh</translation> <translation id="4203055629055264833">Jika kebijakan disetel ke Aktif atau tidak disetel, pengguna akan dapat menampilkan halaman hasil penelusuran mesin telusur default terbaru di panel samping dengan mengalihkan ikon di toolbar. @@ -3796,6 +3803,7 @@ <translation id="5105313908130842249">Penundaan penguncian layar saat menggunakan daya baterai</translation> <translation id="5108031557082757679">Menonaktifkan printer yang merupakan perangkat perusahaan</translation> <translation id="5109383437323376357">Menentukan ketersediaan variasi</translation> +<translation id="5120168808610189805">Aktifkan impor halaman beranda saat browser pertama kali dijalankan</translation> <translation id="5124368997194894978">Aktifkan booting pada tegangan AC (arus bolak-balik)</translation> <translation id="5130213897914754028">Cegah situs menggunakan SharedArrayBuffer</translation> <translation id="5130935469849337738">Selalu tawarkan terjemahan</translation> @@ -4480,6 +4488,7 @@ Perilaku ini tidak akan berlaku jika Safe Browsing dinonaktifkan (oleh kebijakan ataupun pengguna). Untuk mengaktifkan paksa Safe Browsing, gunakan kebijakan <ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" /> atau <ph name="SAFE_BROWSING_PROTETION_LEVEL_POLICY_NAME" />.</translation> <translation id="5835312413892670446">Setelan Screenshot</translation> <translation id="5836064773277134605">Batasi jangkauan port UDP yang digunakan oleh hosting akses jarak jauh</translation> +<translation id="583627479140113555">Aktifkan impor sandi tersimpan saat browser pertama kali dijalankan</translation> <translation id="5837898601525273156">Jika <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_DAY_CONFIG_POLICY_NAME" /> disetel, menyetel <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_POLICY_NAME" /> ke Aktif akan membuat kebijakan pengelolaan daya mode pengisian daya baterai lanjutan tetap aktif (jika didukung di perangkat). Dengan algoritme pengisian daya standar dan teknik lainnya di luar jam kerja, mode ini memungkinkan pengguna memaksimalkan kesehatan baterai. Selama jam kerja, sistem akan menggunakan pengisian daya ekspres sehingga pengisian daya baterai dapat lebih cepat. Tentukan waktu saat sistem paling sering digunakan setiap harinya menurut waktu mulai dan durasi. Jika kebijakan disetel ke Nonaktif atau tidak disetel, mode pengisian daya baterai lanjutan akan dinonaktifkan. @@ -4803,6 +4812,13 @@ Tentukan aplikasi Chrome berdasarkan ID, seperti pjkljhegncpnkpknbcohdijeoejaedia; aplikasi Android berdasarkan nama paket, seperti com.google.android.gm; dan aplikasi web berdasarkan URL yang digunakan di <ph name="WEB_APP_INSTALL_FORCE_LIST_POLICY_NAME" />, seperti https://google.com/maps. Jika tidak ditetapkan, pengguna akan diizinkan mengubah daftar aplikasi yang dipasangi pin di peluncur.</translation> +<translation id="6183409603139321084"><ph name="PRODUCT_OS_NAME" /> dapat mencoba mengisi otomatis kolom nama pengguna di halaman IdP SAML selama proses autentikasi online di layar login dan layar kunci. + + Setelan ini akan menggunakan email pengguna yang dikaitkan dengan profil <ph name="PRODUCT_OS_NAME" /> mereka, sehingga setelan ini harus dinonaktifkan jika pengguna diperkirakan akan menggunakan email yang berbeda di halaman IdP SAML. + + String yang diterima melalui kebijakan ini akan digunakan sebagai nama parameter URL di halaman IdP dengan email pengguna sebagai nilai. + + Sisi server diharapkan bertanggung jawab atas pemetaan antara Penyedia Identitas dan parameter URL yang didukung Penyedia Identitas tersebut.</translation> <translation id="6190367314942602985">Laporkan informasi Identifikasi Pengguna</translation> <translation id="6191963383731098056">Kebijakan ini memungkinkan admin mengonfigurasi warna tema <ph name="PRODUCT_NAME" />. String input harus berupa string warna hex valid yang sesuai dengan format "#RRGGBB". @@ -5348,6 +5364,7 @@ Tentukan hash <ph name="SUBJECT_PUBLIC_KEY_INFO" /> dengan menggabungkan nama algoritme hash, garis miring, dan encoding Base64 dari algoritme hash yang diterapkan ke <ph name="SUBJECT_PUBLIC_KEY_INFO" /> yang dienkode DER dari sertifikat yang ditentukan. Format encoding Base64 cocok dengan Sidik Jari SPKI. Satu-satunya algoritme hash yang dikenali adalah sha256; selain itu diabaikan. Jika kebijakan tidak ditetapkan, itu berarti saat sertifikat yang memerlukan pengungkapan melalui Transparansi Sertifikat tidak diungkapkan, <ph name="PRODUCT_NAME" /> tidak akan memercayai sertifikat tersebut.</translation> +<translation id="6703381779632216549">Aktifkan impor mesin telusur default saat browser pertama kali dijalankan</translation> <translation id="6704445641918520643">Aktifkan pemuatan WebUI Login Lambat.</translation> <translation id="6704515759227307131">Kebijakan ini tidak digunakan lagi, dan telah diganti dengan AdvancedProtectionAllowed. @@ -6342,6 +6359,7 @@ <translation id="77379430721695807">Jika kebijakan disetel, artinya Anda menentukan daftar URL yang polanya cocok dengan asal keamanan URL yang meminta. Jika terdapat kecocokan, akses ke perangkat perekaman video akan diberikan tanpa permintaan izin Untuk informasi mendetail tentang pola <ph name="URL_LABEL" /> yang valid, lihat https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> +<translation id="7740644123648617252">Aktifkan impor data formulir isi otomatis saat browser pertama kali dijalankan</translation> <translation id="7744253761377202223">Persentase kecerahan layar saat menggunakan daya AC.</translation> <translation id="7747447585227954402">Izinkan perangkat menggunakan <ph name="PLUGIN_VM_NAME" /> di <ph name="PRODUCT_OS_NAME" /></translation> <translation id="7749024457938190837">Ekstensi diizinkan melewati dialog konfirmasi ketika mengirimkan pekerjaan cetak melalui API chrome.printing</translation> @@ -6499,6 +6517,7 @@ <translation id="7925224837072026018">Menyetel kebijakan akan memberi ekstensi atau aplikasi Android akses ke kunci perusahaan. Kunci hanya ditujukan untuk pemakaian dalam perusahaan jika dibuat menggunakan chrome.enterprise.platformKeys API pada akun terkelola. Pengguna tidak dapat memberikan atau menarik akses ke kunci perusahaan kepada atau dari ekstensi atau aplikasi Android. Secara default, ekstensi atau aplikasi Android tidak dapat menggunakan kunci yang ditujukan untuk pemakaian dalam perusahaan, hal ini setara dengan menyetel allowCorporateKeyUsage ke Salah (False) untuk ekstensi atau aplikasi Android tersebut. Hanya jika allowCorporateKeyUsage disetel ke Benar (True) untuk suatu ekstensi atau aplikasi Android, ekstensi atau aplikasi Android tersebut dapat menggunakan kunci platform apa pun yang ditujukan untuk pemakaian dalam perusahaan, guna menandai data arbitrer. Izin ini hanya boleh diberikan jika ekstensi atau aplikasi Android dipercaya untuk mengamankan akses ke kunci dari para penyerang.</translation> +<translation id="793188693675675950">Nonaktifkan impor halaman beranda saat browser pertama kali dijalankan</translation> <translation id="7933141401888114454">Mengaktifkan pembuatan pengguna yang dilindungi</translation> <translation id="793473937901685727">Menyetel ketersediaan sertifikat untuk aplikasi ARC</translation> <translation id="7936302526928951356">String Agen Pengguna tidak akan membekukan versi utama.</translation> @@ -7151,6 +7170,7 @@ Mulai <ph name="PRODUCT_NAME" /> versi 92, kebijakan ini juga didukung dalam mode headless. Catatan: Memblokir URL chrome://* internal dapat menyebabkan error tak terduga.</translation> +<translation id="8619748440665904084">Nonaktifkan impor data formulir isi otomatis saat browser pertama kali dijalankan</translation> <translation id="8623672932476443039">Jika kebijakan disetel ke Aktif, pengguna akan dapat mengakses Mode Developer untuk Aplikasi Terisolasi. Jika kebijakan disetel ke Nonaktif, pengguna tidak dapat mengakses kemampuan tersebut. Jika kebijakan ini tidak disetel, secara default pengguna yang dikelola perusahaan tidak akan diizinkan di ChromeOS dan semua pengguna serta OS lainnya akan diizinkan.</translation> @@ -7197,6 +7217,7 @@ Jika kebijakan disetel ke Nonaktif atau tidak disetel, host akses jarak jauh akan dapat dikaitkan dengan pengguna lokal mana pun.</translation> <translation id="867708016260789630">Paksa Mode Terbatas YouTube menjadi minimal Menengah</translation> <translation id="8677853537025397834">Mengizinkan WebHID API di situs ini</translation> +<translation id="8685018726115727387">Nonaktifkan impor histori penjelajahan saat browser pertama kali dijalankan</translation> <translation id="8685024486845674965">Peringatan perlindungan sandi dipicu oleh penggunaan ulang sandi</translation> <translation id="8685680544554917389">Jika kebijakan disetel ke Benar (True), <ph name="PRODUCT_NAME" /> akan dapat memutar otomatis media. Jika kebijakan disetel ke Salah (False), <ph name="PRODUCT_NAME" /> akan berhenti memutar otomatis media. @@ -7568,6 +7589,7 @@ Jika kebijakan disetel ke Nonaktif, perangkat yang terdaftar tidak akan merekam atau melaporkan waktu aktivitas.</translation> <translation id="9077227880520270584">Timer login otomatis akun lokal perangkat</translation> +<translation id="9079531125758468956">Nonaktifkan impor bookmark saat browser pertama kali dijalankan</translation> <translation id="9084985621503260744">Tentukan apakah aktivitas video memengaruhi pengelolaan daya</translation> <translation id="9087434639296483430">Melaporkan peristiwa login/logout pengguna di perangkat terdaftar termasuk login yang gagal.
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb index b23334ab8..32a2750e 100644 --- a/components/policy/resources/policy_templates_ja.xtb +++ b/components/policy/resources/policy_templates_ja.xtb
@@ -13,6 +13,7 @@ ポリシーの値が有効なドメインではない場合、ポリシーは適用されません。</translation> <translation id="1004590217607585595">ウェブアプリ管理設定</translation> <translation id="1006218396155867129">リモート アクセス ユーザーとリモートホストとの間のファイル転送を無効にする</translation> +<translation id="1007149936182752368">ブックマークの編集を無効にする</translation> <translation id="1010151305531217567">マウスのメインボタンを右に切り替える</translation> <translation id="1011266755572744012">1 回の印刷ジョブでユーザーが印刷できる用紙の最大数を指定します。 @@ -71,6 +72,7 @@ 使用できる変数のリストについては、https://support.google.com/chrome/a?p=Supported_directory_variables をご覧ください。 このポリシーを未設定のままにした場合は、デフォルトのプロファイル ディレクトリが使用されます。</translation> +<translation id="1059069692400941670">初回実行時のデフォルトの検索エンジンのインポートを無効にする</translation> <translation id="1062011392452772310">デバイスのリモート認証を有効にする</translation> <translation id="1062407476771304334">置換</translation> <translation id="1069489575852947981">このポリシーを有効に設定するか未設定のままにした場合、デバイスのローカル アカウントは遅延なしで自動ログインするように設定されます。ただし、<ph name="PRODUCT_OS_NAME" /> では、自動ログインせずにログイン画面を表示するキーボード ショートカットの Ctrl+Alt+S キーが優先されます。 @@ -89,6 +91,7 @@ <translation id="1082802595100075771">匿名の Google サービスを使用して、ラベル付けがない画像の説明を自動的に取得するかどうかをユーザーが選択できる</translation> <translation id="1087437665304381368">このポリシーでは、<ph name="PRODUCT_OS_NAME" /> のデベロッパー モードのみを管理します。Android 開発者向けオプションへのアクセスを禁止するには、<ph name="DEVELOPER_TOOLS_DISABLED_POLICY_NAME" /> ポリシーを設定する必要があります。</translation> <translation id="1087707496788636333">Chrome Enterprise ポリシーのリストは別のページに移動しました。ブックマークを <ph name="POLICY_DOCUMENTATION_URL" /> に変更してください。</translation> +<translation id="1089150222292592899">SAML IdP ページでユーザー名を自動入力する</translation> <translation id="1091765729282771296">サイトが HID デバイスへのアクセスをユーザーに要求することを許可する</translation> <translation id="1095209545735032039">シリアル API をブロックするサイトを指定します</translation> <translation id="1096105751829466145">デフォルトの検索プロバイダ</translation> @@ -1774,6 +1777,7 @@ このポリシーを無効に設定した場合、コンポーネントの更新は無効になります。ただし、一部のコンポーネント(実行可能コードを含まず、ブラウザのセキュリティ上重要なコンポーネント)はこのポリシーの適用外で、これらのコンポーネントの更新は無効にはなりません。 適用外のコンポーネントの具体的な例としては、証明書失効リストやサブリソース フィルタが挙げられます。</translation> +<translation id="2939335382784544151">初回実行時の閲覧履歴のインポートを有効にする</translation> <translation id="2940127076681735544">このポリシーが有効な URL に設定されている場合、<ph name="PRODUCT_NAME" /> はその URL からサイトリストをダウンロードし、<ph name="SITELIST_POLICY_NAME" /> ポリシーで設定されているものとしてルールを適用します。 このポリシーが未設定のままか、無効な URL に設定されている場合、<ph name="PRODUCT_NAME" /> は、このポリシーをブラウザの切り替えを行うルールの参照元として使用しません。 @@ -2195,6 +2199,7 @@ このポリシーを設定しない場合、ユーザーはデスクトップとログイン画面の背景に使用する画像を選択できます。</translation> <translation id="3315324240256767419">ゴースト ウィンドウ機能を有効にする</translation> +<translation id="3323819750604111729">初回実行時のブックマークのインポートを有効にする</translation> <translation id="332771718998993005"><ph name="PRODUCT_NAME" /> のレシーバーとして表示する名前を指定します。 このポリシーが空でない文字列に設定されている場合は、その文字列が <ph name="PRODUCT_NAME" /> のレシーバー名として使用されます。それ以外の場合、レシーバー名にはデバイス名が設定されます。このポリシーが未設定の場合、レシーバー名にはデバイス名が設定され、デバイスの所有者(またはデバイスを管理するドメインのユーザー)はその名前を変更できます。なお、名前は 24 文字以内で指定する必要があります。</translation> @@ -2667,6 +2672,7 @@ このポリシーを 2 に設定した場合、煩わしい広告が掲載されるサイトで広告の表示をブロックします。</translation> <translation id="3877517141460819966">統合 2 段階認証モード</translation> <translation id="3879208481373875102">強制的にインストールされるウェブアプリのリストを設定する</translation> +<translation id="3879700444818346084">初回実行時の保存したパスワードのインポートを無効にする</translation> <translation id="388237772682176890">SPDY/3.1 がサポートされなくなるため、このポリシーは、M53 でサポート終了、M54 で廃止となります。 <ph name="PRODUCT_NAME" /> で SPDY プロトコルを使用できないようにします。 @@ -2929,6 +2935,7 @@ キオスク セッションの場合、猶予期間はなく、再起動に関する通知も行われません。 </translation> <translation id="4187576366596772431">WebHID API をブロックするサイトを指定します</translation> +<translation id="4190316993598857632">ブックマークの編集を有効にする</translation> <translation id="4192388905594723944">リモート アクセス クライアントの認証トークンを検証するための URL</translation> <translation id="4203055629055264833">このポリシーを有効に設定するか未設定のままにした場合、ユーザーはツールバーのアイコンを切り替えることでサイドパネルにデフォルトの検索エンジンの最新の検索結果ページを表示できるようになります。 @@ -3589,6 +3596,7 @@ <translation id="5105313908130842249">画面がロックされるまでの時間(バッテリー電源での実行時)</translation> <translation id="5108031557082757679">無効な企業デバイス プリンタ</translation> <translation id="5109383437323376357">適用できるバリエーションを指定します</translation> +<translation id="5120168808610189805">初回実行時のホームページのインポートを有効にする</translation> <translation id="5124368997194894978">AC(交流電流)電源接続時の起動を有効にします</translation> <translation id="5130213897914754028">サイトに SharedArrayBuffers の使用を許可しない</translation> <translation id="5130935469849337738">常に翻訳を表示する</translation> @@ -4221,6 +4229,7 @@ セーフ ブラウジングが(ポリシーまたはユーザーによって)無効に設定されている場合、この処理は行われません。セーフ ブラウジングを強制的に有効にするには、<ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" /> ポリシーまたは <ph name="SAFE_BROWSING_PROTETION_LEVEL_POLICY_NAME" /> ポリシーを使用してください。</translation> <translation id="5835312413892670446">スクリーン キャプチャの設定</translation> <translation id="5836064773277134605">リモート アクセス ホストが使用する UDP ポートの範囲を制限する</translation> +<translation id="583627479140113555">初回実行時の保存したパスワードのインポートを有効にする</translation> <translation id="5837898601525273156"><ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_DAY_CONFIG_POLICY_NAME" /> が設定されている場合に、<ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_POLICY_NAME" /> を有効に設定すると、詳細なバッテリー充電モードの電力管理ポリシーが有効になります(デバイスが対応している場合)。このモードでは、使用頻度の低い時間帯に、標準の充電アルゴリズムや他の技術を使用することでバッテリーの消耗を抑えます。使用頻度の高い時間帯は、急速充電によりバッテリー充電を高速化します。曜日ごとに、システムが最もよく使われている時間帯を、開始時間とその継続時間で指定します。 このポリシーを無効に設定するか未設定のままにした場合、詳細なバッテリー充電モードは無効になります。 @@ -4525,6 +4534,13 @@ <translation id="6181618732396778048">どのサイトにもファイルとディレクトリへの書き込みアクセスの要求を許可しない</translation> <translation id="6181783961196084973">アプリのアクティビティを収集するかどうかの切り替え値です。true に設定した場合、ユーザーによるアプリのアクティビティ レポートがサーバーに送信され、お子様と保護者の <ph name="PRODUCT_NAME" /> アプリに表示されます。false に設定した場合、アプリごとの利用時間の上限は引き続き有効ですが、レポートデータはサーバーに送信されず、<ph name="PRODUCT_NAME" /> にも表示されません。</translation> <translation id="6183327369896253878">このポリシーを設定した場合、<ph name="PRODUCT_OS_NAME" /> でランチャーバーに表示されるアプリケーション ID が固定され、ユーザーが変更できなくなります。Chrome アプリの場合は ID(「pjkljhegncpnkpknbcohdijeoejaedia」など)、Android アプリの場合はパッケージ名(「com.google.android.gm」など)、ウェブアプリの場合は <ph name="WEB_APP_INSTALL_FORCE_LIST_POLICY_NAME" /> で使用する URL(「https://google.com/maps」など)を指定します。このポリシーが未設定の場合、ユーザーはランチャーの固定アプリのリストを変更できます。</translation> +<translation id="6183409603139321084"><ph name="PRODUCT_OS_NAME" /> で、ログイン画面とロック画面でのオンライン認証中に、SAML IdP ページへのユーザー名の自動入力の試行を許可します。 + + ユーザーの <ph name="PRODUCT_OS_NAME" /> プロファイルに関連付けられたメールアドレスが使用されるため、SAML IdP ページで別のメールアドレスを使用する場合は、この設定を無効にする必要があります。 + + このポリシーで受け取った文字列は IdP ページで URL パラメータ名として使用され、ユーザーのメールアドレスが値として設定されます。 + + ID プロバイダとサポートされる URL パラメータのマッピングは、サーバー側で処理することが想定されています。</translation> <translation id="6190367314942602985">ユーザー識別情報に関するレポートを作成</translation> <translation id="6191963383731098056">このポリシーにより、管理者は <ph name="PRODUCT_NAME" /> のテーマの色を設定できます。入力する文字列は「#RRGGBB」の形式に沿った有効な 16 進数色コードである必要があります。 @@ -5017,6 +5033,7 @@ * サーバー証明書の <ph name="SUBJECT_PUBLIC_KEY_INFO" /> で指定されている。 * 証明書チェーンの CA(認証局)証明書に出現する <ph name="SUBJECT_PUBLIC_KEY_INFO" /> で指定されている。CA 証明書に X.509v3 nameConstraints 拡張による制約が適用され、permittedSubtrees に directoryName nameConstraints が 1 つ以上存在し、その directoryName に organizationName 属性が含まれている。* 証明書チェーン内の CA 証明書に出現する <ph name="SUBJECT_PUBLIC_KEY_INFO" /> で指定されていて、その CA 証明書のサブジェクトに organizationName 属性が 1 つ以上含まれていること。さらに、サーバーの証明書にも同じ数の organizationName 属性が同じ順序で含まれ、それらの値がバイト単位で同一である。<ph name="SUBJECT_PUBLIC_KEY_INFO" /> ハッシュは、ハッシュ アルゴリズム名とスラッシュに加え、指定された証明書の DER-エンコード済み <ph name="SUBJECT_PUBLIC_KEY_INFO" /> に適用されているハッシュ アルゴリズムの Base64 エンコードをリンクすることで指定します。Base64 エンコードの形式は、SPKI フィンガープリントの形式に一致します。認識されるハッシュ アルゴリズムは SHA256 だけです。その他は無視されます。ポリシーが未設定のまま、Certificate Transparency(証明書の透明性)による開示を必要とする証明書が開示されていない場合、<ph name="PRODUCT_NAME" /> はその証明書を信頼しません。</translation> +<translation id="6703381779632216549">初回実行時のデフォルトの検索エンジンのインポートを有効にする</translation> <translation id="6704445641918520643">ログイン WebUI の遅延読み込みを有効にする。</translation> <translation id="6704515759227307131">このポリシーはサポートが終了しており、AdvancedProtectionAllowed に置き換えられました。 @@ -5958,6 +5975,7 @@ <translation id="77379430721695807">このポリシーでは、リクエスト元 URL のセキュリティ オリジンと照合する URL パターン リストを指定できます。一致するものについては、動画キャプチャ デバイスへのアクセスが許可されます。その際、確認のメッセージは表示されません。 有効な <ph name="URL_LABEL" /> パターンについて詳しくは、https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns をご覧ください。</translation> +<translation id="7740644123648617252">初回実行時の自動入力フォームのデータのインポートを有効にする</translation> <translation id="7744253761377202223">AC 電源での使用中の画面の明るさの割合(%)</translation> <translation id="7747447585227954402">デバイスが <ph name="PRODUCT_OS_NAME" /> で <ph name="PLUGIN_VM_NAME" /> を使用できるようにする</translation> <translation id="7749024457938190837">chrome.printing API による印刷ジョブの送信時に確認ダイアログのスキップを許可する拡張機能です</translation> @@ -6111,6 +6129,7 @@ <translation id="7925224837072026018">このポリシーでは、拡張機能または Android アプリに対し、企業キーへのアクセスを許可します。管理対象アカウントで chrome.enterprise.platformKeys API を使用して生成したキーは、企業専用のキーと指定されます。ユーザーは、拡張機能または Android アプリに企業キーへのアクセス権を付与することはできず、拡張機能または Android アプリに付与された企業キーへのアクセス権を取り消すこともできません。 デフォルトでは、拡張機能または Android アプリで企業用のキーを使用することはできません。この動作は、拡張機能または Android アプリに対して allowCorporateKeyUsage を False に設定した場合の結果と同じです。拡張機能または Android アプリに対して allowCorporateKeyUsage が True に設定されている場合のみ、その拡張機能または Android アプリでは企業用のプラットフォーム キーを任意のデータの署名に使用できます。対象の拡張機能または Android アプリがキーへのアクセスを攻撃から保護できると信頼できる場合にのみ、この許可を付与してください。</translation> +<translation id="793188693675675950">初回実行時のホームページのインポートを無効にする</translation> <translation id="7933141401888114454">監視対象ユーザーを作成できるようにする</translation> <translation id="793473937901685727">ARC アプリで証明書を使用できるかどうかを設定します</translation> <translation id="7936302526928951356">ユーザー エージェント文字列のメジャー バージョンを固定しない。</translation> @@ -6733,6 +6752,7 @@ <ph name="PRODUCT_NAME" /> バージョン 92 以降、このポリシーはヘッドレス モードでもサポートされるようになりました。 注: 「chrome://*」の内部 URL をブロックすると、予期しないエラーが発生する可能性があります。</translation> +<translation id="8619748440665904084">初回実行時の自動入力フォームのデータのインポートを無効にする</translation> <translation id="8623672932476443039">このポリシーを有効に設定した場合、ユーザーは分離されたアプリのデベロッパー モードにアクセスできます。このポリシーを無効に設定した場合、ユーザーはこの機能を利用できません。このポリシーを未設定のままにした場合、デフォルトでは、Chrome OS 上で企業の管理対象ユーザーはこの機能を利用できず、他のすべてのユーザーと OS は利用できます。</translation> <translation id="8626826495474944836">すべてのサイトに対してサイト分離を必須にする</translation> <translation id="8631434304112909927">バージョン <ph name="UNTIL_VERSION" /> まで</translation> @@ -6777,6 +6797,7 @@ このポリシーを無効に設定するか未設定のままにした場合、リモート アクセス ホストは任意のローカル ユーザーと関連付けられます。</translation> <translation id="867708016260789630">YouTube の「中」以上の制限付きモードを強制的に適用する</translation> <translation id="8677853537025397834">WebHID API を許可するサイトを指定します</translation> +<translation id="8685018726115727387">初回実行時の閲覧履歴のインポートを無効にする</translation> <translation id="8685024486845674965">パスワードが再使用されたときに、パスワード保護について警告する</translation> <translation id="8685680544554917389">このポリシーを True に設定した場合、<ph name="PRODUCT_NAME" /> でメディアの自動再生が可能になります。このポリシーを False に設定した場合、<ph name="PRODUCT_NAME" /> でメディアは自動再生されません。 @@ -7146,6 +7167,7 @@ このポリシーを無効に設定すると、登録済みのデバイスはアクティブな期間を記録または報告しません。</translation> <translation id="9077227880520270584">デバイスのローカル アカウントの自動ログイン タイマー</translation> +<translation id="9079531125758468956">初回実行時のブックマークのインポートを無効にする</translation> <translation id="9084985621503260744">動画操作を電源管理に関連付けるかどうかを指定する</translation> <translation id="9087434639296483430">登録されたデバイスでのユーザーのログイン / ログアウト イベント(失敗したログインを含む)を報告します。
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index 17b217bc..d011b4d 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -13,6 +13,7 @@ 정책 값이 유효한 도메인이 아닌 경우 정책이 적용되지 않습니다.</translation> <translation id="1004590217607585595">웹 앱 관리 설정</translation> <translation id="1006218396155867129">원격 액세스 사용자가 원격 호스트와 파일을 주고받지 못하도록 차단</translation> +<translation id="1007149936182752368">북마크 수정 사용 중지</translation> <translation id="1010151305531217567">기본 마우스 버튼을 오른쪽 버튼으로 전환</translation> <translation id="1011266755572744012">사용자가 인쇄할 수 있는 단일 인쇄 작업의 최대 시트 수를 지정합니다. @@ -75,6 +76,7 @@ 사용할 수 있는 변수 목록은 https://support.google.com/chrome/a?p=Supported_directory_variables를 참고하세요. 이 정책을 설정하지 않으면 기본 프로필 디렉터리를 사용합니다.</translation> +<translation id="1059069692400941670">처음 실행 시 기본 검색엔진 가져오기 사용 중지</translation> <translation id="1062011392452772310">기기에 대한 원격 인증을 사용합니다.</translation> <translation id="1062407476771304334">바꾸기</translation> <translation id="1069489575852947981">정책을 사용으로 설정하거나 설정하지 않으면 기기 로컬 계정이 지연 없는 자동 로그인으로 설정됩니다. <ph name="PRODUCT_OS_NAME" />에서 자동 로그인을 우회하고 로그인 화면을 표시하는 데 Ctrl+Alt+S 키보드 단축키를 인식합니다. @@ -93,6 +95,7 @@ <translation id="1082802595100075771">사용자가 익명의 Google 서비스를 통해 라벨이 지정되지 않은 이미지에 관해 자동으로 생성된 설명을 들을지 선택하도록 허용</translation> <translation id="1087437665304381368">이 정책은 <ph name="PRODUCT_OS_NAME" /> 개발자 모드만 제어합니다. Android 개발자 옵션에 액세스하지 못하게 하려면 <ph name="DEVELOPER_TOOLS_DISABLED_POLICY_NAME" /> 정책을 설정해야 합니다.</translation> <translation id="1087707496788636333">Chrome Enterprise 정책 목록이 이동됩니다. 북마크를 <ph name="POLICY_DOCUMENTATION_URL" /> 페이지로 업데이트하세요.</translation> +<translation id="1089150222292592899">SAML IdP 페이지에서 사용자 이름 자동 완성</translation> <translation id="1091765729282771296">사이트에서 사용자에게 HID 기기 액세스를 요청하도록 허용</translation> <translation id="1095209545735032039">이 사이트에서 Serial API 차단</translation> <translation id="1096105751829466145">기본 검색 공급자</translation> @@ -1900,6 +1903,7 @@ 사용 안함으로 설정하면 구성요소 업데이트가 사용 중지됩니다. 하지만 일부 구성요소는 이 정책에서 제외됩니다. 예를 들어 실행 코드가 포함되지 않은 구성요소와 브라우저 보안에 중요한 구성요소 업데이트는 사용 중지되지 않습니다. 이와 같은 구성요소의 예로는 해지 인증서 목록 및 하위 리소스 필터가 있습니다.</translation> +<translation id="2939335382784544151">처음 실행 시 방문 기록 가져오기 사용 설정</translation> <translation id="2940127076681735544">이 정책을 유효한 URL로 설정하면 <ph name="PRODUCT_NAME" />이 URL로부터 사이트 목록을 다운로드하며 <ph name="SITELIST_POLICY_NAME" /> 정책으로 규칙이 설정된 경우와 동일한 규칙을 적용합니다. 정책을 설정하지 않거나 유효한 URL로 설정하지 않으면 <ph name="PRODUCT_NAME" />에서 브라우저를 전환하는 규칙의 출처로 이 정책을 사용하지 않습니다. @@ -2333,6 +2337,7 @@ 설정하지 않으면 사용자가 데스크톱 및 로그인 화면의 배경화면 이미지를 선택합니다.</translation> <translation id="3315324240256767419">고스트 창 기능 사용함</translation> +<translation id="3323819750604111729">처음 실행 시 북마크 가져오기 사용 설정</translation> <translation id="332771718998993005"><ph name="PRODUCT_NAME" /> 전송 대상으로 알릴 이름을 설정하세요. 이 정책을 비어 있지 않은 문자열로 설정하면 해당 문자열이 <ph name="PRODUCT_NAME" /> 전송 대상의 이름으로 사용됩니다. 반면에 비어 있는 문자열로 설정하면 기기 이름이 전송 대상의 이름으로 사용됩니다. 이 정책을 설정하지 않으면 기기 이름이 전송 대상의 이름으로 사용되며, 기기 소유자(또는 기기를 관리하는 도메인의 사용자)가 이 이름을 변경할 수 있습니다. 이름의 길이는 영문 24자로 제한됩니다.</translation> @@ -2814,6 +2819,7 @@ 정책을 2로 설정하면 사이트에서 방해가 되는 광고를 차단합니다.</translation> <translation id="3877517141460819966">통합된 2단계 인증 모드</translation> <translation id="3879208481373875102">강제로 설치된 웹 앱 목록 구성</translation> +<translation id="3879700444818346084">처음 실행 시 저장된 비밀번호 가져오기 사용 중지</translation> <translation id="388237772682176890">SPDY/3.1 지원이 삭제되어 이 정책은 M53에서 지원 중단되고 M54에서 삭제되었습니다. <ph name="PRODUCT_NAME" />에서 SPDY 프로토콜을 사용 중지합니다. @@ -3094,6 +3100,7 @@ 키오스크 세션에는 유예 기간이 없으며 재부팅에 관한 알림이 표시되지 않습니다. </translation> <translation id="4187576366596772431">이 사이트에서 WebHID API 차단</translation> +<translation id="4190316993598857632">북마크 수정 사용 설정</translation> <translation id="4192388905594723944">원격 액세스 클라이언트 인증 토큰을 확인하기 위한 URL</translation> <translation id="4203055629055264833">정책을 사용으로 설정하거나 설정하지 않으면 사용자가 툴바의 아이콘을 전환하여 측면 패널에 가장 최근의 기본 검색엔진 결과 페이지를 표시할 수 있습니다. @@ -3790,6 +3797,7 @@ <translation id="5105313908130842249">배터리 전원으로 실행할 때 화면 잠금 지연</translation> <translation id="5108031557082757679">사용 중지된 엔터프라이즈 기기 프린터</translation> <translation id="5109383437323376357">변형 사용 가능 여부 결정</translation> +<translation id="5120168808610189805">처음 실행 시 홈페이지 가져오기 사용 설정</translation> <translation id="5124368997194894978">AC(교류 전원)로 부팅 사용</translation> <translation id="5130213897914754028">사이트에서 SharedArrayBuffers를 사용하지 못하도록 차단</translation> <translation id="5130935469849337738">항상 번역</translation> @@ -4473,6 +4481,7 @@ 이 동작은 세이프 브라우징이 정책 또는 사용자에 의해 사용 중지되어 있으면 실행되지 않습니다. 세이프 브라우징을 강제로 사용 설정하려면 <ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" /> 정책이나 <ph name="SAFE_BROWSING_PROTETION_LEVEL_POLICY_NAME" /> 정책을 사용하세요.</translation> <translation id="5835312413892670446">화면 캡처 설정</translation> <translation id="5836064773277134605">원격 액세스 호스트에서 사용되는 UDP 포트 범위 제한</translation> +<translation id="583627479140113555">처음 실행 시 저장된 비밀번호 가져오기 사용 설정</translation> <translation id="5837898601525273156"><ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_DAY_CONFIG_POLICY_NAME" />를 설정하고 <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_POLICY_NAME" />를 사용 설정하면 고급 배터리 충전 모드 전원 관리 정책이 사용 설정됩니다(기기에서 지원되는 경우). 이 모드는 근무 시간 이외에 표준 충전 알고리즘 및 기타 기법을 사용하여 사용자가 배터리의 상태를 최적화하도록 도와줍니다. 근무 시간 동안에는 시스템에서 급속 충전을 사용해 배터리를 빠르게 충전하도록 도와줍니다. 시작 시간 및 사용 시간을 지정하여 매일 시스템 사용량이 가장 큰 시간대를 지정하세요. 정책을 사용 중지하거나 설정하지 않으면 고급 배터리 충전 모드가 사용 중지됩니다. @@ -4796,6 +4805,13 @@ Chrome 앱을 pjkljhegncpnkpknbcohdijeoejaedia와 같은 ID로, Android 앱을 com.google.android.gm과 같은 패키지 이름으로, 웹 앱을 https://google.com/maps와 같이 <ph name="WEB_APP_INSTALL_FORCE_LIST_POLICY_NAME" />에 사용된 URL로 지정합니다. 설정하지 않으면 사용자가 런처에 고정된 앱 목록을 변경할 수 있습니다.</translation> +<translation id="6183409603139321084"><ph name="PRODUCT_OS_NAME" />은(는) 로그인 화면 및 잠금 화면에서 온라인 인증하는 동안 SAML IdP 페이지의 사용자 이름을 자동으로 입력하려고 시도할 수 있습니다. + + 이때 사용자의 <ph name="PRODUCT_OS_NAME" /> 프로필과 연결된 이메일을 사용하므로, 사용자가 SAML IdP 페이지에서 다른 이메일을 사용할 것으로 예상되는 경우 이 설정을 사용 중지해야 합니다. + + 이 정책을 통해 수신된 문자열이 IdP 페이지에서 URL 매개변수 이름이 되고 사용자 이메일이 매개변수 값이 됩니다. + + ID 공급업체와 공급업체가 지원하는 URL 매개변수 간의 매핑은 서버 측에서 담당합니다.</translation> <translation id="6190367314942602985">사용자 식별 정보 보고</translation> <translation id="6191963383731098056">이 정책으로 관리자는 <ph name="PRODUCT_NAME" />의 테마 색상을 구성할 수 있습니다. 입력 문자열은 '#RRGGBB' 형식의 유효한 16진수 색상이어야 합니다. @@ -5327,6 +5343,7 @@ 해시 알고리즘 이름, 슬래시 및 지정된 인증서의 DER 인코딩 <ph name="SUBJECT_PUBLIC_KEY_INFO" />에 적용된 해시 알고리즘 Base64 인코딩을 연결하여 <ph name="SUBJECT_PUBLIC_KEY_INFO" /> 해시를 지정합니다. Base64 인코딩 형식은 SPKI 지문 형식과 일치합니다. 유일하게 인식되는 해시 알고리즘은 sha256이고 다른 모든 알고리즘은 무시됩니다. 정책을 설정하지 않으면 인증서 투명성을 통해 공개해야 하는 인증서가 공개되지 않은 경우 <ph name="PRODUCT_NAME" />에서 인증서를 신뢰하지 않습니다.</translation> +<translation id="6703381779632216549">처음 실행 시 기본 검색엔진 가져오기 사용 설정</translation> <translation id="6704445641918520643">Lazy Login WebUI 로딩을 사용 설정합니다.</translation> <translation id="6704515759227307131">지원이 중단되어 AdvancedProtectionAllowed로 대체된 정책입니다. @@ -6324,6 +6341,7 @@ <translation id="77379430721695807">정책을 설정하면 URL 목록에 지정한 URL 패턴이 요청 URL의 보안 원본과 비교됩니다. 비교 후 일치 여부가 확인되면 동영상 캡처 기기에 액세스 권한이 부여되며 메시지가 표시되지 않습니다. 유효한 <ph name="URL_LABEL" /> 패턴에 관해 자세히 알아보려면 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns를 참고하세요.</translation> +<translation id="7740644123648617252">처음 실행 시 양식 자동 완성 데이터 가져오기 사용 설정</translation> <translation id="7744253761377202223">AC 전원으로 구동될 때의 화면 밝기 비율입니다.</translation> <translation id="7747447585227954402">기기가 <ph name="PRODUCT_OS_NAME" />에서 <ph name="PLUGIN_VM_NAME" />을(를) 사용하도록 허용합니다.</translation> <translation id="7749024457938190837">chrome.printing API를 통해 인쇄 작업을 전송할 때 확장 프로그램이 확인 대화상자를 건너뛸 수 있음</translation> @@ -6481,6 +6499,7 @@ <translation id="7925224837072026018">이 정책을 설정하면 회사 키에 대한 액세스 권한이 확장 프로그램 또는 Android 애플리케이션에 부여됩니다. 관리 계정에서 chrome.enterprise.platformKeys API를 사용하여 생성된 경우에만 키가 회사용으로 지정됩니다. 사용자는 회사 키에 대한 액세스 권한을 확장 프로그램 또는 Android 애플리케이션에 부여 또는 철회할 수 없습니다. 기본적으로 확장 프로그램 또는 Android 애플리케이션은 회사용으로 지정된 키를 사용할 수 없으며, 이는 확장 프로그램 또는 Android 애플리케이션의 allowCorporateKeyUsage를 False로 설정하는 것과 동일합니다. 확장 프로그램의 allowCorporateKeyUsage를 True로 설정하는 경우에만 확장 프로그램 또는 Android 애플리케이션에서 회사용으로 표시된 플랫폼 키를 사용하여 임의의 데이터에 서명할 수 있습니다. 확장 프로그램 또는 Android 애플리케이션이 공격자로부터 키에 대한 액세스 권한을 보호한다고 신뢰할 수 있는 경우에만 이 권한을 허용하세요.</translation> +<translation id="793188693675675950">처음 실행 시 홈페이지 가져오기 사용 중지</translation> <translation id="7933141401888114454">관리 대상 사용자 생성을 허용합니다.</translation> <translation id="793473937901685727">ARC 앱에 인증서 사용 가능 여부 설정</translation> <translation id="7936302526928951356">메이저 버전에서는 사용자 에이전트 문자열이 고정되지 않습니다.</translation> @@ -6631,6 +6650,21 @@ 사용 설정되거나 설정이 지정되지 않으면 웹사이트에서 사용자가 결제 수단을 저장했는지 확인할 수 있습니다.</translation> <translation id="8118665053362250806">미디어 디스크 캐시 크기 설정</translation> <translation id="8124468781472887384">기기 프린터 설정 액세스 정책</translation> +<translation id="8128020091920875372">이 정책을 설정하면 사용자 상호작용 없이 자동으로 설치되는 앱 및 확장 프로그램 목록이 지정되며, 사용자가 제거하거나 사용 중지할 수 없습니다. enterprise.deviceAttributes 및 enterprise.platformKeys 확장 프로그램 API의 권한을 비롯한 권한은 암시적으로 부여됩니다. (이 2개의 API는 강제 설치되지 않은 앱과 확장 프로그램에서는 사용할 수 없습니다.) + + 정책을 설정하지 않으면 앱 또는 확장 프로그램이 자동 설치되지 않으며 사용자는 <ph name="PRODUCT_NAME" />에서 모든 앱 또는 확장 프로그램을 제거할 수 있습니다. + + 이 정책은 <ph name="EXTENSION_INSTALL_BLOCKLIST_POLICY_NAME" /> 정책을 대체합니다. 기존에 강제 설치된 앱 또는 확장 프로그램은 이 목록에서 삭제되며 <ph name="PRODUCT_NAME" />에서 자동으로 제거됩니다. + + <ph name="MS_WIN_NAME" /> 인스턴스에서 인스턴스가 <ph name="MS_AD_NAME" /> 도메인에 연결되었거나 Windows 10 Pro에서 실행되거나 Chrome 브라우저 클라우드 관리에 등록된 경우에만 Chrome 웹 스토어 외부의 앱 및 확장 프로그램이 강제 설치될 수 있습니다. + + <ph name="MAC_OS_NAME" /> 인스턴스에서 인스턴스가 MDM을 통해 관리되거나 MCX를 통해 도메인에 연결된 경우에만 Chrome 웹 스토어 외부의 앱 및 확장 프로그램이 강제 설치될 수 있습니다. + + 모든 확장 프로그램의 소스 코드는 사용자가 개발자 도구를 통해 변경 가능하며, 이 과정에서 확장 프로그램 오작동이 발생할 수 있습니다. 이 점이 우려된다면 <ph name="DEVELOPER_TOOLS_DISABLED_POLICY_NAME" /> 정책을 설정하세요. + + 정책의 각 목록 항목은 세미콜론(;)으로 구분된 확장 프로그램 ID 및 '업데이트' URL(선택사항)로 구성된 문자열입니다. 확장 프로그램 ID는 32자리 문자열로, 예를 들어 개발자 모드일 때 chrome://extensions에서 확인할 수 있습니다. '업데이트' URL을 지정하는 경우 업데이트 매니페스트 XML 문서(https://developer.chrome.com/extensions/autoupdate)로 연결되어야 합니다. 기본적으로 Chrome 웹 스토어의 업데이트 URL이 사용됩니다. 정책에 설정된 '업데이트' URL은 최초 설치 시에만 사용되며 향후 확장 프로그램 업데이트에서는 확장 프로그램 매니페스트에 있는 업데이트 URL이 사용됩니다. + + 참고: 이 정책은 시크릿 모드에는 적용되지 않습니다. 확장 프로그램 호스팅에 관해 자세히 알아보세요(https://developer.chrome.com/extensions/hosting).</translation> <translation id="8128192446158421884">AutoOpenFileTypes가 적용될 수 있는 URL</translation> <translation id="8131046602440880289">텍스트 읽어주기 사용 시 향상된 네트워크 텍스트 음성 변환 음성 허용</translation> <translation id="8133152694354699657">정책을 True로 설정하거나 설정하지 않으면 사용자가 터치하여 검색을 사용할 수 있게 되며, 이 기능을 사용 설정하거나 중지할 수 있습니다. @@ -7141,6 +7175,7 @@ <ph name="PRODUCT_NAME" /> 버전 92부터 이 정책이 헤드리스 모드에서도 지원됩니다. 참고: 내부 chrome://* URL을 차단하면 예기치 못한 오류가 발생할 수 있습니다.</translation> +<translation id="8619748440665904084">처음 실행 시 양식 자동 완성 데이터 가져오기 사용 중지</translation> <translation id="8623672932476443039">정책을 사용으로 설정하면 사용자가 분리된 앱 개발자 모드를 사용할 수 있습니다. 정책을 사용 안함으로 설정하면 사용자가 해당 기능에 액세스할 수 없게 됩니다. 정책을 설정하지 않은 경우 기본값은 ChromeOS에서 기업 관리 사용자에게는 허용되지 않고 그 외 모든 사용자 및 OS에는 허용되는 것입니다.</translation> @@ -7187,6 +7222,7 @@ 정책을 사용 중지하거나 설정하지 않으면 원격 액세스 호스트를 모든 로컬 사용자와 연결할 수 있습니다.</translation> <translation id="867708016260789630">YouTube 제한 모드를 '보통' 이상으로 강제 적용</translation> <translation id="8677853537025397834">이 사이트에서 WebHID API 허용</translation> +<translation id="8685018726115727387">처음 실행 시 방문 기록 가져오기 사용 중지</translation> <translation id="8685024486845674965">비밀번호가 재사용되어 비밀번호 보호 경고가 실행됨</translation> <translation id="8685680544554917389">정책을 True로 설정하면 <ph name="PRODUCT_NAME" />의 미디어 자동 재생이 허용됩니다. 정책을 False로 설정하면 <ph name="PRODUCT_NAME" />의 미디어 자동 재생이 중지됩니다. @@ -7556,6 +7592,7 @@ 정책을 사용 중지하면 등록된 기기에서 활동 시간을 기록하거나 보고하지 않습니다.</translation> <translation id="9077227880520270584">기기 로컬 계정 자동 로그인 타이머</translation> +<translation id="9079531125758468956">처음 실행 시 북마크 가져오기 사용 중지</translation> <translation id="9084985621503260744">동영상 활동이 전원 관리에 영향을 미치는지 여부 지정</translation> <translation id="9087434639296483430">로그인 실패를 포함해 등록된 기기에서의 사용자 로그인/로그아웃 이벤트를 보고합니다.
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index 86f2329..286b4ec8 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -2930,6 +2930,11 @@ <translation id="408076456549153854">เปิดใช้การลงชื่อเข้าใช้เบราว์เซอร์</translation> <translation id="4081127242481747676">การตั้งค่าเซ็นเซอร์</translation> <translation id="4082498585300984671">เปิดใช้ฟีเจอร์คลิกเพื่อโทร</translation> +<translation id="4082809879536562387">อนุญาตให้คุณกำหนดระยะเวลาเป็นมิลลิวินาทีระหว่างการแจ้งเตือนแรกที่บอกว่าต้องรีสตาร์ทอุปกรณ์ "<ph name="PRODUCT_OS_NAME" />" เพื่อใช้อัปเดตที่รอดำเนินการ กับจุดสิ้นสุดระยะเวลาที่ระบุโดยนโยบาย <ph name="RELAUNCH_NOTIFICATION_PERIOD_POLICY_NAME" /> + + หากไม่ได้ตั้งค่า ระบบจะใช้ระยะเวลาเริ่มต้น 259,200,000 มิลลิวินาที (3 วัน) สำหรับอุปกรณ์ "<ph name="PRODUCT_OS_NAME" />" + + สำหรับการดำเนินการย้อนกลับและการอัปเดตอื่นๆ ของ "<ph name="PRODUCT_OS_NAME" />" ที่จะทำ Powerwash อุปกรณ์ ระบบจะแจ้งเตือนผู้ใช้ทันทีเสมอเมื่อมีอัปเดตพร้อมใช้งานโดยแยกจากค่าของนโยบายนี้</translation> <translation id="4086150283035515220">การตั้งค่านโยบายเป็น "เปิดใช้" หมายความว่าระบบจะถามผู้ใช้ว่าจะบันทึกไฟล์ไว้ที่ไหนก่อนที่จะดาวน์โหลด การตั้งค่านโยบายเป็น "ปิดใช้" จะทำให้การดาวน์โหลดเริ่มต้นทันที และระบบจะไม่ถามผู้ใช้ว่าจะบันทึกไฟล์ไว้ที่ไหน การไม่ตั้งค่านโยบายจะทำให้ผู้ใช้เปลี่ยนการตั้งค่าได้</translation> @@ -6549,6 +6554,21 @@ หากตั้งค่าเป็นเปิดใช้หรือไม่ได้ตั้งค่าไว้ เว็บไซต์จะได้รับอนุญาตให้ตรวจสอบว่าผู้ใช้บันทึกวิธีการชำระเงินไว้หรือไม่</translation> <translation id="8118665053362250806">ตั้งค่าขนาดแคชของดิสก์สื่อ</translation> <translation id="8124468781472887384">นโยบายการเข้าถึงการกำหนดค่าเครื่องพิมพ์สำหรับอุปกรณ์</translation> +<translation id="8128020091920875372">การตั้งค่านโยบายนี้จะระบุรายชื่อแอปและส่วนขยายที่ติดตั้งแบบเงียบ (ไม่ต้องมีการโต้ตอบจากผู้ใช้) และผู้ใช้จะถอนการติดตั้งหรือปิดใช้ไม่ได้ ระบบจะให้สิทธิ์โดยปริยาย ซึ่งรวมถึงสิทธิ์การใช้ API ของส่วนขยาย enterprise.deviceAttributes และ enterprise.platformKeys (API ทั้งสองนี้ใช้ไม่ได้กับแอปและส่วนขยายที่ไม่ได้บังคับติดตั้ง) + + หากไม่ตั้งค่านโยบายนี้ จะไม่มีแอปหรือส่วนขยายใดที่ติดตั้งโดยอัตโนมัติ และผู้ใช้จะถอนการติดตั้งแอปหรือส่วนขยายใดก็ได้ใน "<ph name="PRODUCT_NAME" />" + + นโยบายนี้จะมีผลแทนนโยบาย <ph name="EXTENSION_INSTALL_BLOCKLIST_POLICY_NAME" /> หากมีการนำแอปหรือส่วนขยายที่บังคับติดตั้งก่อนหน้านี้ออกจากรายชื่อ "<ph name="PRODUCT_NAME" />" จะถอนการติดตั้งแอปหรือส่วนขยายนั้นโดยอัตโนมัติ + + ในอินสแตนซ์ "<ph name="MS_WIN_NAME" />" จะบังคับติดตั้งแอปและส่วนขยายที่ไม่ได้มาจาก Chrome เว็บสโตร์ได้เฉพาะในกรณีที่อินสแตนซ์นั้นเข้าร่วมโดเมน "<ph name="MS_AD_NAME" />", ทำงานใน Windows 10 Pro หรือลงทะเบียนในการจัดการระบบคลาวด์ของเบราว์เซอร์ Chrome + + ในอินสแตนซ์ "<ph name="MAC_OS_NAME" />" จะบังคับติดตั้งแอปและส่วนขยายที่ไม่ได้มาจาก Chrome เว็บสโตร์ได้เฉพาะในกรณีที่อินสแตนซ์นั้นจัดการผ่าน MDM หรือเข้าร่วมโดเมนผ่าน MCX + + ผู้ใช้จะแก้ไขซอร์สโค้ดของส่วนขยายใดๆ ผ่านเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ได้ ซึ่งอาจทำให้ส่วนขยายทำงานผิดปกติ หากกังวลว่าจะเกิดปัญหานี้ขึ้น ให้ตั้งค่านโยบาย <ph name="DEVELOPER_TOOLS_DISABLED_POLICY_NAME" /> + + แต่ละรายการของนโยบายเป็นสตริงที่มีรหัสส่วนขยาย และอาจมี URL "อัปเดต" ที่คั่นด้วยอัฒภาค (;) รหัสส่วนขยายคือสตริงตัวอักษร 32 ตัว เช่น ที่พบใน chrome://extensions เมื่ออยู่ในโหมดนักพัฒนาซอฟต์แวร์ URL "อัปเดต" (หากระบุไว้) ควรชี้ไปยังเอกสาร XML ไฟล์ Manifest ของการอัปเดต (https://developer.chrome.com/extensions/autoupdate) ระบบจะใช้ URL อัปเดตของ Chrome เว็บสโตร์โดยค่าเริ่มต้น URL "อัปเดต" ที่กำหนดไว้ในนโยบายนี้จะใช้สำหรับการติดตั้งครั้งแรกเท่านั้น ส่วนการอัปเดตส่วนขยายในครั้งต่อๆ ไปจะใช้ URL อัปเดตในไฟล์ Manifest ของส่วนขยาย + + หมายเหตุ: นโยบายนี้ไม่มีผลกับโหมดไม่ระบุตัวตน อ่านเกี่ยวกับการโฮสต์ส่วนขยาย (https://developer.chrome.com/extensions/hosting)</translation> <translation id="8128192446158421884">URL ที่ใช้กับ AutoOpenFileTypes ได้</translation> <translation id="8131046602440880289">อนุญาตเสียงของการอ่านออกเสียงข้อความของเครือข่ายที่ปรับปรุงเมื่อใช้ "เลือกเพื่อให้อ่าน"</translation> <translation id="8133152694354699657">การตั้งค่านโยบายเป็น "จริง" หรือไม่ได้ตั้งค่าจะทำให้ฟีเจอร์แตะเพื่อค้นหาพร้อมใช้งานสำหรับผู้ใช้ โดยผู้ใช้เลือกได้ว่าจะเปิดหรือปิดฟีเจอร์นี้
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index ac353e9..659dc4b 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -13,6 +13,7 @@ Якщо для цього правила вказано недійсний домен, воно не застосовується.</translation> <translation id="1004590217607585595">Параметри керування веб-додатками</translation> <translation id="1006218396155867129">Заборонити користувачам із віддаленим доступом переносити файли на хост і з нього</translation> +<translation id="1007149936182752368">Вимкнути редагування закладок</translation> <translation id="1010151305531217567">Зробити основною праву кнопку миші</translation> <translation id="1011266755572744012">Указує максимальну кількість аркушів, які можна друкувати під час одного завдання. @@ -75,6 +76,7 @@ Список можливих змінних доступний на сторінці https://support.google.com/chrome/a?p=Supported_directory_variables. Якщо цей параметр не налаштовано, використовуватиметься каталог профілю за умовчанням.</translation> +<translation id="1059069692400941670">Вимкнути імпортування пошукової системи за умовчанням під час першого запуску</translation> <translation id="1062011392452772310">Вмикає віддалене підтвердження даних для пристрою</translation> <translation id="1062407476771304334">Замінити</translation> <translation id="1069489575852947981">Якщо це правило активовано або не налаштовано, вхід у локальний обліковий запис на пристрої відбувається автоматично й без затримки. Щоб обійти автоматичний вхід і показати екран входу, у <ph name="PRODUCT_OS_NAME" /> можна скористатися комбінацією клавіш Ctrl + Alt + S. @@ -93,6 +95,7 @@ <translation id="1082802595100075771">Дозволити користувачам застосовувати анонімний сервіс Google, щоб створювати автоматичні описи для зображень без міток</translation> <translation id="1087437665304381368">Це правило керує лише режимом розробника <ph name="PRODUCT_OS_NAME" />. Щоб заборонити доступ до параметрів розробника Android, потрібно налаштувати правило <ph name="DEVELOPER_TOOLS_DISABLED_POLICY_NAME" />.</translation> <translation id="1087707496788636333">Список правил Chrome Enterprise переміщено. Нова URL-адреса: <ph name="POLICY_DOCUMENTATION_URL" />.</translation> +<translation id="1089150222292592899">Автозаповнення імені користувача на сторінці постачальника ідентифікатора SAML</translation> <translation id="1091765729282771296">Дозволити сайтам запитувати в користувача дозвіл на доступ до пристроїв HID</translation> <translation id="1095209545735032039">Блокувати Serial API на цих сайтах</translation> <translation id="1096105751829466145">Пошукова служба за умовчанням</translation> @@ -1898,6 +1901,7 @@ Якщо вимкнути це правило, компоненти не оновлюватимуться. Однак винятками є компоненти, які не містять виконуваний код і важливі для безпеки веб-переглядача. Приклади таких компонентів: списки відкликаних сертифікатів і фільтри субресурсів.</translation> +<translation id="2939335382784544151">Увімкнути імпортування історії веб-перегляду під час першого запуску</translation> <translation id="2940127076681735544">Якщо для цього правила вказано дійсну URL-адресу, <ph name="PRODUCT_NAME" /> завантажує список сайтів за цією URL-адресою та застосовує правила так, наче їх налаштовано за допомогою правила <ph name="SITELIST_POLICY_NAME" />. Якщо це правило не налаштовано (або для нього вказано недійсну URL-адресу), <ph name="PRODUCT_NAME" /> не використовує його як джерело для правил, що ініціюють перехід в інший веб-переглядач. @@ -2335,6 +2339,7 @@ Якщо це правило не налаштовано, користувачі вибирають фоновий малюнок робочого столу й екрана входу.</translation> <translation id="3315324240256767419">Увімкнути функцію вікна-привида</translation> +<translation id="3323819750604111729">Увімкнути імпортування закладок під час першого запуску</translation> <translation id="332771718998993005">Визначає назву як місце призначення <ph name="PRODUCT_NAME" />. Якщо для цього правила вибрано непорожній рядок, цей рядок використовуватиметься як назва місця призначення <ph name="PRODUCT_NAME" />. В іншому випадку місцем призначення буде назва пристрою. Якщо це правило не налаштовано, назвою місця призначення буде назва пристрою, а власник цього пристрою (або користувач домену, що керує пристроєм) зможе змінювати її. Назва може містити не більше 24 символів.</translation> @@ -2814,6 +2819,7 @@ Якщо для цього правила вибрано значення 2, рекламу буде заблоковано на сайтах із нав'язливими оголошеннями.</translation> <translation id="3877517141460819966">Вбудовано режим двофакторної автентифікації</translation> <translation id="3879208481373875102">Налаштувати список примусово встановлюваних веб-додатків</translation> +<translation id="3879700444818346084">Вимкнути імпортування збережених паролів під час першого запуску</translation> <translation id="388237772682176890">Це правило не діє у версії M53 та видалено у версії M54, оскільки підтримку протоколу SPDY/3.1 припинено. Вимикає використання протоколу SPDY у продукті <ph name="PRODUCT_NAME" />. @@ -3094,6 +3100,7 @@ Пільгового періоду й сповіщень про перезапуск не передбачено для сеансів у режимі термінала. </translation> <translation id="4187576366596772431">Блокувати WebHID API на цих сайтах</translation> +<translation id="4190316993598857632">Увімкнути редагування закладок</translation> <translation id="4192388905594723944">URL-адреса для перевірки маркера автентифікації клієнта віддаленого доступу</translation> <translation id="4203055629055264833">Якщо ввімкнути або не налаштувати це правило, останні сторінки з результатами, знайденими пошуковою системою, яку вибрано за умовчанням, зможуть з’являтися на бічній панелі, коли користувачі перемикатимуть значок на панелі інструментів. @@ -3788,6 +3795,7 @@ <translation id="5105313908130842249">Затримка блокування екрана, коли використовується заряд акумулятора</translation> <translation id="5108031557082757679">Вимкнені принтери пристроїв підприємства</translation> <translation id="5109383437323376357">Визначати наявність варіантів</translation> +<translation id="5120168808610189805">Увімкнути імпортування головної сторінки під час першого запуску</translation> <translation id="5124368997194894978">Дозволити запуск під час підключення змінного струму</translation> <translation id="5130213897914754028">Заборонити сайтам використовувати правило SharedArrayBuffers</translation> <translation id="5130935469849337738">Завжди пропонувати переклад</translation> @@ -4471,6 +4479,7 @@ Ця функція не працюватиме, якщо Безпечний перегляд вимкнено (правилом чи користувачем). Щоб примусово ввімкнути Безпечний перегляд, скористайтеся правилом <ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" /> або <ph name="SAFE_BROWSING_PROTETION_LEVEL_POLICY_NAME" />.</translation> <translation id="5835312413892670446">Налаштування запису екрана</translation> <translation id="5836064773277134605">Обмежити діапазон порту UDP, який використовується хостом віддаленого доступу</translation> +<translation id="583627479140113555">Увімкнути імпортування збережених паролів під час першого запуску</translation> <translation id="5837898601525273156">Якщо правило <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_DAY_CONFIG_POLICY_NAME" /> налаштовано, а параметр <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_POLICY_NAME" /> активовано, правило керування живленням для режиму покращеного заряджання акумулятора ввімкнено (за умови, що пристрій підтримує його). Система використовує стандартний алгоритм заряджання й інші методи під час неактивності, щоб подовжити тривалість роботи акумулятора. Під час активності застосовується технологія Express Charge, завдяки якій акумулятор заряджається швидше. Для кожного дня вказується початок і тривалість періоду, коли система використовується найактивніше. Якщо це правило деактивовано або не налаштовано, режим покращеного заряджання вимкнено. @@ -4793,6 +4802,13 @@ Додатки Chrome потрібно вказувати за їх ідентифікатором (як-от pjkljhegncpnkpknbcohdijeoejaedia); додатки для Android – за назвою пакета (як-от com.google.android.gm); веб-додатки – за URL-адресою, яка використовується в правилі <ph name="WEB_APP_INSTALL_FORCE_LIST_POLICY_NAME" /> (як-от https://google.com/maps). Якщо це правило не налаштовано, користувачі зможуть змінювати список додатків, закріплених на панелі запуску.</translation> +<translation id="6183409603139321084"><ph name="PRODUCT_OS_NAME" /> може спробувати автоматично заповнити поле імені користувача на сторінці постачальника ідентифікатора SAML під час онлайн-автентифікації на екрані входу й заблокованому екрані. + + Це правило застосовуватиме електронну адресу користувача, зв’язану з профілем <ph name="PRODUCT_OS_NAME" />. Якщо очікується, що користувачі застосовуватимуть інші електронні адреси на сторінці постачальника ідентифікатора SAML, це налаштування слід вимкнути. + + Рядок, отриманий через це правило, буде застосовуватись як назва параметра URL-адреси на сторінці постачальника ідентифікатора, що матиме як значення електронну адресу користувача. + + Відповідальність за зіставлення постачальників ідентифікаторів і параметрів URL-адреси, які вони підтримують, має залежати від сервера.</translation> <translation id="6190367314942602985">Повідомляти ідентифікаційну інформацію користувачів</translation> <translation id="6191963383731098056">Це правило дає змогу адміністраторам налаштувати колір теми в <ph name="PRODUCT_NAME" />. Як вхідне значення потрібно задати дійсний шістнадцятковий код кольору, що відповідає формату "#RRGGBB". @@ -5334,6 +5350,7 @@ Щоб указати хеш <ph name="SUBJECT_PUBLIC_KEY_INFO" />, об'єднайте назву алгоритму хешу, скісну риску та кодування Base64 алгоритму хешу, що застосовується до даних <ph name="SUBJECT_PUBLIC_KEY_INFO" /> зазначеного сертифіката з DER-кодуванням. Кодування Base64 має той самий формат, що й відбиток SPKI. Розпізнається лише алгоритм хешу sha256. Усі інші ігноруються. Якщо не налаштувати це правило, <ph name="PRODUCT_NAME" /> не довірятиме нерозголошеним сертифікатам, дані яких мають бути розкриті внаслідок перевірки.</translation> +<translation id="6703381779632216549">Увімкнути імпортування пошукової системи за умовчанням під час першого запуску</translation> <translation id="6704445641918520643">Увімкнути відкладене завантаження WebUI для екрана входу.</translation> <translation id="6704515759227307131">Це правило більше не підтримується та буде замінене правилом AdvancedProtectionAllowed. @@ -6330,6 +6347,7 @@ <translation id="77379430721695807">Налаштувавши це правило, ви вказуєте список URL-адрес, шаблони яких зіставлятимуться з джерелом безпеки URL-адреси, що надсилає запит. Якщо буде виявлено збіг, сторінка отримає доступ до пристроїв запису відео, не надсилаючи сповіщення користувачу Докладніше про дійсні шаблони <ph name="URL_LABEL" />-адрес можна дізнатися на сторінці https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> +<translation id="7740644123648617252">Увімкнути імпортування даних форми автозаповнення під час першого запуску</translation> <translation id="7744253761377202223">Відсоток яскравості екрана під час роботи від електромережі</translation> <translation id="7747447585227954402">Дозволити пристроям використовувати плагін <ph name="PLUGIN_VM_NAME" /> в <ph name="PRODUCT_OS_NAME" /></translation> <translation id="7749024457938190837">Розширення, яким дозволено пропускати вікно підтверження під час надсилання завдання друку через chrome.printing API</translation> @@ -6487,6 +6505,7 @@ <translation id="7925224837072026018">Якщо налаштувати це правило, розширення та додатки Android матимуть доступ до корпоративних ключів. Ключі призначаються для корпоративного використання, лише якщо їх згенеровано за допомогою chrome.enterprise.platformKeys API у керованому обліковому записі. Користувачі не можуть надавати чи блокувати розширенням або додаткам Android доступ до цих ключів. За умовчанням розширення або додатки Android не можуть використовувати корпоративний ключ (щоб заборонити це певному додатку чи розширенню, визначте його в цьому правилі та задайте значення false для параметра allowCorporateKeyUsage). Розширення або додаток Android може підписувати довільні дані будь-яким корпоративним ключем платформи, лише якщо задати для нього параметр allowCorporateKeyUsage зі значенням true. Цей дозвіл потрібно надавати, лише якщо розширення або додаток Android гарантує захист ключа від зловмисників.</translation> +<translation id="793188693675675950">Вимкнути імпортування головної сторінки під час першого запуску</translation> <translation id="7933141401888114454">Вмикає створення контрольованих користувачів</translation> <translation id="793473937901685727">Налаштування доступності сертифікатів для додатків ARC</translation> <translation id="7936302526928951356">Номер основної версії не буде закріплено в сегменті агента користувача.</translation> @@ -7146,6 +7165,7 @@ Починаючи з версії <ph name="PRODUCT_NAME" /> 92, це правило підтримується в режимі headless. Примітка: блокування внутрішніх URL-адрес "chrome://*" може призвести до неочікуваних помилок.</translation> +<translation id="8619748440665904084">Вимкнути імпортування даних автозаповнення форм під час першого запуску</translation> <translation id="8623672932476443039">Якщо ввімкнути це правило, користувачі отримають доступ до режиму розробника для ізольованих додатків. Якщо його вимкнути, користувачі не отримають такий доступ. Якщо це правило не налаштувати, за умовчанням такий доступ не дозволятиметься для користувачів ОС Chrome, якими керує адміністратор, і дозволятиметься для всіх інших користувачів та операційних систем.</translation> @@ -7192,6 +7212,7 @@ Якщо це правило вимкнено або не налаштовано, хост віддаленого доступу можна пов'язувати з будь-яким локальним користувачем.</translation> <translation id="867708016260789630">Заборонити вибирати на YouTube менш безпечний режим, ніж помірний</translation> <translation id="8677853537025397834">Дозволити WebHID API на цих сайтах</translation> +<translation id="8685018726115727387">Вимкнути імпортування історії веб-перегляду під час першого запуску</translation> <translation id="8685024486845674965">Застереження про захист паролем активується під час повторного введення пароля</translation> <translation id="8685680544554917389">Якщо для цього правила вибрано значення True, <ph name="PRODUCT_NAME" /> зможе автоматично відтворювати медіа. Якщо для нього вибрано значення False, <ph name="PRODUCT_NAME" /> не зможе цього робити. @@ -7560,6 +7581,7 @@ Якщо це правило вимкнено, зареєстровані пристрої не записують і не надсилають такі дані.</translation> <translation id="9077227880520270584">Таймер для автоматичного входу в локальний обліковий запис на пристрої</translation> +<translation id="9079531125758468956">Вимкнути імпортування закладок під час першого запуску</translation> <translation id="9084985621503260744">Визначати, чи дії з відео впливають на керування живленням</translation> <translation id="9087434639296483430">Визначає, чи надсилати дані про входи й виходи користувачів на зареєстрованих пристроях (зокрема про невдалі спроби).
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index 0938f74c..639bdff 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -13,6 +13,7 @@ 如果這項政策的值不是有效網域,系統就不會套用這項政策。</translation> <translation id="1004590217607585595">網頁應用程式管理設定</translation> <translation id="1006218396155867129">禁止遠端存取使用者向遠端主機傳輸檔案,或從遠端主機接收檔案</translation> +<translation id="1007149936182752368">不允許編輯書籤</translation> <translation id="1010151305531217567">將滑鼠的主要按鈕切換為右鍵</translation> <translation id="1011266755572744012">指定使用者執行單一列印工作時,可列印的紙張數量上限。 @@ -75,6 +76,7 @@ 如需可使用的變數清單,請參閱 https://support.google.com/chrome/a?p=Supported_directory_variables。 如果不設定這項政策,系統會使用預設的設定檔目錄。</translation> +<translation id="1059069692400941670">不允許在第一次執行時匯入預設搜尋引擎</translation> <translation id="1062011392452772310">為裝置啟用遠端認證機制</translation> <translation id="1062407476771304334">取代</translation> <translation id="1069489575852947981">如果將這項政策設為啟用或不設定,系統會將裝置本機帳戶設為零延遲自動登入。<ph name="PRODUCT_OS_NAME" />會遵循用於略過自動登入並顯示登入畫面的鍵盤快速鍵 Ctrl + Alt + S 鍵。 @@ -93,6 +95,7 @@ <translation id="1082802595100075771">讓使用者選擇使用去識別化的 Google 服務,針對無標籤圖片提供自動產生的說明</translation> <translation id="1087437665304381368">這項政策只能控管 <ph name="PRODUCT_OS_NAME" />開發人員模式。如要禁止他人存取 Android 開發人員選項,則必須設定 <ph name="DEVELOPER_TOOLS_DISABLED_POLICY_NAME" /> 政策。</translation> <translation id="1087707496788636333">Chrome Enterprise 政策清單的網址已變更!請將你的書籤更新為 <ph name="POLICY_DOCUMENTATION_URL" />。</translation> +<translation id="1089150222292592899">在 SAML IdP 頁面自動填入使用者名稱</translation> <translation id="1091765729282771296">允許網站要求使用者授予 HID 裝置的存取權</translation> <translation id="1095209545735032039">封鎖這些網站上的 Serial API</translation> <translation id="1096105751829466145">預設搜尋引擎</translation> @@ -1863,6 +1866,7 @@ 如果將這項政策設為停用,則會禁止更新元件。不過,部分元件不受本政策規範:只要元件更新不含可執行的程式碼,且對瀏覽器安全性至關重要,就不會遭到禁止。 舉例來說,憑證撤銷清單和子資源篩選器等元件不會受到這項政策影響。</translation> +<translation id="2939335382784544151">允許在第一次執行時匯入瀏覽記錄</translation> <translation id="2940127076681735544">如果將這項政策設為有效的網址,<ph name="PRODUCT_NAME" /> 會從該網址下載網站清單,然後按照 <ph name="SITELIST_POLICY_NAME" /> 政策中的設定套用規則。 如果未設定 (或設為無效網址),<ph name="PRODUCT_NAME" /> 不會使用這項政策做為切換瀏覽器的規則來源。 @@ -2290,6 +2294,7 @@ 如果未設定,使用者將可選擇桌面和登入畫面背景的圖片。</translation> <translation id="3315324240256767419">啟用 ghost 視窗功能。</translation> +<translation id="3323819750604111729">允許在第一次執行時匯入書籤</translation> <translation id="332771718998993005">確定公開為「<ph name="PRODUCT_NAME" />」目的地的名稱。 如果這項政策設為非空白字串,該字串就會成為「<ph name="PRODUCT_NAME" />」目的地的名稱,否則目的地名稱將會是裝置名稱。如果未設定這項政策,則目的地名稱會是裝置名稱,且裝置擁有者 (或裝置管理網域中的使用者) 可進行變更。名稱長度上限為 24 個字元。</translation> @@ -2762,6 +2767,7 @@ 如果將這項政策設為 2,系統會禁止包含侵入式廣告的網站顯示廣告。</translation> <translation id="3877517141460819966">整合式雙重驗證模式</translation> <translation id="3879208481373875102">設定強制安裝的網頁應用程式清單</translation> +<translation id="3879700444818346084">不允許在第一次執行時匯入儲存的密碼</translation> <translation id="388237772682176890">自 M53 起我們已淘汰這項政策,至 M54 則移除了這項政策 (因為我們已不再支援 SPDY/3.1)。 停用 <ph name="PRODUCT_NAME" /> 的 SPDY 通訊協定。 @@ -3028,6 +3034,7 @@ 在資訊站工作階段中,沒有任何寬限期,也沒有重新啟動作業相關通知。 </translation> <translation id="4187576366596772431">封鎖這些網站上的 WebHID API</translation> +<translation id="4190316993598857632">允許編輯書籤</translation> <translation id="4192388905594723944">用於驗證遠端存取用戶端驗證憑證的網址</translation> <translation id="4203055629055264833">如果將這項政策設為啟用或不設定,代表使用者可透過工具列上的切換圖示開啟側邊面板,查看預設搜尋引擎的最新搜尋結果。 @@ -3724,6 +3731,7 @@ <translation id="5105313908130842249">在電池供電環境下執行時的螢幕鎖定延遲時間</translation> <translation id="5108031557082757679">已停用企業裝置印表機</translation> <translation id="5109383437323376357">指定變化版本的可用性</translation> +<translation id="5120168808610189805">允許在第一次執行時匯入首頁</translation> <translation id="5124368997194894978">啟用「連接 AC (交流電) 電源時啟動」功能</translation> <translation id="5130213897914754028">禁止網站使用 SharedArrayBuffers</translation> <translation id="5130935469849337738">一律提供翻譯</translation> @@ -4380,6 +4388,7 @@ 如果安全瀏覽功能的設定為停用 (無論是根據政策設定或使用者自行停用),則一律不會觸發這個行為。如要強制啟用安全瀏覽功能,請使用 <ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" /> 政策或 <ph name="SAFE_BROWSING_PROTETION_LEVEL_POLICY_NAME" /> 政策。</translation> <translation id="5835312413892670446">螢幕畫面擷取設定</translation> <translation id="5836064773277134605">限制遠端存取主機所使用的 UDP 連接埠範圍</translation> +<translation id="583627479140113555">允許在第一次執行時匯入儲存的密碼</translation> <translation id="5837898601525273156">如果已設定 <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_DAY_CONFIG_POLICY_NAME" />,你可以將 <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_POLICY_NAME" /> 設為啟用,以在支援的裝置上,將進階充電模式電源管理政策保持啟用。這個模式會在非工作時間採用標準充電演算法和其他技術,讓使用者盡可能延長電池壽命。系統在工作時間會使用快速充電模式,加快充電的速度。請設定開始時間和持續期間,指定每天最常使用系統的時間。 如果將這項政策設為停用或不設定,系統會將進階充電模式保持關閉。 @@ -4692,6 +4701,13 @@ 請透過應用程式 ID 來指定 Chrome 應用程式 (例如 pjkljhegncpnkpknbcohdijeoejaedia);透過應用程式套件名稱來指定 Android 應用程式 (例如 com.google.android.gm);透過 <ph name="WEB_APP_INSTALL_FORCE_LIST_POLICY_NAME" /> 中使用的應用程式網址來指定網頁應用程式 (例如 https://google.com/maps)。 如果不設定這項政策,使用者將可變更啟動器中的固定應用程式清單。</translation> +<translation id="6183409603139321084">進行登入畫面和螢幕鎖定畫面線上驗證時,<ph name="PRODUCT_OS_NAME" /> 可嘗試在 SAML IdP 頁面的使用者名稱欄位自動填入內容。 + + 系統會使用與 <ph name="PRODUCT_OS_NAME" /> 設定檔相關聯的電子郵件地址,因此如果使用者要在 SAML IdP 頁面使用其他電子郵件地址,應停用這項設定。 + + 透過這項政策接收的字串將做為 IdP 頁面的網址參數名稱,而使用者的電子郵件地址會是參數的值。 + + 伺服器端將負責對應識別資訊提供者及支援的網址參數。</translation> <translation id="6190367314942602985">回報使用者身分識別資訊</translation> <translation id="6191963383731098056">管理員可以透過這項政策設定 <ph name="PRODUCT_NAME" /> 主題的顏色。輸入的字串應為有效的十六進位顏色字串,格式為「#RRGGBB」。 @@ -5216,6 +5232,7 @@ 指定 <ph name="SUBJECT_PUBLIC_KEY_INFO" /> 雜湊的方法是串連雜湊演算法名稱、斜線以及套用到指定憑證 <ph name="SUBJECT_PUBLIC_KEY_INFO" /> (採 DER 編碼) 雜湊演算法所採用的 Base64 編碼。Base64 編碼格式符合 SPKI 指紋編碼的格式。系統僅能辨識 sha256 雜湊演算法,其他雜湊演算法則會忽略。 如果未設定這項政策,凡是應依憑證透明化規定公開而未公開的憑證,<ph name="PRODUCT_NAME" /> 都會將其視為不受信任的憑證。</translation> +<translation id="6703381779632216549">允許在第一次執行時匯入預設搜尋引擎</translation> <translation id="6704445641918520643">啟用 Lazy Login WebUI 載入功能。</translation> <translation id="6704515759227307131">這項政策已遭淘汰,並已替換為 AdvancedProtectionAllowed。 @@ -6202,6 +6219,7 @@ <translation id="77379430721695807">你可以透過這項政策指定網址清單,系統會將這份清單中的模式與要求網址的安全性來源進行比對。如果模式相符,系統會直接授予影片擷取裝置存取權限,而不會顯示提示 如果想進一步瞭解有效的<ph name="URL_LABEL" />模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。</translation> +<translation id="7740644123648617252">允許在第一次執行時匯入自動填入表單資料</translation> <translation id="7744253761377202223">使用 AC 電源供電時的螢幕亮度百分比</translation> <translation id="7747447585227954402">允許裝置在 <ph name="PRODUCT_OS_NAME" /> 使用 <ph name="PLUGIN_VM_NAME" /></translation> <translation id="7749024457938190837">這些擴充功能在透過 chrome.printing API 傳送列印工作時,可以略過確認對話方塊</translation> @@ -6359,6 +6377,7 @@ <translation id="7925224837072026018">設定這項政策會將企業金鑰的存取權授予擴充功能或 Android 應用程式。在受管理的帳戶中使用 chrome.enterprise.platformKeys API 產生的金鑰僅供企業使用。使用者無法將企業金鑰的存取權授予擴充功能或 Android 應用程式,也無法撤銷擴充功能或 Android 應用程式對企業金鑰的存取權。 根據預設,擴充功能或 Android 應用程式無法使用企業專用的金鑰 (等同於將 allowCorporateKeyUsage 設為 False)。擴充功能或 Android 應用程式只有在 allowCorporateKeyUsage 設為 True 時,才能使用企業專用的平台金鑰簽署任意資料。為了確保攻擊者無法獲得金鑰存取權,這項權限只應授予信任的擴充功能或 Android 應用程式。</translation> +<translation id="793188693675675950">不允許在第一次執行時匯入首頁</translation> <translation id="7933141401888114454">啟用建立受監管使用者的功能</translation> <translation id="793473937901685727">設定 ARC 應用程式的憑證可用性</translation> <translation id="7936302526928951356">User-Agent 字串不會凍結主要版本。</translation> @@ -7012,6 +7031,7 @@ 自 <ph name="PRODUCT_NAME" /> 92 版起,系統在無頭模式下也會支援這項政策。 注意:封鎖內部的 chrome://* 網址可能會導致非預期的錯誤。</translation> +<translation id="8619748440665904084">不允許在第一次執行時匯入自動填入表單資料</translation> <translation id="8623672932476443039">如果將這項政策設為啟用,使用者可以存取「已隔離應用程式的開發人員模式」。 如果將這項政策設為停用,使用者將無法存取這些功能。 如果不設定這項政策,在預設情況下,Chrome OS 上受企業管理的使用者將無法存取這個模式,其他作業系統上的一般使用者則可存取這個模式。</translation> @@ -7058,6 +7078,7 @@ 如果將這項政策設為停用或不設定,遠端存取主機即可與任何本機使用者建立關聯。</translation> <translation id="867708016260789630">強制執行中度以上的 YouTube 嚴格篩選模式</translation> <translation id="8677853537025397834">允許這些網站上的 WebHID API</translation> +<translation id="8685018726115727387">不允許在第一次執行時匯入瀏覽記錄</translation> <translation id="8685024486845674965">密碼遭到重複使用時,會觸發密碼保護警告</translation> <translation id="8685680544554917389">如果將這項政策設為 True,<ph name="PRODUCT_NAME" /> 即可自動播放媒體。如果將這項政策設為 False,<ph name="PRODUCT_NAME" /> 不會自動播放媒體。 @@ -7422,6 +7443,7 @@ 如果將這項政策設為停用,已註冊的裝置不會記錄或回報活動時間。</translation> <translation id="9077227880520270584">裝置本機帳戶自動登入計時器</translation> +<translation id="9079531125758468956">不允許在第一次執行時匯入書籤</translation> <translation id="9084985621503260744">指定會影響電源管理的視訊活動</translation> <translation id="9087434639296483430">回報已註冊裝置上的使用者登入/登出事件,包括登入失敗事件。
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/BUILD.gn b/components/safe_browsing/content/renderer/phishing_classifier/BUILD.gn index cba75f0..dc32b18 100644 --- a/components/safe_browsing/content/renderer/phishing_classifier/BUILD.gn +++ b/components/safe_browsing/content/renderer/phishing_classifier/BUILD.gn
@@ -102,19 +102,18 @@ } if (use_libfuzzer) { - # TODO(crbug/1313963): Re-enable this fuzzer. - # fuzzer_test("client_side_phishing_fuzzer") { - # sources = [ "client_side_phishing_fuzzer.cc" ] - # deps = [ - # ":client_side_phishing_fuzzer_proto", - # ":phishing_classifier", - # "//base:base", - # "//components/safe_browsing/core/common/fbs:client_model", - # "//components/safe_browsing/core/common/proto:client_model_proto", - # "//skia", - # "//third_party/libprotobuf-mutator", - # ] - # } + fuzzer_test("client_side_phishing_fuzzer") { + sources = [ "client_side_phishing_fuzzer.cc" ] + deps = [ + ":client_side_phishing_fuzzer_proto", + ":phishing_classifier", + "//base:base", + "//components/safe_browsing/core/common/fbs:client_model", + "//components/safe_browsing/core/common/proto:client_model_proto", + "//skia", + "//third_party/libprotobuf-mutator", + ] + } fuzzable_proto_library("client_side_phishing_fuzzer_proto") { proto_in_dir = "//"
diff --git a/components/services/app_service/public/cpp/BUILD.gn b/components/services/app_service/public/cpp/BUILD.gn index a08bff8..d367f016 100644 --- a/components/services/app_service/public/cpp/BUILD.gn +++ b/components/services/app_service/public/cpp/BUILD.gn
@@ -327,7 +327,6 @@ "app_launch_util_unittest.cc", "app_registry_cache_unittest.cc", "app_registry_cache_wrapper_unittest.cc", - "app_update_mojom_unittest.cc", "app_update_unittest.cc", "capability_access_update_unittest.cc", "icon_cache_unittest.cc",
diff --git a/components/services/app_service/public/cpp/app_registry_cache_unittest.cc b/components/services/app_service/public/cpp/app_registry_cache_unittest.cc index 81047f7..4df6c00 100644 --- a/components/services/app_service/public/cpp/app_registry_cache_unittest.cc +++ b/components/services/app_service/public/cpp/app_registry_cache_unittest.cc
@@ -11,7 +11,6 @@ #include "base/containers/contains.h" #include "base/memory/raw_ptr.h" -#include "base/test/scoped_feature_list.h" #include "components/services/app_service/public/cpp/app_types.h" #include "components/services/app_service/public/cpp/features.h" #include "components/services/app_service/public/cpp/types_util.h" @@ -313,17 +312,8 @@ public testing::WithParamInterface<bool>, public AppRegistryCache::Observer { public: - AppRegistryCacheTest() { - scoped_feature_list_.InitWithFeatureState( - kAppServiceOnAppUpdateWithoutMojom, IsOnAppUpdateWithoutMojomEnabled()); - } - void CallForAllApps(AppRegistryCache& cache) { cache.ForAllApps([this](const AppUpdate& update) { OnAppUpdate(update); }); - if (!IsOnAppUpdateWithoutMojomEnabled()) { - cache.ForEachApp( - [this](const AppUpdate& update) { OnAppUpdate(update); }); - } } // apps::AppRegistryCache::Observer overrides. @@ -391,21 +381,6 @@ updated_names_.clear(); } - void EnableOnAppTypeInitializedFlag() { - scoped_feature_list_.Reset(); - if (IsOnAppUpdateWithoutMojomEnabled()) - scoped_feature_list_.InitWithFeatures( - /*enabled_features=*/{kAppServiceOnAppUpdateWithoutMojom}, - /*disabled_features=*/{}); - else { - scoped_feature_list_.InitWithFeatures( - /*enabled_features=*/{}, - /*disabled_features=*/{kAppServiceOnAppUpdateWithoutMojom}); - } - } - - bool IsOnAppUpdateWithoutMojomEnabled() const { return GetParam(); } - const AccountId& account_id() const { return account_id_; } void SetAppType(AppType app_type) { app_type_ = app_type; } @@ -417,12 +392,11 @@ int num_freshly_installed_ = 0; private: - base::test::ScopedFeatureList scoped_feature_list_; AccountId account_id_ = AccountId::FromUserEmail("test@gmail.com"); AppType app_type_ = AppType::kUnknown; }; -TEST_P(AppRegistryCacheTest, OnApps) { +TEST_F(AppRegistryCacheTest, OnApps) { AppRegistryCache cache; cache.SetAccountId(account_id()); @@ -519,7 +493,7 @@ EXPECT_FALSE(found_e); } -TEST_P(AppRegistryCacheTest, Removed) { +TEST_F(AppRegistryCacheTest, Removed) { AppRegistryCache cache; testing::StrictMock<MockRegistryObserver> observer; cache.SetAccountId(account_id()); @@ -568,31 +542,17 @@ mojom_apps.push_back(MakeMojomApp("app", "app", apps::mojom::AppType::kArc, apps::mojom::Readiness::kRemoved)); - if (IsOnAppUpdateWithoutMojomEnabled()) { - // We should see one call informing us that the app was uninstalled. - EXPECT_CALL(observer, OnAppUpdate(HasAppId("app"))) - .WillOnce(testing::Invoke([&observer, &cache](const AppUpdate& update) { - EXPECT_EQ(Readiness::kUninstalledByUser, update.Readiness()); - // Even though we have queued the removal, checking the cache now - // shows the app is still present. - EXPECT_CALL(observer, OnAppUpdate(HasAppId("app"))); - cache.ForAllApps([&observer](const AppUpdate& update) { - observer.OnAppUpdate(update); - }); - })); - } else { - // We should see one call informing us that the app was uninstalled. - EXPECT_CALL(observer, OnAppUpdate(HasAppId("app"))) - .WillOnce(testing::Invoke([&observer, &cache](const AppUpdate& update) { - EXPECT_EQ(apps::Readiness::kUninstalledByUser, update.Readiness()); - // Even though we have queued the removal, checking the cache now - // shows the app is still present. - EXPECT_CALL(observer, OnAppUpdate(HasAppId("app"))); - cache.ForEachApp([&observer](const AppUpdate& update) { - observer.OnAppUpdate(update); - }); - })); - } + // We should see one call informing us that the app was uninstalled. + EXPECT_CALL(observer, OnAppUpdate(HasAppId("app"))) + .WillOnce(testing::Invoke([&observer, &cache](const AppUpdate& update) { + EXPECT_EQ(Readiness::kUninstalledByUser, update.Readiness()); + // Even though we have queued the removal, checking the cache now + // shows the app is still present. + EXPECT_CALL(observer, OnAppUpdate(HasAppId("app"))); + cache.ForAllApps([&observer](const AppUpdate& update) { + observer.OnAppUpdate(update); + }); + })); cache.OnApps(std::move(apps), AppType::kUnknown, false /* should_notify_initialized */); @@ -611,7 +571,7 @@ EXPECT_TRUE(cache.GetAllApps().empty()); } -TEST_P(AppRegistryCacheTest, RemovedAndAdded) { +TEST_F(AppRegistryCacheTest, RemovedAndAdded) { AppRegistryCache cache; RemoveObserver observer(&cache); cache.SetAccountId(account_id()); @@ -685,7 +645,7 @@ EXPECT_EQ(Readiness::kReady, observer.readinesses()[1]); } -TEST_P(AppRegistryCacheTest, RemovedAndAddMultipleApps) { +TEST_F(AppRegistryCacheTest, RemovedAndAddMultipleApps) { AppRegistryCache cache; RemoveObserver observer(&cache); cache.SetAccountId(account_id()); @@ -770,7 +730,7 @@ EXPECT_EQ(Readiness::kDisabledByPolicy, observer.readinesses()[2]); } -TEST_P(AppRegistryCacheTest, Observer) { +TEST_F(AppRegistryCacheTest, Observer) { std::vector<AppPtr> deltas; AppRegistryCache cache; cache.SetAccountId(account_id()); @@ -807,9 +767,7 @@ EXPECT_NE(updated_ids_.end(), updated_ids_.find("c")); EXPECT_NE(updated_ids_.end(), updated_ids_.find("e")); EXPECT_EQ(AppType::kArc, app_type()); - if (base::FeatureList::IsEnabled(kAppServiceOnAppUpdateWithoutMojom)) { - EXPECT_TRUE(cache.IsAppTypeInitialized(AppType::kArc)); - } + EXPECT_TRUE(cache.IsAppTypeInitialized(AppType::kArc)); auto all_apps = cache.GetAllApps(); ASSERT_EQ(3u, all_apps.size()); @@ -868,9 +826,7 @@ EXPECT_EQ(0, num_freshly_installed_); EXPECT_EQ(0u, updated_ids_.size()); EXPECT_EQ(AppType::kUnknown, app_type()); - if (base::FeatureList::IsEnabled(kAppServiceOnAppUpdateWithoutMojom)) { - EXPECT_TRUE(cache.IsAppTypeInitialized(AppType::kArc)); - } + EXPECT_TRUE(cache.IsAppTypeInitialized(AppType::kArc)); all_apps = cache.GetAllApps(); ASSERT_EQ(5u, all_apps.size()); @@ -881,13 +837,7 @@ EXPECT_EQ("f", all_apps[4]->app_id); } -TEST_P(AppRegistryCacheTest, Recursive) { - if (!base::FeatureList::IsEnabled(kAppServiceOnAppUpdateWithoutMojom)) { - return; - } - - EnableOnAppTypeInitializedFlag(); - +TEST_F(AppRegistryCacheTest, Recursive) { std::vector<AppPtr> deltas; AppRegistryCache cache; cache.SetAccountId(account_id()); @@ -951,13 +901,7 @@ EXPECT_EQ("q", all_apps[2]->app_id); } -TEST_P(AppRegistryCacheTest, SuperRecursive) { - if (!base::FeatureList::IsEnabled(kAppServiceOnAppUpdateWithoutMojom)) { - return; - } - - EnableOnAppTypeInitializedFlag(); - +TEST_F(AppRegistryCacheTest, SuperRecursive) { std::vector<AppPtr> deltas; AppRegistryCache cache; cache.SetAccountId(account_id()); @@ -1020,10 +964,8 @@ // Verify the OnAppTypeInitialized callback when OnApps is called for the non // mojom App type first, with the enabled flag. -TEST_P(AppRegistryCacheTest, +TEST_F(AppRegistryCacheTest, OnAppTypeInitializedWithEnableFlagNonMojomUpdateFirst) { - EnableOnAppTypeInitializedFlag(); - AppRegistryCache cache; InitializedObserver observer1(&cache); @@ -1081,10 +1023,8 @@ // Verify the OnAppTypeInitialized callback when OnApps is called for the mojom // App type first, with the enabled flag. -TEST_P(AppRegistryCacheTest, +TEST_F(AppRegistryCacheTest, OnAppTypeInitializedWithEnableFlagMojomUpdateFirst) { - EnableOnAppTypeInitializedFlag(); - AppRegistryCache cache; InitializedObserver observer1(&cache); @@ -1139,10 +1079,8 @@ // Verify the OnAppTypeInitialized callback when OnApps is called for multiple // App types, with the enabled flag. -TEST_P(AppRegistryCacheTest, +TEST_F(AppRegistryCacheTest, OnAppTypeInitializedWithEnableFlagMultipleAppTypes) { - EnableOnAppTypeInitializedFlag(); - AppRegistryCache cache; InitializedObserver observer1(&cache); @@ -1210,9 +1148,7 @@ // Verify the OnAppTypeInitialized callback when OnApps is called for empty apps // vector, with the enabled flag. -TEST_P(AppRegistryCacheTest, OnAppTypeInitializedWithEnableFlagEmptyUpdate) { - EnableOnAppTypeInitializedFlag(); - +TEST_F(AppRegistryCacheTest, OnAppTypeInitializedWithEnableFlagEmptyUpdate) { AppRegistryCache cache; InitializedObserver observer1(&cache); @@ -1292,9 +1228,4 @@ EXPECT_EQ(0, observer2.app_count_at_initialization()); } -INSTANTIATE_TEST_SUITE_P( - All, - AppRegistryCacheTest, - testing::Bool() /* IsOnAppUpdateWithoutMojomEnabled */); - } // namespace apps
diff --git a/components/services/app_service/public/cpp/app_update_mojom_unittest.cc b/components/services/app_service/public/cpp/app_update_mojom_unittest.cc deleted file mode 100644 index cba1250d..0000000 --- a/components/services/app_service/public/cpp/app_update_mojom_unittest.cc +++ /dev/null
@@ -1,1191 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/test/scoped_feature_list.h" -#include "base/time/time.h" -#include "components/services/app_service/public/cpp/app_types.h" -#include "components/services/app_service/public/cpp/app_update.h" -#include "components/services/app_service/public/cpp/features.h" -#include "components/services/app_service/public/cpp/icon_types.h" -#include "components/services/app_service/public/cpp/intent_filter.h" -#include "components/services/app_service/public/cpp/intent_filter_util.h" -#include "components/services/app_service/public/cpp/permission.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { -const apps::mojom::AppType app_type = apps::mojom::AppType::kArc; -const char app_id[] = "abcdefgh"; -const char test_name_0[] = "Inigo Montoya"; -const char test_name_1[] = "Dread Pirate Roberts"; -} // namespace - -class AppUpdateMojomTest : public testing::Test { - protected: - AppUpdateMojomTest() { - scoped_feature_list_.InitAndDisableFeature( - apps::kAppServiceOnAppUpdateWithoutMojom); - } - - apps::Readiness expect_readiness_; - apps::Readiness expect_prior_readiness_; - bool expect_readiness_changed_; - - std::string expect_name_; - bool expect_name_changed_; - - std::string expect_short_name_; - bool expect_short_name_changed_; - - std::string expect_publisher_id_; - bool expect_publisher_id_changed_; - - std::string expect_description_; - bool expect_description_changed_; - - std::string expect_version_; - bool expect_version_changed_; - - std::vector<std::string> expect_additional_search_terms_; - bool expect_additional_search_terms_changed_; - - absl::optional<apps::IconKey> expect_icon_key_; - bool expect_icon_key_changed_; - - base::Time expect_last_launch_time_; - bool expect_last_launch_time_changed_; - - base::Time expect_install_time_; - bool expect_install_time_changed_; - - apps::Permissions expect_permissions_; - bool expect_permissions_changed_; - - apps::InstallReason expect_install_reason_; - bool expect_install_reason_changed_; - - apps::InstallSource expect_install_source_; - bool expect_install_source_changed_; - - std::string expect_policy_id_; - bool expect_policy_id_changed_; - - absl::optional<bool> expect_is_platform_app_; - bool expect_is_platform_app_changed_; - - absl::optional<bool> expect_recommendable_; - bool expect_recommendable_changed_; - - absl::optional<bool> expect_searchable_; - bool expect_searchable_changed_; - - absl::optional<bool> expect_show_in_launcher_; - bool expect_show_in_launcher_changed_; - - absl::optional<bool> expect_show_in_shelf_; - bool expect_show_in_shelf_changed_; - - absl::optional<bool> expect_show_in_search_; - bool expect_show_in_search_changed_; - - absl::optional<bool> expect_show_in_management_; - bool expect_show_in_management_changed_; - - absl::optional<bool> expect_handles_intents_; - bool expect_handles_intents_changed_; - - absl::optional<bool> expect_allow_uninstall_; - bool expect_allow_uninstall_changed_; - - absl::optional<bool> expect_has_badge_; - bool expect_has_badge_changed_; - - absl::optional<bool> expect_paused_; - bool expect_paused_changed_; - - std::vector<apps::IntentFilterPtr> expect_intent_filters_; - bool expect_intent_filters_changed_; - - absl::optional<bool> expect_resize_locked_; - bool expect_resize_locked_changed_; - - apps::WindowMode expect_window_mode_; - bool expect_window_mode_changed_; - - absl::optional<apps::RunOnOsLogin> expect_run_on_os_login_; - bool expect_run_on_os_login_changed_; - - AccountId account_id_ = AccountId::FromUserEmail("test@gmail.com"); - - apps::mojom::PermissionPtr MakePermission( - apps::mojom::PermissionType permission_type, - apps::mojom::TriState value) { - apps::mojom::PermissionPtr permission = apps::mojom::Permission::New(); - permission->permission_type = permission_type; - permission->value = apps::mojom::PermissionValue::NewTristateValue(value); - return permission; - } - - void ExpectNoChange() { - expect_readiness_changed_ = false; - expect_name_changed_ = false; - expect_short_name_changed_ = false; - expect_publisher_id_changed_ = false; - expect_description_changed_ = false; - expect_version_changed_ = false; - expect_additional_search_terms_changed_ = false; - expect_icon_key_changed_ = false; - expect_last_launch_time_changed_ = false; - expect_install_time_changed_ = false; - expect_permissions_changed_ = false; - expect_install_reason_changed_ = false; - expect_install_source_changed_ = false; - expect_policy_id_changed_ = false; - expect_is_platform_app_changed_ = false; - expect_recommendable_changed_ = false; - expect_searchable_changed_ = false; - expect_show_in_launcher_changed_ = false; - expect_show_in_shelf_changed_ = false; - expect_show_in_search_changed_ = false; - expect_show_in_management_changed_ = false; - expect_handles_intents_changed_ = false; - expect_allow_uninstall_changed_ = false; - expect_has_badge_changed_ = false; - expect_paused_changed_ = false; - expect_intent_filters_changed_ = false; - expect_resize_locked_changed_ = false; - expect_window_mode_changed_ = false; - expect_run_on_os_login_changed_ = false; - } - - void CheckExpects(const apps::AppUpdate& u) { - EXPECT_EQ(expect_readiness_, u.Readiness()); - EXPECT_EQ(expect_prior_readiness_, u.PriorReadiness()); - EXPECT_EQ(expect_readiness_changed_, u.ReadinessChanged()); - - EXPECT_EQ(expect_name_, u.Name()); - EXPECT_EQ(expect_name_changed_, u.NameChanged()); - - EXPECT_EQ(expect_short_name_, u.ShortName()); - EXPECT_EQ(expect_short_name_changed_, u.ShortNameChanged()); - - EXPECT_EQ(expect_publisher_id_, u.PublisherId()); - EXPECT_EQ(expect_publisher_id_changed_, u.PublisherIdChanged()); - - EXPECT_EQ(expect_description_, u.Description()); - EXPECT_EQ(expect_description_changed_, u.DescriptionChanged()); - - EXPECT_EQ(expect_version_, u.Version()); - EXPECT_EQ(expect_version_changed_, u.VersionChanged()); - - EXPECT_EQ(expect_additional_search_terms_, u.AdditionalSearchTerms()); - EXPECT_EQ(expect_additional_search_terms_changed_, - u.AdditionalSearchTermsChanged()); - - EXPECT_EQ(expect_icon_key_, u.IconKey()); - EXPECT_EQ(expect_icon_key_changed_, u.IconKeyChanged()); - - EXPECT_EQ(expect_last_launch_time_, u.LastLaunchTime()); - EXPECT_EQ(expect_last_launch_time_changed_, u.LastLaunchTimeChanged()); - - EXPECT_EQ(expect_install_time_, u.InstallTime()); - EXPECT_EQ(expect_install_time_changed_, u.InstallTimeChanged()); - - EXPECT_TRUE(IsEqual(expect_permissions_, u.Permissions())); - EXPECT_EQ(expect_permissions_changed_, u.PermissionsChanged()); - - EXPECT_EQ(expect_install_reason_, u.InstallReason()); - EXPECT_EQ(expect_install_reason_changed_, u.InstallReasonChanged()); - - EXPECT_EQ(expect_install_source_, u.InstallSource()); - EXPECT_EQ(expect_install_source_changed_, u.InstallSourceChanged()); - - EXPECT_EQ(expect_policy_id_, u.PolicyId()); - EXPECT_EQ(expect_policy_id_changed_, u.PolicyIdChanged()); - - EXPECT_EQ(expect_is_platform_app_, u.IsPlatformApp()); - EXPECT_EQ(expect_is_platform_app_changed_, u.IsPlatformAppChanged()); - - EXPECT_EQ(expect_recommendable_, u.Recommendable()); - EXPECT_EQ(expect_recommendable_changed_, u.RecommendableChanged()); - - EXPECT_EQ(expect_searchable_, u.Searchable()); - EXPECT_EQ(expect_searchable_changed_, u.SearchableChanged()); - - EXPECT_EQ(expect_show_in_launcher_, u.ShowInLauncher()); - EXPECT_EQ(expect_show_in_launcher_changed_, u.ShowInLauncherChanged()); - - EXPECT_EQ(expect_show_in_shelf_, u.ShowInShelf()); - EXPECT_EQ(expect_show_in_shelf_changed_, u.ShowInShelfChanged()); - - EXPECT_EQ(expect_show_in_search_, u.ShowInSearch()); - EXPECT_EQ(expect_show_in_search_changed_, u.ShowInSearchChanged()); - - EXPECT_EQ(expect_show_in_management_, u.ShowInManagement()); - EXPECT_EQ(expect_show_in_management_changed_, u.ShowInManagementChanged()); - - EXPECT_EQ(expect_handles_intents_, u.HandlesIntents()); - EXPECT_EQ(expect_handles_intents_changed_, u.HandlesIntentsChanged()); - - EXPECT_EQ(expect_allow_uninstall_, u.AllowUninstall()); - EXPECT_EQ(expect_allow_uninstall_changed_, u.AllowUninstallChanged()); - - EXPECT_EQ(expect_has_badge_, u.HasBadge()); - EXPECT_EQ(expect_has_badge_changed_, u.HasBadgeChanged()); - - EXPECT_EQ(expect_paused_, u.Paused()); - EXPECT_EQ(expect_paused_changed_, u.PausedChanged()); - - EXPECT_TRUE(IsEqual(expect_intent_filters_, u.IntentFilters())); - EXPECT_EQ(expect_intent_filters_changed_, u.IntentFiltersChanged()); - - EXPECT_EQ(expect_resize_locked_, u.ResizeLocked()); - EXPECT_EQ(expect_resize_locked_changed_, u.ResizeLockedChanged()); - - EXPECT_EQ(expect_window_mode_, u.WindowMode()); - EXPECT_EQ(expect_window_mode_changed_, u.WindowModeChanged()); - - EXPECT_EQ(expect_run_on_os_login_, u.RunOnOsLogin()); - EXPECT_EQ(expect_run_on_os_login_changed_, u.RunOnOsLoginChanged()); - - EXPECT_EQ(account_id_, u.AccountId()); - } - - void TestAppUpdate(apps::mojom::App* state, apps::mojom::App* delta) { - apps::AppUpdate u(state, delta, account_id_); - - EXPECT_EQ(app_type, apps::ConvertAppTypeToMojomAppType(u.AppType())); - EXPECT_EQ(app_id, u.AppId()); - EXPECT_EQ(state == nullptr, u.StateIsNull()); - - expect_readiness_ = apps::Readiness::kUnknown; - expect_prior_readiness_ = apps::Readiness::kUnknown; - expect_name_ = ""; - expect_short_name_ = ""; - expect_publisher_id_ = ""; - expect_description_ = ""; - expect_version_ = ""; - expect_additional_search_terms_.clear(); - expect_icon_key_ = absl::nullopt; - expect_last_launch_time_ = base::Time(); - expect_install_time_ = base::Time(); - expect_permissions_.clear(); - expect_install_reason_ = apps::InstallReason::kUnknown; - expect_install_source_ = apps::InstallSource::kUnknown; - expect_policy_id_ = ""; - expect_is_platform_app_ = absl::nullopt; - expect_recommendable_ = absl::nullopt; - expect_searchable_ = absl::nullopt; - expect_show_in_launcher_ = absl::nullopt; - expect_show_in_shelf_ = absl::nullopt; - expect_show_in_search_ = absl::nullopt; - expect_show_in_management_ = absl::nullopt; - expect_handles_intents_ = absl::nullopt; - expect_allow_uninstall_ = absl::nullopt; - expect_has_badge_ = absl::nullopt; - expect_paused_ = absl::nullopt; - expect_intent_filters_.clear(); - expect_resize_locked_ = absl::nullopt; - expect_window_mode_ = apps::WindowMode::kUnknown; - expect_run_on_os_login_ = absl::nullopt; - ExpectNoChange(); - CheckExpects(u); - - if (delta) { - delta->name = test_name_0; - expect_name_ = test_name_0; - expect_name_changed_ = true; - CheckExpects(u); - } - - if (state) { - state->name = test_name_0; - expect_name_ = test_name_0; - expect_name_changed_ = false; - CheckExpects(u); - } - - if (delta) { - delta->readiness = apps::mojom::Readiness::kReady; - expect_readiness_ = apps::Readiness::kReady; - expect_readiness_changed_ = true; - CheckExpects(u); - - delta->name = absl::nullopt; - expect_name_ = state ? test_name_0 : ""; - expect_name_changed_ = false; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - expect_prior_readiness_ = - apps::ConvertMojomReadinessToReadiness(state->readiness); - ExpectNoChange(); - CheckExpects(u); - } - - if (delta) { - delta->readiness = apps::mojom::Readiness::kDisabledByPolicy; - expect_readiness_ = apps::Readiness::kDisabledByPolicy; - expect_readiness_changed_ = true; - delta->name = test_name_1; - expect_name_ = test_name_1; - expect_name_changed_ = true; - CheckExpects(u); - } - - // ShortName tests. - - if (state) { - state->short_name = "Kate"; - expect_short_name_ = "Kate"; - expect_short_name_changed_ = false; - CheckExpects(u); - } - - if (delta) { - delta->short_name = "Bob"; - expect_short_name_ = "Bob"; - expect_short_name_changed_ = true; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - expect_prior_readiness_ = - apps::ConvertMojomReadinessToReadiness(state->readiness); - ExpectNoChange(); - CheckExpects(u); - } - - // PublisherId tests. - - if (state) { - state->publisher_id = "com.google.android.youtube"; - expect_publisher_id_ = "com.google.android.youtube"; - expect_publisher_id_changed_ = false; - CheckExpects(u); - } - - if (delta) { - delta->publisher_id = "com.android.youtube"; - expect_publisher_id_ = "com.android.youtube"; - expect_publisher_id_changed_ = true; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - ExpectNoChange(); - CheckExpects(u); - } - - // Description tests. - - if (state) { - state->description = "Has a cat."; - expect_description_ = "Has a cat."; - expect_description_changed_ = false; - CheckExpects(u); - } - - if (delta) { - delta->description = "Has a dog."; - expect_description_ = "Has a dog."; - expect_description_changed_ = true; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - ExpectNoChange(); - CheckExpects(u); - } - - // Version tests. - - if (state) { - state->version = "1.0.0"; - expect_version_ = "1.0.0"; - expect_version_changed_ = false; - CheckExpects(u); - } - - if (delta) { - delta->version = "1.0.1"; - expect_version_ = "1.0.1"; - expect_version_changed_ = true; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - ExpectNoChange(); - CheckExpects(u); - } - - // AdditionalSearchTerms tests. - - if (state) { - state->additional_search_terms.push_back("cat"); - state->additional_search_terms.push_back("dog"); - expect_additional_search_terms_.push_back("cat"); - expect_additional_search_terms_.push_back("dog"); - expect_additional_search_terms_changed_ = false; - CheckExpects(u); - } - - if (delta) { - expect_additional_search_terms_.clear(); - delta->additional_search_terms.push_back("horse"); - delta->additional_search_terms.push_back("mouse"); - expect_additional_search_terms_.push_back("horse"); - expect_additional_search_terms_.push_back("mouse"); - expect_additional_search_terms_changed_ = true; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - ExpectNoChange(); - CheckExpects(u); - } - - // IconKey tests. - - if (state) { - auto x = apps::mojom::IconKey::New(100, 0, 0); - state->icon_key = x.Clone(); - expect_icon_key_ = std::move(*apps::ConvertMojomIconKeyToIconKey(x)); - expect_icon_key_changed_ = false; - CheckExpects(u); - } - - if (delta) { - auto x = apps::mojom::IconKey::New(200, 0, 0); - delta->icon_key = x.Clone(); - expect_icon_key_ = std::move(*apps::ConvertMojomIconKeyToIconKey(x)); - expect_icon_key_changed_ = true; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - ExpectNoChange(); - CheckExpects(u); - } - - // LastLaunchTime tests. - - if (state) { - state->last_launch_time = base::Time::FromDoubleT(1000.0); - expect_last_launch_time_ = base::Time::FromDoubleT(1000.0); - expect_last_launch_time_changed_ = false; - CheckExpects(u); - } - - if (delta) { - delta->last_launch_time = base::Time::FromDoubleT(1001.0); - expect_last_launch_time_ = base::Time::FromDoubleT(1001.0); - expect_last_launch_time_changed_ = true; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - ExpectNoChange(); - CheckExpects(u); - } - - // InstallTime tests. - - if (state) { - state->install_time = base::Time::FromDoubleT(2000.0); - expect_install_time_ = base::Time::FromDoubleT(2000.0); - expect_install_time_changed_ = false; - CheckExpects(u); - } - - if (delta) { - delta->install_time = base::Time::FromDoubleT(2001.0); - expect_install_time_ = base::Time::FromDoubleT(2001.0); - expect_install_time_changed_ = true; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - ExpectNoChange(); - CheckExpects(u); - } - - // InstallReason tests. - if (state) { - state->install_reason = apps::mojom::InstallReason::kUser; - expect_install_reason_ = apps::InstallReason::kUser; - expect_install_reason_changed_ = false; - CheckExpects(u); - } - - if (delta) { - delta->install_reason = apps::mojom::InstallReason::kPolicy; - expect_install_reason_ = apps::InstallReason::kPolicy; - expect_install_reason_changed_ = true; - CheckExpects(u); - } - - // PolicyId tests. - if (state) { - state->policy_id = "https://app.site/alpha"; - expect_policy_id_ = "https://app.site/alpha"; - expect_policy_id_changed_ = false; - CheckExpects(u); - } - - if (delta) { - delta->policy_id = "https://app.site/delta"; - expect_policy_id_ = "https://app.site/delta"; - expect_policy_id_changed_ = true; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - ExpectNoChange(); - CheckExpects(u); - } - - // InstallSource tests. - if (state) { - state->install_source = apps::mojom::InstallSource::kPlayStore; - expect_install_source_ = apps::InstallSource::kPlayStore; - expect_install_source_changed_ = false; - CheckExpects(u); - } - - if (delta) { - delta->install_source = apps::mojom::InstallSource::kSync; - expect_install_source_ = apps::InstallSource::kSync; - expect_install_source_changed_ = true; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - ExpectNoChange(); - CheckExpects(u); - } - - // IsPlatformApp tests. - - if (state) { - state->is_platform_app = apps::mojom::OptionalBool::kFalse; - expect_is_platform_app_ = false; - expect_is_platform_app_changed_ = false; - CheckExpects(u); - } - - if (delta) { - delta->is_platform_app = apps::mojom::OptionalBool::kTrue; - expect_is_platform_app_ = true; - expect_is_platform_app_changed_ = true; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - ExpectNoChange(); - CheckExpects(u); - } - - // Recommendable tests. - - if (state) { - state->recommendable = apps::mojom::OptionalBool::kFalse; - expect_recommendable_ = false; - expect_recommendable_changed_ = false; - CheckExpects(u); - } - - if (delta) { - delta->recommendable = apps::mojom::OptionalBool::kTrue; - expect_recommendable_ = true; - expect_recommendable_changed_ = true; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - ExpectNoChange(); - CheckExpects(u); - } - - // Searchable tests. - - if (state) { - state->searchable = apps::mojom::OptionalBool::kFalse; - expect_searchable_ = false; - expect_searchable_changed_ = false; - CheckExpects(u); - } - - if (delta) { - delta->searchable = apps::mojom::OptionalBool::kTrue; - expect_searchable_ = true; - expect_searchable_changed_ = true; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - ExpectNoChange(); - CheckExpects(u); - } - - // ShowInLauncher tests. - - if (state) { - state->show_in_launcher = apps::mojom::OptionalBool::kFalse; - expect_show_in_launcher_ = false; - expect_show_in_launcher_changed_ = false; - CheckExpects(u); - } - - if (delta) { - delta->show_in_launcher = apps::mojom::OptionalBool::kTrue; - expect_show_in_launcher_ = true; - expect_show_in_launcher_changed_ = true; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - ExpectNoChange(); - CheckExpects(u); - } - - // ShowInShelf tests. - - if (state) { - state->show_in_shelf = apps::mojom::OptionalBool::kFalse; - expect_show_in_shelf_ = false; - expect_show_in_shelf_changed_ = false; - CheckExpects(u); - } - - if (delta) { - delta->show_in_shelf = apps::mojom::OptionalBool::kTrue; - expect_show_in_shelf_ = true; - expect_show_in_shelf_changed_ = true; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - ExpectNoChange(); - CheckExpects(u); - } - - // ShowInSearch tests. - - if (state) { - state->show_in_search = apps::mojom::OptionalBool::kFalse; - expect_show_in_search_ = false; - expect_show_in_search_changed_ = false; - CheckExpects(u); - } - - if (delta) { - delta->show_in_search = apps::mojom::OptionalBool::kTrue; - expect_show_in_search_ = true; - expect_show_in_search_changed_ = true; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - ExpectNoChange(); - CheckExpects(u); - } - - // ShowInManagement tests. - - if (state) { - state->show_in_management = apps::mojom::OptionalBool::kFalse; - expect_show_in_management_ = false; - expect_show_in_management_changed_ = false; - CheckExpects(u); - } - - if (delta) { - delta->show_in_management = apps::mojom::OptionalBool::kTrue; - expect_show_in_management_ = true; - expect_show_in_management_changed_ = true; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - ExpectNoChange(); - CheckExpects(u); - } - - // HandlesIntents tests. - - if (state) { - state->handles_intents = apps::mojom::OptionalBool::kFalse; - expect_handles_intents_ = false; - expect_handles_intents_changed_ = false; - CheckExpects(u); - } - - if (delta) { - delta->handles_intents = apps::mojom::OptionalBool::kTrue; - expect_handles_intents_ = true; - expect_handles_intents_changed_ = true; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - ExpectNoChange(); - CheckExpects(u); - } - - // AllowUninstall tests - - if (state) { - state->allow_uninstall = apps::mojom::OptionalBool::kFalse; - expect_allow_uninstall_ = false; - expect_allow_uninstall_changed_ = false; - CheckExpects(u); - } - - if (delta) { - delta->allow_uninstall = apps::mojom::OptionalBool::kTrue; - expect_allow_uninstall_ = true; - expect_allow_uninstall_changed_ = true; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - ExpectNoChange(); - CheckExpects(u); - } - - // HasBadge tests. - - if (state) { - state->has_badge = apps::mojom::OptionalBool::kFalse; - expect_has_badge_ = false; - expect_has_badge_changed_ = false; - CheckExpects(u); - } - - if (delta) { - delta->has_badge = apps::mojom::OptionalBool::kTrue; - expect_has_badge_ = true; - expect_has_badge_changed_ = true; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - ExpectNoChange(); - CheckExpects(u); - } - - // Pause tests. - - if (state) { - state->paused = apps::mojom::OptionalBool::kFalse; - expect_paused_ = false; - expect_paused_changed_ = false; - CheckExpects(u); - } - - if (delta) { - delta->paused = apps::mojom::OptionalBool::kTrue; - expect_paused_ = true; - expect_paused_changed_ = true; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - ExpectNoChange(); - CheckExpects(u); - } - - // Permission tests. - - if (state) { - auto p0 = MakePermission(apps::mojom::PermissionType::kLocation, - apps::mojom::TriState::kAllow); - auto p1 = MakePermission(apps::mojom::PermissionType::kNotifications, - apps::mojom::TriState::kAllow); - state->permissions.push_back(p0.Clone()); - state->permissions.push_back(p1.Clone()); - expect_permissions_.push_back( - apps::ConvertMojomPermissionToPermission(p0)); - expect_permissions_.push_back( - apps::ConvertMojomPermissionToPermission(p1)); - expect_permissions_changed_ = false; - CheckExpects(u); - } - - if (delta) { - expect_permissions_.clear(); - auto p0 = MakePermission(apps::mojom::PermissionType::kNotifications, - apps::mojom::TriState::kAllow); - auto p1 = MakePermission(apps::mojom::PermissionType::kLocation, - apps::mojom::TriState::kBlock); - - delta->permissions.push_back(p0.Clone()); - delta->permissions.push_back(p1.Clone()); - expect_permissions_.push_back( - apps::ConvertMojomPermissionToPermission(p0)); - expect_permissions_.push_back( - apps::ConvertMojomPermissionToPermission(p1)); - expect_permissions_changed_ = true; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - ExpectNoChange(); - CheckExpects(u); - } - - // Intent Filter tests. - - if (state) { - auto intent_filter = apps::mojom::IntentFilter::New(); - - std::vector<apps::mojom::ConditionValuePtr> scheme_condition_values; - scheme_condition_values.push_back(apps_util::MakeConditionValue( - "https", apps::mojom::PatternMatchType::kNone)); - auto scheme_condition = - apps_util::MakeCondition(apps::mojom::ConditionType::kScheme, - std::move(scheme_condition_values)); - - std::vector<apps::mojom::ConditionValuePtr> host_condition_values; - host_condition_values.push_back(apps_util::MakeConditionValue( - "www.google.com", apps::mojom::PatternMatchType::kNone)); - auto host_condition = apps_util::MakeCondition( - apps::mojom::ConditionType::kHost, std::move(host_condition_values)); - - intent_filter->conditions.push_back(std::move(scheme_condition)); - intent_filter->conditions.push_back(std::move(host_condition)); - - state->intent_filters.push_back(intent_filter.Clone()); - expect_intent_filters_.push_back( - apps::ConvertMojomIntentFilterToIntentFilter(intent_filter)); - expect_intent_filters_changed_ = false; - CheckExpects(u); - } - - if (delta) { - expect_intent_filters_.clear(); - - auto intent_filter = apps::mojom::IntentFilter::New(); - - std::vector<apps::mojom::ConditionValuePtr> scheme_condition_values; - scheme_condition_values.push_back(apps_util::MakeConditionValue( - "https", apps::mojom::PatternMatchType::kNone)); - auto scheme_condition = - apps_util::MakeCondition(apps::mojom::ConditionType::kScheme, - std::move(scheme_condition_values)); - intent_filter->conditions.push_back(scheme_condition.Clone()); - - std::vector<apps::mojom::ConditionValuePtr> host_condition_values; - host_condition_values.push_back(apps_util::MakeConditionValue( - "www.abc.com", apps::mojom::PatternMatchType::kNone)); - auto host_condition = apps_util::MakeCondition( - apps::mojom::ConditionType::kHost, std::move(host_condition_values)); - intent_filter->conditions.push_back(host_condition.Clone()); - - intent_filter->conditions.push_back(std::move(scheme_condition)); - intent_filter->conditions.push_back(std::move(host_condition)); - - delta->intent_filters.push_back(intent_filter.Clone()); - expect_intent_filters_.push_back( - apps::ConvertMojomIntentFilterToIntentFilter(intent_filter)); - expect_intent_filters_changed_ = true; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - ExpectNoChange(); - CheckExpects(u); - } - - // ResizeLocked tests. - - if (state) { - state->resize_locked = apps::mojom::OptionalBool::kFalse; - expect_resize_locked_ = false; - expect_resize_locked_changed_ = false; - CheckExpects(u); - } - - if (delta) { - delta->resize_locked = apps::mojom::OptionalBool::kTrue; - expect_resize_locked_ = true; - expect_resize_locked_changed_ = true; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - ExpectNoChange(); - CheckExpects(u); - } - - // WindowMode tests. - - if (state) { - state->window_mode = apps::mojom::WindowMode::kBrowser; - expect_window_mode_ = apps::WindowMode::kBrowser; - expect_window_mode_changed_ = false; - CheckExpects(u); - } - - if (delta) { - delta->window_mode = apps::mojom::WindowMode::kWindow; - expect_window_mode_ = apps::WindowMode::kWindow; - expect_window_mode_changed_ = true; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - ExpectNoChange(); - CheckExpects(u); - } - - // RunOnOsLogin tests. - - if (state) { - apps::RunOnOsLogin value(apps::RunOnOsLoginMode::kNotRun, false); - state->run_on_os_login = - apps::ConvertRunOnOsLoginToMojomRunOnOsLogin(value); - expect_run_on_os_login_ = std::move(value); - expect_run_on_os_login_changed_ = false; - CheckExpects(u); - } - - if (delta) { - apps::RunOnOsLogin value(apps::RunOnOsLoginMode::kWindowed, false); - delta->run_on_os_login = - apps::ConvertRunOnOsLoginToMojomRunOnOsLogin(value); - expect_run_on_os_login_ = std::move(value); - expect_run_on_os_login_changed_ = true; - CheckExpects(u); - } - - if (state) { - apps::AppUpdate::Merge(state, delta); - ExpectNoChange(); - CheckExpects(u); - } - } - - private: - base::test::ScopedFeatureList scoped_feature_list_; -}; - -TEST_F(AppUpdateMojomTest, StateIsNonNull) { - apps::mojom::AppPtr state = apps::mojom::App::New(); - state->app_type = app_type; - state->app_id = app_id; - - TestAppUpdate(state.get(), nullptr); -} - -TEST_F(AppUpdateMojomTest, DeltaIsNonNull) { - apps::mojom::AppPtr delta = apps::mojom::App::New(); - delta->app_type = app_type; - delta->app_id = app_id; - - TestAppUpdate(nullptr, delta.get()); -} - -TEST_F(AppUpdateMojomTest, BothAreNonNull) { - apps::mojom::AppPtr state = apps::mojom::App::New(); - state->app_type = app_type; - state->app_id = app_id; - - apps::mojom::AppPtr delta = apps::mojom::App::New(); - delta->app_type = app_type; - delta->app_id = app_id; - - TestAppUpdate(state.get(), delta.get()); -} - -TEST_F(AppUpdateMojomTest, AppConvert) { - apps::mojom::AppPtr input = apps::mojom::App::New(); - input->app_type = apps::mojom::AppType::kWeb; - input->app_id = "abcdefg"; - input->readiness = apps::mojom::Readiness::kReady; - input->name = "lacros test name"; - input->short_name = "lacros test name"; - input->publisher_id = "publisher_id"; - input->description = "description"; - input->version = "version"; - input->additional_search_terms = {"1", "2"}; - - auto icon_key = apps::mojom::IconKey::New(); - icon_key->timeline = 1; - icon_key->icon_effects = 2; - input->icon_key = std::move(icon_key); - - input->last_launch_time = base::Time() + base::Days(1); - input->install_time = base::Time() + base::Days(2); - - input->install_reason = apps::mojom::InstallReason::kUser; - input->policy_id = "https://app.site/alpha"; - input->is_platform_app = apps::mojom::OptionalBool::kFalse; - input->recommendable = apps::mojom::OptionalBool::kTrue; - input->searchable = apps::mojom::OptionalBool::kTrue; - input->paused = apps::mojom::OptionalBool::kFalse; - input->show_in_launcher = apps::mojom::OptionalBool::kTrue; - input->show_in_shelf = apps::mojom::OptionalBool::kTrue; - input->show_in_search = apps::mojom::OptionalBool::kTrue; - input->show_in_management = apps::mojom::OptionalBool::kTrue; - input->has_badge = apps::mojom::OptionalBool::kUnknown; - input->paused = apps::mojom::OptionalBool::kFalse; - - auto intent_filter = apps::mojom::IntentFilter::New(); - apps_util::AddSingleValueCondition( - apps::mojom::ConditionType::kScheme, "https", - apps::mojom::PatternMatchType::kNone, intent_filter); - intent_filter->activity_name = "activity_name"; - intent_filter->activity_label = "activity_label"; - input->intent_filters.push_back(std::move(intent_filter)); - - input->window_mode = apps::mojom::WindowMode::kWindow; - - auto permission = apps::mojom::Permission::New(); - permission->permission_type = apps::mojom::PermissionType::kCamera; - permission->value = apps::mojom::PermissionValue::NewBoolValue(true); - permission->is_managed = true; - input->permissions.push_back(std::move(permission)); - - input->allow_uninstall = apps::mojom::OptionalBool::kTrue; - input->handles_intents = apps::mojom::OptionalBool::kTrue; - - auto output = apps::ConvertMojomAppToApp(input); - - EXPECT_EQ(output->app_type, apps::AppType::kWeb); - EXPECT_EQ(output->app_id, "abcdefg"); - EXPECT_EQ(output->readiness, apps::Readiness::kReady); - EXPECT_EQ(output->name, "lacros test name"); - EXPECT_EQ(output->short_name, "lacros test name"); - EXPECT_EQ(output->publisher_id, "publisher_id"); - EXPECT_EQ(output->description, "description"); - EXPECT_EQ(output->version, "version"); - EXPECT_EQ(output->additional_search_terms, input->additional_search_terms); - - EXPECT_EQ(output->icon_key->timeline, 1U); - EXPECT_EQ(output->icon_key->icon_effects, 2U); - - EXPECT_EQ(output->last_launch_time, base::Time() + base::Days(1)); - EXPECT_EQ(output->install_time, base::Time() + base::Days(2)); - - EXPECT_EQ(output->install_reason, apps::InstallReason::kUser); - EXPECT_EQ(output->policy_id, "https://app.site/alpha"); - EXPECT_FALSE(output->is_platform_app.value()); - EXPECT_TRUE(output->recommendable.value()); - EXPECT_TRUE(output->searchable.value()); - EXPECT_FALSE(output->paused.value()); - EXPECT_TRUE(output->show_in_launcher.value()); - EXPECT_TRUE(output->show_in_shelf.value()); - EXPECT_TRUE(output->show_in_search.value()); - EXPECT_TRUE(output->show_in_management.value()); - EXPECT_FALSE(output->has_badge.has_value()); - EXPECT_FALSE(output->paused.value()); - - ASSERT_EQ(output->intent_filters.size(), 1U); - auto& filter = output->intent_filters[0]; - ASSERT_EQ(filter->conditions.size(), 1U); - auto& condition = filter->conditions[0]; - EXPECT_EQ(condition->condition_type, apps::ConditionType::kScheme); - ASSERT_EQ(condition->condition_values.size(), 1U); - EXPECT_EQ(condition->condition_values[0]->value, "https"); - EXPECT_EQ(condition->condition_values[0]->match_type, - apps::PatternMatchType::kNone); - EXPECT_EQ(filter->activity_name, "activity_name"); - EXPECT_EQ(filter->activity_label, "activity_label"); - - EXPECT_EQ(output->window_mode, apps::WindowMode::kWindow); - - ASSERT_EQ(output->permissions.size(), 1U); - auto& out_permission = output->permissions[0]; - EXPECT_EQ(out_permission->permission_type, apps::PermissionType::kCamera); - ASSERT_TRUE(out_permission->value->bool_value.has_value()); - EXPECT_TRUE(out_permission->value->bool_value.value()); - EXPECT_TRUE(out_permission->is_managed); - - EXPECT_TRUE(output->allow_uninstall.value()); - EXPECT_TRUE(output->handles_intents.value()); - - auto mojom_app = apps::ConvertAppToMojomApp(output); - - EXPECT_EQ(mojom_app->app_type, apps::mojom::AppType::kWeb); - EXPECT_EQ(mojom_app->app_id, "abcdefg"); - EXPECT_EQ(mojom_app->readiness, apps::mojom::Readiness::kReady); - EXPECT_EQ(mojom_app->name, "lacros test name"); - EXPECT_EQ(mojom_app->short_name, "lacros test name"); - EXPECT_EQ(mojom_app->publisher_id, "publisher_id"); - EXPECT_EQ(mojom_app->description, "description"); - EXPECT_EQ(mojom_app->version, "version"); - EXPECT_EQ(mojom_app->additional_search_terms, input->additional_search_terms); - - EXPECT_EQ(mojom_app->icon_key->timeline, 1U); - EXPECT_EQ(mojom_app->icon_key->icon_effects, 2U); - - EXPECT_EQ(mojom_app->last_launch_time, base::Time() + base::Days(1)); - EXPECT_EQ(mojom_app->install_time, base::Time() + base::Days(2)); - - EXPECT_EQ(mojom_app->install_reason, apps::mojom::InstallReason::kUser); - EXPECT_EQ(mojom_app->policy_id, "https://app.site/alpha"); - EXPECT_EQ(mojom_app->recommendable, apps::mojom::OptionalBool::kTrue); - EXPECT_EQ(mojom_app->searchable, apps::mojom::OptionalBool::kTrue); - EXPECT_EQ(mojom_app->paused, apps::mojom::OptionalBool::kFalse); - EXPECT_EQ(mojom_app->show_in_launcher, apps::mojom::OptionalBool::kTrue); - EXPECT_EQ(mojom_app->show_in_shelf, apps::mojom::OptionalBool::kTrue); - EXPECT_EQ(mojom_app->show_in_search, apps::mojom::OptionalBool::kTrue); - EXPECT_EQ(mojom_app->show_in_management, apps::mojom::OptionalBool::kTrue); - EXPECT_EQ(mojom_app->has_badge, apps::mojom::OptionalBool::kUnknown); - EXPECT_EQ(mojom_app->paused, apps::mojom::OptionalBool::kFalse); - - ASSERT_EQ(mojom_app->intent_filters.size(), 1U); - auto& mojom_filter = mojom_app->intent_filters[0]; - ASSERT_EQ(mojom_filter->conditions.size(), 1U); - auto& mojom_condition = mojom_filter->conditions[0]; - EXPECT_EQ(mojom_condition->condition_type, - apps::mojom::ConditionType::kScheme); - ASSERT_EQ(mojom_condition->condition_values.size(), 1U); - EXPECT_EQ(mojom_condition->condition_values[0]->value, "https"); - EXPECT_EQ(mojom_condition->condition_values[0]->match_type, - apps::mojom::PatternMatchType::kNone); - EXPECT_EQ(mojom_filter->activity_name, "activity_name"); - EXPECT_EQ(mojom_filter->activity_label, "activity_label"); - - EXPECT_EQ(mojom_app->window_mode, apps::mojom::WindowMode::kWindow); - - ASSERT_EQ(mojom_app->permissions.size(), 1U); - auto& mojom_permission = mojom_app->permissions[0]; - EXPECT_EQ(mojom_permission->permission_type, - apps::mojom::PermissionType::kCamera); - ASSERT_TRUE(mojom_permission->value->is_bool_value()); - EXPECT_TRUE(mojom_permission->value->get_bool_value()); - EXPECT_TRUE(mojom_permission->is_managed); - - EXPECT_EQ(mojom_app->allow_uninstall, apps::mojom::OptionalBool::kTrue); - EXPECT_EQ(mojom_app->handles_intents, apps::mojom::OptionalBool::kTrue); -}
diff --git a/components/services/app_service/public/cpp/app_update_unittest.cc b/components/services/app_service/public/cpp/app_update_unittest.cc index 92be8d2..18e4b865 100644 --- a/components/services/app_service/public/cpp/app_update_unittest.cc +++ b/components/services/app_service/public/cpp/app_update_unittest.cc
@@ -4,10 +4,8 @@ #include "components/services/app_service/public/cpp/app_update.h" -#include "base/test/scoped_feature_list.h" #include "base/time/time.h" #include "components/services/app_service/public/cpp/app_update.h" -#include "components/services/app_service/public/cpp/features.h" #include "components/services/app_service/public/cpp/intent_filter.h" #include "components/services/app_service/public/cpp/permission.h" #include "components/services/app_service/public/cpp/run_on_os_login_types.h" @@ -41,11 +39,6 @@ class AppUpdateTest : public testing::Test { protected: - AppUpdateTest() { - scoped_feature_list_.InitAndEnableFeature( - kAppServiceOnAppUpdateWithoutMojom); - } - Readiness expect_readiness_; Readiness expect_prior_readiness_; bool expect_readiness_changed_; @@ -1135,9 +1128,6 @@ CheckExpects(u); } } - - private: - base::test::ScopedFeatureList scoped_feature_list_; }; TEST_F(AppUpdateTest, StateIsNonNull) {
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index e070399..65dc923 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -2729,6 +2729,7 @@ <translation id="8508648098325802031">সার্চ আইকন</translation> <translation id="8511402995811232419">কুকি ম্যানেজ করুন</translation> <translation id="851353418319061866">আরও উন্নত করার জন্য দেওয়া পরামর্শ যাচাই করা</translation> +<translation id="8513580896341796021">ডাউনলোড শুরু হয়েছে। এটি দেখার জন্য, |<ph name="ACCELERATOR" />| প্রেস করুন।</translation> <translation id="8519753333133776369">আপনার অ্যাডমিনিস্ট্রেটর HID ডিভাইস ব্যবহারের অনুমতি দিয়েছেন</translation> <translation id="8522552481199248698">পাসওয়ার্ড পরিবর্তন করে আপনার Google অ্যাকাউন্ট সুরক্ষিত রাখতে Chrome সাহায্য করতে পারবে।</translation> <translation id="8530813470445476232">Chrome সেটিংস থেকে আপনার ব্রাউজিং ইতিহাস, কুকি, ক্যাশে ও আরও অনেক কিছু মুছুন</translation>
diff --git a/components/strings/components_strings_bs.xtb b/components/strings/components_strings_bs.xtb index e2b9215..dca6a50 100644 --- a/components/strings/components_strings_bs.xtb +++ b/components/strings/components_strings_bs.xtb
@@ -2729,6 +2729,7 @@ <translation id="8508648098325802031">Ikona pretraživanja</translation> <translation id="8511402995811232419">Upravljajte kolačićima</translation> <translation id="851353418319061866">Provjera tačnosti</translation> +<translation id="8513580896341796021">Preuzimanje je započeto Da ga vidite, pritisnite |<ph name="ACCELERATOR" />|.</translation> <translation id="8519753333133776369">HID uređaj koji je dozvolio vaš administrator</translation> <translation id="8522552481199248698">Chrome vam može pomoći da zaštitite svoj Google račun i promijenite lozinku.</translation> <translation id="8530813470445476232">Izbrišite historiju pregledanja, kolačiće, keš memoriju i drugo u postavkama Chromea</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index e355f6f9..0bbc15eb 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -1465,6 +1465,7 @@ <translation id="4969341057194253438">Suprimeix la gravació</translation> <translation id="4973922308112707173">Encunyació doble a la part superior</translation> <translation id="4976702386844183910">Darrera visita: <ph name="DATE" /></translation> +<translation id="498323057460789381">Error de validació de l'esquema: <ph name="ERROR" /></translation> <translation id="4984088539114770594">Vols utilitzar el micròfon?</translation> <translation id="4984339528288761049">Prc5 (sobre)</translation> <translation id="4989163558385430922">Mostra-ho tot</translation>
diff --git a/components/strings/components_strings_cy.xtb b/components/strings/components_strings_cy.xtb index 8d17d49..be14145 100644 --- a/components/strings/components_strings_cy.xtb +++ b/components/strings/components_strings_cy.xtb
@@ -1465,6 +1465,7 @@ <translation id="4969341057194253438">Dileu'r recordiad</translation> <translation id="4973922308112707173">Dau dwll ar y brig</translation> <translation id="4976702386844183910">Ymwelwyd ddiwethaf <ph name="DATE" /></translation> +<translation id="498323057460789381">Gwall dilysu sgema: <ph name="ERROR" /></translation> <translation id="4984088539114770594">Defnyddio'r meicroffon?</translation> <translation id="4984339528288761049">Prc5 (Amlen)</translation> <translation id="4989163558385430922">Gweld popeth</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb index c28cbed..266be4a 100644 --- a/components/strings/components_strings_es-419.xtb +++ b/components/strings/components_strings_es-419.xtb
@@ -1466,6 +1466,7 @@ <translation id="4969341057194253438">Borrar grabación</translation> <translation id="4973922308112707173">Perforación doble en la parte superior</translation> <translation id="4976702386844183910">Última visita: <ph name="DATE" /></translation> +<translation id="498323057460789381">Error de validación del esquema: <ph name="ERROR" /></translation> <translation id="4984088539114770594">¿Permitir el uso del micrófono?</translation> <translation id="4984339528288761049">Prc5 (Envelope)</translation> <translation id="4989163558385430922">Ver todo</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index e907cc96..853c377a 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -1465,6 +1465,7 @@ <translation id="4969341057194253438">حذف ویدیوی ضبطشده</translation> <translation id="4973922308112707173">دو سوراخ در بالا</translation> <translation id="4976702386844183910">آخرین بازدید: <ph name="DATE" /></translation> +<translation id="498323057460789381">خطا در اعتبارسنجی طرح: <ph name="ERROR" /></translation> <translation id="4984088539114770594">از میکروفون استفاده شود؟</translation> <translation id="4984339528288761049">Prc5 (Envelope)</translation> <translation id="4989163558385430922">دیدن همه</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb index 8e9b415..b21f54f 100644 --- a/components/strings/components_strings_fil.xtb +++ b/components/strings/components_strings_fil.xtb
@@ -2258,6 +2258,7 @@ <translation id="7238585580608191973">SHA-256 Fingerprint</translation> <translation id="7240120331469437312">Kahaliling Pangalan ng Paksa ng Certificate</translation> <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation> +<translation id="7244465398154211886">{NUM_MATCHES,plural, =1{# tugma}one{# tugma}other{# na tugma}}</translation> <translation id="724691107663265825">Naglalaman ng malware ang site</translation> <translation id="724975217298816891">Ilagay ang petsa ng expiration at CVC para sa <ph name="CREDIT_CARD" /> upang i-update ang mga detalye ng iyong card. Kapag nagkumpirma ka na, ibabahagi ang mga detalye ng iyong card sa site na ito.</translation> <translation id="7251437084390964440">Hindi sumusunod ang configuration ng network sa pamantayan ng ONC. Hindi maaaring i-import ang mga bahagi ng configuration. @@ -2729,6 +2730,7 @@ <translation id="8508648098325802031">Icon ng paghahanap</translation> <translation id="8511402995811232419">Pamahalaan ang cookies</translation> <translation id="851353418319061866">Pagsusuri sa Katumpakan</translation> +<translation id="8513580896341796021">Nagsimula na ang pag-download. Para makita ito, pindutin ang |<ph name="ACCELERATOR" />|.</translation> <translation id="8519753333133776369">HID device na pinapayagan ng iyong administrator</translation> <translation id="8522552481199248698">Matutulungan ka ng Chrome na protektahan ang iyong Google Account at palitan ang password mo.</translation> <translation id="8530813470445476232">I-clear ang iyong history ng pag-browse, cookies, cache, at higit pa sa mga setting ng Chrome</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb index 9d37ba8..28b83d42 100644 --- a/components/strings/components_strings_hr.xtb +++ b/components/strings/components_strings_hr.xtb
@@ -2728,6 +2728,7 @@ <translation id="8508648098325802031">Ikona pretraživanja</translation> <translation id="8511402995811232419">Upravljajte kolačićima</translation> <translation id="851353418319061866">Provjera točnosti</translation> +<translation id="8513580896341796021">Preuzimanje je započelo. Da biste je vidjeli, pritisnite |<ph name="ACCELERATOR" />|.</translation> <translation id="8519753333133776369">HID uređaj koji dopušta vaš administrator</translation> <translation id="8522552481199248698">Chrome vam može pomoći da zaštitite svoj Google račun i promijenite zaporku.</translation> <translation id="8530813470445476232">Izbrišite povijest pregledavanja, kolačiće, predmemoriju i još mnogo toga u postavkama Chromea</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index b12ae86..a20888d 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -1464,6 +1464,7 @@ <translation id="4969341057194253438">Hapus rekaman</translation> <translation id="4973922308112707173">Dua lubang di atas</translation> <translation id="4976702386844183910">Terakhir dibuka <ph name="DATE" /></translation> +<translation id="498323057460789381">Error validasi skema: <ph name="ERROR" /></translation> <translation id="4984088539114770594">Gunakan mikrofon?</translation> <translation id="4984339528288761049">Prc5 (Envelope)</translation> <translation id="4989163558385430922">Lihat semua</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb index ac72b12..5e1a032 100644 --- a/components/strings/components_strings_ja.xtb +++ b/components/strings/components_strings_ja.xtb
@@ -1465,6 +1465,7 @@ <translation id="4969341057194253438">録画を削除</translation> <translation id="4973922308112707173">2 穴パンチ(上)</translation> <translation id="4976702386844183910">最終アクセス日: <ph name="DATE" /></translation> +<translation id="498323057460789381">スキーマ検証エラー: <ph name="ERROR" /></translation> <translation id="4984088539114770594">マイクを使用しますか?</translation> <translation id="4984339528288761049">Prc5(封筒)</translation> <translation id="4989163558385430922">すべて表示</translation>
diff --git a/components/strings/components_strings_ka.xtb b/components/strings/components_strings_ka.xtb index 0ea8a01..d3c3861 100644 --- a/components/strings/components_strings_ka.xtb +++ b/components/strings/components_strings_ka.xtb
@@ -2258,6 +2258,7 @@ <translation id="7238585580608191973">SHA-256 თითის ანაბეჭდი</translation> <translation id="7240120331469437312">სერტიფიკატის თემის ალტერნატიული სახელი</translation> <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation> +<translation id="7244465398154211886">{NUM_MATCHES,plural, =1{# დამთხვევა}other{# დამთხვევა}}</translation> <translation id="724691107663265825">საიტი მოიცავს საზიანო პროგრამებს</translation> <translation id="724975217298816891">თქვენი ბარათის დეტალების გასაახლებლად, შეიყვანეთ <ph name="CREDIT_CARD" />-ის მოქმედების ვადა და CVC. დადასტურების შემდეგ, თქვენი ბარათის დეტალები ამ საიტთან გაზიარდება.</translation> <translation id="7251437084390964440">ქსელის კონფიგურაცია არ შეესაბამება ONC სტანდარტს. კონფიგურაციის ნაწილის იმპორტი შეიძლება ვერ მოხერხდეს. @@ -2729,6 +2730,7 @@ <translation id="8508648098325802031">ძიების ხატულა</translation> <translation id="8511402995811232419">ქუქი-ჩანაწერების მართვა</translation> <translation id="851353418319061866">სიზუსტის შემოწმება</translation> +<translation id="8513580896341796021">ჩამოტვირთვა დაიწყო. მის სანახავად დააჭირეთ |<ph name="ACCELERATOR" />|-ს.</translation> <translation id="8519753333133776369">HID მოწყობილობა დაშვებულია თქვენი ადმინისტრატორის მიერ</translation> <translation id="8522552481199248698">Chrome-ს შეუძლია დაგეხმაროთ თქვენი Google ანგარიშის დაცვაში და პაროლის შეცვლაში.</translation> <translation id="8530813470445476232">გაასუფთავეთ დათვალიერების ისტორია, ქუქი-ჩანაწერები, ქეში და სხვა კონტენტი Chrome-ის პარამეტრებიდან</translation>
diff --git a/components/strings/components_strings_km.xtb b/components/strings/components_strings_km.xtb index 57853ae4..dae6435 100644 --- a/components/strings/components_strings_km.xtb +++ b/components/strings/components_strings_km.xtb
@@ -1469,6 +1469,7 @@ <translation id="4969341057194253438">លុបការថត</translation> <translation id="4973922308112707173">ចោះពីររន្ធខាងលើ</translation> <translation id="4976702386844183910">បានចូលមើលលើកចុងក្រោយនៅថ្ងៃទី <ph name="DATE" /></translation> +<translation id="498323057460789381">បញ្ហាផ្ទៀងផ្ទាត់គ្រោងតាង៖ <ph name="ERROR" /></translation> <translation id="4984088539114770594">ប្រើមីក្រូហ្វូនឬ?</translation> <translation id="4984339528288761049">Prc5 (ស្រោមសំបុត្រ)</translation> <translation id="4989163558385430922">មើលទាំងអស់</translation> @@ -2734,6 +2735,7 @@ <translation id="8508648098325802031">រូបស្វែងរក</translation> <translation id="8511402995811232419">គ្រប់គ្រងខូគី</translation> <translation id="851353418319061866">ការពិនិត្យមើលភាពត្រឹមត្រូវ</translation> +<translation id="8513580896341796021">បានចាប់ផ្ដើមការទាញយក។ ដើម្បីឃើញការទាញយក សូមចុច |<ph name="ACCELERATOR" />|។</translation> <translation id="8519753333133776369">ឧបករណ៍ HID ត្រូវបានអនុញ្ញាតដោយអ្នកគ្រប់គ្រងរបស់អ្នក</translation> <translation id="8522552481199248698">Chrome អាចជួយអ្នកក្នុងការការពារគណនី Google និងផ្លាស់ប្ដូរពាក្យសម្ងាត់របស់អ្នក។</translation> <translation id="8530813470445476232">សម្អាតប្រវត្តិរុករកតាមអ៊ីនធឺណិត ខូគី ឃ្លាំងផ្ទុកទិន្នន័យរបស់អ្នក និងអ្វីៗជាច្រើនទៀតនៅក្នុងការកំណត់ Chrome</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb index 4a4e567..a6480097 100644 --- a/components/strings/components_strings_ko.xtb +++ b/components/strings/components_strings_ko.xtb
@@ -1465,6 +1465,7 @@ <translation id="4969341057194253438">녹음 파일 삭제</translation> <translation id="4973922308112707173">상단 2공 펀칭</translation> <translation id="4976702386844183910">최근 방문: <ph name="DATE" /></translation> +<translation id="498323057460789381">스키마 유효성 검사 오류: <ph name="ERROR" /></translation> <translation id="4984088539114770594">마이크를 사용하시겠습니까?</translation> <translation id="4984339528288761049">Prc5(봉투)</translation> <translation id="4989163558385430922">모두 보기</translation> @@ -2727,6 +2728,7 @@ <translation id="8508648098325802031">검색 아이콘</translation> <translation id="8511402995811232419">쿠키 관리</translation> <translation id="851353418319061866">정확성 검사</translation> +<translation id="8513580896341796021">다운로드가 시작되었습니다. 확인하려면 |<ph name="ACCELERATOR" />| 키를 누르세요.</translation> <translation id="8519753333133776369">관리자가 허용한 HID 기기</translation> <translation id="8522552481199248698">Chrome을 통해 Google 계정을 보호하고 비밀번호를 변경할 수 있습니다.</translation> <translation id="8530813470445476232">Chrome 설정에서 방문 기록, 쿠키, 캐시 등을 삭제하세요.</translation>
diff --git a/components/strings/components_strings_lo.xtb b/components/strings/components_strings_lo.xtb index 68da074..1fcd760b 100644 --- a/components/strings/components_strings_lo.xtb +++ b/components/strings/components_strings_lo.xtb
@@ -1465,6 +1465,7 @@ <translation id="4969341057194253438">ລຶບການບັນທຶກອອກ</translation> <translation id="4973922308112707173">ເຈາະຮູຢູ່ເທິງສຸດສອງຮູ</translation> <translation id="4976702386844183910">ເຂົ້າເບິ່ງຫຼ້າສຸດ <ph name="DATE" /></translation> +<translation id="498323057460789381">ການກວດສອບຮູບແບບຜິດພາດ: <ph name="ERROR" /></translation> <translation id="4984088539114770594">ໃຊ້ໄມໂຄຣໂຟນບໍ?</translation> <translation id="4984339528288761049">Prc5 (ຊອງຈົດໝາຍ)</translation> <translation id="4989163558385430922">ເບິ່ງທັງໝົດ</translation>
diff --git a/components/strings/components_strings_mk.xtb b/components/strings/components_strings_mk.xtb index 2579f10c..5ebff2e2 100644 --- a/components/strings/components_strings_mk.xtb +++ b/components/strings/components_strings_mk.xtb
@@ -2258,6 +2258,7 @@ <translation id="7238585580608191973">SHA-256 отпечаток од прст</translation> <translation id="7240120331469437312">Алтернативно име на предмет на сертификат</translation> <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation> +<translation id="7244465398154211886">{NUM_MATCHES,plural, =1{# совпаѓање}one{# совпаѓање}other{# совпаѓања}}</translation> <translation id="724691107663265825">Локацијата пред вас содржи злонамерен софтвер</translation> <translation id="724975217298816891">Внесете го рокот на важење и CVC за <ph name="CREDIT_CARD" /> за да ги ажурирате деталите за картичката. Откако ќе потврдите, деталите за вашата картичка ќе се споделат со сајтот.</translation> <translation id="7251437084390964440">Конфигурацијата на мрежата не е во согласност со стандардот ONC. Можно е делови од конфигурацијата да не се увезат. @@ -2729,6 +2730,7 @@ <translation id="8508648098325802031">Икона за пребарување</translation> <translation id="8511402995811232419">Управувај со колачињата</translation> <translation id="851353418319061866">Проверка на точноста</translation> +<translation id="8513580896341796021">Преземањето започна. За да го видите, притиснете |<ph name="ACCELERATOR" />|.</translation> <translation id="8519753333133776369">HID-уред дозволен од вашиот администратор</translation> <translation id="8522552481199248698">Chrome може да ви помогне да ја заштитите сметката на Google и да ја промените лозинката.</translation> <translation id="8530813470445476232">Избришете ја историјата на прелистување, колачињата, кешот и друго во поставките за Chrome</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index fb5688c..bc7aa32 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -1464,6 +1464,7 @@ <translation id="4969341057194253438">റെക്കോർഡിംഗ് ഇല്ലാതാക്കുക</translation> <translation id="4973922308112707173">മുകളിൽ ഇരട്ട പഞ്ച് ചെയ്യുക</translation> <translation id="4976702386844183910">അവസാനം സന്ദർശിച്ചത് <ph name="DATE" />-ന് ആണ്</translation> +<translation id="498323057460789381">സ്കീമ മൂല്യനിർണ്ണയ പിശക്: <ph name="ERROR" /></translation> <translation id="4984088539114770594">മൈക്രോഫോൺ ഉപയോഗിക്കണോ?</translation> <translation id="4984339528288761049">Prc5 (എൻവലപ്പ്)</translation> <translation id="4989163558385430922">എല്ലാം കാണുക</translation>
diff --git a/components/strings/components_strings_mn.xtb b/components/strings/components_strings_mn.xtb index 0072748..813c8e1 100644 --- a/components/strings/components_strings_mn.xtb +++ b/components/strings/components_strings_mn.xtb
@@ -2258,6 +2258,7 @@ <translation id="7238585580608191973">SHA-256 Хурууны хээ</translation> <translation id="7240120331469437312">Гэрчилгээний субъектийн хувилбар нэр</translation> <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation> +<translation id="7244465398154211886">{NUM_MATCHES,plural, =1{# тохирол}other{# тохирол}}</translation> <translation id="724691107663265825">Энэхүү сайт вирус агуулж байна.</translation> <translation id="724975217298816891">Картынхаа дэлгэрэнгүй мэдээллийг шинэчлэхийн тулд <ph name="CREDIT_CARD" />-н дуусах огноо, карт баталгаажуулалтын кодыг оруулна уу. Баталгаажуулсны дараагаар таны картын дэлгэрэнгүйг энэ сайтад хуваалцах болно.</translation> <translation id="7251437084390964440">Сүлжээний тохируулга ONC-н стандартад нийцэхгүй байна. Тохируулгын зарим хэсгийг импортлохгүй байж болзошгүй.
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb index 7bc4317e..4defee23 100644 --- a/components/strings/components_strings_ms.xtb +++ b/components/strings/components_strings_ms.xtb
@@ -2259,6 +2259,7 @@ <translation id="7238585580608191973">Cap jari SHA-256</translation> <translation id="7240120331469437312">Nama Alternatif Subjek Sijil</translation> <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation> +<translation id="7244465398154211886">{NUM_MATCHES,plural, =1{# padanan}other{# padanan}}</translation> <translation id="724691107663265825">Tapak di hadapan mengandungi perisian hasad</translation> <translation id="724975217298816891">Masukkan tarikh tamat tempoh dan CVC untuk <ph name="CREDIT_CARD" /> bagi mengemas kini butiran kad anda. Setelah anda mengesahkan, butiran kad anda akan dikongsi dengan tapak ini.</translation> <translation id="7251437084390964440">Konfigurasi rangkaian tidak mematuhi standard ONC. Sebahagian konfigurasi tidak boleh diimport.
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index 9b9c171..af9747d 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -2258,6 +2258,7 @@ <translation id="7238585580608191973">SHA-256-fingeravtrykk</translation> <translation id="7240120331469437312">Alternativt navn på sertifikatemne</translation> <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation> +<translation id="7244465398154211886">{NUM_MATCHES,plural, =1{# treff}other{# treff}}</translation> <translation id="724691107663265825">Nettstedet du er på vei til, inneholder skadelig programvare</translation> <translation id="724975217298816891">Skriv inn utløpsdatoen og verifiseringskoden for <ph name="CREDIT_CARD" /> for å oppdatere kortinformasjonen din. Når du bekrefter, deles denne informasjonen med dette nettstedet.</translation> <translation id="7251437084390964440">Nettverkskonfigurasjonen overholder ikke ONC-standarden. Deler av konfigurasjonen kan muligens ikke importeres. Mer informasjon:
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb index 44023801..557031e 100644 --- a/components/strings/components_strings_ro.xtb +++ b/components/strings/components_strings_ro.xtb
@@ -2258,6 +2258,7 @@ <translation id="7238585580608191973">Amprentă digitală SHA-256</translation> <translation id="7240120331469437312">Nume alternativ subiect certificat</translation> <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation> +<translation id="7244465398154211886">{NUM_MATCHES,plural, =1{# potrivire}few{# potriviri}other{# de potriviri}}</translation> <translation id="724691107663265825">Site-ul pe care urmează să îl accesezi conține programe malware</translation> <translation id="724975217298816891">Introdu data de expirare și codul CVC pentru <ph name="CREDIT_CARD" />, pentru a actualiza detaliile cardului. După ce confirmi, acest site va avea acces la detaliile cardului tău.</translation> <translation id="7251437084390964440">Configurația rețelei nu respectă standardul ONC. Este posibil ca anumite părți ale configurației să nu fie importate.
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index efe21a1e..e216c4f 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -2724,6 +2724,7 @@ <translation id="8508648098325802031">Ikona vyhľadávania</translation> <translation id="8511402995811232419">Spravovať súbory cookie</translation> <translation id="851353418319061866">Kontrola presnosti</translation> +<translation id="8513580896341796021">Súbor sa začal sťahovať. Ak ho chcete zobraziť, stlačte |<ph name="ACCELERATOR" />|.</translation> <translation id="8519753333133776369">Zariadenie HID povolené vaším správcom</translation> <translation id="8522552481199248698">Chrome vám pomôže ochrániť účet Google a zmeniť heslo.</translation> <translation id="8530813470445476232">Vymazať svoju históriu prehliadania, súbory cookie, vyrovnávaciu pamäť a ďalšie položky v nastaveniach Chromu</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index 94bf3de..9e24617e 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -1465,6 +1465,7 @@ <translation id="4969341057194253438">Izbriši posnetek</translation> <translation id="4973922308112707173">Dvojno luknjanje zgoraj</translation> <translation id="4976702386844183910">Nazadnje obiskano: <ph name="DATE" /></translation> +<translation id="498323057460789381">Napaka pri preverjanju sheme: <ph name="ERROR" /></translation> <translation id="4984088539114770594">Želite uporabiti mikrofon?</translation> <translation id="4984339528288761049">Prc5 (Envelope)</translation> <translation id="4989163558385430922">Pokaži vse</translation>
diff --git a/components/strings/components_strings_sr-Latn.xtb b/components/strings/components_strings_sr-Latn.xtb index 86cc4308..d22eb27 100644 --- a/components/strings/components_strings_sr-Latn.xtb +++ b/components/strings/components_strings_sr-Latn.xtb
@@ -2728,6 +2728,7 @@ <translation id="8508648098325802031">Ikona Pretraga</translation> <translation id="8511402995811232419">Upravljajte kolačićima</translation> <translation id="851353418319061866">Provera tačnosti</translation> +<translation id="8513580896341796021">Preuzimanje je počelo. Da biste ga videli, pritisnite |<ph name="ACCELERATOR" />|.</translation> <translation id="8519753333133776369">Administrator je dozvolio HID uređaj</translation> <translation id="8522552481199248698">Chrome može da vam pomogne da zaštitite Google nalog i promenite lozinku.</translation> <translation id="8530813470445476232">Obrišite istoriju pregledanja, kolačiće, keš i drugo u podešavanjima Chrome-a</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index 847d1ff9..c5b1f033 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -2728,6 +2728,7 @@ <translation id="8508648098325802031">Икона Претрага</translation> <translation id="8511402995811232419">Управљајте колачићима</translation> <translation id="851353418319061866">Провера тачности</translation> +<translation id="8513580896341796021">Преузимање је почело. Да бисте га видели, притисните |<ph name="ACCELERATOR" />|.</translation> <translation id="8519753333133776369">Администратор је дозволио HID уређај</translation> <translation id="8522552481199248698">Chrome може да вам помогне да заштитите Google налог и промените лозинку.</translation> <translation id="8530813470445476232">Обришите историју прегледања, колачиће, кеш и друго у подешавањима Chrome-а</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb index a768bdf..f26fb7e 100644 --- a/components/strings/components_strings_sw.xtb +++ b/components/strings/components_strings_sw.xtb
@@ -1465,6 +1465,7 @@ <translation id="4969341057194253438">Futa rekodi</translation> <translation id="4973922308112707173">Toboa juu mara mbili</translation> <translation id="4976702386844183910">Ilitembelewa mara ya mwisho <ph name="DATE" /></translation> +<translation id="498323057460789381">Hitilafu ya uthibitishaji wa taratibu: <ph name="ERROR" /></translation> <translation id="4984088539114770594">Ungependa kutumia maikrofoni?</translation> <translation id="4984339528288761049">Prc5 (Bahasha)</translation> <translation id="4989163558385430922">Angalia vyote</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index dafc4e59..fa61c1db 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -2257,6 +2257,7 @@ <translation id="7238585580608191973">ลายนิ้วมือ SHA-256</translation> <translation id="7240120331469437312">ชื่อสำรองของหัวเรื่องใบรับรอง</translation> <translation id="7243010569062352439"><ph name="PASSWORDS" /> <ph name="SIGNIN_DATA" /></translation> +<translation id="7244465398154211886">{NUM_MATCHES,plural, =1{ตรงกัน # รายการ}other{ตรงกัน # รายการ}}</translation> <translation id="724691107663265825">ไซต์ที่จะเปิดมีมัลแวร์</translation> <translation id="724975217298816891">ป้อนวันหมดอายุและ CVC สำหรับ <ph name="CREDIT_CARD" /> เพื่ออัปเดตรายละเอียดของบัตร เมื่อคุณยืนยันแล้ว รายละเอียดบัตรของคุณจะแชร์กับเว็บไซต์นี้</translation> <translation id="7251437084390964440">การกำหนดค่าเครือข่ายไม่เป็นไปตามมาตรฐาน ONC ระบบอาจไม่นำเข้าการกำหนดค่าบางส่วน @@ -2728,6 +2729,7 @@ <translation id="8508648098325802031">ไอคอนค้นหา</translation> <translation id="8511402995811232419">จัดการคุกกี้</translation> <translation id="851353418319061866">การตรวจสอบความถูกต้อง</translation> +<translation id="8513580896341796021">เริ่มดาวน์โหลดแล้ว หากต้องการดู ให้กด |<ph name="ACCELERATOR" />|</translation> <translation id="8519753333133776369">อุปกรณ์ HID นี้ได้รับอนุญาตจากผู้ดูแลระบบ</translation> <translation id="8522552481199248698">Chrome ช่วยคุณปกป้องบัญชี Google และเปลี่ยนรหัสผ่านได้</translation> <translation id="8530813470445476232">ล้างประวัติการท่องเว็บ คุกกี้ แคช และอื่นๆ ในการตั้งค่า Chrome</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb index 75c077e..47e689d 100644 --- a/components/strings/components_strings_uk.xtb +++ b/components/strings/components_strings_uk.xtb
@@ -1465,6 +1465,7 @@ <translation id="4969341057194253438">Видалити запис</translation> <translation id="4973922308112707173">Пробити два отвори вгорі</translation> <translation id="4976702386844183910">Останнє відвідування: <ph name="DATE" /></translation> +<translation id="498323057460789381">Помилка перевірки схеми: <ph name="ERROR" /></translation> <translation id="4984088539114770594">Використовувати мікрофон?</translation> <translation id="4984339528288761049">Prc5 (конверт)</translation> <translation id="4989163558385430922">Показати все</translation>
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb index 2b8683b..a8ea8d9 100644 --- a/components/strings/components_strings_zh-HK.xtb +++ b/components/strings/components_strings_zh-HK.xtb
@@ -1464,6 +1464,7 @@ <translation id="4969341057194253438">刪除錄影</translation> <translation id="4973922308112707173">雙孔 (頂端)</translation> <translation id="4976702386844183910">上次瀏覽日期:<ph name="DATE" /></translation> +<translation id="498323057460789381">結構定義驗證錯誤:<ph name="ERROR" /></translation> <translation id="4984088539114770594">要使用麥克風嗎?</translation> <translation id="4984339528288761049">Prc5 (信封)</translation> <translation id="4989163558385430922">查看全部</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb index 4936620a..9332af6 100644 --- a/components/strings/components_strings_zh-TW.xtb +++ b/components/strings/components_strings_zh-TW.xtb
@@ -1465,6 +1465,7 @@ <translation id="4969341057194253438">刪除錄製內容</translation> <translation id="4973922308112707173">雙孔 (頂端)</translation> <translation id="4976702386844183910">上次造訪日期:<ph name="DATE" /></translation> +<translation id="498323057460789381">結構定義驗證錯誤:<ph name="ERROR" /></translation> <translation id="4984088539114770594">要使用麥克風嗎?</translation> <translation id="4984339528288761049">Prc5 (信封)</translation> <translation id="4989163558385430922">查看全部</translation>
diff --git a/components/sync/base/sync_prefs.cc b/components/sync/base/sync_prefs.cc index 5666234..d2d4e170 100644 --- a/components/sync/base/sync_prefs.cc +++ b/components/sync/base/sync_prefs.cc
@@ -263,7 +263,7 @@ } #endif // BUILDFLAG(IS_CHROMEOS_LACROS) -bool SyncPrefs::IsManaged() const { +bool SyncPrefs::IsSyncClientDisabledByPolicy() const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); return pref_service_->GetBoolean(prefs::kSyncManaged); } @@ -333,11 +333,6 @@ observer.OnSyncRequestedPrefChange(*pref_sync_requested_); } -void SyncPrefs::SetManagedForTest(bool is_managed) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - pref_service_->SetBoolean(prefs::kSyncManaged, is_managed); -} - // static void SyncPrefs::RegisterTypeSelectedPref(PrefRegistrySimple* registry, UserSelectableType type) {
diff --git a/components/sync/base/sync_prefs.h b/components/sync/base/sync_prefs.h index fe53c5c..c5a6393 100644 --- a/components/sync/base/sync_prefs.h +++ b/components/sync/base/sync_prefs.h
@@ -101,17 +101,12 @@ void SetAppsSyncEnabledByOs(bool apps_sync_enabled); #endif - // Whether Sync is forced off by enterprise policy. Note that this only covers - // one out of two types of policy, "browser" policy. The second kind, "cloud" - // policy, is handled directly in SyncServiceImpl. - bool IsManaged() const; + // Whether Sync is disabled on the client for all profiles and accounts. + bool IsSyncClientDisabledByPolicy() const; // Maps |type| to its corresponding preference name. static const char* GetPrefNameForType(UserSelectableType type); - // For testing. - void SetManagedForTest(bool is_managed); - // Gets the local sync backend enabled state. bool IsLocalSyncEnabled() const;
diff --git a/components/sync/base/sync_prefs_unittest.cc b/components/sync/base/sync_prefs_unittest.cc index a8e3fb9..f168851e 100644 --- a/components/sync/base/sync_prefs_unittest.cc +++ b/components/sync/base/sync_prefs_unittest.cc
@@ -68,16 +68,16 @@ EXPECT_CALL(mock_sync_pref_observer, OnSyncRequestedPrefChange(true)); EXPECT_CALL(mock_sync_pref_observer, OnSyncRequestedPrefChange(false)); - ASSERT_FALSE(sync_prefs_->IsManaged()); + ASSERT_FALSE(sync_prefs_->IsSyncClientDisabledByPolicy()); ASSERT_FALSE(sync_prefs_->IsFirstSetupComplete()); ASSERT_FALSE(sync_prefs_->IsSyncRequested()); sync_prefs_->AddSyncPrefObserver(&mock_sync_pref_observer); - sync_prefs_->SetManagedForTest(true); - EXPECT_TRUE(sync_prefs_->IsManaged()); - sync_prefs_->SetManagedForTest(false); - EXPECT_FALSE(sync_prefs_->IsManaged()); + pref_service_.SetBoolean(prefs::kSyncManaged, true); + EXPECT_TRUE(sync_prefs_->IsSyncClientDisabledByPolicy()); + pref_service_.SetBoolean(prefs::kSyncManaged, false); + EXPECT_FALSE(sync_prefs_->IsSyncClientDisabledByPolicy()); sync_prefs_->SetFirstSetupComplete(); EXPECT_TRUE(sync_prefs_->IsFirstSetupComplete());
diff --git a/components/sync/driver/resources/sync_node_browser.css b/components/sync/driver/resources/sync_node_browser.css index 65e545a3..3bdc6dc 100644 --- a/components/sync/driver/resources/sync_node_browser.css +++ b/components/sync/driver/resources/sync_node_browser.css
@@ -56,6 +56,7 @@ #node-details { flex-grow: 1; + overflow: auto; } #node-details td {
diff --git a/components/sync/driver/sync_service_impl.cc b/components/sync/driver/sync_service_impl.cc index 5e878a4..1dda54d 100644 --- a/components/sync/driver/sync_service_impl.cc +++ b/components/sync/driver/sync_service_impl.cc
@@ -591,7 +591,7 @@ // If local sync is enabled, most disable reasons don't apply. if (!IsLocalSyncEnabled()) { - if (sync_prefs_.IsManaged() || sync_disabled_by_admin_) { + if (sync_prefs_.IsSyncClientDisabledByPolicy() || sync_disabled_by_admin_) { result.Put(DISABLE_REASON_ENTERPRISE_POLICY); } if (!IsSignedIn()) {
diff --git a/components/sync/driver/sync_service_impl_startup_unittest.cc b/components/sync/driver/sync_service_impl_startup_unittest.cc index fb6fb659..f10101ff 100644 --- a/components/sync/driver/sync_service_impl_startup_unittest.cc +++ b/components/sync/driver/sync_service_impl_startup_unittest.cc
@@ -508,7 +508,7 @@ TEST_F(SyncServiceImplStartupTest, ManagedStartup) { // Sync was previously enabled, but a policy was set while Chrome wasn't // running. - sync_prefs()->SetManagedForTest(true); + pref_service()->SetBoolean(prefs::kSyncManaged, true); sync_prefs()->SetSyncRequested(true); sync_prefs()->SetFirstSetupComplete(); @@ -548,7 +548,7 @@ ASSERT_EQ(0, get_controller(BOOKMARKS)->model()->clear_metadata_call_count()); // The service should stop when switching to managed mode. - sync_prefs()->SetManagedForTest(true); + pref_service()->SetBoolean(prefs::kSyncManaged, true); // Give re-startup a chance to happen (it shouldn't!). base::RunLoop().RunUntilIdle(); // Sync was disabled due to the policy, setting SyncRequested to false and @@ -567,7 +567,7 @@ // When switching back to unmanaged, Sync-the-transport should start up // automatically, which causes (re)creation of SyncEngine and // DataTypeManager. - sync_prefs()->SetManagedForTest(false); + pref_service()->SetBoolean(prefs::kSyncManaged, false); base::RunLoop().RunUntilIdle(); ASSERT_EQ(
diff --git a/components/webrtc_logging/BUILD.gn b/components/webrtc_logging/BUILD.gn index 5b9d983..7b179842 100644 --- a/components/webrtc_logging/BUILD.gn +++ b/components/webrtc_logging/BUILD.gn
@@ -9,7 +9,6 @@ deps = [ "//base", - "//base/test:test_support", "//testing/gmock", "//testing/gtest", "//third_party/webrtc_overrides:webrtc_component",
diff --git a/components/webrtc_logging/logging_unittest.cc b/components/webrtc_logging/logging_unittest.cc index d5e6bc9..2085eae9 100644 --- a/components/webrtc_logging/logging_unittest.cc +++ b/components/webrtc_logging/logging_unittest.cc
@@ -13,7 +13,6 @@ #include "base/command_line.h" #include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" -#include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/webrtc_overrides/rtc_base/logging.h" @@ -164,26 +163,3 @@ EXPECT_TRUE(ContainsString(contents_of_file, AsString(rtc::LS_SENSITIVE))); #endif // BUILDFLAG(USE_RUNTIME_VLOG) } - -TEST_F(WebRtcTextLogTest, SuppressLogEverythingWithFlag) { - base::test::ScopedFeatureList scoped_feature(blink::kSuppressAllWebRtcLogs); - - // Verbosity at level 2 normally allows LS_SENSITIVE (as per above test), but - // the kSuppressAllWebRtcLogs flag should suppress them. - ASSERT_TRUE(Initialize(2)); - - RTC_LOG_V(rtc::LS_ERROR) << AsString(rtc::LS_ERROR); - RTC_LOG_V(rtc::LS_WARNING) << AsString(rtc::LS_WARNING); - RTC_LOG(LS_INFO) << AsString(rtc::LS_INFO); - RTC_LOG_V(rtc::LS_VERBOSE) << AsString(rtc::LS_VERBOSE); - RTC_LOG_V(rtc::LS_SENSITIVE) << AsString(rtc::LS_SENSITIVE); - - std::string contents_of_file; - base::ReadFileToString(log_file_path_, &contents_of_file); - - EXPECT_FALSE(ContainsString(contents_of_file, AsString(rtc::LS_ERROR))); - EXPECT_FALSE(ContainsString(contents_of_file, AsString(rtc::LS_WARNING))); - EXPECT_FALSE(ContainsString(contents_of_file, AsString(rtc::LS_INFO))); - EXPECT_FALSE(ContainsString(contents_of_file, AsString(rtc::LS_VERBOSE))); - EXPECT_FALSE(ContainsString(contents_of_file, AsString(rtc::LS_SENSITIVE))); -}
diff --git a/content/browser/devtools/protocol/page_handler.cc b/content/browser/devtools/protocol/page_handler.cc index 13d646ee..1d18955 100644 --- a/content/browser/devtools/protocol/page_handler.cc +++ b/content/browser/devtools/protocol/page_handler.cc
@@ -1424,6 +1424,8 @@ case PrerenderHost::FinalStatus::kEmbedderTriggeredAndSameOriginRedirected: return Page::PrerenderFinalStatusEnum:: EmbedderTriggeredAndSameOriginRedirected; + case PrerenderHost::FinalStatus::kFailToGetMemoryUsage: + return Page::PrerenderFinalStatusEnum::FailToGetMemoryUsage; case PrerenderHost::FinalStatus::kInProgressNavigation: return Page::PrerenderFinalStatusEnum::InProgressNavigation; case PrerenderHost::FinalStatus::kInvalidSchemeNavigation: @@ -1438,6 +1440,8 @@ return Page::PrerenderFinalStatusEnum::MainFrameNavigation; case PrerenderHost::FinalStatus::kMaxNumOfRunningPrerendersExceeded: return Page::PrerenderFinalStatusEnum::MaxNumOfRunningPrerendersExceeded; + case PrerenderHost::FinalStatus::kMemoryLimitExceeded: + return Page::PrerenderFinalStatusEnum::MemoryLimitExceeded; case PrerenderHost::FinalStatus::kMixedContent: return Page::PrerenderFinalStatusEnum::MixedContent; case PrerenderHost::FinalStatus::kMojoBinderPolicy:
diff --git a/content/browser/preloading/prerender/prerender_host.cc b/content/browser/preloading/prerender/prerender_host.cc index 23b9b769..c19c053f 100644 --- a/content/browser/preloading/prerender/prerender_host.cc +++ b/content/browser/preloading/prerender/prerender_host.cc
@@ -945,6 +945,8 @@ case FinalStatus::kTriggerBackgrounded: case FinalStatus::kEmbedderTriggeredAndSameOriginRedirected: case FinalStatus::kEmbedderTriggeredAndCrossOriginRedirected: + case FinalStatus::kMemoryLimitExceeded: + case FinalStatus::kFailToGetMemoryUsage: attempt_->SetFailureReason(ToPreloadingFailureReason(status)); return; }
diff --git a/content/browser/preloading/prerender/prerender_host.h b/content/browser/preloading/prerender/prerender_host.h index be2a221b..516639d 100644 --- a/content/browser/preloading/prerender/prerender_host.h +++ b/content/browser/preloading/prerender/prerender_host.h
@@ -92,7 +92,9 @@ kEmbedderTriggeredAndSameOriginRedirected = 33, kEmbedderTriggeredAndCrossOriginRedirected = 34, kEmbedderTriggeredAndDestroyed = 35, - kMaxValue = kEmbedderTriggeredAndDestroyed, + kMemoryLimitExceeded = 36, + kFailToGetMemoryUsage = 37, + kMaxValue = kFailToGetMemoryUsage, }; PrerenderHost(const PrerenderAttributes& attributes,
diff --git a/content/browser/preloading/prerender/prerender_internals_handler_impl.cc b/content/browser/preloading/prerender/prerender_internals_handler_impl.cc index 5f2fb2f..d3e5bdbd 100644 --- a/content/browser/preloading/prerender/prerender_internals_handler_impl.cc +++ b/content/browser/preloading/prerender/prerender_internals_handler_impl.cc
@@ -78,6 +78,10 @@ return "EmbedderTriggeredAndCrossOriginRedirected"; case PrerenderHost::FinalStatus::kEmbedderTriggeredAndDestroyed: return "EmbedderTriggeredAndDestroyed"; + case PrerenderHost::FinalStatus::kMemoryLimitExceeded: + return "MemoryLimitExceeded"; + case PrerenderHost::FinalStatus::kFailToGetMemoryUsage: + return "FailToGetMemoryUsage"; } NOTREACHED(); return "";
diff --git a/content/browser/service_worker/service_worker_container_host.cc b/content/browser/service_worker/service_worker_container_host.cc index 130d793f..8b98ceb 100644 --- a/content/browser/service_worker/service_worker_container_host.cc +++ b/content/browser/service_worker/service_worker_container_host.cc
@@ -743,11 +743,20 @@ return service_worker_object_hosts_[version_id]->AsWeakPtr(); } -void ServiceWorkerContainerHost::RemoveServiceWorkerObjectHost( +void ServiceWorkerContainerHost::RemoveServiceWorkerObjectHostOnConnectionError( int64_t version_id) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(base::Contains(service_worker_object_hosts_, version_id)); + // check if receivers are empty + { + auto& service_worker_object_host = service_worker_object_hosts_[version_id]; + // If there are still receivers, the object is still being used. + if (service_worker_object_host->has_receivers()) { + return; + } + } + // ServiceWorkerObjectHost to be deleted may have the last reference to // ServiceWorkerVersion that indirectly owns this ServiceWorkerContainerHost. // If we erase the object host directly from the map, |this| could be deleted
diff --git a/content/browser/service_worker/service_worker_container_host.h b/content/browser/service_worker/service_worker_container_host.h index 290de33..448d97ba 100644 --- a/content/browser/service_worker/service_worker_container_host.h +++ b/content/browser/service_worker/service_worker_container_host.h
@@ -240,7 +240,7 @@ scoped_refptr<ServiceWorkerVersion> version); // Removes the ServiceWorkerObjectHost corresponding to |version_id|. - void RemoveServiceWorkerObjectHost(int64_t version_id); + void RemoveServiceWorkerObjectHostOnConnectionError(int64_t version_id); // Returns true if this container host is for a service worker. bool IsContainerForServiceWorker() const;
diff --git a/content/browser/service_worker/service_worker_object_host.cc b/content/browser/service_worker/service_worker_object_host.cc index a60d8c8..81dde578 100644 --- a/content/browser/service_worker/service_worker_object_host.cc +++ b/content/browser/service_worker/service_worker_object_host.cc
@@ -205,7 +205,9 @@ DCHECK(context_->GetLiveRegistration(version_->registration_id())); version_->AddObserver(this); receivers_.set_disconnect_handler(base::BindRepeating( - &ServiceWorkerObjectHost::OnConnectionError, base::Unretained(this))); + &ServiceWorkerContainerHost:: + RemoveServiceWorkerObjectHostOnConnectionError, + base::Unretained(container_host), version_->version_id())); } ServiceWorkerObjectHost::~ServiceWorkerObjectHost() { @@ -312,12 +314,4 @@ } } -void ServiceWorkerObjectHost::OnConnectionError() { - // If there are still receivers, |this| is still being used. - if (!receivers_.empty()) - return; - // Will destroy |this|. - container_host_->RemoveServiceWorkerObjectHost(version_->version_id()); -} - } // namespace content
diff --git a/content/browser/service_worker/service_worker_object_host.h b/content/browser/service_worker/service_worker_object_host.h index e3c117c5..77e4bf8 100644 --- a/content/browser/service_worker/service_worker_object_host.h +++ b/content/browser/service_worker/service_worker_object_host.h
@@ -84,6 +84,8 @@ base::WeakPtr<ServiceWorkerObjectHost> AsWeakPtr(); + bool has_receivers() { return !receivers_.empty(); } + private: friend class service_worker_object_host_unittest::ServiceWorkerObjectHostTest; @@ -99,12 +101,10 @@ ::blink::TransferableMessage message, base::OnceCallback<void(blink::ServiceWorkerStatusCode)> callback); - void OnConnectionError(); - base::WeakPtr<ServiceWorkerContextCore> context_; // |container_host_| is valid throughout lifetime of |this| because it owns // |this|. - const raw_ptr<ServiceWorkerContainerHost, DanglingUntriaged> container_host_; + const raw_ptr<ServiceWorkerContainerHost> container_host_; // The origin of the |container_host_|. Note that this is const because once a // JavaScript ServiceWorker object is created for an execution context, we // don't expect that context to change origins and still hold on to the
diff --git a/content/browser/service_worker/service_worker_object_host_unittest.cc b/content/browser/service_worker/service_worker_object_host_unittest.cc index 7bfda43..570593e 100644 --- a/content/browser/service_worker/service_worker_object_host_unittest.cc +++ b/content/browser/service_worker/service_worker_object_host_unittest.cc
@@ -212,7 +212,7 @@ // Make sure that OnConnectionError induces destruction of the version and // the object host. object_host->receivers_.Clear(); - object_host->OnConnectionError(); + container_host->RemoveServiceWorkerObjectHostOnConnectionError(version_id); } void CallOnConnectionErrorForRegistrationObjectHost( @@ -226,7 +226,7 @@ EXPECT_FALSE(object_host->version_->HasOneRef()); object_host->receivers_.Clear(); - object_host->OnConnectionError(); + container_host->RemoveServiceWorkerObjectHostOnConnectionError(version_id); EXPECT_TRUE(registration_object_host->registration_->HasOneRef()); registration_object_host->receivers_.Clear();
diff --git a/content/test/data/attribution_reporting/interop/rate_limit_max_attribution_reporting_endpoints.json b/content/test/data/attribution_reporting/interop/rate_limit_max_attribution_reporting_endpoints.json index 67fe774..d7030c9 100644 --- a/content/test/data/attribution_reporting/interop/rate_limit_max_attribution_reporting_endpoints.json +++ b/content/test/data/attribution_reporting/interop/rate_limit_max_attribution_reporting_endpoints.json
@@ -17,7 +17,7 @@ "response": { "Attribution-Reporting-Register-Source": { "destination": "https://destination.test", - "source_event_id": "123" + "source_event_id": "111" } } }] @@ -34,7 +34,7 @@ "response": { "Attribution-Reporting-Register-Source": { "destination": "https://destination.test", - "source_event_id": "123" + "source_event_id": "222" } } }] @@ -51,7 +51,7 @@ "response": { "Attribution-Reporting-Register-Source": { "destination": "https://another-destination.test", - "source_event_id": "123" + "source_event_id": "333" } } }] @@ -68,7 +68,7 @@ "response": { "Attribution-Reporting-Register-Source": { "destination": "https://destination.test", - "source_event_id": "123" + "source_event_id": "444" } } }] @@ -178,7 +178,7 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024, - "source_event_id": "123", + "source_event_id": "111", "source_type": "navigation", "trigger_data": "7" }, @@ -189,7 +189,7 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024, - "source_event_id": "123", + "source_event_id": "222", "source_type": "navigation", "trigger_data": "6" }, @@ -200,7 +200,7 @@ "payload": { "attribution_destination": "https://another-destination.test", "randomized_trigger_rate": 0.0024, - "source_event_id": "123", + "source_event_id": "333", "source_type": "navigation", "trigger_data": "5" }, @@ -211,7 +211,7 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0000025, - "source_event_id": "123", + "source_event_id": "444", "source_type": "event", "trigger_data": "1" },
diff --git a/content/test/data/attribution_reporting/interop/rate_limit_max_source_registration_reporting_origin_endpoints.json b/content/test/data/attribution_reporting/interop/rate_limit_max_source_registration_reporting_origin_endpoints.json new file mode 100644 index 0000000..c301d1021 --- /dev/null +++ b/content/test/data/attribution_reporting/interop/rate_limit_max_source_registration_reporting_origin_endpoints.json
@@ -0,0 +1,240 @@ +{ + "description": "Max source registration reporting endpoints per rate limit window", + "api_config": { + "rate_limit_max_source_registration_reporting_origins": "1" + }, + "input": { + "sources": [ + { + "timestamp": "1643235573000", + "registration_request": { + "source_origin": "https://source1.test", + "attribution_src_url": "https://reporter1.test/register-source", + "source_type": "navigation" + }, + "responses": [{ + "url": "https://reporter1.test/register-source", + "response": { + "Attribution-Reporting-Register-Source": { + "destination": "https://destination1.test", + "source_event_id": "111" + } + } + }] + }, + { + "timestamp": "1643235574000", + "registration_request": { + "source_origin": "https://source2.test", + "attribution_src_url": "https://reporter2.test/register-source", + "source_type": "navigation" + }, + "responses": [{ + "url": "https://reporter2.test/register-source", + "response": { + "Attribution-Reporting-Register-Source": { + "destination": "https://destination1.test", + "source_event_id": "222" + } + } + }] + }, + { + "timestamp": "1643235575000", + "registration_request": { + "source_origin": "https://source1.test", + "attribution_src_url": "https://reporter2.test/register-source", + "source_type": "navigation" + }, + "responses": [{ + "url": "https://reporter2.test/register-source", + "response": { + "Attribution-Reporting-Register-Source": { + "destination": "https://destination2.test", + "source_event_id": "333" + } + } + }] + }, + { + "timestamp": "1643235576000", + "registration_request": { + "source_origin": "https://source1.test", + "attribution_src_url": "https://reporter3.test/register-source", + "source_type": "event" + }, + "responses": [{ + "url": "https://reporter3.test/register-source", + "response": { + "Attribution-Reporting-Register-Source": { + "destination": "https://destination1.test", + "source_event_id": "444" + } + } + }] + }, + { + "timestamp": "1645827573000", + "registration_request": { + "source_origin": "https://source1.test", + "attribution_src_url": "https://reporter3.test/register-source", + "source_type": "event" + }, + "responses": [{ + "url": "https://reporter3.test/register-source", + "response": { + "Attribution-Reporting-Register-Source": { + "destination": "https://destination1.test", + "source_event_id": "555" + } + } + }] + } + ], + "triggers": [ + { + "timestamp": "1643235583000", + "registration_request": { + "attribution_src_url": "https://reporter1.test/register-trigger", + "destination_origin": "https://destination1.test" + }, + "responses": [{ + "url": "https://reporter1.test/register-trigger", + "response": { + "Attribution-Reporting-Register-Trigger": { + "event_trigger_data": [ + { + "trigger_data": "7" + } + ] + } + } + }] + }, + { + "timestamp": "1643235584000", + "registration_request": { + "attribution_src_url": "https://reporter2.test/register-trigger", + "destination_origin": "https://destination1.test" + }, + "responses": [{ + "url": "https://reporter2.test/register-trigger", + "response": { + "Attribution-Reporting-Register-Trigger": { + "event_trigger_data": [ + { + "trigger_data": "6" + } + ] + } + } + }] + }, + { + "timestamp": "1643235585000", + "registration_request": { + "attribution_src_url": "https://reporter2.test/register-trigger", + "destination_origin": "https://destination2.test" + }, + "responses": [{ + "url": "https://reporter2.test/register-trigger", + "response": { + "Attribution-Reporting-Register-Trigger": { + "event_trigger_data": [ + { + "trigger_data": "5" + } + ] + } + } + }] + }, + { + "timestamp": "1643235585000", + "registration_request": { + "attribution_src_url": "https://reporter3.test/register-trigger", + "destination_origin": "https://destination1.test" + }, + "responses": [{ + "url": "https://reporter3.test/register-trigger", + "response": { + "Attribution-Reporting-Register-Trigger": { + "event_trigger_data": [ + { + "trigger_data": "4" + } + ] + } + } + }] + }, + { + "timestamp": "1645827574000", + "registration_request": { + "attribution_src_url": "https://reporter3.test/register-trigger", + "destination_origin": "https://destination1.test" + }, + "responses": [{ + "url": "https://reporter3.test/register-trigger", + "response": { + "Attribution-Reporting-Register-Trigger": { + "event_trigger_data": [ + { + "trigger_data": "3" + } + ] + } + } + }] + } + ] + }, + "output": { + "event_level_results": [ + { + "payload": { + "attribution_destination": "https://destination1.test", + "randomized_trigger_rate": 0.0024, + "source_event_id": "111", + "source_type": "navigation", + "trigger_data": "7" + }, + "report_url": "https://reporter1.test/.well-known/attribution-reporting/report-event-attribution", + "report_time": "1643408373000" + }, + { + "payload": { + "attribution_destination": "https://destination1.test", + "randomized_trigger_rate": 0.0024, + "source_event_id": "222", + "source_type": "navigation", + "trigger_data": "6" + }, + "report_url": "https://reporter2.test/.well-known/attribution-reporting/report-event-attribution", + "report_time": "1643408374000" + }, + { + "payload": { + "attribution_destination": "https://destination2.test", + "randomized_trigger_rate": 0.0024, + "source_event_id": "333", + "source_type": "navigation", + "trigger_data": "5" + }, + "report_url": "https://reporter2.test/.well-known/attribution-reporting/report-event-attribution", + "report_time": "1643408375000" + }, + { + "payload": { + "attribution_destination": "https://destination1.test", + "randomized_trigger_rate": 0.0000025, + "source_event_id": "555", + "source_type": "event", + "trigger_data": "1" + }, + "report_url": "https://reporter3.test/.well-known/attribution-reporting/report-event-attribution", + "report_time": "1648423173000" + } + ] + } +}
diff --git a/google_apis/gaia/google_service_auth_error.cc b/google_apis/gaia/google_service_auth_error.cc index 901826c..9c0e288 100644 --- a/google_apis/gaia/google_service_auth_error.cc +++ b/google_apis/gaia/google_service_auth_error.cc
@@ -82,6 +82,20 @@ } // static +GoogleServiceAuthError GoogleServiceAuthError::FromServiceUnavailable( + const std::string& error_message) { + return GoogleServiceAuthError(SERVICE_UNAVAILABLE, error_message); +} + +// static +GoogleServiceAuthError +GoogleServiceAuthError::FromScopeLimitedUnrecoverableError( + const std::string& error_message) { + return GoogleServiceAuthError(SCOPE_LIMITED_UNRECOVERABLE_ERROR, + error_message); +} + +// static GoogleServiceAuthError GoogleServiceAuthError::FromServiceError( const std::string& error_message) { return GoogleServiceAuthError(SERVICE_ERROR, error_message);
diff --git a/google_apis/gaia/google_service_auth_error.h b/google_apis/gaia/google_service_auth_error.h index e3acea84..386d3fe 100644 --- a/google_apis/gaia/google_service_auth_error.h +++ b/google_apis/gaia/google_service_auth_error.h
@@ -125,6 +125,12 @@ static GoogleServiceAuthError FromInvalidGaiaCredentialsReason( InvalidGaiaCredentialsReason reason); + static GoogleServiceAuthError FromServiceUnavailable( + const std::string& error_message); + + static GoogleServiceAuthError FromScopeLimitedUnrecoverableError( + const std::string& error_message); + // Construct a SERVICE_ERROR error, e.g. invalid client ID, with an // |error_message| which provides more information about the service error. static GoogleServiceAuthError FromServiceError(
diff --git a/google_apis/gaia/oauth2_access_token_fetcher_impl.cc b/google_apis/gaia/oauth2_access_token_fetcher_impl.cc index 0837b4c7..9dec7ccc 100644 --- a/google_apis/gaia/oauth2_access_token_fetcher_impl.cc +++ b/google_apis/gaia/oauth2_access_token_fetcher_impl.cc
@@ -9,6 +9,7 @@ #include <vector> #include "base/bind.h" +#include "base/feature_list.h" #include "base/json/json_reader.h" #include "base/strings/escape.h" #include "base/strings/string_util.h" @@ -24,6 +25,9 @@ #include "services/network/public/mojom/url_response_head.mojom.h" namespace { +const base::Feature kParseOauth2ErrorCode{"ParseOAuth2ErrorCode", + base::FEATURE_ENABLED_BY_DEFAULT}; + constexpr char kGetAccessTokenBodyFormat[] = "client_id=%s&" "client_secret=%s&" @@ -184,18 +188,20 @@ int response_code = url_loader_->ResponseInfo()->headers->response_code(); RecordResponseCodeUma(response_code); - std::string response_str = response_body ? *response_body : ""; + if (response_code == net::HTTP_OK) { OAuth2AccessTokenConsumer::TokenResponse token_response; if (ParseGetAccessTokenSuccessResponse(response_str, &token_response)) { RecordOAuth2Response(OAuth2Response::kOk); OnGetTokenSuccess(token_response); } else { + // Successful (net::HTTP_OK) unexpected format is considered as a + // transient error. DLOG(WARNING) << "Response doesn't match expected format"; RecordOAuth2Response(OAuth2Response::kOkUnexpectedFormat); OnGetTokenFailure( - GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE)); + GoogleServiceAuthError::FromServiceUnavailable(response_str)); } return; } @@ -205,52 +211,81 @@ ParseGetAccessTokenFailureResponse(response_str, &oauth2_error); OAuth2Response response = OAuth2ResponseErrorToOAuth2Response(oauth2_error); RecordOAuth2Response(response); + absl::optional<GoogleServiceAuthError> error; + if (base::FeatureList::IsEnabled(kParseOauth2ErrorCode)) { + switch (response) { + case kOk: + case kOkUnexpectedFormat: + NOTREACHED(); + break; - switch (response_code) { - case net::HTTP_OK: - NOTREACHED(); - break; - case net::HTTP_PROXY_AUTHENTICATION_REQUIRED: - NOTREACHED() << "HTTP 407 should be treated as a network error."; - // If this ever happens in production, we treat it as a temporary error as - // it is similar to a network error. - OnGetTokenFailure( - GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE)); - return; - case net::HTTP_FORBIDDEN: - // HTTP_FORBIDDEN (403) is treated as temporary error, because it may be - // '403 Rate Limit Exeeded.' - OnGetTokenFailure( - GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE)); - return; - case net::HTTP_BAD_REQUEST: { - // HTTP_BAD_REQUEST (400) usually contains error as per - // http://tools.ietf.org/html/rfc6749#section-5.2. - OnGetTokenFailure( - response == kInvalidGrant - ? GoogleServiceAuthError::FromInvalidGaiaCredentialsReason( - GoogleServiceAuthError::InvalidGaiaCredentialsReason:: - CREDENTIALS_REJECTED_BY_SERVER) - : GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_ERROR)); - return; - } - default: { - if (response_code >= net::HTTP_INTERNAL_SERVER_ERROR) { - // 5xx is always treated as transient. - OnGetTokenFailure(GoogleServiceAuthError( - GoogleServiceAuthError::SERVICE_UNAVAILABLE)); - } else { - // The other errors are treated as permanent error. - DLOG(ERROR) << "Unexpected persistent error: http_status=" - << response_code; - OnGetTokenFailure( - GoogleServiceAuthError::FromInvalidGaiaCredentialsReason( - GoogleServiceAuthError::InvalidGaiaCredentialsReason:: - CREDENTIALS_REJECTED_BY_SERVER)); - } - return; + case kRateLimitExceeded: + case kInternalFailure: + // Transient error. + error = GoogleServiceAuthError::FromServiceUnavailable(response_str); + break; + + case kInvalidGrant: + // Persistent error requiring the user to sign in again. + error = GoogleServiceAuthError::FromInvalidGaiaCredentialsReason( + GoogleServiceAuthError::InvalidGaiaCredentialsReason:: + CREDENTIALS_REJECTED_BY_SERVER); + break; + + case kInvalidScope: + case kRestrictedClient: + // Scope persistent error that can't be fixed by user action. + error = GoogleServiceAuthError::FromScopeLimitedUnrecoverableError( + response_str); + break; + + case kInvalidRequest: + case kInvalidClient: + case kUnauthorizedClient: + case kUnsuportedGrantType: + DLOG(ERROR) << "Unexpected persistent error: error code = " + << oauth2_error; + error = GoogleServiceAuthError::FromServiceError(response_str); + break; + + case kUnknownError: + case kErrorUnexpectedFormat: + // Failed request with unknown error code or unexpected format is + // treated as a persistent error case. + DLOG(ERROR) << "Unexpected error/format: error code = " << oauth2_error; + break; } } + + if (!error.has_value()) { + // Fallback to http status code. + if (response_code == net::HTTP_OK) { + NOTREACHED(); + } else if (response_code == net::HTTP_FORBIDDEN || + response_code == net::HTTP_PROXY_AUTHENTICATION_REQUIRED || + response_code >= net::HTTP_INTERNAL_SERVER_ERROR) { + // HTTP_FORBIDDEN (403): is treated as transient error, because it may be + // '403 Rate Limit Exeeded.' + // HTTP_PROXY_AUTHENTICATION_REQUIRED (407): is treated as a network error + // HTTP_INTERNAL_SERVER_ERROR: 5xx is always treated as transient. + error = GoogleServiceAuthError::FromServiceUnavailable(response_str); + } else { + // HTTP_BAD_REQUEST (400) or other response codes are treated as + // persistent errors. + // HTTP_BAD_REQUEST errors usually contains errors as per + // http://tools.ietf.org/html/rfc6749#section-5.2. + if (response == kInvalidGrant) { + error = GoogleServiceAuthError::FromInvalidGaiaCredentialsReason( + GoogleServiceAuthError::InvalidGaiaCredentialsReason:: + CREDENTIALS_REJECTED_BY_SERVER); + } else { + error = GoogleServiceAuthError::FromServiceError(response_str); + } + } + } + + if (error.has_value()) + OnGetTokenFailure(error.value()); } void OAuth2AccessTokenFetcherImpl::OnGetTokenSuccess(
diff --git a/google_apis/gaia/oauth2_access_token_fetcher_impl_unittest.cc b/google_apis/gaia/oauth2_access_token_fetcher_impl_unittest.cc index 7e2ce0f..4e3e394 100644 --- a/google_apis/gaia/oauth2_access_token_fetcher_impl_unittest.cc +++ b/google_apis/gaia/oauth2_access_token_fetcher_impl_unittest.cc
@@ -297,8 +297,9 @@ struct OAuth2ErrorCodesTestParam { const char* error_code; - OAuth2AccessTokenFetcherImpl::OAuth2Response expected_sample; net::HttpStatusCode httpStatusCode; + OAuth2AccessTokenFetcherImpl::OAuth2Response expected_sample; + GoogleServiceAuthError::State expected_error_state; }; class OAuth2ErrorCodesTest @@ -309,43 +310,84 @@ OAuth2ErrorCodesTest(const OAuth2ErrorCodesTest&) = delete; OAuth2ErrorCodesTest& operator=(const OAuth2ErrorCodesTest&) = delete; + + GoogleServiceAuthError GetGoogleServiceAuthError( + const std::string& error_message) { + switch (GetParam().expected_error_state) { + case GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS: + return GoogleServiceAuthError::FromInvalidGaiaCredentialsReason( + GoogleServiceAuthError::InvalidGaiaCredentialsReason:: + CREDENTIALS_REJECTED_BY_SERVER); + case GoogleServiceAuthError::SERVICE_UNAVAILABLE: + return GoogleServiceAuthError::FromServiceUnavailable(error_message); + case GoogleServiceAuthError::SERVICE_ERROR: + return GoogleServiceAuthError::FromServiceError(error_message); + case GoogleServiceAuthError::SCOPE_LIMITED_UNRECOVERABLE_ERROR: + return GoogleServiceAuthError::FromScopeLimitedUnrecoverableError( + error_message); + + case GoogleServiceAuthError::NONE: + case GoogleServiceAuthError::USER_NOT_SIGNED_UP: + case GoogleServiceAuthError::CONNECTION_FAILED: + case GoogleServiceAuthError::UNEXPECTED_SERVICE_RESPONSE: + case GoogleServiceAuthError::REQUEST_CANCELED: + case GoogleServiceAuthError::NUM_STATES: + NOTREACHED(); + return GoogleServiceAuthError::AuthErrorNone(); + } + } }; const OAuth2ErrorCodesTestParam kOAuth2ErrorCodesTable[] = { - { - "invalid_request", - OAuth2AccessTokenFetcherImpl::kInvalidRequest, - net::HTTP_BAD_REQUEST, - }, - {"invalid_client", OAuth2AccessTokenFetcherImpl::kInvalidClient, - net::HTTP_UNAUTHORIZED}, - {"invalid_grant", OAuth2AccessTokenFetcherImpl::kInvalidGrant, - net::HTTP_BAD_REQUEST}, - {"unauthorized_client", OAuth2AccessTokenFetcherImpl::kUnauthorizedClient, - net::HTTP_UNAUTHORIZED}, - {"unsupported_grant_type", - OAuth2AccessTokenFetcherImpl::kUnsuportedGrantType, net::HTTP_BAD_REQUEST}, - {"invalid_scope", OAuth2AccessTokenFetcherImpl::kInvalidScope, - net::HTTP_BAD_REQUEST}, - {"restricted_client", OAuth2AccessTokenFetcherImpl::kRestrictedClient, - net::HTTP_FORBIDDEN}, - {"rate_limit_exceeded", OAuth2AccessTokenFetcherImpl::kRateLimitExceeded, - net::HTTP_FORBIDDEN}, - {"internal_failure", OAuth2AccessTokenFetcherImpl::kInternalFailure, - net::HTTP_INTERNAL_SERVER_ERROR}, - {"unknown_error", OAuth2AccessTokenFetcherImpl::kUnknownError, - net::HTTP_BAD_REQUEST}, - {"", OAuth2AccessTokenFetcherImpl::kErrorUnexpectedFormat, - net::HTTP_BAD_REQUEST}}; + {"invalid_request", net::HTTP_BAD_REQUEST, + OAuth2AccessTokenFetcherImpl::kInvalidRequest, + GoogleServiceAuthError::SERVICE_ERROR}, + {"invalid_client", net::HTTP_UNAUTHORIZED, + OAuth2AccessTokenFetcherImpl::kInvalidClient, + GoogleServiceAuthError::SERVICE_ERROR}, + {"invalid_grant", net::HTTP_BAD_REQUEST, + OAuth2AccessTokenFetcherImpl::kInvalidGrant, + GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS}, + {"unauthorized_client", net::HTTP_UNAUTHORIZED, + OAuth2AccessTokenFetcherImpl::kUnauthorizedClient, + GoogleServiceAuthError::SERVICE_ERROR}, + {"unsupported_grant_type", net::HTTP_BAD_REQUEST, + OAuth2AccessTokenFetcherImpl::kUnsuportedGrantType, + GoogleServiceAuthError::SERVICE_ERROR}, + {"invalid_scope", net::HTTP_BAD_REQUEST, + OAuth2AccessTokenFetcherImpl::kInvalidScope, + GoogleServiceAuthError::SCOPE_LIMITED_UNRECOVERABLE_ERROR}, + {"restricted_client", net::HTTP_FORBIDDEN, + OAuth2AccessTokenFetcherImpl::kRestrictedClient, + GoogleServiceAuthError::SCOPE_LIMITED_UNRECOVERABLE_ERROR}, + {"rate_limit_exceeded", net::HTTP_FORBIDDEN, + OAuth2AccessTokenFetcherImpl::kRateLimitExceeded, + GoogleServiceAuthError::SERVICE_UNAVAILABLE}, + {"internal_failure", net::HTTP_INTERNAL_SERVER_ERROR, + OAuth2AccessTokenFetcherImpl::kInternalFailure, + GoogleServiceAuthError::SERVICE_UNAVAILABLE}, + {"", net::HTTP_BAD_REQUEST, + OAuth2AccessTokenFetcherImpl::kErrorUnexpectedFormat, + GoogleServiceAuthError::SERVICE_ERROR}, + {"", net::HTTP_OK, OAuth2AccessTokenFetcherImpl::kOkUnexpectedFormat, + GoogleServiceAuthError::SERVICE_UNAVAILABLE}, + {"unknown_error", net::HTTP_BAD_REQUEST, + OAuth2AccessTokenFetcherImpl::kUnknownError, + GoogleServiceAuthError::SERVICE_ERROR}, + {"unknown_error", net::HTTP_INTERNAL_SERVER_ERROR, + OAuth2AccessTokenFetcherImpl::kUnknownError, + GoogleServiceAuthError::SERVICE_UNAVAILABLE}}; TEST_P(OAuth2ErrorCodesTest, TableRowTest) { - SetupGetAccessToken(net::OK, GetParam().httpStatusCode, - base::StringPrintf(R"( + std::string response_body = base::StringPrintf(R"( { "error": "%s" })", - GetParam().error_code)); - EXPECT_CALL(consumer_, OnGetTokenFailure(_)).Times(1); + GetParam().error_code); + GoogleServiceAuthError expected_error = + GetGoogleServiceAuthError(response_body); + SetupGetAccessToken(net::OK, GetParam().httpStatusCode, response_body); + EXPECT_CALL(consumer_, OnGetTokenFailure(expected_error)).Times(1); fetcher_->Start("client_id", "client_secret", ScopeList()); base::RunLoop().RunUntilIdle(); histogram_tester()->ExpectUniqueSample(
diff --git a/google_apis/gaia/oauth2_access_token_manager_unittest.cc b/google_apis/gaia/oauth2_access_token_manager_unittest.cc index c636f817..684b2d1 100644 --- a/google_apis/gaia/oauth2_access_token_manager_unittest.cc +++ b/google_apis/gaia/oauth2_access_token_manager_unittest.cc
@@ -535,8 +535,7 @@ std::unique_ptr<OAuth2AccessTokenManager::Request> request( token_manager_.StartRequest( account_id_, OAuth2AccessTokenManager::ScopeSet(), &consumer_)); - SimulateOAuthTokenResponse(GetValidTokenResponse("token", 3600), - net::HTTP_BAD_REQUEST); + SimulateOAuthTokenResponse("", net::HTTP_BAD_REQUEST); run_loop.Run(); }
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_fil.xtb index c94aeb4..128bedf 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_fil.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_fil.xtb
@@ -120,6 +120,7 @@ <translation id="8586442755830160949">Copyright <ph name="YEAR" /> Ang Mga May-akda ng Chromium. Nakalaan ang lahat ng karapatan.</translation> <translation id="865600487977764604">Pinapanatili kang ligtas sa Chromium at puwedeng gamitin para paigtingin ang iyong seguridad sa iba pang Google app kapag naka-sign in ka.</translation> <translation id="8663480472502753423">Panatilihing up to date ang Chromium</translation> +<translation id="8685813584220679697">Mag-sign in sa site na ito at sa Chromium.</translation> <translation id="8747378496147986285">Kapag naka-on: <ph name="BEGIN_INDENT" /> • Tumulong na pahusayin ang Chromium para sa mga taong gumagamit nito gaya ng iyong paggamit.<ph name="END_INDENT" />
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ka.xtb index ab02875..3713327 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ka.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ka.xtb
@@ -120,6 +120,7 @@ <translation id="8586442755830160949">Copyright <ph name="YEAR" /> The Chromium Authors. ყველა უფლება დაცულია.</translation> <translation id="865600487977764604">უზრუნველყოფს თქვენს უსაფრთხოებას Chromium-სა და Google-ის სხვა აპებში, როცა სისტემაში შესული ხართ.</translation> <translation id="8663480472502753423">Chromium-ის მუდმივი განახლების უზრუნველყოფა</translation> +<translation id="8685813584220679697">შედით ამ საიტსა და Chromium-ში.</translation> <translation id="8747378496147986285">როდესაც ჩართულია: <ph name="BEGIN_INDENT" /> • დაგვეხმარეთ, გავაუმჯობესოთ Chromium მათთვის, ვინც მას თქვენ მსგავსად იყენებს.<ph name="END_INDENT" />
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_mk.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_mk.xtb index f3c7410..3464d339 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_mk.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_mk.xtb
@@ -120,6 +120,7 @@ <translation id="8586442755830160949">Авторски права <ph name="YEAR" /> на Авторите на Chromium. Сите права се задржани.</translation> <translation id="865600487977764604">Ве заштитува на Chromium и може да се користи за да ја подобри вашата безбедност на други апликации на Google кога сте најавени.</translation> <translation id="8663480472502753423">Одржувајте го Chromium ажурен</translation> +<translation id="8685813584220679697">Најавете се на сајтов и на Chromium.</translation> <translation id="8747378496147986285">Кога е вклучено: <ph name="BEGIN_INDENT" /> • Помага да се подобри Chromium за луѓето што го користат исто како и вие.<ph name="END_INDENT" />
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_mn.xtb index 99ba6b36..91dbaaa 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_mn.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_mn.xtb
@@ -120,6 +120,7 @@ <translation id="8586442755830160949">Chromium-ийн зохиогчийн эрх <ph name="YEAR" />. Бүх эрхийг хуулиар хамгаалсан.</translation> <translation id="865600487977764604">Таныг нэвтэрсэн үед Chromium дээр таны аюулгүй байдлыг хангадаг бөгөөд Google-н бусад апп дахь таны аюулгүй байдлыг сайжруулахын тулд үүнийг ашиглах боломжтой.</translation> <translation id="8663480472502753423">Chromium-г хамгийн шинэ байлгаарай</translation> +<translation id="8685813584220679697">Энэ сайт болон Chromium-д нэвтэрнэ үү.</translation> <translation id="8747378496147986285">Асаалттай үед: <ph name="BEGIN_INDENT" /> • Chromium-г тантай адил аргаар ашигладаг хүмүүст зориулан сайжруулахад нь туслаарай.<ph name="END_INDENT" />
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ms.xtb index 7c64e74..97b161a 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ms.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ms.xtb
@@ -120,6 +120,7 @@ <translation id="8586442755830160949">Hak Cipta <ph name="YEAR" /> Pengarang Chromium. Hak cipta terpelihara.</translation> <translation id="865600487977764604">Memastikan anda selamat pada Chromium dan mungkin digunakan untuk meningkatkan keselamatan anda dalam apl Google yang lain apabila anda log masuk.</translation> <translation id="8663480472502753423">Pastikan Chromium terkini</translation> +<translation id="8685813584220679697">Log masuk ke laman ini dan Chromium.</translation> <translation id="8747378496147986285">Apabila dihidupkan: <ph name="BEGIN_INDENT" /> • Bantu jadikan Chromium lebih baik untuk orang yang menggunakannya seperti yang anda lakukan.<ph name="END_INDENT" />
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb index ab47590..417be2b 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb
@@ -120,6 +120,7 @@ <translation id="8586442755830160949">Copyright <ph name="YEAR" /> – The Chromium Authors. Med enerett.</translation> <translation id="865600487977764604">Holder deg trygg i Chromium og kan brukes til å øke sikkerheten din i andre Google-apper når du er pålogget.</translation> <translation id="8663480472502753423">Hold Chromium oppdatert</translation> +<translation id="8685813584220679697">Logg på dette nettstedet og Chromium.</translation> <translation id="8747378496147986285">Når du gir samtykke <ph name="BEGIN_INDENT" /> • bidrar du til å gjøre Chromium bedre for folk som bruker nettleseren på samme måte som deg<ph name="END_INDENT" />
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb index c0d1f577..d8abbf0 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb
@@ -120,6 +120,7 @@ <translation id="8586442755830160949">Copyright <ph name="YEAR" /> The Chromium Authors. Toate drepturile rezervate.</translation> <translation id="865600487977764604">Te protejează în Chromium și poate fi folosit pentru a spori securitatea în alte aplicații Google dacă te-ai conectat.</translation> <translation id="8663480472502753423">Menține browserul Chromium actualizat</translation> +<translation id="8685813584220679697">Conectează-te la acest site și la Chromium.</translation> <translation id="8747378496147986285">Când opțiunea este activă <ph name="BEGIN_INDENT" /> • Contribui la îmbunătățirea Chromium pentru cei care-l folosesc în mod similar cu tine.<ph name="END_INDENT" />
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_th.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_th.xtb index 8b23bb0..88c4fa9 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_th.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_th.xtb
@@ -120,6 +120,7 @@ <translation id="8586442755830160949">ลิขสิทธิ์ <ph name="YEAR" /> The Chromium Authors สงวนลิขสิทธิ์</translation> <translation id="865600487977764604">รักษาความปลอดภัยของคุณใน Chromium และอาจใช้เพื่อปรับปรุงความปลอดภัยในแอปอื่นๆ ของ Google เมื่อลงชื่อเข้าใช้</translation> <translation id="8663480472502753423">อัปเดต Chromium อยู่เสมอ</translation> +<translation id="8685813584220679697">ลงชื่อเข้าใช้เว็บไซต์นี้และ Chromium</translation> <translation id="8747378496147986285">เมื่อเปิดไว้ จะมีประโยชน์ดังนี้ <ph name="BEGIN_INDENT" /> • ช่วยปรับปรุง Chromium ให้ดีขึ้นสำหรับคนที่ใช้งานแบบคุณ<ph name="END_INDENT" />
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fil.xtb index 31d2f43..f1eb66d 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fil.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fil.xtb
@@ -57,6 +57,7 @@ <translation id="4249068189593983585">Tip sa Chrome. Para sa higit pang opsyon sa tab, pindutin nang matagal ang button na Ipakita ang Mga Tab sa toolbar, na nasa ibaba o itaas ng iyong screen.</translation> <translation id="4523886039239821078">Nagiging dahilan ang ilang add-on ng pag-crash ng Chrome. Paki-uninstall.</translation> <translation id="4633328489441962921">Hindi matingnan ng Chrome kung may mga update</translation> +<translation id="4636900170638246267">Mag-sign in sa site na ito at sa Chrome.</translation> <translation id="4698415050768537821">Hindi masuri ng Chrome ang lahat ng password. Subukan ulit bukas o <ph name="BEGIN_LINK" />suriin ang mga password sa iyong Google Account.<ph name="END_LINK" /></translation> <translation id="4802922164792993118">Tip sa Chrome. Mag-sign in nang mas mabilis sa pamamagitan ng pagpili ng iyong naka-save na password sa itaas ng keyboard.</translation> <translation id="4819268619367838612">Para makatulong na mapaganda ang app, nagpapadala ang Chrome ng data ng paggamit at pag-crash sa Google. <ph name="BEGIN_LINK" />Pamahalaan<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ka.xtb index 688dc8e..903f0b7b 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ka.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ka.xtb
@@ -57,6 +57,7 @@ <translation id="4249068189593983585">Chrome მინიშნება: ჩანართებთან დაკავშირებული სხვა ვარიანტის სანახავად ხანგრძლივად შეეხეთ „ჩანართების ჩვენების“ ღილაკს ხელსაწყოთა ზოლში, რომელიც მდებარეობს ეკრანის ქვედა ან ზედა ნაწილში.</translation> <translation id="4523886039239821078">ზოგიერთი დანამატი იწვევს Chrome-ის შეცდომას. წაშალეთ:</translation> <translation id="4633328489441962921">Chrome ვერ ახერხებს განახლებების შემოწმებას</translation> +<translation id="4636900170638246267">შედით ამ საიტსა და Chrome-ში.</translation> <translation id="4698415050768537821">Chrome-მა ვერ შეამოწმა ყველა პაროლი. ცადეთ ხვალ ან <ph name="BEGIN_LINK" />შეამოწმეთ პაროლები თქვენი Google ანგარიშიდან<ph name="END_LINK" />.</translation> <translation id="4802922164792993118">Chrome-ის მინიშნება. შედით სისტემაში უფრო სწრაფად — აირჩიეთ თქვენი შენახული პაროლი კლავიატურის ზედა ნაწილში.</translation> <translation id="4819268619367838612">ამ აპის გაუმჯობესების მიზნით, Chrome უგზავნის Google-ს მოხმარებისა და ავარიულად გათიშვის მონაცემებს. <ph name="BEGIN_LINK" />მართვა<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_mk.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_mk.xtb index d0009968..2e8808f9 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_mk.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_mk.xtb
@@ -57,6 +57,7 @@ <translation id="4249068189593983585">Совет за Chrome: за повеќе опции за картичките, допрете го и задржете го копчето „Прикажи ги картичките“ во алатникот, што се наоѓа најгоре или најдолу на екранот.</translation> <translation id="4523886039239821078">Некои додатоци предизвикуваат пад на Chrome. Деинсталирајте:</translation> <translation id="4633328489441962921">Chrome не може да провери дали има ажурирања</translation> +<translation id="4636900170638246267">Најавете се на сајтов и на Chrome.</translation> <translation id="4698415050768537821">Chrome не може да ги провери сите лозинки. Обидете се пак утре или <ph name="BEGIN_LINK" />проверете ги лозинките во сметката на Google.<ph name="END_LINK" /></translation> <translation id="4802922164792993118">Совет за Chrome Најавувајте се побрзо со бирање на зачуваната лозинка најгоре на тастатурата.</translation> <translation id="4819268619367838612">За да се подобри апликацијата, Chrome испраќа податоци за користењето и падовите во Google. <ph name="BEGIN_LINK" />Управувајте<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_mn.xtb index 9e7c50b..b10e3de 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_mn.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_mn.xtb
@@ -57,6 +57,7 @@ <translation id="4249068189593983585">Chrome-н зөвлөгөө. Табын бусад сонголтыг харахын тулд дэлгэцийнхээ доод эсвэл дээд хэсэгт байрлах самбараас Табыг харуулах товчлуурыг удаан дарна уу.</translation> <translation id="4523886039239821078">Зарим нэмэлт апп-ууд нь Chrome-ыг эвдрэхэд хүргэдэг. Тиймээс тэдгээрийг утсгана уу:</translation> <translation id="4633328489441962921">Chrome-н шинэчлэлтийг шалгах боломжгүй байна</translation> +<translation id="4636900170638246267">Энэ сайт болон Chrome-д нэвтэрнэ үү.</translation> <translation id="4698415050768537821">Chrome бүх нууц үгийг шалгаж чадсангүй. Маргааш дахин оролдох буюу эсхүл <ph name="BEGIN_LINK" />Google Бүртгэлдээ байгаа нууц үгнүүдийг шалгана уу.<ph name="END_LINK" /></translation> <translation id="4802922164792993118">Chrome-н зөвлөгөө. Гарын дээд хэсэгт хадгалсан нууц үгээ сонгосноор илүү хурдан нэвтэрнэ үү.</translation> <translation id="4819268619367838612">Аппыг сайжруулахад туслахын тулд Chrome нь ашиглалт болон гэмтлийн өгөгдлийг Google-д илгээдэг. <ph name="BEGIN_LINK" />Удирдах<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ms.xtb index c3e9f98..4cc9f96 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ms.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ms.xtb
@@ -57,6 +57,7 @@ <translation id="4249068189593983585">Petua Chrome. Untuk melihat lebih banyak pilihan tab, sentuh & tahan butang Tunjukkan Tab dalam bar alat, yang terletak di bahagian bawah atau atas skrin anda.</translation> <translation id="4523886039239821078">Beberapa tambahan menyebabkan Chrome ranap. Sila nyahpasang:</translation> <translation id="4633328489441962921">Chrome tidak dapat menyemak kemas kini</translation> +<translation id="4636900170638246267">Log masuk ke laman ini dan Chrome.</translation> <translation id="4698415050768537821">Chrome tidak dapat menyemak semua kata laluan. Cuba lagi esok atau <ph name="BEGIN_LINK" />semak kata laluan dalam Akaun Google anda.<ph name="END_LINK" /></translation> <translation id="4802922164792993118">Petua Chrome. Log masuk lebih cepat dengan memilih kata laluan anda yang disimpan di bahagian atas papan kekunci.</translation> <translation id="4819268619367838612">Untuk membantu dalam usaha meningkatkan apl, Chrome menghantar data penggunaan dan ranap sistem kepada Google. <ph name="BEGIN_LINK" />Urus<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb index 8617b37..6a9cef9 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb
@@ -57,6 +57,7 @@ <translation id="4249068189593983585">Chrome-tips. For flere fanealternativer, trykk og hold inne Vis faner-knappen på verktøylinjen, som du finner nederst eller øverst på skjermen.</translation> <translation id="4523886039239821078">Noen tillegg fører til at Chrome krasjer. Avinstaller:</translation> <translation id="4633328489441962921">Chrome kan ikke se etter oppdateringer</translation> +<translation id="4636900170638246267">Logg på dette nettstedet og Chrome.</translation> <translation id="4698415050768537821">Chrome kunne ikke sjekke alle passordene. Prøv på nytt i morgen, eller <ph name="BEGIN_LINK" />sjekk passordene i Google-kontoen din<ph name="END_LINK" />.</translation> <translation id="4802922164792993118">Chrome-tips. Logg på raskere ved å velge det lagrede passordet ditt øverst på tastaturet.</translation> <translation id="4819268619367838612">For å bidra til å gjøre appen bedre sender Chrome bruks- og krasjrelaterte data til Google. <ph name="BEGIN_LINK" />Administrer<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ro.xtb index be72cfd..a1f5aca 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ro.xtb
@@ -57,6 +57,7 @@ <translation id="4249068189593983585">Sfat pentru Chrome: pentru mai multe opțiuni de file, atinge lung butonul Afișează filele din bara de instrumente, care se află în partea de sus sau de jos a ecranului.</translation> <translation id="4523886039239821078">Unele suplimente determină blocarea browserului Chrome. Dezinstalează:</translation> <translation id="4633328489441962921">Chrome nu poate căuta actualizări</translation> +<translation id="4636900170638246267">Conectează-te la acest site și la Chrome.</translation> <translation id="4698415050768537821">Chrome nu a putut verifica toate parolele. Încearcă din nou mâine sau <ph name="BEGIN_LINK" />verifică parolele din Contul Google<ph name="END_LINK" />.</translation> <translation id="4802922164792993118">Sfat pentru Chrome. Conectează-te mai rapid selectând parola salvată în partea de sus a tastaturii.</translation> <translation id="4819268619367838612">Pentru a contribui la îmbunătățirea aplicației, Chrome trimite date de utilizare și despre erori la Google. <ph name="BEGIN_LINK" />Gestionează<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb index 8abb359..0e4fce5 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb
@@ -57,6 +57,7 @@ <translation id="4249068189593983585">เคล็ดลับสำหรับ Chrome ถ้าต้องการดูตัวเลือกแท็บเพิ่มเติม ให้แตะปุ่ม "แสดงแท็บ" ค้างไว้ในแถบเครื่องมือ ซึ่งอยู่ที่ด้านล่างหรือด้านบนของหน้าจอ</translation> <translation id="4523886039239821078">ส่วนเสริมบางรายการทำให้ Chrome ขัดข้อง โปรดถอนการติดตั้ง</translation> <translation id="4633328489441962921">Chrome ตรวจหาอัปเดตไม่ได้</translation> +<translation id="4636900170638246267">ลงชื่อเข้าใช้เว็บไซต์นี้และ Chrome</translation> <translation id="4698415050768537821">Chrome ตรวจสอบรหัสผ่านได้ไม่ครบทั้งหมด โปรดลองอีกครั้งในวันพรุ่งนี้หรือ<ph name="BEGIN_LINK" />ตรวจสอบรหัสผ่านในบัญชี Google<ph name="END_LINK" /></translation> <translation id="4802922164792993118">เคล็ดลับสำหรับ Chrome ลงชื่อเข้าใช้ได้เร็วขึ้นโดยการเลือกรหัสผ่านที่บันทึกไว้บริเวณด้านบนของแป้นพิมพ์</translation> <translation id="4819268619367838612">Chrome จะส่งข้อมูลการใช้งานและข้อขัดข้องไปยัง Google เพื่อช่วยปรับปรุงแอป <ph name="BEGIN_LINK" />จัดการ<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb index 9a413f87..39dc1fa 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -329,6 +329,7 @@ <translation id="3775743491439407556">La sincronització no funciona</translation> <translation id="3779810277399252432">No hi ha connexió a Internet.</translation> <translation id="3783017676699494206">Desa la imatge</translation> +<translation id="3789294999358192700">Segueix aquests passos:</translation> <translation id="3789841737615482174">Instal·la</translation> <translation id="380329542618494757">Nom</translation> <translation id="3803696231112616155">Proposa traduir aquest lloc web</translation> @@ -941,6 +942,7 @@ <translation id="8870413625673593573">Tancades recentment</translation> <translation id="8876882697946675716">Mantén els dispositius sincronitzats</translation> <translation id="8881801611828450202">Cerca aquesta imatge a <ph name="SEARCH_ENGINE" /></translation> +<translation id="8891935667620843985">Pots obrir enllaços automàticament a l'aplicació Chrome convertint-la en la predeterminada com a navegador.</translation> <translation id="8898822736010347272">Envia a Google els URL d'algunes pàgines que visites, informació limitada del sistema i part del contingut de les pàgines per ajudar a detectar amenaces noves i protegir tothom al web.</translation> <translation id="8909135823018751308">Comparteix...</translation> <translation id="8917490105272468696">Sí, ho accepto</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cy.xtb b/ios/chrome/app/strings/resources/ios_strings_cy.xtb index 91402c8..84064168 100644 --- a/ios/chrome/app/strings/resources/ios_strings_cy.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_cy.xtb
@@ -329,6 +329,7 @@ <translation id="3775743491439407556">Nid yw'r Cysoni'n Gweithio</translation> <translation id="3779810277399252432">Dim cysylltiad rhyngrwyd.</translation> <translation id="3783017676699494206">Cadw'r Llun</translation> +<translation id="3789294999358192700">Dilynwch y camau isod:</translation> <translation id="3789841737615482174">Gosod</translation> <translation id="380329542618494757">Enw</translation> <translation id="3803696231112616155">Cynnig cyfieithu'r wefan hon</translation> @@ -941,6 +942,7 @@ <translation id="8870413625673593573">Wedi'u Cau yn Ddiweddar</translation> <translation id="8876882697946675716">Cadwch Eich Dyfeisiau Yn Gyson</translation> <translation id="8881801611828450202">Chwilio <ph name="SEARCH_ENGINE" /> ar gyfer y Llun Hwn</translation> +<translation id="8891935667620843985">Gallwch agor dolenni yn Chrome yn awtomatig drwy ei osod fel eich Ap Porwr Diofyn.</translation> <translation id="8898822736010347272">Yn anfon cyfeiriadau URL o rai tudalennau rydych yn ymweld â nhw, gwybodaeth system gyfyngedig, a rhywfaint o gynnwys tudalen at Google, i helpu i ddarganfod bygythiadau newydd ac i amddiffyn pawb ar y we.</translation> <translation id="8909135823018751308">Rhannu…</translation> <translation id="8917490105272468696">Iawn, Rwy'n Cydsynio</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb index 0e2179c..5610b53 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
@@ -329,6 +329,7 @@ <translation id="3775743491439407556">La sincronización no funciona</translation> <translation id="3779810277399252432">Sin conexión a Internet</translation> <translation id="3783017676699494206">Guardar imagen</translation> +<translation id="3789294999358192700">Sigue estos pasos:</translation> <translation id="3789841737615482174">Instalar</translation> <translation id="380329542618494757">Nombre</translation> <translation id="3803696231112616155">Ofrecer traducir este sitio</translation> @@ -941,6 +942,7 @@ <translation id="8870413625673593573">Cerrado recientemente</translation> <translation id="8876882697946675716">Mantén tus dispositivos sincronizados</translation> <translation id="8881801611828450202">Buscar esta imagen en <ph name="SEARCH_ENGINE" /></translation> +<translation id="8891935667620843985">Para que los vínculos se abran de forma automática en Chrome, elígelo como app de navegador predeterminada.</translation> <translation id="8898822736010347272">Envía a Google las URL de algunas páginas que visitas, información limitada del sistema y parte del contenido de las páginas para ayudar a detectar nuevas amenazas y proteger a todos los usuarios en la Web.</translation> <translation id="8909135823018751308">Compartir…</translation> <translation id="8917490105272468696">Acepto</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb index a25ae310..ff2bf5d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -329,6 +329,7 @@ <translation id="3775743491439407556">همگامسازی کار نمیکند</translation> <translation id="3779810277399252432">اتصال اینترنتی ندارید</translation> <translation id="3783017676699494206">ذخیره تصویر</translation> +<translation id="3789294999358192700">مراحل زیر را دنبال کنید:</translation> <translation id="3789841737615482174">نصب</translation> <translation id="380329542618494757">نام</translation> <translation id="3803696231112616155">پیشنهاد ترجمه این سایت</translation> @@ -941,6 +942,7 @@ <translation id="8870413625673593573">اخیراً بستهشده</translation> <translation id="8876882697946675716">دستگاههایتان را همگام نگه دارید</translation> <translation id="8881801611828450202">جستجوی <ph name="SEARCH_ENGINE" /> برای این تصویر</translation> +<translation id="8891935667620843985">با تنظیم Chrome بهعنوان «برنامه مرورگر پیشفرض» میتوانید پیوندها را بهطور خودکار در آن باز کنید.</translation> <translation id="8898822736010347272">نشانیهای وب بعضی از صفحههایی که بازدید میکنید، اطلاعات محدودی از سیستم، و برخی از محتوای صفحه را به Google ارسال میکند تا به کشف تهدیدهای جدید و محافظت از همه افراد در وب کمک کند.</translation> <translation id="8909135823018751308">اشتراکگذاری...</translation> <translation id="8917490105272468696">بله، موافقم</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb index 596066d1..a06f85d1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -474,6 +474,7 @@ <translation id="4979397965658815378">Mag-sign in gamit ang Google Account mo para makuha ang iyong mga bookmark, password, history at iba pang mga setting sa lahat ng device mo</translation> <translation id="4986678885919050584">Alisin sa Device na ito</translation> <translation id="4989542687859782284">Hindi Available</translation> +<translation id="498985224078955265">Para ipadala ang tab na ito sa ibang device, mag-sign in sa Chrome sa dalawang device.</translation> <translation id="5005498671520578047">Kopyahin password</translation> <translation id="5017828934289857214">Paalalahanan Ako Sa Ibang Pagkakataon</translation> <translation id="5037676449506322593">Select All</translation> @@ -525,6 +526,7 @@ <translation id="5489208564673669003">Para pamahalaan ang cookies para sa lahat ng site, tingnan ang <ph name="BEGIN_LINK" />Mga Setting ng Cookie<ph name="END_LINK" />.</translation> <translation id="5490005495580364134">I-block ang Lahat ng Cookies (Hindi Inirerekomenda)</translation> <translation id="5513681519188741830"><ph name="TIME" /> (na) oras na ang nakalipas</translation> +<translation id="5525095647255982834">Para ipadala ang tab na ito sa ibang device, mag-sign in sa Chrome doon.</translation> <translation id="5525269841082836315">Lumikha ng Passphrase</translation> <translation id="5542540507657872337">Nakita ang <ph name="COUNT" /></translation> <translation id="5548760955356983418">Nagbibigay-daan sa iyo ang handoff na magsimula sa pagba-browse sa isang website sa device na ito at pagkatapos ay magpatuloy kaagad sa iyong Mac. Lalabas ang kasalukuyang nakabukas na website sa Dock ng iyong Mac.
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb index 0a22526..5ae31f8 100644 --- a/ios/chrome/app/strings/resources/ios_strings_id.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -329,6 +329,7 @@ <translation id="3775743491439407556">Sinkronisasi Tidak Berfungsi</translation> <translation id="3779810277399252432">Tidak ada koneksi internet.</translation> <translation id="3783017676699494206">Simpan Gambar</translation> +<translation id="3789294999358192700">Ikuti langkah-langkah di bawah ini:</translation> <translation id="3789841737615482174">Instal</translation> <translation id="380329542618494757">Nama</translation> <translation id="3803696231112616155">Tawarkan untuk menerjemahkan situs ini</translation> @@ -941,6 +942,7 @@ <translation id="8870413625673593573">Baru Saja Ditutup</translation> <translation id="8876882697946675716">Jaga Perangkat Anda Tetap Sinkron</translation> <translation id="8881801611828450202">Telusuri Gambar Ini di <ph name="SEARCH_ENGINE" /></translation> +<translation id="8891935667620843985">Anda dapat membuka link di Chrome secara otomatis dengan menjadikan Chrome sebagai Aplikasi Browser Default Anda.</translation> <translation id="8898822736010347272">Kirim URL beberapa halaman yang Anda kunjungi, informasi sistem terbatas, dan beberapa konten halaman ke Google untuk membantu menemukan ancaman baru dan melindungi semua orang di web.</translation> <translation id="8909135823018751308">Bagikan...</translation> <translation id="8917490105272468696">Ya, Saya Setuju</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb index f763698..603b13be 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -329,6 +329,7 @@ <translation id="3775743491439407556">同期が機能していません</translation> <translation id="3779810277399252432">インターネットに接続されていません。</translation> <translation id="3783017676699494206">画像を保存</translation> +<translation id="3789294999358192700">次の手順で設定してください。</translation> <translation id="3789841737615482174">インストール</translation> <translation id="380329542618494757">名前</translation> <translation id="3803696231112616155">このサイトを翻訳するか尋ねる</translation> @@ -941,6 +942,7 @@ <translation id="8870413625673593573">最近閉じたタブ</translation> <translation id="8876882697946675716">デバイスを同期したままにする</translation> <translation id="8881801611828450202">この画像を <ph name="SEARCH_ENGINE" /> で検索</translation> +<translation id="8891935667620843985">Chrome をデフォルトのブラウザアプリに設定すると、Chrome で自動的にリンクを開くことができます。</translation> <translation id="8898822736010347272">新たな脅威の発見と、すべてのウェブユーザーの保護に役立てるため、アクセスした一部のページの URL、限定的なシステム情報、一部のページ コンテンツを Google に送信します。</translation> <translation id="8909135823018751308">共有...</translation> <translation id="8917490105272468696">有効にする</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_strings_ka.xtb index 3fb44bb..a3a951a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ka.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
@@ -474,6 +474,7 @@ <translation id="4979397965658815378">თქვენი სანიშნეების, პაროლების, ისტორიის და სხვა პარამეტრების ყველა თქვენს მოწყობილობაში მისაღებად, შედით სისტემაში თქვენი Google ანგარიშით</translation> <translation id="4986678885919050584">ამ მოწყობილობიდან ამოშლა</translation> <translation id="4989542687859782284">მიუწვდომელია</translation> +<translation id="498985224078955265">ეს ჩანართი სხვა მოწყობილობაზე რომ გაგზავნოთ, შედით Chrome-ში ორივე მოწყობილობიდან.</translation> <translation id="5005498671520578047">პაროლის კოპირება</translation> <translation id="5017828934289857214">მოგვიანებით შეხსენება</translation> <translation id="5037676449506322593">აირჩიეთ ყველა</translation> @@ -525,6 +526,7 @@ <translation id="5489208564673669003">ყველა საიტისთვის ქუქი-ჩანაწერების სამართავად გადადით <ph name="BEGIN_LINK" />ქუქი-ჩანაწერების პარამეტრებზე<ph name="END_LINK" />.</translation> <translation id="5490005495580364134">ყველა ქუქი-ჩანაწერის დაბლოკვა (არარეკომენდებული)</translation> <translation id="5513681519188741830"><ph name="TIME" /> საათის წინ</translation> +<translation id="5525095647255982834">ეს ჩანართი სხვა მოწყობილობაზე რომ გაგზავნოთ, შედით იქიდან Chrome-ში.</translation> <translation id="5525269841082836315">საიდუმლო ფრაზის შექმნა</translation> <translation id="5542540507657872337">მოიძებნა <ph name="COUNT" /></translation> <translation id="5548760955356983418">Handoff საშუალებით შეგიძლიათ დაიწყოთ ვებსაიტის დათვალიერება ამ მოწყობილობაში და ადვილად გააგრძელოთ Mac მოწყობილობაში. მიმდინარე გახსნილი ვებსაიტი გამოჩნდება Mac მოწყობილობის Dock-ში.
diff --git a/ios/chrome/app/strings/resources/ios_strings_km.xtb b/ios/chrome/app/strings/resources/ios_strings_km.xtb index 7f24b26c..26ad514 100644 --- a/ios/chrome/app/strings/resources/ios_strings_km.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_km.xtb
@@ -329,6 +329,7 @@ <translation id="3775743491439407556">សមកាលកម្មមិនដំណើរការទេ</translation> <translation id="3779810277399252432">គ្មានការតភ្ជាប់អ៊ីនធឺណិតទេ។</translation> <translation id="3783017676699494206">រក្សាទុករូបភាព</translation> +<translation id="3789294999358192700">សូមអនុវត្តតាមជំហានខាងក្រោម៖</translation> <translation id="3789841737615482174">តំឡើង</translation> <translation id="380329542618494757">ឈ្មោះ</translation> <translation id="3803696231112616155">ផ្ដល់ការបកប្រែគេហទំព័រនេះ</translation> @@ -941,6 +942,7 @@ <translation id="8870413625673593573">បានបិទកន្លងទៅថ្មីៗ</translation> <translation id="8876882697946675716">បន្តឱ្យឧបករណ៍របស់អ្នកធ្វើសមកាលកម្ម</translation> <translation id="8881801611828450202">ស្វែងរករួបភាពនេះនៅលើ <ph name="SEARCH_ENGINE" /></translation> +<translation id="8891935667620843985">អ្នកអាចបើកតំណនៅក្នុង Chrome ដោយស្វ័យប្រវត្តិដោយកំណត់វាជា "Default Browser App" របស់អ្នក។</translation> <translation id="8898822736010347272">បញ្ជូន URL នៃគេហទំព័រមួយចំនួនដែលអ្នកចូលមើល ព័ត៌មានប្រព័ន្ធមួយចំនួន និងខ្លឹមសារទំព័រមួយចំនួនទៅ Google ដើម្បីជួយស្វែងរកការគំរាមកំហែងថ្មី និងការពារអ្នកគ្រប់គ្នានៅលើអ៊ីនធឺណិត។</translation> <translation id="8909135823018751308">ចែករំលែក…</translation> <translation id="8917490105272468696">បាទ/ចាស ខ្ញុំយល់ព្រម។</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb index 3f6325f..af121b92 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -329,6 +329,7 @@ <translation id="3775743491439407556">동기화가 작동하지 않음</translation> <translation id="3779810277399252432">인터넷에 연결되어 있지 않습니다.</translation> <translation id="3783017676699494206">이미지 저장</translation> +<translation id="3789294999358192700">다음 단계를 따르세요.</translation> <translation id="3789841737615482174">설치</translation> <translation id="380329542618494757">이름</translation> <translation id="3803696231112616155">이 사이트 번역 옵션 제공</translation> @@ -941,6 +942,7 @@ <translation id="8870413625673593573">최근에 닫은 탭</translation> <translation id="8876882697946675716">기기 동기화 상태 유지</translation> <translation id="8881801611828450202"><ph name="SEARCH_ENGINE" />에서 이 이미지 검색</translation> +<translation id="8891935667620843985">Chrome을 기본 브라우저 앱으로 설정하면 링크가 자동으로 Chrome에서 열립니다.</translation> <translation id="8898822736010347272">모든 웹 사용자에게 영향을 주는 새로운 위협을 발견하고 사용자를 보호하는 데 도움을 주기 위해 방문한 일부 페이지의 URL, 제한된 시스템 정보, 일부 페이지 콘텐츠를 Google로 전송합니다.</translation> <translation id="8909135823018751308">공유…</translation> <translation id="8917490105272468696">사용</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lo.xtb b/ios/chrome/app/strings/resources/ios_strings_lo.xtb index 53da8076..f83e1d3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lo.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
@@ -329,6 +329,7 @@ <translation id="3775743491439407556">ການຊິ້ງຂໍ້ມູນໃຊ້ບໍ່ໄດ້</translation> <translation id="3779810277399252432">ບໍ່ມີການເຊື່ອມຕໍ່ອິນເຕີເນັດ.</translation> <translation id="3783017676699494206">ບັນທຶກຮູບ</translation> +<translation id="3789294999358192700">ປະຕິບັດຕາມຂັ້ນຕອນລຸ່ມນີ້:</translation> <translation id="3789841737615482174">ຕິດຕັ້ງ</translation> <translation id="380329542618494757">ຊື່</translation> <translation id="3803696231112616155">ສະເໜີແປເວັບໄຊນີ້</translation> @@ -941,6 +942,7 @@ <translation id="8870413625673593573">ປິດບໍ່ດົນມານີ້</translation> <translation id="8876882697946675716">ຊິ້ງຂໍ້ມູນອຸປະກອນຂອງທ່ານສະເໝີ</translation> <translation id="8881801611828450202">ຊອກຫາຮູບນີ້ໃນ <ph name="SEARCH_ENGINE" /></translation> +<translation id="8891935667620843985">ທ່ານສາມາດເປີດລິ້ງຕ່າງໆໃນ Chrome ໂດຍອັດຕະໂນມັດໂດຍການເຮັດໃຫ້ມັນເປັນແອັບໂປຣແກຣມທ່ອງເວັບເລີ່ມຕົ້ນຂອງທ່ານ.</translation> <translation id="8898822736010347272">ສົ່ງ URL ຂອງບາງໜ້າທີ່ທ່ານເຂົ້າເບິ່ງ, ຂໍ້ມູນລະບົບທີ່ຈຳກັດ ແລະ ບາງເນື້ອຫາໃນໜ້າໃຫ້ Google ເພື່ອຊ່ວຍຄົ້ນພົບອັນຕະລາຍໃໝ່ ແລະ ປົກປ້ອງທຸກຄົນໃນເວັບ.</translation> <translation id="8909135823018751308">ແຊຣ໌...</translation> <translation id="8917490105272468696">ແມ່ນ, ຂ້ອຍເຂົ້າຮ່ວມ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mk.xtb b/ios/chrome/app/strings/resources/ios_strings_mk.xtb index 2ea28ac..1448924d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mk.xtb
@@ -474,6 +474,7 @@ <translation id="4979397965658815378">Најавете се со сметката на Google за да ги добиете обележувачите, лозинките, историјата и другите поставки на сите ваши уреди.</translation> <translation id="4986678885919050584">Отстранете ја од уредов</translation> <translation id="4989542687859782284">Недостапни</translation> +<translation id="498985224078955265">За да ја испратите картичкава на друг уред, најавете се на Chrome на двата уреда.</translation> <translation id="5005498671520578047">Копирање лозинка</translation> <translation id="5017828934289857214">Потсети ме подоцна</translation> <translation id="5037676449506322593">Избери сè</translation> @@ -525,6 +526,7 @@ <translation id="5489208564673669003">За да управувате со колачињата за сите сајтови, погледнете ги <ph name="BEGIN_LINK" />Поставките за колачиња<ph name="END_LINK" />.</translation> <translation id="5490005495580364134">Блокирај ги сите колачиња (не се препорачува)</translation> <translation id="5513681519188741830">пред <ph name="TIME" /> ч.</translation> +<translation id="5525095647255982834">За да ја испратите картичкава на друг уред, најавете се на Chrome таму.</translation> <translation id="5525269841082836315">Создај пристапна фраза</translation> <translation id="5542540507657872337">Најдено: <ph name="COUNT" /></translation> <translation id="5548760955356983418">Handoff ви овозможува да започнете со прелистување на веб-локација на уредот и потоа лесно да продолжите на Mac. Моментално отворената веб-локација ќе се појави во Dock на Mac.
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb index d1659726..a5e6a11 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -329,6 +329,7 @@ <translation id="3775743491439407556">സമന്വയം പ്രവർത്തിക്കുന്നില്ല</translation> <translation id="3779810277399252432">ഇന്റർനെറ്റ് കണക്ഷനില്ല.</translation> <translation id="3783017676699494206">ചിത്രം സംരക്ഷിക്കുക</translation> +<translation id="3789294999358192700">ചുവടെയുള്ള ഘട്ടങ്ങൾ പിന്തുടരുക:</translation> <translation id="3789841737615482174">ഇന്സ്റ്റാൾ ചെയ്യുക</translation> <translation id="380329542618494757">പേര്</translation> <translation id="3803696231112616155">ഈ സൈറ്റ് വിവർത്തനം ചെയ്യാനുള്ള അനുമതി</translation> @@ -941,6 +942,7 @@ <translation id="8870413625673593573">സമീപകാലത്ത് അടച്ചവ</translation> <translation id="8876882697946675716">നിങ്ങളുടെ ഉപകരണങ്ങൾ സമന്വയിപ്പിച്ച് നിലനിർത്തുക</translation> <translation id="8881801611828450202">ഈ ചിത്രത്തിനായി <ph name="SEARCH_ENGINE" />-ൽ തിരയുക</translation> +<translation id="8891935667620843985">നിങ്ങളുടെ ഡിഫോൾട്ട് ബ്രൗസർ ആപ്പ് ആയി Chrome സജ്ജീകരിച്ചാൽ നിങ്ങൾക്ക് അതിൽ ലിങ്കുകൾ സ്വയമേവ തുറക്കാം.</translation> <translation id="8898822736010347272">വെബിലെ പുതിയ ഭീഷണികൾ കണ്ടെത്തി എല്ലാവരെയും പരിരക്ഷിക്കാൻ സഹായിക്കുന്നതിന് നിങ്ങൾ സന്ദർശിക്കുന്ന ചില പേജുകളുടെ URL-കൾ, പരിമിത സിസ്റ്റം വിവരങ്ങൾ, ചില പേജുകളുടെ ഉള്ളടക്കം എന്നിവ Google-ലേക്ക് അയയ്ക്കുന്നു.</translation> <translation id="8909135823018751308">പങ്കിടുക...</translation> <translation id="8917490105272468696">അതെ, ഞാൻ തയ്യാറാണ്</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_strings_mn.xtb index f8f4b7b..4d5c40e0 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
@@ -473,6 +473,7 @@ <translation id="4979397965658815378">Хавчуурга, нууц үг, түүх болон бусад тохиргоог бүх төхөөрөмждөө авахын тулд Google Бүртгэлээрээ нэвтэрнэ үү</translation> <translation id="4986678885919050584">Энэ төхөөрөмжөөс хасах</translation> <translation id="4989542687859782284">Боломжгүй</translation> +<translation id="498985224078955265">Энэ табыг өөр төхөөрөмж рүү илгээхийн тулд аль аль төхөөрөмж дээр Chrome-д нэвтэрнэ үү.</translation> <translation id="5005498671520578047">Нууц үг хуулах</translation> <translation id="5017828934289857214">Надад дараа сануулна уу</translation> <translation id="5037676449506322593">Бүгдийг сонгох</translation> @@ -524,6 +525,7 @@ <translation id="5489208564673669003">Бүх сайтын күүкийг удирдахын тулд <ph name="BEGIN_LINK" />Күүкиний тохиргоог<ph name="END_LINK" /> харна уу.</translation> <translation id="5490005495580364134">Бүх күүкиг блоклох (Зөвлөдөггүй)</translation> <translation id="5513681519188741830"><ph name="TIME" /> цагийн өмнө</translation> +<translation id="5525095647255982834">Энэ табыг өөр төхөөрөмж рүү илгээхийн тулд тэндээс Chrome-д нэвтэрнэ үү.</translation> <translation id="5525269841082836315">Нэвтрэх үгийг үүсгэх</translation> <translation id="5542540507657872337"><ph name="COUNT" /> олдсон</translation> <translation id="5548760955356983418">Handoff нь танд энэ төхөөрөмж дээр веб хуудсыг ачаалж, дараа нь Mac дээр хялбархан үргэжлүүлэн ажиллах боломжийг олгодог. Одоо нээлттэй байгаа вебсайт таны Mac-ийн Dock дотор гарч ирнэ.
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb index 9318677..3ec3d43 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -474,6 +474,7 @@ <translation id="4979397965658815378">Log masuk dengan Akaun Google anda untuk mendapatkan penanda halaman, kata laluan, sejarah dan tetapan anda yang lain pada semua peranti anda</translation> <translation id="4986678885919050584">Alih keluar daripada Peranti ini</translation> <translation id="4989542687859782284">Tidak tersedia</translation> +<translation id="498985224078955265">Untuk menghantar tab ini ke peranti lain, log masuk Chrome pada kedua-dua peranti.</translation> <translation id="5005498671520578047">Salin kata laluan</translation> <translation id="5017828934289857214">Ingatkan Saya Kemudian</translation> <translation id="5037676449506322593">Pilih Semua</translation> @@ -525,6 +526,7 @@ <translation id="5489208564673669003">Untuk mengurus kuki bagi semua tapak, lihat <ph name="BEGIN_LINK" />Tetapan Kuki<ph name="END_LINK" />.</translation> <translation id="5490005495580364134">Sekat Semua Kuki (Tidak Disyorkan)</translation> <translation id="5513681519188741830"><ph name="TIME" /> j yang lalu</translation> +<translation id="5525095647255982834">Untuk menghantar tab ini ke peranti lain, log masuk Chrome pada peranti lain itu.</translation> <translation id="5525269841082836315">Buat Frasa Laluan</translation> <translation id="5542540507657872337"><ph name="COUNT" /> Ditemui</translation> <translation id="5548760955356983418">Ciri Serah membolehkan anda mula menyemak imbas laman web pada peranti ini, kemudian meneruskannya pada Mac anda dengan mudah. Tapak web yang dibuka pada masa ini akan muncul dalam Dock Mac anda.
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb index 74f075f..a56d37a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -721,7 +721,7 @@ <translation id="6873263987691478642">Gesplitste weergave</translation> <translation id="6882836635272038266">Standaardbeveiliging tegen websites, downloads en extensies die als gevaarlijk zijn bestempeld.</translation> <translation id="6888009575607455378">Weet je zeker dat je de wijzigingen niet wilt opslaan?</translation> -<translation id="6896758677409633944">Kopieer</translation> +<translation id="6896758677409633944">Kopiëren</translation> <translation id="6897187120838603299">Je wachtwoord wordt opgeslagen op je apparaat.</translation> <translation id="6914583639806229067">Zoeken naar gekopieerde afbeelding</translation> <translation id="6914783257214138813">Je wachtwoorden zijn zichtbaar voor iedereen die het geëxporteerde bestand kan bekijken.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb index 531b023..845a4d8 100644 --- a/ios/chrome/app/strings/resources/ios_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -474,6 +474,7 @@ <translation id="4979397965658815378">Logg på med Google-kontoen din for å få bokmerkene, passordene, loggoppføringene og de andre innstillingene dine på alle enhetene du bruker</translation> <translation id="4986678885919050584">Fjern fra denne enheten</translation> <translation id="4989542687859782284">Utilgjengelig</translation> +<translation id="498985224078955265">For å sende denne fanen til en annen enhet, logg på Chrome på begge enhetene.</translation> <translation id="5005498671520578047">Kopiér passordet</translation> <translation id="5017828934289857214">Påminn meg senere</translation> <translation id="5037676449506322593">Velg alle</translation> @@ -525,6 +526,7 @@ <translation id="5489208564673669003">For å administrere informasjonskapsler for alle nettsteder, se <ph name="BEGIN_LINK" />Innstillinger for informasjonskapsler<ph name="END_LINK" />.</translation> <translation id="5490005495580364134">Blokkér alle informasjonskapsler (anbefales ikke)</translation> <translation id="5513681519188741830">For <ph name="TIME" /> t siden</translation> +<translation id="5525095647255982834">For å sende denne fanen til en annen enhet, logg på Chrome der.</translation> <translation id="5525269841082836315">Opprett en passordfrase</translation> <translation id="5542540507657872337"><ph name="COUNT" /> er funnet</translation> <translation id="5548760955356983418">Med Handoff kan du begynne å se gjennom en nettside på denne enheten og deretter fortsette på Mac-en din uten problemer. Den åpne nettsiden vises i dokken til Mac-en din.
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb index a3aaf3f..1ffafdd 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -474,6 +474,7 @@ <translation id="4979397965658815378">Conectează-te folosind Contul Google pentru a accesa marcajele, parolele, istoricul și alte setări pe toate dispozitivele</translation> <translation id="4986678885919050584">Elimină de pe acest dispozitiv</translation> <translation id="4989542687859782284">Indisponibile</translation> +<translation id="498985224078955265">Pentru a trimite fila pe alt dispozitiv, conectează-te la Chrome pe ambele dispozitive.</translation> <translation id="5005498671520578047">Copiază parola</translation> <translation id="5017828934289857214">Amintește-mi mai târziu</translation> <translation id="5037676449506322593">Selectează tot</translation> @@ -525,6 +526,7 @@ <translation id="5489208564673669003">Pentru a gestiona cookie-urile pentru toate site-urile, consultă <ph name="BEGIN_LINK" />Setări pentru cookie-uri<ph name="END_LINK" />.</translation> <translation id="5490005495580364134">Blochează toate cookie-urile (nu este recomandat)</translation> <translation id="5513681519188741830">acum <ph name="TIME" /> h</translation> +<translation id="5525095647255982834">Pentru a trimite fila pe alt dispozitiv, conectează-te la Chrome pe dispozitivul respectiv.</translation> <translation id="5525269841082836315">Creează o expresie de acces</translation> <translation id="5542540507657872337">S-au găsit <ph name="COUNT" /></translation> <translation id="5548760955356983418">Cu Handoff, începi să navighezi pe un site de pe acest dispozitiv, apoi continui cu ușurință de pe Mac. Site-ul deschis actual va apărea în Dock pe Mac.
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb index eece22a..440b8b15 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -329,6 +329,7 @@ <translation id="3775743491439407556">Sinhronizacija ne deluje</translation> <translation id="3779810277399252432">Ni internetne povezave.</translation> <translation id="3783017676699494206">Shrani sliko</translation> +<translation id="3789294999358192700">Upoštevajte spodnja navodila:</translation> <translation id="3789841737615482174">Namesti</translation> <translation id="380329542618494757">Ime</translation> <translation id="3803696231112616155">Ponudi prevod tega spletnega mesta</translation> @@ -941,6 +942,7 @@ <translation id="8870413625673593573">Nedavno zaprto</translation> <translation id="8876882697946675716">Poskrbite za sinhroniziranost naprav</translation> <translation id="8881801611828450202">Uporabi <ph name="SEARCH_ENGINE" /> za iskanje te slike</translation> +<translation id="8891935667620843985">Če nastavite Chrome kot privzeto aplikacijo za brskanje, lahko samodejno odpirate povezave v njem.</translation> <translation id="8898822736010347272">Pošilja URL-je nekaterih strani, ki jih obiščete, omejene podatke o sistemu in nekatere vsebine strani Googlu zaradi pomoči pri odkrivanju novih groženj in zaščiti vseh uporabnikov v spletu.</translation> <translation id="8909135823018751308">Skupna raba …</translation> <translation id="8917490105272468696">Da, sem za</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb index efde94e2..c3300e9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -329,6 +329,7 @@ <translation id="3775743491439407556">Kipengele cha Kusawazisha Hakifanyi Kazi</translation> <translation id="3779810277399252432">Hakuna muunganisho wa intaneti.</translation> <translation id="3783017676699494206">Hifadhi Picha</translation> +<translation id="3789294999358192700">Fuata hatua zifuatazo:</translation> <translation id="3789841737615482174">Sakinisha</translation> <translation id="380329542618494757">Jina</translation> <translation id="3803696231112616155">Jitolee kutafsiri tovuti hii</translation> @@ -941,6 +942,7 @@ <translation id="8870413625673593573">Zilizofungwa Hivi Karibuni</translation> <translation id="8876882697946675716">Hakikisha Vifaa Vyako Vinasawazishwa</translation> <translation id="8881801611828450202">Tafuta Picha Hii kwenye <ph name="SEARCH_ENGINE" /></translation> +<translation id="8891935667620843985">Unaweza kufungua viungo kiotomatiki katika Chrome kwa kuiweka iwe Programu yako Chaguomsingi ya Kuvinjari.</translation> <translation id="8898822736010347272">Hutuma URL za baadhi ya kurasa unazotembelea, maelezo machache ya mfumo na baadhi ya maudhui ya kurasa kwa Google, ili kusaidia kugundua na kuzuia vitisho vipya na kulinda kila mtu kwenye wavuti.</translation> <translation id="8909135823018751308">Shiriki...</translation> <translation id="8917490105272468696">Ndiyo, Ninakubali</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb index 7b581e7..0363264 100644 --- a/ios/chrome/app/strings/resources/ios_strings_th.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -474,6 +474,7 @@ <translation id="4979397965658815378">ลงชื่อเข้าใช้บัญชี Google เพื่อรับบุ๊กมาร์ก รหัสผ่าน ประวัติการเข้าชม และการตั้งค่าอื่นๆ บนอุปกรณ์ทั้งหมดของคุณ</translation> <translation id="4986678885919050584">นำออกจากอุปกรณ์นี้</translation> <translation id="4989542687859782284">ไม่มี</translation> +<translation id="498985224078955265">หากต้องการส่งแท็บนี้ไปยังอุปกรณ์อื่น ให้ลงชื่อเข้าใช้ Chrome ในอุปกรณ์ทั้ง 2 เครื่อง</translation> <translation id="5005498671520578047">คัดลอกรหัสผ่าน</translation> <translation id="5017828934289857214">เตือนฉันภายหลัง</translation> <translation id="5037676449506322593">เลือก&ทั้งหมด</translation> @@ -525,6 +526,7 @@ <translation id="5489208564673669003">ดู<ph name="BEGIN_LINK" />การตั้งค่าคุกกี้<ph name="END_LINK" />เพื่อจัดการคุกกี้สำหรับทุกเว็บไซต์</translation> <translation id="5490005495580364134">บล็อกคุกกี้ทั้งหมด (ไม่แนะนำ)</translation> <translation id="5513681519188741830"><ph name="TIME" /> ชม. ที่ผ่านมา</translation> +<translation id="5525095647255982834">หากต้องการส่งแท็บนี้ไปยังอุปกรณ์อื่น ให้ลงชื่อเข้าใช้ Chrome ในอุปกรณ์นั้น</translation> <translation id="5525269841082836315">สร้างข้อความรหัสผ่าน</translation> <translation id="5542540507657872337">พบ <ph name="COUNT" /> แท็บ</translation> <translation id="5548760955356983418">Handoff ช่วยให้คุณสามารถเริ่มการท่องเว็บไซต์บนอุปกรณ์นี้และใช้งานต่อบน Mac ได้อย่างง่ายดาย เว็บไซต์ที่เปิดอยู่ในปัจจุบันจะปรากฏในแท่นชาร์จของ Mac
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb index 00f31a773..a62cb70 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -329,6 +329,7 @@ <translation id="3775743491439407556">Синхронізація не працює</translation> <translation id="3779810277399252432">Немає з’єднання з Інтернетом</translation> <translation id="3783017676699494206">Зберегти зображення</translation> +<translation id="3789294999358192700">Для цього виконайте наведені нижче дії.</translation> <translation id="3789841737615482174">Установити</translation> <translation id="380329542618494757">Повне ім’я</translation> <translation id="3803696231112616155">Пропонувати переклад для цього сайту</translation> @@ -941,6 +942,7 @@ <translation id="8870413625673593573">Нещодавно закриті</translation> <translation id="8876882697946675716">Синхронізуйте свої пристрої</translation> <translation id="8881801611828450202">Пошук цього зображення в <ph name="SEARCH_ENGINE" /></translation> +<translation id="8891935667620843985">Щоб автоматично відкривати посилання в додатку Chrome, зробіть його своїм веб-переглядачем за умовчанням</translation> <translation id="8898822736010347272">Надсилає в Google URL-адреси відвіданих сторінок, обмежену системну інформацію та вміст деяких сторінок, щоб виявляти нові загрози та захищати всіх користувачів в Інтернеті.</translation> <translation id="8909135823018751308">Надіслати…</translation> <translation id="8917490105272468696">Так</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb index 58089b2..d03b148 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
@@ -329,6 +329,7 @@ <translation id="3775743491439407556">同步功能無法正常運作</translation> <translation id="3779810277399252432">沒有互聯網連線。</translation> <translation id="3783017676699494206">儲存圖片</translation> +<translation id="3789294999358192700">步驟如下:</translation> <translation id="3789841737615482174">安裝</translation> <translation id="380329542618494757">名稱</translation> <translation id="3803696231112616155">為此網站提供翻譯選項</translation> @@ -939,6 +940,7 @@ <translation id="8870413625673593573">最近關閉的分頁</translation> <translation id="8876882697946675716">讓您的裝置保持同步</translation> <translation id="8881801611828450202">在 <ph name="SEARCH_ENGINE" /> 中搜尋此圖片</translation> +<translation id="8891935667620843985">只要將 Chrome 設為預設瀏覽器應用程式,即可自動在 Chrome 中開啟連結。</translation> <translation id="8898822736010347272">向 Google 傳送部分您瀏覽網頁的網址、特定的系統資料及部分網頁內容,以協助探索新威脅,並保護所有網絡使用者。</translation> <translation id="8909135823018751308">共用…</translation> <translation id="8917490105272468696">係,我同意</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb index c0b343d..a6c8880 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -329,6 +329,7 @@ <translation id="3775743491439407556">同步功能無法正常運作</translation> <translation id="3779810277399252432">沒有網際網路連線。</translation> <translation id="3783017676699494206">儲存圖片</translation> +<translation id="3789294999358192700">步驟如下:</translation> <translation id="3789841737615482174">安裝</translation> <translation id="380329542618494757">姓名</translation> <translation id="3803696231112616155">針對這個網站提供翻譯選項</translation> @@ -941,6 +942,7 @@ <translation id="8870413625673593573">最近關閉的分頁</translation> <translation id="8876882697946675716">讓你的裝置保持同步</translation> <translation id="8881801611828450202">透過 <ph name="SEARCH_ENGINE" /> 搜尋這張圖片</translation> +<translation id="8891935667620843985">只要將 Chrome 設為預設瀏覽器應用程式,即可自動在 Chrome 中開啟連結。</translation> <translation id="8898822736010347272">將部分已造訪網頁的網址、特定的系統資訊和部分網頁內容傳送至 Google,以協助發現新威脅並保障所有網路使用者的安全。</translation> <translation id="8909135823018751308">分享…</translation> <translation id="8917490105272468696">是,我同意</translation>
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details.h b/ios/chrome/browser/ui/settings/password/password_details/password_details.h index e0086711..b7bda59 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/password_details.h +++ b/ios/chrome/browser/ui/settings/password/password_details/password_details.h
@@ -10,7 +10,7 @@ #include "url/gurl.h" namespace password_manager { -struct PasswordForm; +struct CredentialUIEntry; } // namespace password_manager // Object which is used by `PasswordDetailsViewController` to show @@ -38,7 +38,8 @@ // URL which allows to change the password of compromised credential. @property(nonatomic, readonly) GURL changePasswordURL; -- (instancetype)initWithPasswordForm:(const password_manager::PasswordForm&)form +- (instancetype)initWithCredential: + (const password_manager::CredentialUIEntry&)credential NS_DESIGNATED_INITIALIZER; - (instancetype)init NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details.mm b/ios/chrome/browser/ui/settings/password/password_details/password_details.mm index 96dc6c3..98404dc 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/password_details.mm +++ b/ios/chrome/browser/ui/settings/password/password_details/password_details.mm
@@ -6,8 +6,8 @@ #include "base/strings/sys_string_conversions.h" #include "components/password_manager/core/browser/android_affiliation/affiliation_utils.h" -#include "components/password_manager/core/browser/password_form.h" -#include "components/password_manager/core/browser/password_ui_utils.h" +#import "components/password_manager/core/browser/password_ui_utils.h" +#import "components/password_manager/core/browser/ui/credential_ui_entry.h" #include "components/password_manager/core/browser/well_known_change_password_util.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -16,37 +16,40 @@ @implementation PasswordDetails -- (instancetype)initWithPasswordForm: - (const password_manager::PasswordForm&)form { +- (instancetype)initWithCredential: + (const password_manager::CredentialUIEntry&)credential { self = [super init]; if (self) { auto facetUri = password_manager::FacetURI::FromPotentiallyInvalidSpec( - form.signon_realm); + credential.signon_realm); if (facetUri.IsValidAndroidFacetURI()) { - if (!form.app_display_name.empty()) { + if (!credential.app_display_name.empty()) { _changePasswordURL = password_manager::CreateChangePasswordUrl( - GURL(form.affiliated_web_realm)); - _origin = base::SysUTF8ToNSString(form.app_display_name); - _website = base::SysUTF8ToNSString(form.app_display_name); + GURL(credential.affiliated_web_realm)); + _origin = base::SysUTF8ToNSString(credential.app_display_name); + _website = base::SysUTF8ToNSString(credential.app_display_name); } else { _origin = base::SysUTF8ToNSString(facetUri.android_package_name()); _website = base::SysUTF8ToNSString(facetUri.android_package_name()); } } else { - auto nameWithLink = password_manager::GetShownOriginAndLinkUrl(form); - _origin = base::SysUTF8ToNSString(nameWithLink.first); - _website = base::SysUTF8ToNSString(nameWithLink.second.spec()); - _changePasswordURL = password_manager::CreateChangePasswordUrl(form.url); + _origin = + base::SysUTF8ToNSString(password_manager::GetShownOrigin(credential)); + _website = base::SysUTF8ToNSString( + password_manager::GetShownUrl(credential).spec()); + _changePasswordURL = + password_manager::CreateChangePasswordUrl(credential.url); } - if (!form.blocked_by_user) { - _username = base::SysUTF16ToNSString(form.username_value); + if (!credential.blocked_by_user) { + _username = base::SysUTF16ToNSString(credential.username); } - if (form.federation_origin.opaque()) { - _password = base::SysUTF16ToNSString(form.password_value); + if (credential.federation_origin.opaque()) { + _password = base::SysUTF16ToNSString(credential.password); } else { - _federation = base::SysUTF8ToNSString(form.federation_origin.host()); + _federation = + base::SysUTF8ToNSString(credential.federation_origin.host()); } } return self;
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.h b/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.h index 966f508..70d9b5f 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.h +++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.h
@@ -8,7 +8,7 @@ #import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h" namespace password_manager { -struct PasswordForm; +struct CredentialUIEntry; } // namespace password_manager @protocol ApplicationCommands; @@ -24,8 +24,9 @@ initWithBaseNavigationController: (UINavigationController*)navigationController browser:(Browser*)browser - password: - (const password_manager::PasswordForm&)password + credential: + (const password_manager::CredentialUIEntry&) + credential reauthModule:(ReauthenticationModule*)reauthModule passwordCheckManager:(IOSChromePasswordCheckManager*)manager NS_DESIGNATED_INITIALIZER;
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.mm b/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.mm index 02ba819..5ade5ff0 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.mm +++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.mm
@@ -7,8 +7,8 @@ #include "base/mac/foundation_util.h" #include "base/metrics/histogram_functions.h" #include "base/strings/sys_string_conversions.h" -#include "components/password_manager/core/browser/password_form.h" #include "components/password_manager/core/browser/password_manager_metrics_util.h" +#import "components/password_manager/core/browser/ui/credential_ui_entry.h" #include "components/strings/grit/components_strings.h" #import "ios/chrome/browser/main/browser.h" #import "ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h" @@ -32,7 +32,7 @@ #endif @interface PasswordDetailsCoordinator () <PasswordDetailsHandler> { - password_manager::PasswordForm _password; + password_manager::CredentialUIEntry _credential; // Manager responsible for password check feature. IOSChromePasswordCheckManager* _manager; @@ -68,8 +68,9 @@ initWithBaseNavigationController: (UINavigationController*)navigationController browser:(Browser*)browser - password: - (const password_manager::PasswordForm&)password + credential: + (const password_manager::CredentialUIEntry&) + credential reauthModule:(ReauthenticationModule*)reauthModule passwordCheckManager:(IOSChromePasswordCheckManager*)manager { self = [super initWithBaseViewController:navigationController @@ -79,13 +80,13 @@ DCHECK(manager); _baseNavigationController = navigationController; - _password = password; + _credential = credential; _manager = manager; _reauthenticationModule = reauthModule; - _credentialType = password.blocked_by_user ? CredentialTypeBlocked - : CredentialTypeRegular; + _credentialType = credential.blocked_by_user ? CredentialTypeBlocked + : CredentialTypeRegular; if (_credentialType == CredentialTypeRegular && - !_password.federation_origin.opaque()) { + !credential.federation_origin.opaque()) { _credentialType = CredentialTypeFederation; } } @@ -97,7 +98,7 @@ initWithCredentialType:_credentialType syncingUserEmail:nil]; - self.mediator = [[PasswordDetailsMediator alloc] initWithPassword:_password + self.mediator = [[PasswordDetailsMediator alloc] initWithPassword:_credential passwordCheckManager:_manager]; self.mediator.consumer = self.viewController; self.viewController.handler = self; @@ -232,7 +233,7 @@ // Notifies delegate about password deletion and records metric if needed. - (void)passwordDeletionConfirmedForCompromised:(BOOL)compromised { [self.delegate passwordDetailsCoordinator:self - deletePassword:self.mediator.password]; + deleteCredential:self.mediator.credential]; if (compromised) { base::UmaHistogramEnumeration( "PasswordManager.BulkCheck.UserAction",
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator_delegate.h b/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator_delegate.h index 16066113..bcf1de05 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator_delegate.h +++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator_delegate.h
@@ -6,7 +6,7 @@ #define IOS_CHROME_BROWSER_UI_SETTINGS_PASSWORD_PASSWORD_DETAILS_PASSWORD_DETAILS_COORDINATOR_DELEGATE_H_ namespace password_manager { -struct PasswordForm; +struct CredentialUIEntry; } // namespace password_manager @class PasswordDetailsCoordinator; @@ -21,8 +21,8 @@ // Called when user deleted password. This action should be handled // outside to update the list of passwords immediately. - (void)passwordDetailsCoordinator:(PasswordDetailsCoordinator*)coordinator - deletePassword: - (const password_manager::PasswordForm&)password; + deleteCredential: + (const password_manager::CredentialUIEntry&)credential; @end
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator.h b/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator.h index 7a1be8b2..285a23d 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator.h +++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator.h
@@ -10,7 +10,7 @@ #import "ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller_delegate.h" namespace password_manager { -struct PasswordForm; +struct CredentialUIEntry; } // namespace password_manager class IOSChromePasswordCheckManager; @@ -20,9 +20,10 @@ @interface PasswordDetailsMediator : NSObject <PasswordDetailsTableViewControllerDelegate> -// PasswordForm is converted to the PasswordDetails and passed to a consumer. +// CredentialUIEntry is converted to the PasswordDetails and passed to a +// consumer. - (instancetype)initWithPassword: - (const password_manager::PasswordForm&)passwordForm + (const password_manager::CredentialUIEntry&)credential passwordCheckManager:(IOSChromePasswordCheckManager*)manager NS_DESIGNATED_INITIALIZER; @@ -32,7 +33,7 @@ @property(nonatomic, weak) id<PasswordDetailsConsumer> consumer; // Password passed to the mediator. -@property(nonatomic, readonly) password_manager::PasswordForm password; +@property(nonatomic, readonly) password_manager::CredentialUIEntry credential; // Disconnects the mediator from all observers. - (void)disconnect;
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator.mm b/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator.mm index 16dd0fb..294d7579 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator.mm +++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator.mm
@@ -5,7 +5,7 @@ #import "ios/chrome/browser/ui/settings/password/password_details/password_details_mediator.h" #include "base/strings/sys_string_conversions.h" -#include "components/password_manager/core/browser/password_form.h" +#import "components/password_manager/core/browser/ui/credential_ui_entry.h" #include "ios/chrome/browser/passwords/password_check_observer_bridge.h" #import "ios/chrome/browser/ui/settings/password/password_details/password_details.h" #import "ios/chrome/browser/ui/settings/password/password_details/password_details_consumer.h" @@ -37,23 +37,22 @@ @implementation PasswordDetailsMediator - (instancetype)initWithPassword: - (const password_manager::PasswordForm&)passwordForm + (const password_manager::CredentialUIEntry&)credential passwordCheckManager:(IOSChromePasswordCheckManager*)manager { self = [super init]; if (self) { _manager = manager; - _password = passwordForm; + _credential = credential; _passwordCheckObserver.reset( new PasswordCheckObserverBridge(self, manager)); NSMutableSet<NSString*>* usernames = [[NSMutableSet alloc] init]; auto forms = manager->GetAllCredentials(); for (const auto& form : forms) { - if (form.signon_realm == passwordForm.signon_realm) { + if (form.signon_realm == credential.signon_realm) { [usernames addObject:base::SysUTF16ToNSString(form.username_value)]; } } - [usernames - removeObject:base::SysUTF16ToNSString(passwordForm.username_value)]; + [usernames removeObject:base::SysUTF16ToNSString(credential.username)]; _usernamesWithSameDomain = usernames; } return self; @@ -77,11 +76,13 @@ (PasswordDetailsTableViewController*)viewController didEditPasswordDetails:(PasswordDetails*)password { if ([password.password length] != 0) { - if (_manager->EditPasswordForm(_password, - SysNSStringToUTF16(password.username), - SysNSStringToUTF16(password.password))) { - _password.username_value = SysNSStringToUTF16(password.username); - _password.password_value = SysNSStringToUTF16(password.password); + password_manager::CredentialUIEntry updated_credential = _credential; + updated_credential.username = SysNSStringToUTF16(password.username); + updated_credential.password = SysNSStringToUTF16(password.password); + if (_manager->GetSavedPasswordsPresenter()->EditSavedCredentials( + _credential, updated_credential) == + password_manager::SavedPasswordsPresenter::EditResult::kSuccess) { + _credential = updated_credential; return; } } @@ -141,14 +142,14 @@ // Updates password details and sets it to a consumer. - (void)fetchPasswordWith:(InsecureCredentialsView)credentials { PasswordDetails* password = - [[PasswordDetails alloc] initWithPasswordForm:_password]; + [[PasswordDetails alloc] initWithCredential:_credential]; password.compromised = NO; for (const auto& credential : credentials) { if (std::tie(credential.signon_realm, credential.username, - credential.password) == std::tie(_password.signon_realm, - _password.username_value, - _password.password_value)) + credential.password) == std::tie(_credential.signon_realm, + _credential.username, + _credential.password)) password.compromised = YES; }
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller_unittest.mm index e14ca8f3..ffe5773e 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller_unittest.mm
@@ -10,7 +10,8 @@ #include "base/mac/foundation_util.h" #include "base/strings/utf_string_conversions.h" #include "base/test/scoped_feature_list.h" -#include "components/password_manager/core/browser/password_form.h" +#import "components/password_manager/core/browser/password_form.h" +#import "components/password_manager/core/browser/ui/credential_ui_entry.h" #include "components/password_manager/core/common/password_manager_features.h" #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" #import "ios/chrome/browser/ui/commands/snackbar_commands.h" @@ -192,8 +193,8 @@ form.username_element = u"email"; form.scheme = password_manager::PasswordForm::Scheme::kHtml; - PasswordDetails* passwordDetails = - [[PasswordDetails alloc] initWithPasswordForm:form]; + PasswordDetails* passwordDetails = [[PasswordDetails alloc] + initWithCredential:password_manager::CredentialUIEntry(form)]; passwordDetails.compromised = isCompromised; PasswordDetailsTableViewController* passwords_controller = @@ -209,8 +210,8 @@ form.signon_realm = form.url.spec(); form.federation_origin = url::Origin::Create(GURL("http://www.example.com/")); - PasswordDetails* password = - [[PasswordDetails alloc] initWithPasswordForm:form]; + PasswordDetails* password = [[PasswordDetails alloc] + initWithCredential:password_manager::CredentialUIEntry(form)]; PasswordDetailsTableViewController* passwords_controller = static_cast<PasswordDetailsTableViewController*>(controller()); [passwords_controller setPassword:password]; @@ -222,8 +223,8 @@ form.url = GURL("http://www.example.com/"); form.blocked_by_user = true; form.signon_realm = form.url.spec(); - PasswordDetails* password = - [[PasswordDetails alloc] initWithPasswordForm:form]; + PasswordDetails* password = [[PasswordDetails alloc] + initWithCredential:password_manager::CredentialUIEntry(form)]; PasswordDetailsTableViewController* passwords_controller = static_cast<PasswordDetailsTableViewController*>(controller()); [passwords_controller setPassword:password];
diff --git a/ios/chrome/browser/ui/settings/password/password_issues_coordinator.h b/ios/chrome/browser/ui/settings/password/password_issues_coordinator.h index 3720237..c71cd250 100644 --- a/ios/chrome/browser/ui/settings/password/password_issues_coordinator.h +++ b/ios/chrome/browser/ui/settings/password/password_issues_coordinator.h
@@ -8,7 +8,7 @@ #import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h" namespace password_manager { -struct PasswordForm; +struct CredentialUIEntry; } // namespace password_manager @protocol ApplicationCommands; @@ -27,7 +27,7 @@ // Called when the user deleted password. Returns whether presenter will // handle it or not. - (BOOL)willHandlePasswordDeletion: - (const password_manager::PasswordForm&)password; + (const password_manager::CredentialUIEntry&)credential; @end
diff --git a/ios/chrome/browser/ui/settings/password/password_issues_coordinator.mm b/ios/chrome/browser/ui/settings/password/password_issues_coordinator.mm index 7210f06..a2941e2 100644 --- a/ios/chrome/browser/ui/settings/password/password_issues_coordinator.mm +++ b/ios/chrome/browser/ui/settings/password/password_issues_coordinator.mm
@@ -122,7 +122,7 @@ self.passwordDetails = [[PasswordDetailsCoordinator alloc] initWithBaseNavigationController:self.baseNavigationController browser:self.browser - password:form + credential:password_manager::CredentialUIEntry(form) reauthModule:self.reauthModule passwordCheckManager:_manager]; self.passwordDetails.delegate = self; @@ -140,10 +140,10 @@ } - (void)passwordDetailsCoordinator:(PasswordDetailsCoordinator*)coordinator - deletePassword: - (const password_manager::PasswordForm&)password { - if (![self.delegate willHandlePasswordDeletion:password]) { - [self.mediator deletePassword:password]; + deleteCredential: + (const password_manager::CredentialUIEntry&)credential { + if (![self.delegate willHandlePasswordDeletion:credential]) { + [self.mediator deleteCredential:credential]; } [self.baseNavigationController popViewControllerAnimated:YES]; }
diff --git a/ios/chrome/browser/ui/settings/password/password_issues_mediator.h b/ios/chrome/browser/ui/settings/password/password_issues_mediator.h index 9590909..7154a4a 100644 --- a/ios/chrome/browser/ui/settings/password/password_issues_mediator.h +++ b/ios/chrome/browser/ui/settings/password/password_issues_mediator.h
@@ -12,7 +12,7 @@ #import "ios/chrome/common/ui/reauthentication/reauthentication_module.h" namespace password_manager { -struct PasswordForm; +struct CredentialUIEntry; } // namespace password_manager class FaviconLoader; @@ -34,7 +34,7 @@ @property(nonatomic, weak) id<PasswordIssuesConsumer> consumer; // Deletes password from the password store. -- (void)deletePassword:(const password_manager::PasswordForm&)password; +- (void)deleteCredential:(const password_manager::CredentialUIEntry&)credential; @end
diff --git a/ios/chrome/browser/ui/settings/password/password_issues_mediator.mm b/ios/chrome/browser/ui/settings/password/password_issues_mediator.mm index d6dca69..2218c5e 100644 --- a/ios/chrome/browser/ui/settings/password/password_issues_mediator.mm +++ b/ios/chrome/browser/ui/settings/password/password_issues_mediator.mm
@@ -66,17 +66,9 @@ [self fetchPasswordIssues]; } -- (void)deletePassword:(const password_manager::PasswordForm&)password { - for (const auto& credential : _unmutedCompromisedCredentials) { - if (std::tie(credential.signon_realm, credential.username, - credential.password) == std::tie(password.signon_realm, - password.username_value, - password.password_value)) { - _manager->DeleteCompromisedPasswordForm(password); - return; - } - } - _manager->DeletePasswordForm(password); +- (void)deleteCredential: + (const password_manager::CredentialUIEntry&)credential { + _manager->GetSavedPasswordsPresenter()->RemoveCredential(credential); // TODO:(crbug.com/1075494) - Update list of compromised passwords without // awaiting compromisedCredentialsDidChange. }
diff --git a/ios/chrome/browser/ui/settings/password/password_issues_mediator_unittest.mm b/ios/chrome/browser/ui/settings/password/password_issues_mediator_unittest.mm index 647a78af..5fe0c38e 100644 --- a/ios/chrome/browser/ui/settings/password/password_issues_mediator_unittest.mm +++ b/ios/chrome/browser/ui/settings/password/password_issues_mediator_unittest.mm
@@ -9,6 +9,7 @@ #include "base/strings/utf_string_conversions.h" #include "components/password_manager/core/browser/password_manager_test_utils.h" #include "components/password_manager/core/browser/test_password_store.h" +#import "components/password_manager/core/browser/ui/credential_ui_entry.h" #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" #import "ios/chrome/browser/favicon/favicon_loader.h" #include "ios/chrome/browser/favicon/ios_chrome_favicon_loader_factory.h" @@ -167,7 +168,7 @@ EXPECT_EQ(1u, [[consumer() passwords] count]); auto password = store()->stored_passwords().at(kExampleCom).at(0); - [mediator() deletePassword:password]; + [mediator() deleteCredential:password_manager::CredentialUIEntry(password)]; RunUntilIdle(); EXPECT_EQ(0u, [[consumer() passwords] count]); }
diff --git a/ios/chrome/browser/ui/settings/password/passwords_coordinator.mm b/ios/chrome/browser/ui/settings/password/passwords_coordinator.mm index d064ef2..9ec9b029 100644 --- a/ios/chrome/browser/ui/settings/password/passwords_coordinator.mm +++ b/ios/chrome/browser/ui/settings/password/passwords_coordinator.mm
@@ -7,6 +7,7 @@ #include "base/metrics/histogram_functions.h" #include "components/keyed_service/core/service_access_type.h" #include "components/password_manager/core/browser/password_manager_metrics_util.h" +#import "components/password_manager/core/browser/ui/credential_ui_entry.h" #include "components/password_manager/core/common/password_manager_features.h" #import "ios/chrome/browser/favicon/favicon_loader.h" #include "ios/chrome/browser/favicon/ios_chrome_favicon_loader_factory.h" @@ -176,7 +177,7 @@ self.passwordDetailsCoordinator = [[PasswordDetailsCoordinator alloc] initWithBaseNavigationController:self.baseNavigationController browser:self.browser - password:form + credential:password_manager::CredentialUIEntry(form) reauthModule:self.reauthModule passwordCheckManager:[self passwordCheckManager].get()]; self.passwordDetailsCoordinator.delegate = self; @@ -221,8 +222,8 @@ } - (BOOL)willHandlePasswordDeletion: - (const password_manager::PasswordForm&)password { - [self.mediator deletePasswordForm:password]; + (const password_manager::CredentialUIEntry&)credential { + [self.mediator deleteCredential:credential]; return YES; } @@ -237,10 +238,10 @@ } - (void)passwordDetailsCoordinator:(PasswordDetailsCoordinator*)coordinator - deletePassword: - (const password_manager::PasswordForm&)password { + deleteCredential: + (const password_manager::CredentialUIEntry&)credential { DCHECK_EQ(self.passwordDetailsCoordinator, coordinator); - [self.mediator deletePasswordForm:password]; + [self.mediator deleteCredential:credential]; [self.baseNavigationController popViewControllerAnimated:YES]; }
diff --git a/ios/chrome/browser/ui/settings/password/passwords_mediator.h b/ios/chrome/browser/ui/settings/password/passwords_mediator.h index 2f6d35e6..fb0b7cc 100644 --- a/ios/chrome/browser/ui/settings/password/passwords_mediator.h +++ b/ios/chrome/browser/ui/settings/password/passwords_mediator.h
@@ -20,6 +20,10 @@ @protocol PasswordsConsumer; class SyncSetupService; +namespace password_manager { +struct CredentialUIEntry; +} + // This mediator fetches and organises the passwords for its consumer. @interface PasswordsMediator : NSObject <PasswordAutoFillStatusObserver, PasswordManagerViewControllerDelegate, @@ -38,7 +42,7 @@ - (instancetype)init NS_UNAVAILABLE; // Deletes 'form' and its duplicates. -- (void)deletePasswordForm:(const password_manager::PasswordForm&)form; +- (void)deleteCredential:(const password_manager::CredentialUIEntry&)credential; // Disconnect the observers. - (void)disconnect;
diff --git a/ios/chrome/browser/ui/settings/password/passwords_mediator.mm b/ios/chrome/browser/ui/settings/password/passwords_mediator.mm index 3e950896..7612604 100644 --- a/ios/chrome/browser/ui/settings/password/passwords_mediator.mm +++ b/ios/chrome/browser/ui/settings/password/passwords_mediator.mm
@@ -149,8 +149,9 @@ .size()]; } -- (void)deletePasswordForm:(const password_manager::PasswordForm&)form { - _savedPasswordsPresenter->RemovePassword(form); +- (void)deleteCredential: + (const password_manager::CredentialUIEntry&)credential { + _savedPasswordsPresenter->RemoveCredential(credential); } - (void)disconnect {
diff --git a/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm b/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm index e5b3944..7178bb21 100644 --- a/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm +++ b/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm
@@ -11,6 +11,7 @@ #include "base/test/scoped_feature_list.h" #include "components/password_manager/core/browser/password_manager_test_utils.h" #include "components/password_manager/core/browser/test_password_store.h" +#import "components/password_manager/core/browser/ui/credential_ui_entry.h" #include "components/password_manager/core/common/password_manager_features.h" #include "components/password_manager/core/common/password_manager_pref_names.h" #include "components/prefs/testing_pref_service.h" @@ -211,7 +212,7 @@ RunUntilIdle(); ASSERT_THAT([consumer() savedForms], testing::ElementsAre(form)); - [mediator() deletePasswordForm:form]; + [mediator() deleteCredential:password_manager::CredentialUIEntry(form)]; RunUntilIdle(); EXPECT_THAT([consumer() savedForms], testing::IsEmpty()); }
diff --git a/ios/chrome/browser/ui/settings/safety_check/safety_check_coordinator.mm b/ios/chrome/browser/ui/settings/safety_check/safety_check_coordinator.mm index 9ee23fb..1b2c02e 100644 --- a/ios/chrome/browser/ui/settings/safety_check/safety_check_coordinator.mm +++ b/ios/chrome/browser/ui/settings/safety_check/safety_check_coordinator.mm
@@ -281,7 +281,7 @@ } - (BOOL)willHandlePasswordDeletion: - (const password_manager::PasswordForm&)password { + (const password_manager::CredentialUIEntry&)credential { return NO; }
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm b/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm index da5c34d6..2bb9655 100644 --- a/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm +++ b/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm
@@ -324,12 +324,6 @@ // Types JavaScript into Omnibox and verify that an alert is displayed. - (void)testTypeJavaScriptIntoOmnibox { -// TODO(crbug.com/1067819): Test won't pass on iPad devices. -#if !TARGET_IPHONE_SIMULATOR - if ([ChromeEarlGrey isIPadIdiom]) { - EARL_GREY_TEST_SKIPPED(@"This test doesn't pass on iPad device."); - } -#endif [ChromeEarlGrey loadURL:self.testServer->GetURL("/echo")]; [ChromeEarlGreyUI focusOmniboxAndType:@"javascript:alert('Hello');\n"]; @@ -351,12 +345,6 @@ // not displayed. WebUI pages have elevated privileges and should not allow // script execution. - (void)testTypeJavaScriptIntoOmniboxWithWebUIPage { -// TODO(crbug.com/1067819): Test won't pass on iPad devices. -#if !TARGET_IPHONE_SIMULATOR - if ([ChromeEarlGrey isIPadIdiom]) { - EARL_GREY_TEST_SKIPPED(@"This test doesn't pass on iPad device."); - } -#endif [ChromeEarlGrey loadURL:GURL("chrome://version")]; [ChromeEarlGreyUI focusOmniboxAndType:@"javascript:alert('Hello');\n"];
diff --git a/ios/chrome/browser/web/font_size/BUILD.gn b/ios/chrome/browser/web/font_size/BUILD.gn index 85a6f649..deebb25 100644 --- a/ios/chrome/browser/web/font_size/BUILD.gn +++ b/ios/chrome/browser/web/font_size/BUILD.gn
@@ -2,7 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//ios/web/public/js_messaging/optimize_js.gni") +import("//ios/web/public/js_messaging/optimize_ts.gni") source_set("font_size") { configs += [ "//build/config/compiler:enable_arc" ] @@ -30,16 +30,6 @@ public_deps = [ "//ios/web/public/js_messaging" ] } -optimize_js("font_size_js") { - visibility = [ - ":font_size", - ":unit_tests", - ] - - primary_script = "resources/font_size.js" - sources = [ "resources/font_size.js" ] -} - source_set("unit_tests") { configs += [ "//build/config/compiler:enable_arc" ] testonly = true @@ -67,3 +57,14 @@ "//ui/base", ] } + +optimize_ts("font_size_js") { + visibility = [ + ":font_size", + ":unit_tests", + ] + + sources = [ "resources/font_size.ts" ] + + deps = [ "//ios/web/public/js_messaging:gcrweb" ] +}
diff --git a/ios/chrome/browser/web/font_size/resources/font_size.js b/ios/chrome/browser/web/font_size/resources/font_size.js deleted file mode 100644 index 723cc0d7..0000000 --- a/ios/chrome/browser/web/font_size/resources/font_size.js +++ /dev/null
@@ -1,36 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview Add functionality related to font size adjustment. - */ - -/** - * Namespace for this file. It depends on |__gCrWeb| having already been - * injected. - */ -__gCrWeb.font_size = {}; - -/** - * Store common namespace object in a global __gCrWeb object referenced by a - * string, so it does not get renamed by closure compiler during the - * minification. - */ -__gCrWeb['font_size'] = __gCrWeb.font_size; - -/** - * Adjust the font size of current web page by "size%" - * - * TODO(crbug.com/836962): Consider the original value of - * -webkit-text-size-adjust on the web page. Add it - * if it's a number or abort if it's 'none'. - * - * @param {number} size The ratio to apply to font scaling in %. - */ -__gCrWeb.font_size.adjustFontSize = function(size) { - try { - document.body.style.webkitTextSizeAdjust = size + '%'; - } catch (error) { - } -};
diff --git a/ios/chrome/browser/web/font_size/resources/font_size.ts b/ios/chrome/browser/web/font_size/resources/font_size.ts new file mode 100644 index 0000000..0128f28 --- /dev/null +++ b/ios/chrome/browser/web/font_size/resources/font_size.ts
@@ -0,0 +1,37 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import {gCrWeb} from '//ios/web/public/js_messaging/resources/gcrweb.js'; + +/** + * @fileoverview Add functionality related to font size adjustment. + */ + +/** + * This interface extends the CSSStyleDeclaration interface + * to include the webkitTextSizeAdjust property. Text-size-adjust property + * is experimential, so it is not included in the CSSStyleDeclaration + * object. + */ +declare interface CSSTextSizeAdjust extends CSSStyleDeclaration { + webkitTextSizeAdjust: string; +} + +/** + * Adjust the font size of current web page by "size%" + * + * TODO(crbug.com/836962): Consider the original value of + * -webkit-text-size-adjust on the web page. Add it + * if it's a number or abort if it's 'none'. + * + * @param {number} size The ratio to apply to font scaling in %. + */ +function adjustFontSize(size: number): void { + try { + (document.body.style as CSSTextSizeAdjust).webkitTextSizeAdjust + = `${size}%`; + } catch (error) {} +} + +gCrWeb.font_size = { adjustFontSize }; \ No newline at end of file
diff --git a/services/network/public/cpp/simple_url_loader_throttle.cc b/services/network/public/cpp/simple_url_loader_throttle.cc index fc5b42ce..b97e3b0 100644 --- a/services/network/public/cpp/simple_url_loader_throttle.cc +++ b/services/network/public/cpp/simple_url_loader_throttle.cc
@@ -68,10 +68,11 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(is_observing_default_network_); - owner_->OnReadyToStart(); - net::NetworkChangeNotifier::RemoveDefaultNetworkActiveObserver(this); is_observing_default_network_ = false; + + // `owner_` deletes `this`. + owner_->OnReadyToStart(); } // Must outlive `this`. @@ -170,6 +171,7 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(callback_.is_null()); DCHECK(!timeout_timer_.IsRunning()); + DCHECK(delegate_); bool should_throttle = delegate_->ShouldThrottle(); base::UmaHistogramBoolean("Network.Radio.SimpleURLLoaderIsThrottled", @@ -193,6 +195,7 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(callback_); timeout_timer_.Stop(); + delegate_.reset(); base::TimeDelta throttled_time = base::TimeTicks::Now() - throttling_start_time_;
diff --git a/testing/buildbot/chrome.json b/testing/buildbot/chrome.json index 69cf7c46..8d7e599 100644 --- a/testing/buildbot/chrome.json +++ b/testing/buildbot/chrome.json
@@ -1916,7 +1916,7 @@ { "args": [], "cros_board": "atlas", - "cros_img": "atlas-release/R105-14959.0.0", + "cros_img": "atlas-release/R106-14996.0.0", "name": "lacros_all_tast_tests ATLAS_RELEASE_LKGM", "resultdb": { "enable": true, @@ -1932,7 +1932,7 @@ { "args": [], "cros_board": "atlas", - "cros_img": "atlas-release/R105-14961.0.0", + "cros_img": "atlas-release/R105-14985.0.0", "name": "lacros_all_tast_tests ATLAS_RELEASE_DEV", "resultdb": { "enable": true, @@ -1948,7 +1948,7 @@ { "args": [], "cros_board": "atlas", - "cros_img": "atlas-release/R104-14909.52.0", + "cros_img": "atlas-release/R104-14909.79.0", "name": "lacros_all_tast_tests ATLAS_RELEASE_BETA", "resultdb": { "enable": true, @@ -1964,7 +1964,7 @@ { "args": [], "cros_board": "atlas", - "cros_img": "atlas-release/R103-14816.99.0", + "cros_img": "atlas-release/R103-14816.131.0", "name": "lacros_all_tast_tests ATLAS_RELEASE_STABLE", "resultdb": { "enable": true, @@ -1980,7 +1980,7 @@ { "args": [], "cros_board": "eve", - "cros_img": "eve-release/R105-14979.0.0", + "cros_img": "eve-release/R106-14996.0.0", "name": "lacros_all_tast_tests EVE_RELEASE_LKGM", "resultdb": { "enable": true, @@ -1996,7 +1996,7 @@ { "args": [], "cros_board": "eve", - "cros_img": "eve-release/R105-14961.0.0", + "cros_img": "eve-release/R105-14985.0.0", "name": "lacros_all_tast_tests EVE_RELEASE_DEV", "resultdb": { "enable": true, @@ -2012,7 +2012,7 @@ { "args": [], "cros_board": "eve", - "cros_img": "eve-release/R104-14909.52.0", + "cros_img": "eve-release/R104-14909.79.0", "name": "lacros_all_tast_tests EVE_RELEASE_BETA", "resultdb": { "enable": true, @@ -2028,7 +2028,7 @@ { "args": [], "cros_board": "eve", - "cros_img": "eve-release/R103-14816.99.0", + "cros_img": "eve-release/R103-14816.131.0", "name": "lacros_all_tast_tests EVE_RELEASE_STABLE", "resultdb": { "enable": true, @@ -2087,7 +2087,7 @@ { "args": [], "cros_board": "hana", - "cros_img": "hana-release/R105-14979.0.0", + "cros_img": "hana-release/R106-14996.0.0", "name": "lacros_all_tast_tests HANA_RELEASE_LKGM", "resultdb": { "enable": true, @@ -2103,7 +2103,7 @@ { "args": [], "cros_board": "hana", - "cros_img": "hana-release/R105-14961.0.0", + "cros_img": "hana-release/R105-14985.0.0", "name": "lacros_all_tast_tests HANA_RELEASE_DEV", "resultdb": { "enable": true, @@ -2119,7 +2119,7 @@ { "args": [], "cros_board": "hana", - "cros_img": "hana-release/R104-14909.52.0", + "cros_img": "hana-release/R104-14909.79.0", "name": "lacros_all_tast_tests HANA_RELEASE_BETA", "resultdb": { "enable": true, @@ -2135,7 +2135,7 @@ { "args": [], "cros_board": "hana", - "cros_img": "hana-release/R103-14816.99.0", + "cros_img": "hana-release/R103-14816.131.0", "name": "lacros_all_tast_tests HANA_RELEASE_STABLE", "resultdb": { "enable": true, @@ -2151,7 +2151,7 @@ { "args": [], "cros_board": "jacuzzi", - "cros_img": "jacuzzi-release/R105-14979.0.0", + "cros_img": "jacuzzi-release/R106-14996.0.0", "name": "lacros_all_tast_tests JACUZZI_RELEASE_LKGM", "resultdb": { "enable": true, @@ -2167,7 +2167,7 @@ { "args": [], "cros_board": "jacuzzi", - "cros_img": "jacuzzi-release/R105-14943.0.0", + "cros_img": "jacuzzi-release/R105-14985.0.0", "name": "lacros_all_tast_tests JACUZZI_RELEASE_DEV", "resultdb": { "enable": true, @@ -2183,7 +2183,7 @@ { "args": [], "cros_board": "jacuzzi", - "cros_img": "jacuzzi-release/R104-14909.52.0", + "cros_img": "jacuzzi-release/R104-14909.79.0", "name": "lacros_all_tast_tests JACUZZI_RELEASE_BETA", "resultdb": { "enable": true, @@ -2199,7 +2199,7 @@ { "args": [], "cros_board": "jacuzzi", - "cros_img": "jacuzzi-release/R103-14816.99.0", + "cros_img": "jacuzzi-release/R103-14816.131.0", "name": "lacros_all_tast_tests JACUZZI_RELEASE_STABLE", "resultdb": { "enable": true,
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json index 1007443..95ee84a 100644 --- a/testing/buildbot/chromium.chromiumos.json +++ b/testing/buildbot/chromium.chromiumos.json
@@ -5692,21 +5692,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.36/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.57/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5112.36", + "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5112.57", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v104.0.5112.36", - "revision": "version:104.0.5112.36" + "location": "lacros_version_skew_tests_v104.0.5112.57", + "revision": "version:104.0.5112.57" } ], "dimension_sets": [ @@ -5719,26 +5719,26 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 104.0.5112.36" + "variant_id": "Lacros version skew testing ash 104.0.5112.57" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5161.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5187.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5161.0", + "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5187.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5161.0", - "revision": "version:105.0.5161.0" + "location": "lacros_version_skew_tests_v105.0.5187.0", + "revision": "version:105.0.5187.0" } ], "dimension_sets": [ @@ -5751,26 +5751,26 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 105.0.5161.0" + "variant_id": "Lacros version skew testing ash 105.0.5187.0" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5192.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5200.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5192.0", + "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5200.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5192.0", - "revision": "version:105.0.5192.0" + "location": "lacros_version_skew_tests_v106.0.5200.0", + "revision": "version:106.0.5200.0" } ], "dimension_sets": [ @@ -5783,7 +5783,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 105.0.5192.0" + "variant_id": "Lacros version skew testing ash 106.0.5200.0" }, { "isolate_profile_data": true, @@ -5859,21 +5859,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.36/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.57/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5112.36", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5112.57", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v104.0.5112.36", - "revision": "version:104.0.5112.36" + "location": "lacros_version_skew_tests_v104.0.5112.57", + "revision": "version:104.0.5112.57" } ], "dimension_sets": [ @@ -5885,26 +5885,26 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 104.0.5112.36" + "variant_id": "Lacros version skew testing ash 104.0.5112.57" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5161.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5187.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5161.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5187.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5161.0", - "revision": "version:105.0.5161.0" + "location": "lacros_version_skew_tests_v105.0.5187.0", + "revision": "version:105.0.5187.0" } ], "dimension_sets": [ @@ -5916,26 +5916,26 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 105.0.5161.0" + "variant_id": "Lacros version skew testing ash 105.0.5187.0" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5192.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5200.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5192.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5200.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5192.0", - "revision": "version:105.0.5192.0" + "location": "lacros_version_skew_tests_v106.0.5200.0", + "revision": "version:106.0.5200.0" } ], "dimension_sets": [ @@ -5947,7 +5947,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 105.0.5192.0" + "variant_id": "Lacros version skew testing ash 106.0.5200.0" }, { "args": [ @@ -6005,21 +6005,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.36/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.57/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5112.36", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5112.57", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v104.0.5112.36", - "revision": "version:104.0.5112.36" + "location": "lacros_version_skew_tests_v104.0.5112.57", + "revision": "version:104.0.5112.57" } ], "dimension_sets": [ @@ -6031,26 +6031,26 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 104.0.5112.36" + "variant_id": "Lacros version skew testing ash 104.0.5112.57" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5161.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5187.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5161.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5187.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5161.0", - "revision": "version:105.0.5161.0" + "location": "lacros_version_skew_tests_v105.0.5187.0", + "revision": "version:105.0.5187.0" } ], "dimension_sets": [ @@ -6062,26 +6062,26 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 105.0.5161.0" + "variant_id": "Lacros version skew testing ash 105.0.5187.0" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5192.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5200.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5192.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5200.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5192.0", - "revision": "version:105.0.5192.0" + "location": "lacros_version_skew_tests_v106.0.5200.0", + "revision": "version:106.0.5200.0" } ], "dimension_sets": [ @@ -6093,7 +6093,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 105.0.5192.0" + "variant_id": "Lacros version skew testing ash 106.0.5200.0" }, { "isolate_profile_data": true,
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index 0062f15..ca5bd2c2 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -85793,21 +85793,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.36/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.57/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5112.36", + "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5112.57", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v104.0.5112.36", - "revision": "version:104.0.5112.36" + "location": "lacros_version_skew_tests_v104.0.5112.57", + "revision": "version:104.0.5112.57" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -85815,26 +85815,26 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 104.0.5112.36" + "variant_id": "Lacros version skew testing ash 104.0.5112.57" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5161.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5187.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5161.0", + "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5187.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5161.0", - "revision": "version:105.0.5161.0" + "location": "lacros_version_skew_tests_v105.0.5187.0", + "revision": "version:105.0.5187.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -85842,26 +85842,26 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 105.0.5161.0" + "variant_id": "Lacros version skew testing ash 105.0.5187.0" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5192.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5200.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5192.0", + "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5200.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5192.0", - "revision": "version:105.0.5192.0" + "location": "lacros_version_skew_tests_v106.0.5200.0", + "revision": "version:106.0.5200.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -85869,7 +85869,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 105.0.5192.0" + "variant_id": "Lacros version skew testing ash 106.0.5200.0" }, { "isolate_profile_data": true, @@ -85930,80 +85930,80 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.36/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.57/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5112.36", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5112.57", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v104.0.5112.36", - "revision": "version:104.0.5112.36" + "location": "lacros_version_skew_tests_v104.0.5112.57", + "revision": "version:104.0.5112.57" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 104.0.5112.36" + "variant_id": "Lacros version skew testing ash 104.0.5112.57" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5161.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5187.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5161.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5187.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5161.0", - "revision": "version:105.0.5161.0" + "location": "lacros_version_skew_tests_v105.0.5187.0", + "revision": "version:105.0.5187.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 105.0.5161.0" + "variant_id": "Lacros version skew testing ash 105.0.5187.0" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5192.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5200.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5192.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5200.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5192.0", - "revision": "version:105.0.5192.0" + "location": "lacros_version_skew_tests_v106.0.5200.0", + "revision": "version:106.0.5200.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 105.0.5192.0" + "variant_id": "Lacros version skew testing ash 106.0.5200.0" }, { "args": [ @@ -86051,80 +86051,80 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.36/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.57/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5112.36", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5112.57", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v104.0.5112.36", - "revision": "version:104.0.5112.36" + "location": "lacros_version_skew_tests_v104.0.5112.57", + "revision": "version:104.0.5112.57" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 104.0.5112.36" + "variant_id": "Lacros version skew testing ash 104.0.5112.57" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5161.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5187.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5161.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5187.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5161.0", - "revision": "version:105.0.5161.0" + "location": "lacros_version_skew_tests_v105.0.5187.0", + "revision": "version:105.0.5187.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 105.0.5161.0" + "variant_id": "Lacros version skew testing ash 105.0.5187.0" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5192.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5200.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5192.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5200.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5192.0", - "revision": "version:105.0.5192.0" + "location": "lacros_version_skew_tests_v106.0.5200.0", + "revision": "version:106.0.5200.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 105.0.5192.0" + "variant_id": "Lacros version skew testing ash 106.0.5200.0" }, { "isolate_profile_data": true, @@ -87398,20 +87398,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.36/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.57/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5112.36", + "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5112.57", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v104.0.5112.36", - "revision": "version:104.0.5112.36" + "location": "lacros_version_skew_tests_v104.0.5112.57", + "revision": "version:104.0.5112.57" } ], "dimension_sets": [ @@ -87425,25 +87425,25 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 104.0.5112.36" + "variant_id": "Lacros version skew testing ash 104.0.5112.57" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5161.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5187.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5161.0", + "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5187.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5161.0", - "revision": "version:105.0.5161.0" + "location": "lacros_version_skew_tests_v105.0.5187.0", + "revision": "version:105.0.5187.0" } ], "dimension_sets": [ @@ -87457,25 +87457,25 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 105.0.5161.0" + "variant_id": "Lacros version skew testing ash 105.0.5187.0" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5192.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5200.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5192.0", + "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5200.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5192.0", - "revision": "version:105.0.5192.0" + "location": "lacros_version_skew_tests_v106.0.5200.0", + "revision": "version:106.0.5200.0" } ], "dimension_sets": [ @@ -87489,7 +87489,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 105.0.5192.0" + "variant_id": "Lacros version skew testing ash 106.0.5200.0" }, { "merge": { @@ -87565,20 +87565,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.36/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.57/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5112.36", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5112.57", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v104.0.5112.36", - "revision": "version:104.0.5112.36" + "location": "lacros_version_skew_tests_v104.0.5112.57", + "revision": "version:104.0.5112.57" } ], "dimension_sets": [ @@ -87591,25 +87591,25 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 104.0.5112.36" + "variant_id": "Lacros version skew testing ash 104.0.5112.57" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5161.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5187.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5161.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5187.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5161.0", - "revision": "version:105.0.5161.0" + "location": "lacros_version_skew_tests_v105.0.5187.0", + "revision": "version:105.0.5187.0" } ], "dimension_sets": [ @@ -87622,25 +87622,25 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 105.0.5161.0" + "variant_id": "Lacros version skew testing ash 105.0.5187.0" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5192.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5200.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5192.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5200.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5192.0", - "revision": "version:105.0.5192.0" + "location": "lacros_version_skew_tests_v106.0.5200.0", + "revision": "version:106.0.5200.0" } ], "dimension_sets": [ @@ -87653,7 +87653,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 105.0.5192.0" + "variant_id": "Lacros version skew testing ash 106.0.5200.0" }, { "args": [ @@ -87711,20 +87711,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.36/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.57/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5112.36", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5112.57", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v104.0.5112.36", - "revision": "version:104.0.5112.36" + "location": "lacros_version_skew_tests_v104.0.5112.57", + "revision": "version:104.0.5112.57" } ], "dimension_sets": [ @@ -87737,25 +87737,25 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 104.0.5112.36" + "variant_id": "Lacros version skew testing ash 104.0.5112.57" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5161.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5187.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5161.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5187.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5161.0", - "revision": "version:105.0.5161.0" + "location": "lacros_version_skew_tests_v105.0.5187.0", + "revision": "version:105.0.5187.0" } ], "dimension_sets": [ @@ -87768,25 +87768,25 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 105.0.5161.0" + "variant_id": "Lacros version skew testing ash 105.0.5187.0" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5192.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5200.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5192.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5200.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5192.0", - "revision": "version:105.0.5192.0" + "location": "lacros_version_skew_tests_v106.0.5200.0", + "revision": "version:106.0.5200.0" } ], "dimension_sets": [ @@ -87799,7 +87799,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 105.0.5192.0" + "variant_id": "Lacros version skew testing ash 106.0.5200.0" }, { "merge": { @@ -89231,20 +89231,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.36/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.57/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5112.36", + "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5112.57", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v104.0.5112.36", - "revision": "version:104.0.5112.36" + "location": "lacros_version_skew_tests_v104.0.5112.57", + "revision": "version:104.0.5112.57" } ], "dimension_sets": [ @@ -89258,25 +89258,25 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 104.0.5112.36" + "variant_id": "Lacros version skew testing ash 104.0.5112.57" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5161.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5187.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5161.0", + "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5187.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5161.0", - "revision": "version:105.0.5161.0" + "location": "lacros_version_skew_tests_v105.0.5187.0", + "revision": "version:105.0.5187.0" } ], "dimension_sets": [ @@ -89290,25 +89290,25 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 105.0.5161.0" + "variant_id": "Lacros version skew testing ash 105.0.5187.0" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5192.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5200.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5192.0", + "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5200.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5192.0", - "revision": "version:105.0.5192.0" + "location": "lacros_version_skew_tests_v106.0.5200.0", + "revision": "version:106.0.5200.0" } ], "dimension_sets": [ @@ -89322,7 +89322,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 105.0.5192.0" + "variant_id": "Lacros version skew testing ash 106.0.5200.0" }, { "merge": { @@ -89398,20 +89398,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.36/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.57/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5112.36", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5112.57", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v104.0.5112.36", - "revision": "version:104.0.5112.36" + "location": "lacros_version_skew_tests_v104.0.5112.57", + "revision": "version:104.0.5112.57" } ], "dimension_sets": [ @@ -89424,25 +89424,25 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 104.0.5112.36" + "variant_id": "Lacros version skew testing ash 104.0.5112.57" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5161.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5187.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5161.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5187.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5161.0", - "revision": "version:105.0.5161.0" + "location": "lacros_version_skew_tests_v105.0.5187.0", + "revision": "version:105.0.5187.0" } ], "dimension_sets": [ @@ -89455,25 +89455,25 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 105.0.5161.0" + "variant_id": "Lacros version skew testing ash 105.0.5187.0" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5192.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5200.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5192.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5200.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5192.0", - "revision": "version:105.0.5192.0" + "location": "lacros_version_skew_tests_v106.0.5200.0", + "revision": "version:106.0.5200.0" } ], "dimension_sets": [ @@ -89486,7 +89486,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 105.0.5192.0" + "variant_id": "Lacros version skew testing ash 106.0.5200.0" }, { "args": [ @@ -89544,20 +89544,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.36/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.57/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5112.36", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5112.57", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v104.0.5112.36", - "revision": "version:104.0.5112.36" + "location": "lacros_version_skew_tests_v104.0.5112.57", + "revision": "version:104.0.5112.57" } ], "dimension_sets": [ @@ -89570,25 +89570,25 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 104.0.5112.36" + "variant_id": "Lacros version skew testing ash 104.0.5112.57" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5161.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5187.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5161.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5187.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5161.0", - "revision": "version:105.0.5161.0" + "location": "lacros_version_skew_tests_v105.0.5187.0", + "revision": "version:105.0.5187.0" } ], "dimension_sets": [ @@ -89601,25 +89601,25 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 105.0.5161.0" + "variant_id": "Lacros version skew testing ash 105.0.5187.0" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5192.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5200.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5192.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5200.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5192.0", - "revision": "version:105.0.5192.0" + "location": "lacros_version_skew_tests_v106.0.5200.0", + "revision": "version:106.0.5200.0" } ], "dimension_sets": [ @@ -89632,7 +89632,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 105.0.5192.0" + "variant_id": "Lacros version skew testing ash 106.0.5200.0" }, { "merge": { @@ -90305,20 +90305,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.36/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.57/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5112.36", + "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5112.57", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v104.0.5112.36", - "revision": "version:104.0.5112.36" + "location": "lacros_version_skew_tests_v104.0.5112.57", + "revision": "version:104.0.5112.57" } ], "dimension_sets": [ @@ -90331,25 +90331,25 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 104.0.5112.36" + "variant_id": "Lacros version skew testing ash 104.0.5112.57" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5161.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5187.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5161.0", + "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5187.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5161.0", - "revision": "version:105.0.5161.0" + "location": "lacros_version_skew_tests_v105.0.5187.0", + "revision": "version:105.0.5187.0" } ], "dimension_sets": [ @@ -90362,25 +90362,25 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 105.0.5161.0" + "variant_id": "Lacros version skew testing ash 105.0.5187.0" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5192.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5200.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5192.0", + "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5200.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5192.0", - "revision": "version:105.0.5192.0" + "location": "lacros_version_skew_tests_v106.0.5200.0", + "revision": "version:106.0.5200.0" } ], "dimension_sets": [ @@ -90393,7 +90393,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 105.0.5192.0" + "variant_id": "Lacros version skew testing ash 106.0.5200.0" } ] },
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json index d884046d..1fa0b68 100644 --- a/testing/buildbot/chromium.memory.json +++ b/testing/buildbot/chromium.memory.json
@@ -20811,21 +20811,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.36/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.57/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5112.36", + "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5112.57", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v104.0.5112.36", - "revision": "version:104.0.5112.36" + "location": "lacros_version_skew_tests_v104.0.5112.57", + "revision": "version:104.0.5112.57" } ], "dimension_sets": [ @@ -20838,26 +20838,26 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 104.0.5112.36" + "variant_id": "Lacros version skew testing ash 104.0.5112.57" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5161.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5187.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5161.0", + "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5187.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5161.0", - "revision": "version:105.0.5161.0" + "location": "lacros_version_skew_tests_v105.0.5187.0", + "revision": "version:105.0.5187.0" } ], "dimension_sets": [ @@ -20870,26 +20870,26 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 105.0.5161.0" + "variant_id": "Lacros version skew testing ash 105.0.5187.0" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5192.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5200.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5192.0", + "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5200.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5192.0", - "revision": "version:105.0.5192.0" + "location": "lacros_version_skew_tests_v106.0.5200.0", + "revision": "version:106.0.5200.0" } ], "dimension_sets": [ @@ -20902,7 +20902,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 105.0.5192.0" + "variant_id": "Lacros version skew testing ash 106.0.5200.0" }, { "isolate_profile_data": true, @@ -20978,21 +20978,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.36/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.57/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5112.36", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5112.57", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v104.0.5112.36", - "revision": "version:104.0.5112.36" + "location": "lacros_version_skew_tests_v104.0.5112.57", + "revision": "version:104.0.5112.57" } ], "dimension_sets": [ @@ -21004,26 +21004,26 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 104.0.5112.36" + "variant_id": "Lacros version skew testing ash 104.0.5112.57" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5161.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5187.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5161.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5187.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5161.0", - "revision": "version:105.0.5161.0" + "location": "lacros_version_skew_tests_v105.0.5187.0", + "revision": "version:105.0.5187.0" } ], "dimension_sets": [ @@ -21035,26 +21035,26 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 105.0.5161.0" + "variant_id": "Lacros version skew testing ash 105.0.5187.0" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5192.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5200.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5192.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5200.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5192.0", - "revision": "version:105.0.5192.0" + "location": "lacros_version_skew_tests_v106.0.5200.0", + "revision": "version:106.0.5200.0" } ], "dimension_sets": [ @@ -21066,7 +21066,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 105.0.5192.0" + "variant_id": "Lacros version skew testing ash 106.0.5200.0" }, { "args": [ @@ -21124,21 +21124,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.36/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.57/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5112.36", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5112.57", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v104.0.5112.36", - "revision": "version:104.0.5112.36" + "location": "lacros_version_skew_tests_v104.0.5112.57", + "revision": "version:104.0.5112.57" } ], "dimension_sets": [ @@ -21150,26 +21150,26 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 104.0.5112.36" + "variant_id": "Lacros version skew testing ash 104.0.5112.57" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5161.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5187.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5161.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5187.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5161.0", - "revision": "version:105.0.5161.0" + "location": "lacros_version_skew_tests_v105.0.5187.0", + "revision": "version:105.0.5187.0" } ], "dimension_sets": [ @@ -21181,26 +21181,26 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 105.0.5161.0" + "variant_id": "Lacros version skew testing ash 105.0.5187.0" }, { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5192.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5200.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5192.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5200.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v105.0.5192.0", - "revision": "version:105.0.5192.0" + "location": "lacros_version_skew_tests_v106.0.5200.0", + "revision": "version:106.0.5200.0" } ], "dimension_sets": [ @@ -21212,7 +21212,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 105.0.5192.0" + "variant_id": "Lacros version skew testing ash 106.0.5200.0" }, { "isolate_profile_data": true,
diff --git a/testing/buildbot/internal.chromeos.fyi.json b/testing/buildbot/internal.chromeos.fyi.json index 145b892..7f23289 100644 --- a/testing/buildbot/internal.chromeos.fyi.json +++ b/testing/buildbot/internal.chromeos.fyi.json
@@ -1037,7 +1037,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R105-14979.0.0", + "cros_img": "octopus-release/R106-14996.0.0", "name": "lacros_fyi_tast_tests OCTOPUS_RELEASE_LKGM", "swarming": {}, "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", @@ -1049,7 +1049,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R105-14961.0.0", + "cros_img": "octopus-release/R105-14985.0.0", "name": "lacros_fyi_tast_tests OCTOPUS_RELEASE_DEV", "swarming": {}, "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", @@ -1061,7 +1061,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R104-14909.52.0", + "cros_img": "octopus-release/R104-14909.79.0", "name": "lacros_fyi_tast_tests OCTOPUS_RELEASE_BETA", "swarming": {}, "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", @@ -1073,7 +1073,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R103-14816.99.0", + "cros_img": "octopus-release/R103-14816.131.0", "name": "lacros_fyi_tast_tests OCTOPUS_RELEASE_STABLE", "swarming": {}, "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", @@ -1085,7 +1085,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R105-14979.0.0", + "cros_img": "octopus-release/R106-14996.0.0", "name": "ozone_unittests OCTOPUS_RELEASE_LKGM", "swarming": {}, "test": "ozone_unittests", @@ -1096,7 +1096,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R105-14961.0.0", + "cros_img": "octopus-release/R105-14985.0.0", "name": "ozone_unittests OCTOPUS_RELEASE_DEV", "swarming": {}, "test": "ozone_unittests", @@ -1107,7 +1107,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R104-14909.52.0", + "cros_img": "octopus-release/R104-14909.79.0", "name": "ozone_unittests OCTOPUS_RELEASE_BETA", "swarming": {}, "test": "ozone_unittests", @@ -1118,7 +1118,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R103-14816.99.0", + "cros_img": "octopus-release/R103-14816.131.0", "name": "ozone_unittests OCTOPUS_RELEASE_STABLE", "swarming": {}, "test": "ozone_unittests", @@ -1136,7 +1136,7 @@ { "args": [], "cros_board": "strongbad", - "cros_img": "strongbad-release/R105-14979.0.0", + "cros_img": "strongbad-release/R106-14996.0.0", "name": "lacros_all_tast_tests STRONGBAD_RELEASE_LKGM", "swarming": {}, "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", @@ -1148,7 +1148,7 @@ { "args": [], "cros_board": "strongbad", - "cros_img": "strongbad-release/R105-14961.0.0", + "cros_img": "strongbad-release/R105-14985.0.0", "name": "lacros_all_tast_tests strongbad_RELEASE_DEV", "swarming": {}, "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", @@ -1160,7 +1160,7 @@ { "args": [], "cros_board": "strongbad", - "cros_img": "strongbad-release/R104-14909.52.0", + "cros_img": "strongbad-release/R104-14909.79.0", "name": "lacros_all_tast_tests STRONGBAD_RELEASE_BETA", "swarming": {}, "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", @@ -1172,7 +1172,7 @@ { "args": [], "cros_board": "strongbad", - "cros_img": "strongbad-release/R103-14816.99.0", + "cros_img": "strongbad-release/R103-14816.131.0", "name": "lacros_all_tast_tests STRONGBAD_RELEASE_STABLE", "swarming": {}, "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", @@ -1184,7 +1184,7 @@ { "args": [], "cros_board": "strongbad", - "cros_img": "strongbad-release/R105-14979.0.0", + "cros_img": "strongbad-release/R106-14996.0.0", "name": "ozone_unittests STRONGBAD_RELEASE_LKGM", "swarming": {}, "test": "ozone_unittests", @@ -1195,7 +1195,7 @@ { "args": [], "cros_board": "strongbad", - "cros_img": "strongbad-release/R105-14961.0.0", + "cros_img": "strongbad-release/R105-14985.0.0", "name": "ozone_unittests strongbad_RELEASE_DEV", "swarming": {}, "test": "ozone_unittests", @@ -1206,7 +1206,7 @@ { "args": [], "cros_board": "strongbad", - "cros_img": "strongbad-release/R104-14909.52.0", + "cros_img": "strongbad-release/R104-14909.79.0", "name": "ozone_unittests STRONGBAD_RELEASE_BETA", "swarming": {}, "test": "ozone_unittests", @@ -1217,7 +1217,7 @@ { "args": [], "cros_board": "strongbad", - "cros_img": "strongbad-release/R103-14816.99.0", + "cros_img": "strongbad-release/R103-14816.131.0", "name": "ozone_unittests STRONGBAD_RELEASE_STABLE", "swarming": {}, "test": "ozone_unittests", @@ -1228,7 +1228,7 @@ { "args": [], "cros_board": "strongbad", - "cros_img": "strongbad-release/R105-14979.0.0", + "cros_img": "strongbad-release/R106-14996.0.0", "name": "viz_unittests STRONGBAD_RELEASE_LKGM", "swarming": {}, "test": "viz_unittests", @@ -1239,7 +1239,7 @@ { "args": [], "cros_board": "strongbad", - "cros_img": "strongbad-release/R105-14961.0.0", + "cros_img": "strongbad-release/R105-14985.0.0", "name": "viz_unittests strongbad_RELEASE_DEV", "swarming": {}, "test": "viz_unittests", @@ -1250,7 +1250,7 @@ { "args": [], "cros_board": "strongbad", - "cros_img": "strongbad-release/R104-14909.52.0", + "cros_img": "strongbad-release/R104-14909.79.0", "name": "viz_unittests STRONGBAD_RELEASE_BETA", "swarming": {}, "test": "viz_unittests", @@ -1261,7 +1261,7 @@ { "args": [], "cros_board": "strongbad", - "cros_img": "strongbad-release/R103-14816.99.0", + "cros_img": "strongbad-release/R103-14816.131.0", "name": "viz_unittests STRONGBAD_RELEASE_STABLE", "swarming": {}, "test": "viz_unittests",
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index 52732a30..9f847431c 100644 --- a/testing/buildbot/variants.pyl +++ b/testing/buildbot/variants.pyl
@@ -22,45 +22,45 @@ }, 'LACROS_VERSION_SKEW_CANARY': { 'args': [ - '--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5192.0/test_ash_chrome', + '--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5200.0/test_ash_chrome', ], - 'identifier': 'Lacros version skew testing ash 105.0.5192.0', + 'identifier': 'Lacros version skew testing ash 106.0.5200.0', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip', - 'location': 'lacros_version_skew_tests_v105.0.5192.0', - 'revision': 'version:105.0.5192.0', + 'location': 'lacros_version_skew_tests_v106.0.5200.0', + 'revision': 'version:106.0.5200.0', }, ], }, }, 'LACROS_VERSION_SKEW_DEV': { 'args': [ - '--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5161.0/test_ash_chrome', + '--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5187.0/test_ash_chrome', ], - 'identifier': 'Lacros version skew testing ash 105.0.5161.0', + 'identifier': 'Lacros version skew testing ash 105.0.5187.0', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip', - 'location': 'lacros_version_skew_tests_v105.0.5161.0', - 'revision': 'version:105.0.5161.0', + 'location': 'lacros_version_skew_tests_v105.0.5187.0', + 'revision': 'version:105.0.5187.0', }, ], }, }, 'LACROS_VERSION_SKEW_BETA': { 'args': [ - '--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.36/test_ash_chrome', + '--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5112.57/test_ash_chrome', ], - 'identifier': 'Lacros version skew testing ash 104.0.5112.36', + 'identifier': 'Lacros version skew testing ash 104.0.5112.57', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip', - 'location': 'lacros_version_skew_tests_v104.0.5112.36', - 'revision': 'version:104.0.5112.36', + 'location': 'lacros_version_skew_tests_v104.0.5112.57', + 'revision': 'version:104.0.5112.57', }, ], }, @@ -962,8 +962,8 @@ 'CROS_ATLAS_RELEASE_LKGM': { 'skylab': { 'cros_board': 'atlas', - 'cros_chrome_version': '105.0.5158.0', - 'cros_img': 'atlas-release/R105-14959.0.0', + 'cros_chrome_version': '105.0.5190.0', + 'cros_img': 'atlas-release/R106-14996.0.0', }, 'enabled': True, 'identifier': 'ATLAS_RELEASE_LKGM', @@ -971,8 +971,8 @@ 'CROS_ATLAS_RELEASE_DEV': { 'skylab': { 'cros_board': 'atlas', - 'cros_chrome_version': '105.0.5161.0', - 'cros_img': 'atlas-release/R105-14961.0.0', + 'cros_chrome_version': '105.0.5187.0', + 'cros_img': 'atlas-release/R105-14985.0.0', }, 'enabled': True, 'identifier': 'ATLAS_RELEASE_DEV', @@ -980,8 +980,8 @@ 'CROS_ATLAS_RELEASE_BETA': { 'skylab': { 'cros_board': 'atlas', - 'cros_chrome_version': '104.0.5112.36', - 'cros_img': 'atlas-release/R104-14909.52.0', + 'cros_chrome_version': '104.0.5112.57', + 'cros_img': 'atlas-release/R104-14909.79.0', }, 'enabled': True, 'identifier': 'ATLAS_RELEASE_BETA', @@ -989,8 +989,8 @@ 'CROS_ATLAS_RELEASE_STABLE': { 'skylab': { 'cros_board': 'atlas', - 'cros_chrome_version': '103.0.5060.114', - 'cros_img': 'atlas-release/R103-14816.99.0', + 'cros_chrome_version': '103.0.5060.132', + 'cros_img': 'atlas-release/R103-14816.131.0', }, 'enabled': True, 'identifier': 'ATLAS_RELEASE_STABLE', @@ -998,8 +998,8 @@ 'CROS_EVE_RELEASE_LKGM': { 'skylab': { 'cros_board': 'eve', - 'cros_chrome_version': '105.0.5180.0', - 'cros_img': 'eve-release/R105-14979.0.0', + 'cros_chrome_version': '105.0.5190.0', + 'cros_img': 'eve-release/R106-14996.0.0', }, 'enabled': True, 'identifier': 'EVE_RELEASE_LKGM', @@ -1007,8 +1007,8 @@ 'CROS_EVE_RELEASE_DEV': { 'skylab': { 'cros_board': 'eve', - 'cros_chrome_version': '105.0.5161.0', - 'cros_img': 'eve-release/R105-14961.0.0', + 'cros_chrome_version': '105.0.5187.0', + 'cros_img': 'eve-release/R105-14985.0.0', }, 'enabled': True, 'identifier': 'EVE_RELEASE_DEV', @@ -1016,8 +1016,8 @@ 'CROS_EVE_RELEASE_BETA': { 'skylab': { 'cros_board': 'eve', - 'cros_chrome_version': '104.0.5112.36', - 'cros_img': 'eve-release/R104-14909.52.0', + 'cros_chrome_version': '104.0.5112.57', + 'cros_img': 'eve-release/R104-14909.79.0', }, 'enabled': True, 'identifier': 'EVE_RELEASE_BETA', @@ -1025,8 +1025,8 @@ 'CROS_EVE_RELEASE_STABLE': { 'skylab': { 'cros_board': 'eve', - 'cros_chrome_version': '103.0.5060.114', - 'cros_img': 'eve-release/R103-14816.99.0', + 'cros_chrome_version': '103.0.5060.132', + 'cros_img': 'eve-release/R103-14816.131.0', }, 'enabled': True, 'identifier': 'EVE_RELEASE_STABLE', @@ -1043,8 +1043,8 @@ 'CROS_HANA_RELEASE_LKGM': { 'skylab': { 'cros_board': 'hana', - 'cros_chrome_version': '105.0.5180.0', - 'cros_img': 'hana-release/R105-14979.0.0', + 'cros_chrome_version': '105.0.5190.0', + 'cros_img': 'hana-release/R106-14996.0.0', }, 'enabled': True, 'identifier': 'HANA_RELEASE_LKGM', @@ -1052,8 +1052,8 @@ 'CROS_HANA_RELEASE_DEV': { 'skylab': { 'cros_board': 'hana', - 'cros_chrome_version': '105.0.5161.0', - 'cros_img': 'hana-release/R105-14961.0.0', + 'cros_chrome_version': '105.0.5187.0', + 'cros_img': 'hana-release/R105-14985.0.0', }, 'enabled': True, 'identifier': 'HANA_RELEASE_DEV', @@ -1061,8 +1061,8 @@ 'CROS_HANA_RELEASE_BETA': { 'skylab': { 'cros_board': 'hana', - 'cros_chrome_version': '104.0.5112.36', - 'cros_img': 'hana-release/R104-14909.52.0', + 'cros_chrome_version': '104.0.5112.57', + 'cros_img': 'hana-release/R104-14909.79.0', }, 'enabled': True, 'identifier': 'HANA_RELEASE_BETA', @@ -1070,8 +1070,8 @@ 'CROS_HANA_RELEASE_STABLE': { 'skylab': { 'cros_board': 'hana', - 'cros_chrome_version': '103.0.5060.114', - 'cros_img': 'hana-release/R103-14816.99.0', + 'cros_chrome_version': '103.0.5060.132', + 'cros_img': 'hana-release/R103-14816.131.0', }, 'enabled': True, 'identifier': 'HANA_RELEASE_STABLE', @@ -1079,8 +1079,8 @@ 'CROS_JACUZZI_RELEASE_LKGM': { 'skylab': { 'cros_board': 'jacuzzi', - 'cros_chrome_version': '105.0.5180.0', - 'cros_img': 'jacuzzi-release/R105-14979.0.0', + 'cros_chrome_version': '105.0.5190.0', + 'cros_img': 'jacuzzi-release/R106-14996.0.0', }, 'enabled': True, 'identifier': 'JACUZZI_RELEASE_LKGM', @@ -1088,8 +1088,8 @@ 'CROS_JACUZZI_RELEASE_DEV': { 'skylab': { 'cros_board': 'jacuzzi', - 'cros_chrome_version': '105.0.5140.0', - 'cros_img': 'jacuzzi-release/R105-14943.0.0', + 'cros_chrome_version': '105.0.5187.0', + 'cros_img': 'jacuzzi-release/R105-14985.0.0', }, 'enabled': True, 'identifier': 'JACUZZI_RELEASE_DEV', @@ -1097,8 +1097,8 @@ 'CROS_JACUZZI_RELEASE_BETA': { 'skylab': { 'cros_board': 'jacuzzi', - 'cros_chrome_version': '104.0.5112.36', - 'cros_img': 'jacuzzi-release/R104-14909.52.0', + 'cros_chrome_version': '104.0.5112.57', + 'cros_img': 'jacuzzi-release/R104-14909.79.0', }, 'enabled': True, 'identifier': 'JACUZZI_RELEASE_BETA', @@ -1106,8 +1106,8 @@ 'CROS_JACUZZI_RELEASE_STABLE': { 'skylab': { 'cros_board': 'jacuzzi', - 'cros_chrome_version': '103.0.5060.114', - 'cros_img': 'jacuzzi-release/R103-14816.99.0', + 'cros_chrome_version': '103.0.5060.132', + 'cros_img': 'jacuzzi-release/R103-14816.131.0', }, 'enabled': True, 'identifier': 'JACUZZI_RELEASE_STABLE', @@ -1124,8 +1124,8 @@ 'CROS_OCTOPUS_RELEASE_LKGM': { 'skylab': { 'cros_board': 'octopus', - 'cros_chrome_version': '105.0.5180.0', - 'cros_img': 'octopus-release/R105-14979.0.0', + 'cros_chrome_version': '105.0.5190.0', + 'cros_img': 'octopus-release/R106-14996.0.0', }, 'enabled': True, 'identifier': 'OCTOPUS_RELEASE_LKGM', @@ -1133,8 +1133,8 @@ 'CROS_OCTOPUS_RELEASE_DEV': { 'skylab': { 'cros_board': 'octopus', - 'cros_chrome_version': '105.0.5161.0', - 'cros_img': 'octopus-release/R105-14961.0.0', + 'cros_chrome_version': '105.0.5187.0', + 'cros_img': 'octopus-release/R105-14985.0.0', }, 'enabled': True, 'identifier': 'OCTOPUS_RELEASE_DEV', @@ -1142,8 +1142,8 @@ 'CROS_OCTOPUS_RELEASE_BETA': { 'skylab': { 'cros_board': 'octopus', - 'cros_chrome_version': '104.0.5112.36', - 'cros_img': 'octopus-release/R104-14909.52.0', + 'cros_chrome_version': '104.0.5112.57', + 'cros_img': 'octopus-release/R104-14909.79.0', }, 'enabled': True, 'identifier': 'OCTOPUS_RELEASE_BETA', @@ -1151,8 +1151,8 @@ 'CROS_OCTOPUS_RELEASE_STABLE': { 'skylab': { 'cros_board': 'octopus', - 'cros_chrome_version': '103.0.5060.114', - 'cros_img': 'octopus-release/R103-14816.99.0', + 'cros_chrome_version': '103.0.5060.132', + 'cros_img': 'octopus-release/R103-14816.131.0', }, 'enabled': True, 'identifier': 'OCTOPUS_RELEASE_STABLE', @@ -1160,8 +1160,8 @@ 'CROS_STRONGBAD_RELEASE_LKGM': { 'skylab': { 'cros_board': 'strongbad', - 'cros_chrome_version': '105.0.5180.0', - 'cros_img': 'strongbad-release/R105-14979.0.0', + 'cros_chrome_version': '105.0.5190.0', + 'cros_img': 'strongbad-release/R106-14996.0.0', }, 'enabled': True, 'identifier': 'STRONGBAD_RELEASE_LKGM', @@ -1169,8 +1169,8 @@ 'CROS_STRONGBAD_RELEASE_DEV': { 'skylab': { 'cros_board': 'strongbad', - 'cros_chrome_version': '105.0.5161.0', - 'cros_img': 'strongbad-release/R105-14961.0.0', + 'cros_chrome_version': '105.0.5187.0', + 'cros_img': 'strongbad-release/R105-14985.0.0', }, 'enabled': True, 'identifier': 'strongbad_RELEASE_DEV', @@ -1178,8 +1178,8 @@ 'CROS_STRONGBAD_RELEASE_BETA': { 'skylab': { 'cros_board': 'strongbad', - 'cros_chrome_version': '104.0.5112.36', - 'cros_img': 'strongbad-release/R104-14909.52.0', + 'cros_chrome_version': '104.0.5112.57', + 'cros_img': 'strongbad-release/R104-14909.79.0', }, 'enabled': True, 'identifier': 'STRONGBAD_RELEASE_BETA', @@ -1187,8 +1187,8 @@ 'CROS_STRONGBAD_RELEASE_STABLE': { 'skylab': { 'cros_board': 'strongbad', - 'cros_chrome_version': '103.0.5060.114', - 'cros_img': 'strongbad-release/R103-14816.99.0', + 'cros_chrome_version': '103.0.5060.132', + 'cros_img': 'strongbad-release/R103-14816.131.0', }, 'enabled': True, 'identifier': 'STRONGBAD_RELEASE_STABLE', @@ -1253,4 +1253,4 @@ 'win10_nvidia_gtx_1660_stable', ], }, -} +} \ No newline at end of file
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index db996d2..97433374 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -281,10 +281,14 @@ base::FEATURE_DISABLED_BY_DEFAULT #endif }; +const char kPrerender2MaxNumOfRunningSpeculationRules[] = + "max_num_of_running_speculation_rules"; const base::Feature kPrerender2MemoryControls{"Prerender2MemoryControls", base::FEATURE_ENABLED_BY_DEFAULT}; const char kPrerender2MemoryThresholdParamName[] = "memory_threshold_in_mb"; +const char kPrerender2MemoryAcceptablePercentOfSystemMemoryParamName[] = + "acceptable_percent_of_system_memory"; bool IsPrerender2Enabled() { return base::FeatureList::IsEnabled(blink::features::kPrerender2);
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h index 7563eef..279fe6b 100644 --- a/third_party/blink/public/common/features.h +++ b/third_party/blink/public/common/features.h
@@ -130,6 +130,10 @@ // Enables the Prerender2 feature: https://crbug.com/1126305 // But see comments in the .cc file also. BLINK_COMMON_EXPORT extern const base::Feature kPrerender2; +// The number of prerenderings that can run concurrently. This only applies for +// prerenderings triggered by speculation rules. +BLINK_COMMON_EXPORT extern const char + kPrerender2MaxNumOfRunningSpeculationRules[]; // Enables restrictions on how much memory is required on a device to use // Prerender2. This is a separate feature from kPrerender2 so that the // restrictions can be disabled entirely to allow bots to run the tests without @@ -140,6 +144,11 @@ // device to use Prerender2. If the device's physical memory does not exceed // this value, pages will not be prerendered even when kPrerender2 is enabled. BLINK_COMMON_EXPORT extern const char kPrerender2MemoryThresholdParamName[]; +// A field trial param that controls how much physical memory is allowed to be +// used by Chrome. If the current memory usage in Chrome exceeds this percent, +// pages will not be prerendered even when kPrerender2 is enabled. +BLINK_COMMON_EXPORT extern const char + kPrerender2MemoryAcceptablePercentOfSystemMemoryParamName[]; // Returns true when Prerender2 feature is enabled. BLINK_COMMON_EXPORT bool IsPrerender2Enabled();
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl index 73feffd..81e3ce7 100644 --- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl +++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -699,8 +699,12 @@ type AttributionReportingIssueType extends string enum PermissionPolicyDisabled + # TODO(apaseltiner): Remove this once it is no longer referenced by the frontend. AttributionSourceUntrustworthyOrigin + # TODO(apaseltiner): Remove this once it is no longer referenced by the frontend. AttributionUntrustworthyOrigin + UntrustworthyReportingOrigin + InsecureContext InvalidHeader # Details for issues around "Attribution Reporting API" usage. @@ -708,6 +712,7 @@ type AttributionReportingIssueDetails extends object properties AttributionReportingIssueType violationType + # TODO(apaseltiner): Remove this once it is no longer referenced by the frontend. optional AffectedFrame frame optional AffectedRequest request optional DOM.BackendNodeId violatingNodeId @@ -4074,8 +4079,11 @@ # Clears all entries from an object store. command clearObjectStore parameters + # At least and at most one of securityOrigin, storageKey must be specified. # Security origin. - string securityOrigin + optional string securityOrigin + # Storage key. + optional string storageKey # Database name. string databaseName # Object store name. @@ -4084,8 +4092,11 @@ # Deletes a database. command deleteDatabase parameters + # At least and at most one of securityOrigin, storageKey must be specified. # Security origin. - string securityOrigin + optional string securityOrigin + # Storage key. + optional string storageKey # Database name. string databaseName @@ -8426,6 +8437,10 @@ EmbedderTriggeredAndSameOriginRedirected EmbedderTriggeredAndCrossOriginRedirected EmbedderTriggeredAndDestroyed + MemoryLimitExceeded + # Prerenders can be cancelled when Chrome uses excessive memory. This is + # recorded when it fails to get the memory usage. + FailToGetMemoryUsage # Fired when a prerender attempt is completed. event prerenderAttemptCompleted
diff --git a/third_party/blink/public/strings/translations/blink_strings_ar.xtb b/third_party/blink/public/strings/translations/blink_strings_ar.xtb index cdfa6d3..a0f6639 100644 --- a/third_party/blink/public/strings/translations/blink_strings_ar.xtb +++ b/third_party/blink/public/strings/translations/blink_strings_ar.xtb
@@ -94,7 +94,7 @@ <translation id="5466621249238537318">يُرجى اختيار ملف واحد أو أكثر.</translation> <translation id="5468998798572797635">إنهاء وضع ملء الشاشة</translation> <translation id="5516235301412634559">0.75</translation> -<translation id="5537725057119320332">إرسال</translation> +<translation id="5537725057119320332">بث</translation> <translation id="5546461542133609677">إعادة الصوت</translation> <translation id="5630795885300617244">انقر مرّتين جهة اليمين أو اليسار لتخطي 10 ثوانٍ.</translation> <translation id="5677946354068040947">خيارات إضافية</translation>
diff --git a/third_party/blink/renderer/core/css/container_query_test.cc b/third_party/blink/renderer/core/css/container_query_test.cc index 9bef378..3e521bc2 100644 --- a/third_party/blink/renderer/core/css/container_query_test.cc +++ b/third_party/blink/renderer/core/css/container_query_test.cc
@@ -146,14 +146,20 @@ "(width < 300px)", SerializeCondition(ParseAtContainer("@container (width < 300px) {}"))); + EXPECT_EQ("not (width)", SerializeCondition(ParseAtContainer( + "@container somename not (width) {}"))); + + EXPECT_EQ("(width) and (height)", SerializeCondition(ParseAtContainer( + "@container (width) and (height) {}"))); + + EXPECT_EQ("(width) or (height)", SerializeCondition(ParseAtContainer( + "@container (width) or (height) {}"))); + // Invalid: EXPECT_FALSE(ParseAtContainer("@container 100px {}")); EXPECT_FALSE(ParseAtContainer("@container calc(1) {}")); EXPECT_FALSE(ParseAtContainer("@container {}")); EXPECT_FALSE(ParseAtContainer("@container (min-width: 300px) nonsense {}")); - EXPECT_FALSE(ParseAtContainer("@container somename not (width) {}")); - EXPECT_FALSE(ParseAtContainer("@container (width) and (height) {}")); - EXPECT_FALSE(ParseAtContainer("@container (width) or (height) {}")); EXPECT_FALSE(ParseAtContainer("@container size(width) {}")); }
diff --git a/third_party/blink/renderer/core/css/parser/container_query_parser.cc b/third_party/blink/renderer/core/css/parser/container_query_parser.cc index 5837addb..5f69611 100644 --- a/third_party/blink/renderer/core/css/parser/container_query_parser.cc +++ b/third_party/blink/renderer/core/css/parser/container_query_parser.cc
@@ -109,26 +109,26 @@ context.GetExecutionContext(), MediaQueryParser::SyntaxLevel::kLevel4) {} -const MediaQueryExpNode* ContainerQueryParser::ParseQuery(String value) { +const MediaQueryExpNode* ContainerQueryParser::ParseCondition(String value) { auto tokens = CSSTokenizer(value).TokenizeToEOF(); CSSParserTokenRange range(tokens); - return ParseQuery(range); + return ParseCondition(range); } -const MediaQueryExpNode* ContainerQueryParser::ParseQuery( +const MediaQueryExpNode* ContainerQueryParser::ParseCondition( CSSParserTokenRange range) { range.ConsumeWhitespace(); - const MediaQueryExpNode* node = ConsumeContainerQuery(range); + const MediaQueryExpNode* node = ConsumeContainerCondition(range); if (!range.AtEnd()) return nullptr; return node; } -// <container-query> = ( <container-condition> ) +// <query-in-parens> = ( <container-condition> ) // | ( <size-feature> ) // | style( <style-query> ) // | <general-enclosed> -const MediaQueryExpNode* ContainerQueryParser::ConsumeContainerQuery( +const MediaQueryExpNode* ContainerQueryParser::ConsumeQueryInParens( CSSParserTokenRange& range) { CSSParserTokenRange original_range = range; @@ -171,7 +171,7 @@ CSSParserTokenRange& range) { return ConsumeNotAndOr( [this](CSSParserTokenRange& range) { - return this->ConsumeContainerQuery(range); + return this->ConsumeQueryInParens(range); }, range); }
diff --git a/third_party/blink/renderer/core/css/parser/container_query_parser.h b/third_party/blink/renderer/core/css/parser/container_query_parser.h index a73db56..bd405c74 100644 --- a/third_party/blink/renderer/core/css/parser/container_query_parser.h +++ b/third_party/blink/renderer/core/css/parser/container_query_parser.h
@@ -22,16 +22,16 @@ public: explicit ContainerQueryParser(const CSSParserContext&); - // https://drafts.csswg.org/css-contain-3/#typedef-container-query - const MediaQueryExpNode* ParseQuery(String); - const MediaQueryExpNode* ParseQuery(CSSParserTokenRange); + // https://drafts.csswg.org/css-contain-3/#typedef-container-condition + const MediaQueryExpNode* ParseCondition(String); + const MediaQueryExpNode* ParseCondition(CSSParserTokenRange); private: friend class ContainerQueryParserTest; using FeatureSet = MediaQueryParser::FeatureSet; - const MediaQueryExpNode* ConsumeContainerQuery(CSSParserTokenRange&); + const MediaQueryExpNode* ConsumeQueryInParens(CSSParserTokenRange&); const MediaQueryExpNode* ConsumeContainerCondition(CSSParserTokenRange&); const MediaQueryExpNode* ConsumeFeatureQuery(CSSParserTokenRange&, const FeatureSet&);
diff --git a/third_party/blink/renderer/core/css/parser/container_query_parser_test.cc b/third_party/blink/renderer/core/css/parser/container_query_parser_test.cc index e2011a7..841d0c8 100644 --- a/third_party/blink/renderer/core/css/parser/container_query_parser_test.cc +++ b/third_party/blink/renderer/core/css/parser/container_query_parser_test.cc
@@ -18,7 +18,7 @@ String ParseQuery(String string) { const auto* context = MakeGarbageCollected<CSSParserContext>(GetDocument()); const MediaQueryExpNode* node = - ContainerQueryParser(*context).ParseQuery(string); + ContainerQueryParser(*context).ParseCondition(string); if (!node) return g_null_atom; if (node->HasUnknown()) @@ -72,6 +72,9 @@ "((width > 100px) and (width > 200px))", "((width) and (width) and (width))", "((width) or (width) or (width))", + "not (width)", + "(width) and (height)", + "(width) or (height)", }; for (const char* test : tests) @@ -79,8 +82,6 @@ // Invalid: EXPECT_EQ("<unknown>", ParseQuery("(min-width)")); - EXPECT_EQ(g_null_atom, ParseQuery("(width) and (height)")); - EXPECT_EQ(g_null_atom, ParseQuery("(width) or (height)")); EXPECT_EQ("<unknown>", ParseQuery("((width) or (width) and (width))")); EXPECT_EQ("<unknown>", ParseQuery("((width) and (width) or (width))")); EXPECT_EQ("<unknown>", ParseQuery("((width) or (height) and (width))"));
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_impl.cc b/third_party/blink/renderer/core/css/parser/css_parser_impl.cc index 8502ee7d..c18477d 100644 --- a/third_party/blink/renderer/core/css/parser/css_parser_impl.cc +++ b/third_party/blink/renderer/core/css/parser/css_parser_impl.cc
@@ -1172,12 +1172,11 @@ if (prelude.Peek().GetType() == kIdentToken) { auto* ident = DynamicTo<CSSCustomIdentValue>( css_parsing_utils::ConsumeSingleContainerName(prelude, *context_)); - if (!ident) - return nullptr; - name = ident->Value(); + if (ident) + name = ident->Value(); } - const MediaQueryExpNode* query = query_parser.ParseQuery(prelude); + const MediaQueryExpNode* query = query_parser.ParseCondition(prelude); if (!query) return nullptr; ContainerQuery* container_query = MakeGarbageCollected<ContainerQuery>(
diff --git a/third_party/blink/renderer/core/css/style_rule.cc b/third_party/blink/renderer/core/css/style_rule.cc index 5c7e896..8faec18 100644 --- a/third_party/blink/renderer/core/css/style_rule.cc +++ b/third_party/blink/renderer/core/css/style_rule.cc
@@ -695,7 +695,7 @@ auto* context = MakeGarbageCollected<CSSParserContext>(*execution_context); ContainerQueryParser parser(*context); - if (const MediaQueryExpNode* exp_node = parser.ParseQuery(value)) { + if (const MediaQueryExpNode* exp_node = parser.ParseCondition(value)) { condition_text_ = exp_node->Serialize(); ContainerSelector selector(container_query_->Selector().Name(), *exp_node);
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index cb677d2..6a8ff33 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -3702,8 +3702,10 @@ HTMLFrameOwnerElement::PluginDisposeSuspendScope suspend_plugin_dispose; if (HasRareData()) { ElementRareData* data = GetElementRareData(); - if (!performing_reattach) + if (!performing_reattach) { data->ClearPseudoElements(); + data->ClearContainerQueryData(); + } if (ElementAnimations* element_animations = data->GetElementAnimations()) { if (!performing_reattach) {
diff --git a/third_party/blink/renderer/core/dom/element_rare_data.h b/third_party/blink/renderer/core/dom/element_rare_data.h index 031d21b..0f16a92 100644 --- a/third_party/blink/renderer/core/dom/element_rare_data.h +++ b/third_party/blink/renderer/core/dom/element_rare_data.h
@@ -118,6 +118,7 @@ ContainerQueryData* GetContainerQueryData() const { return container_query_data_; } + void ClearContainerQueryData() { container_query_data_ = nullptr; } // Returns the crop-ID if one was set, or nullptr otherwise. const RegionCaptureCropId* GetRegionCaptureCropId() const { @@ -558,6 +559,10 @@ return super_rare_data_->GetContainerQueryData(); return nullptr; } + void ClearContainerQueryData() { + if (super_rare_data_) + super_rare_data_->ClearContainerQueryData(); + } ContainerQueryEvaluator* GetContainerQueryEvaluator() const { ContainerQueryData* container_query_data = GetContainerQueryData();
diff --git a/third_party/blink/renderer/core/editing/frame_selection.cc b/third_party/blink/renderer/core/editing/frame_selection.cc index 273035f..28e31a3 100644 --- a/third_party/blink/renderer/core/editing/frame_selection.cc +++ b/third_party/blink/renderer/core/editing/frame_selection.cc
@@ -154,7 +154,10 @@ return kNotFound; Element* const editable = RootEditableElementOrDocumentElement(); DCHECK(editable); - return PlainTextRange::Create(*editable, range).Start(); + PlainTextRange plain_text_range = PlainTextRange::Create(*editable, range); + if (plain_text_range.IsNull()) + return kNotFound; + return plain_text_range.Start(); } VisibleSelection FrameSelection::ComputeVisibleSelectionInDOMTreeDeprecated()
diff --git a/third_party/blink/renderer/core/frame/attribution_src_loader.cc b/third_party/blink/renderer/core/frame/attribution_src_loader.cc index 0a3bd58..74581ff 100644 --- a/third_party/blink/renderer/core/frame/attribution_src_loader.cc +++ b/third_party/blink/renderer/core/frame/attribution_src_loader.cc
@@ -22,6 +22,7 @@ #include "third_party/blink/public/mojom/conversions/conversions.mojom-blink.h" #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h" #include "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom-blink.h" +#include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/frame/attribution_response_parsing.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/frame/local_frame.h" @@ -64,23 +65,17 @@ status); } -void MaybeLogAuditIssue(LocalFrame* frame, - AttributionReportingIssueType issue_type, - const absl::optional<String>& string, - HTMLElement* element, - absl::optional<uint64_t> request_id) { - DCHECK(frame); - - if (!frame->IsAttached()) - return; - - absl::optional<String> id_string; +void LogAuditIssue(ExecutionContext* execution_context, + AttributionReportingIssueType issue_type, + HTMLElement* element, + absl::optional<uint64_t> request_id, + const String& invalid_parameter) { + String id_string; if (request_id) id_string = IdentifiersFactory::SubresourceRequestId(*request_id); - AuditsIssue::ReportAttributionIssue(frame->DomWindow(), issue_type, - frame->GetDevToolsFrameToken(), element, - id_string, string); + AuditsIssue::ReportAttributionIssue(execution_context, issue_type, element, + id_string, invalid_parameter); } } // namespace @@ -104,24 +99,19 @@ if (!feature_policy_enabled) { if (log_issues) { - MaybeLogAuditIssue( - frame, AttributionReportingIssueType::kPermissionPolicyDisabled, - /*string=*/absl::nullopt, element, request_id); + LogAuditIssue(window, + AttributionReportingIssueType::kPermissionPolicyDisabled, + element, request_id, /*invalid_parameter=*/String()); } return false; } - // The API is only allowed in secure contexts. if (!window->IsSecureContext()) { if (log_issues) { - MaybeLogAuditIssue( - frame, - context == AttributionSrcLoader::RegisterContext::kAttributionSrc - ? AttributionReportingIssueType:: - kAttributionSourceUntrustworthyOrigin - : AttributionReportingIssueType::kAttributionUntrustworthyOrigin, - frame->GetSecurityContext()->GetSecurityOrigin()->ToString(), element, - request_id); + LogAuditIssue( + window, AttributionReportingIssueType::kInsecureContext, element, + request_id, /*invalid_parameter=*/ + window->GetSecurityContext().GetSecurityOrigin()->ToString()); } return false; } @@ -344,12 +334,10 @@ scoped_refptr<const SecurityOrigin> reporting_origin = SecurityOrigin::Create(url); if (!reporting_origin->IsPotentiallyTrustworthy()) { - LogAuditIssue( - context == RegisterContext::kAttributionSrc - ? AttributionReportingIssueType:: - kAttributionSourceUntrustworthyOrigin - : AttributionReportingIssueType::kAttributionUntrustworthyOrigin, - reporting_origin->ToString(), element, request_id); + LogAuditIssue(window, + AttributionReportingIssueType::kUntrustworthyReportingOrigin, + element, request_id, + /*invalid_parameter=*/reporting_origin->ToString()); return false; } @@ -545,9 +533,10 @@ if (!attribution_response_parsing::ParseSourceRegistrationHeader( source_json, *source_data)) { - loader_->LogAuditIssue(AttributionReportingIssueType::kInvalidHeader, - source_json, - /*element=*/nullptr, request_id); + LogAuditIssue(loader_->local_frame_->DomWindow(), + AttributionReportingIssueType::kInvalidHeader, + /*element=*/nullptr, request_id, + /*invalid_parameter=*/source_json); return; } @@ -568,12 +557,4 @@ data_host_->TriggerDataAvailable(std::move(trigger_data)); } -void AttributionSrcLoader::LogAuditIssue( - AttributionReportingIssueType issue_type, - const absl::optional<String>& string, - HTMLElement* element, - absl::optional<uint64_t> request_id) { - MaybeLogAuditIssue(local_frame_, issue_type, string, element, request_id); -} - } // namespace blink
diff --git a/third_party/blink/renderer/core/frame/attribution_src_loader.h b/third_party/blink/renderer/core/frame/attribution_src_loader.h index e81b671..4d9bef70 100644 --- a/third_party/blink/renderer/core/frame/attribution_src_loader.h +++ b/third_party/blink/renderer/core/frame/attribution_src_loader.h
@@ -97,11 +97,6 @@ SrcType src_type, bool associated_with_navigation); - void LogAuditIssue(AttributionReportingIssueType issue_type, - const absl::optional<String>& string, - HTMLElement* element, - absl::optional<uint64_t> request_id); - const Member<LocalFrame> local_frame_; size_t num_resource_clients_ = 0; };
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc index 6e074c3..d22a8596 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -2865,10 +2865,6 @@ DCHECK(GetFrame().IsLocalRoot()); - absl::optional<MobileFriendlinessChecker::PaintScope> mf_scope; - if (mobile_friendliness_checker_) - mf_scope.emplace(*mobile_friendliness_checker_); - auto* layout_view = GetLayoutView(); DCHECK(layout_view);
diff --git a/third_party/blink/renderer/core/frame/visual_viewport.cc b/third_party/blink/renderer/core/frame/visual_viewport.cc index 34ed2aa..b33fc5b 100644 --- a/third_party/blink/renderer/core/frame/visual_viewport.cc +++ b/third_party/blink/renderer/core/frame/visual_viewport.cc
@@ -817,10 +817,6 @@ } ScrollOffset VisualViewport::MaximumScrollOffset() const { - return MaximumScrollOffsetAtScale(scale_); -} - -ScrollOffset VisualViewport::MaximumScrollOffsetAtScale(float scale) const { if (!IsActiveViewport()) return ScrollOffset(); @@ -834,14 +830,14 @@ frame_view_size.Enlarge(0, browser_controls_adjustment_ / min_scale); } - frame_view_size.Scale(scale); + frame_view_size.Scale(scale_); frame_view_size = gfx::SizeF(ToFlooredSize(frame_view_size)); gfx::SizeF viewport_size(size_); viewport_size.Enlarge(0, ceilf(browser_controls_adjustment_)); gfx::SizeF max_position = frame_view_size - viewport_size; - max_position.Scale(1 / scale); + max_position.Scale(1 / scale_); return ScrollOffset(max_position.width(), max_position.height()); }
diff --git a/third_party/blink/renderer/core/frame/visual_viewport.h b/third_party/blink/renderer/core/frame/visual_viewport.h index 49ef3647..c3c2a09 100644 --- a/third_party/blink/renderer/core/frame/visual_viewport.h +++ b/third_party/blink/renderer/core/frame/visual_viewport.h
@@ -212,7 +212,6 @@ gfx::Vector2d MinimumScrollOffsetInt() const override; gfx::Vector2d MaximumScrollOffsetInt() const override; ScrollOffset MaximumScrollOffset() const override; - ScrollOffset MaximumScrollOffsetAtScale(float scale) const; // Note: Because scrollbars are conceptually owned by the LayoutView, // ContentsSize includes the main frame's scrollbars. This is necessary for // correct cc Layer sizing.
diff --git a/third_party/blink/renderer/core/frame/visual_viewport_test.cc b/third_party/blink/renderer/core/frame/visual_viewport_test.cc index dc9db2aa..5f7a6369f 100644 --- a/third_party/blink/renderer/core/frame/visual_viewport_test.cc +++ b/third_party/blink/renderer/core/frame/visual_viewport_test.cc
@@ -1836,28 +1836,6 @@ scrollable_area->MaximumScrollOffset()); } -// Tests that the scroll offset is consistent when scale specified. -TEST_P(VisualViewportTest, MaxScrollOffsetAtScale) { - InitializeWithDesktopSettings(); - WebView()->MainFrameViewWidget()->Resize(gfx::Size(101, 201)); - NavigateTo("about:blank"); - - VisualViewport& visual_viewport = GetFrame()->GetPage()->GetVisualViewport(); - - WebView()->SetPageScaleFactor(0.1); - EXPECT_EQ(ScrollOffset(), visual_viewport.MaximumScrollOffsetAtScale(1.0)); - - WebView()->SetPageScaleFactor(2); - EXPECT_EQ(ScrollOffset(), visual_viewport.MaximumScrollOffsetAtScale(1.0)); - - WebView()->SetPageScaleFactor(5); - EXPECT_EQ(ScrollOffset(), visual_viewport.MaximumScrollOffsetAtScale(1.0)); - - WebView()->SetPageScaleFactor(10); - EXPECT_EQ(ScrollOffset(101. / 2., 201. / 2.), - visual_viewport.MaximumScrollOffsetAtScale(2.0)); -} - // Tests that the slow scrolling after an impl scroll on the visual viewport is // continuous. crbug.com/453460 was caused by the impl-path not updating the // ScrollAnimatorBase class.
diff --git a/third_party/blink/renderer/core/inspector/build.gni b/third_party/blink/renderer/core/inspector/build.gni index 2e50b1a..c0e1f3d 100644 --- a/third_party/blink/renderer/core/inspector/build.gni +++ b/third_party/blink/renderer/core/inspector/build.gni
@@ -126,6 +126,7 @@ blink_core_tests_inspector = [ "agent_registry_test.cc", + "inspected_frames_test.cc", "inspector_contrast_test.cc", "inspector_emulation_agent_test.cc", "inspector_highlight_test.cc",
diff --git a/third_party/blink/renderer/core/inspector/inspected_frames.cc b/third_party/blink/renderer/core/inspector/inspected_frames.cc index 107c2e7..82e3f87 100644 --- a/third_party/blink/renderer/core/inspector/inspected_frames.cc +++ b/third_party/blink/renderer/core/inspector/inspected_frames.cc
@@ -34,6 +34,16 @@ return nullptr; } +LocalFrame* InspectedFrames::FrameWithStorageKey(const String& key_raw_string) { + for (LocalFrame* frame : *this) { + if (static_cast<StorageKey>(frame->DomWindow()->GetStorageKey()) + .Serialize() == key_raw_string.Utf8()) { + return frame; + } + } + return nullptr; +} + InspectedFrames::Iterator::Iterator(LocalFrame* root, LocalFrame* current) : root_(root), current_(current) {}
diff --git a/third_party/blink/renderer/core/inspector/inspected_frames.h b/third_party/blink/renderer/core/inspector/inspected_frames.h index 8fc79aa3..392fb96b 100644 --- a/third_party/blink/renderer/core/inspector/inspected_frames.h +++ b/third_party/blink/renderer/core/inspector/inspected_frames.h
@@ -43,6 +43,7 @@ LocalFrame* Root() { return root_; } bool Contains(LocalFrame*) const; LocalFrame* FrameWithSecurityOrigin(const String& origin_raw_string); + LocalFrame* FrameWithStorageKey(const String& key_raw_string); Iterator begin(); Iterator end();
diff --git a/third_party/blink/renderer/core/inspector/inspected_frames_test.cc b/third_party/blink/renderer/core/inspector/inspected_frames_test.cc new file mode 100644 index 0000000..b53c475d --- /dev/null +++ b/third_party/blink/renderer/core/inspector/inspected_frames_test.cc
@@ -0,0 +1,43 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/core/inspector/inspected_frames.h" + +#include "base/unguessable_token.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/core/frame/local_dom_window.h" +#include "third_party/blink/renderer/core/frame/local_frame.h" +#include "third_party/blink/renderer/core/testing/dummy_page_holder.h" +#include "third_party/blink/renderer/platform/storage/blink_storage_key.h" +#include "third_party/blink/renderer/platform/weborigin/security_origin.h" + +namespace blink { + +class InspectedFramesTest : public testing::Test { + public: + InspectedFramesTest() = default; + ~InspectedFramesTest() override = default; +}; + +TEST_F(InspectedFramesTest, FindsFrameForGivenStorageKey) { + auto security_origin = + SecurityOrigin::CreateFromString("http://example.site"); + auto nonce = base::UnguessableToken::Create(); + auto blink_storage_key = + BlinkStorageKey::CreateWithNonce(security_origin, nonce); + + auto page_holder = std::make_unique<DummyPageHolder>( + gfx::Size(800, 600), nullptr, nullptr, base::NullCallback()); + LocalDOMWindow* dom_window = page_holder->GetFrame().DomWindow(); + dom_window->SetStorageKey(blink_storage_key); + + InspectedFrames inspected_frames(&page_holder->GetFrame()); + std::string storage_key = + static_cast<StorageKey>(blink_storage_key).Serialize(); + + EXPECT_EQ(page_holder->GetFrame(), + inspected_frames.FrameWithStorageKey(WTF::String(storage_key))); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_audits_issue.cc b/third_party/blink/renderer/core/inspector/inspector_audits_issue.cc index 6a339d6..e964fff52 100644 --- a/third_party/blink/renderer/core/inspector/inspector_audits_issue.cc +++ b/third_party/blink/renderer/core/inspector/inspector_audits_issue.cc
@@ -143,12 +143,12 @@ case AttributionReportingIssueType::kPermissionPolicyDisabled: return protocol::Audits::AttributionReportingIssueTypeEnum:: PermissionPolicyDisabled; - case AttributionReportingIssueType::kAttributionSourceUntrustworthyOrigin: + case AttributionReportingIssueType::kUntrustworthyReportingOrigin: return protocol::Audits::AttributionReportingIssueTypeEnum:: - AttributionSourceUntrustworthyOrigin; - case AttributionReportingIssueType::kAttributionUntrustworthyOrigin: + UntrustworthyReportingOrigin; + case AttributionReportingIssueType::kInsecureContext: return protocol::Audits::AttributionReportingIssueTypeEnum:: - AttributionUntrustworthyOrigin; + InsecureContext; case AttributionReportingIssueType::kInvalidHeader: return protocol::Audits::AttributionReportingIssueTypeEnum::InvalidHeader; } @@ -156,33 +156,25 @@ } // namespace -void AuditsIssue::ReportAttributionIssue( - ExecutionContext* reporting_execution_context, - AttributionReportingIssueType type, - const absl::optional<base::UnguessableToken>& offending_frame_token, - Element* element, - const absl::optional<String>& request_id, - const absl::optional<String>& invalid_parameter) { +void AuditsIssue::ReportAttributionIssue(ExecutionContext* execution_context, + AttributionReportingIssueType type, + Element* element, + const String& request_id, + const String& invalid_parameter) { auto details = protocol::Audits::AttributionReportingIssueDetails::create() .setViolationType(BuildAttributionReportingIssueType(type)) .build(); - if (offending_frame_token) { - details->setFrame( - protocol::Audits::AffectedFrame::create() - .setFrameId(IdentifiersFactory::IdFromToken(*offending_frame_token)) - .build()); - } if (element) { details->setViolatingNodeId(DOMNodeIds::IdForNode(element)); } - if (request_id) { + if (!request_id.IsNull()) { details->setRequest(protocol::Audits::AffectedRequest::create() - .setRequestId(*request_id) + .setRequestId(request_id) .build()); } - if (invalid_parameter) { - details->setInvalidParameter(*invalid_parameter); + if (!invalid_parameter.IsNull()) { + details->setInvalidParameter(invalid_parameter); } auto issue_details = @@ -194,7 +186,7 @@ AttributionReportingIssue) .setDetails(std::move(issue_details)) .build(); - reporting_execution_context->AddInspectorIssue(AuditsIssue(std::move(issue))); + execution_context->AddInspectorIssue(AuditsIssue(std::move(issue))); } void AuditsIssue::ReportNavigatorUserAgentAccess(
diff --git a/third_party/blink/renderer/core/inspector/inspector_audits_issue.h b/third_party/blink/renderer/core/inspector/inspector_audits_issue.h index 65f11a48..c15aa3e 100644 --- a/third_party/blink/renderer/core/inspector/inspector_audits_issue.h +++ b/third_party/blink/renderer/core/inspector/inspector_audits_issue.h
@@ -104,8 +104,8 @@ enum class AttributionReportingIssueType { kPermissionPolicyDisabled, - kAttributionSourceUntrustworthyOrigin, - kAttributionUntrustworthyOrigin, + kUntrustworthyReportingOrigin, + kInsecureContext, kInvalidHeader, }; @@ -165,21 +165,12 @@ WTF::String initiator_origin, WTF::String failedParameter, absl::optional<base::UnguessableToken> issue_id); - // Reports an Attribution Reporting API issue to DevTools. - // |reporting_execution_context| is the current execution context in which the - // issue happens and is reported in (the "target" in DevTools terms). - // |offending_frame_token| is the offending frame that triggered the issue. - // |offending_frame_token| does not necessarly correspond to - // |reporting_execution_context|, e.g. when an impression click in an iframe - // is blocked due to an insecure main frame. - static void ReportAttributionIssue( - ExecutionContext* reporting_execution_context, - AttributionReportingIssueType type, - const absl::optional<base::UnguessableToken>& offending_frame_token = - absl::nullopt, - Element* element = nullptr, - const absl::optional<String>& request_id = absl::nullopt, - const absl::optional<String>& invalid_parameter = absl::nullopt); + + static void ReportAttributionIssue(ExecutionContext* execution_context, + AttributionReportingIssueType type, + Element* element, + const String& request_id, + const String& invalid_parameter); static void ReportNavigatorUserAgentAccess( ExecutionContext* execution_context,
diff --git a/third_party/blink/renderer/core/layout/layout_text.cc b/third_party/blink/renderer/core/layout/layout_text.cc index dafcef15..5c33864 100644 --- a/third_party/blink/renderer/core/layout/layout_text.cc +++ b/third_party/blink/renderer/core/layout/layout_text.cc
@@ -1856,6 +1856,57 @@ } } +LayoutUnit LayoutText::PhysicalAreaSize() const { + NOT_DESTROYED(); + // This is not accurate when |this| starts or ends at the middle of a line, + // but we prefer performance over accuracy. + if (IsInLayoutNGInlineFormattingContext()) { + NGInlineCursor cursor; + cursor.MoveTo(*this); + if (!cursor) + return LayoutUnit(0); + PhysicalRect rect = cursor.Current().RectInContainerFragment(); + cursor.MoveToLastForSameLayoutObject(); + rect.Unite(cursor.Current().RectInContainerFragment()); + return rect.Width() * rect.Height(); + } + + if (const auto* first_text_box = FirstTextBox()) { + if (const auto* last_text_box = LastTextBox()) { + LayoutUnit width = + std::max(first_text_box->LogicalRight(), + last_text_box->LogicalRight()) - + std::min(first_text_box->LogicalLeft(), last_text_box->LogicalLeft()); + LayoutUnit height = + last_text_box->LogicalBottom() - first_text_box->LogicalTop(); + return width * height; + } + } + return LayoutUnit(0); +} + +LayoutUnit LayoutText::PhysicalRightOffset() const { + NOT_DESTROYED(); + // This is not accurate when |this| starts or ends at the middle of a line, + // but we prefer performance over accuracy. + if (IsInLayoutNGInlineFormattingContext()) { + NGInlineCursor cursor; + cursor.MoveTo(*this); + if (!cursor) + return LayoutUnit(0); + PhysicalRect rect = cursor.Current().RectInContainerFragment(); + return rect.offset.left + rect.size.width; + } + + if (const auto* first_text_box = FirstTextBox()) { + if (const auto* last_text_box = LastTextBox()) { + return std::max(first_text_box->FrameRect().MaxX(), + last_text_box->FrameRect().MaxX()); + } + } + return LayoutUnit(0); +} + bool LayoutText::CanOptimizeSetText() const { NOT_DESTROYED(); // If we have only one line of text and "contain: layout size" we can avoid
diff --git a/third_party/blink/renderer/core/layout/layout_text.h b/third_party/blink/renderer/core/layout/layout_text.h index 33c0afe..e345f6941 100644 --- a/third_party/blink/renderer/core/layout/layout_text.h +++ b/third_party/blink/renderer/core/layout/layout_text.h
@@ -420,6 +420,12 @@ void LogicalStartingPointAndHeight(LogicalOffset& logical_starting_point, LayoutUnit& logical_height) const; + // Returns the size of area occupied by this LayoutText. + LayoutUnit PhysicalAreaSize() const; + + // Returns the rightmost offset occupied by this LayoutText. + LayoutUnit PhysicalRightOffset() const; + // For LayoutShiftTracker. Saves the value of LogicalStartingPoint() value // during the previous paint invalidation. LogicalOffset PreviousLogicalStartingPoint() const {
diff --git a/third_party/blink/renderer/core/layout/min_max_sizes.h b/third_party/blink/renderer/core/layout/min_max_sizes.h index 1193427..4b018f65 100644 --- a/third_party/blink/renderer/core/layout/min_max_sizes.h +++ b/third_party/blink/renderer/core/layout/min_max_sizes.h
@@ -25,6 +25,8 @@ LayoutUnit min_size; LayoutUnit max_size; + bool IsEmpty() const { return !min_size && max_size == LayoutUnit::Max(); } + // Make sure that our min/max sizes are at least as large as |other|. void Encompass(const MinMaxSizes& other) { min_size = std::max(min_size, other.min_size); @@ -59,6 +61,7 @@ bool operator==(const MinMaxSizes& other) const { return min_size == other.min_size && max_size == other.max_size; } + bool operator!=(const MinMaxSizes& other) const { return !operator==(other); } void operator=(LayoutUnit value) { min_size = max_size = value; } MinMaxSizes& operator+=(MinMaxSizes extra) {
diff --git a/third_party/blink/renderer/core/layout/ng/ng_absolute_utils.cc b/third_party/blink/renderer/core/layout/ng/ng_absolute_utils.cc index 50ac85c1..ce61192 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_absolute_utils.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_absolute_utils.cc
@@ -495,6 +495,9 @@ const auto& style = node.Style(); const bool is_table = node.IsTable(); + MinMaxSizes min_max_block_sizes = ComputeMinMaxBlockSizes( + space, style, border_padding, computed_available_size.block_size, + anchor_evaluator); auto IntrinsicBlockSizeFunc = [&]() -> LayoutUnit { DCHECK(!node.IsReplaced()); @@ -509,6 +512,9 @@ {dimensions->size.inline_size, space.AvailableSize().block_size}); builder.SetIsFixedInlineSize(true); builder.SetPercentageResolutionSize(space.PercentageResolutionSize()); + // Use the computed |MinMaxSizes| because |node.Layout()| can't resolve + // the `anchor-size()` function. + builder.SetOverrideMinMaxBlockSizes(min_max_block_sizes); if (space.IsInitialColumnBalancingPass()) { // The |fragmentainer_offset_delta| will not make a difference in the @@ -552,9 +558,6 @@ LayoutUnit main_block_size = ResolveMainBlockLength( space, style, border_padding, main_block_length, IntrinsicBlockSizeFunc, computed_available_size.block_size, anchor_evaluator); - MinMaxSizes min_max_block_sizes = ComputeMinMaxBlockSizes( - space, style, border_padding, computed_available_size.block_size, - anchor_evaluator); // Manually resolve any intrinsic/content min/max block-sizes. // TODO(crbug.com/1135207): |ComputeMinMaxBlockSizes()| should handle this.
diff --git a/third_party/blink/renderer/core/layout/ng/ng_constraint_space.h b/third_party/blink/renderer/core/layout/ng/ng_constraint_space.h index 1ce129b0..0bb06b1b 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_constraint_space.h +++ b/third_party/blink/renderer/core/layout/ng/ng_constraint_space.h
@@ -12,6 +12,7 @@ #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/layout/geometry/logical_size.h" #include "third_party/blink/renderer/core/layout/geometry/physical_size.h" +#include "third_party/blink/renderer/core/layout/min_max_sizes.h" #include "third_party/blink/renderer/core/layout/ng/exclusions/ng_exclusion_space.h" #include "third_party/blink/renderer/core/layout/ng/geometry/ng_bfc_offset.h" #include "third_party/blink/renderer/core/layout/ng/geometry/ng_margin_strut.h" @@ -278,6 +279,11 @@ return LayoutUnit(); } + absl::optional<MinMaxSizes> OverrideMinMaxBlockSizes() const { + return HasRareData() ? rare_data_->OverrideMinMaxBlockSizes() + : absl::nullopt; + } + // Inline/block target stretch size constraints. // See: // https://w3c.github.io/mathml-core/#dfn-inline-stretch-size-constraint @@ -846,6 +852,7 @@ should_ignore_forced_breaks(false), is_in_column_bfc(false), min_block_size_should_encompass_intrinsic_size(false), + has_override_min_max_block_sizes(false), min_break_appeal(kBreakAppealLastResort), propagate_child_break_values(false), is_at_fragmentainer_start(false), @@ -856,6 +863,7 @@ other.replaced_percentage_resolution_block_size), block_start_annotation_space(other.block_start_annotation_space), bfc_offset(other.bfc_offset), + override_min_max_block_sizes(other.override_min_max_block_sizes), fragmentainer_block_size(other.fragmentainer_block_size), fragmentainer_offset_at_bfc(other.fragmentainer_offset_at_bfc), data_union_type(other.data_union_type), @@ -872,6 +880,8 @@ is_in_column_bfc(other.is_in_column_bfc), min_block_size_should_encompass_intrinsic_size( other.min_block_size_should_encompass_intrinsic_size), + has_override_min_max_block_sizes( + other.has_override_min_max_block_sizes), min_break_appeal(other.min_break_appeal), propagate_child_break_values(other.propagate_child_break_values), is_at_fragmentainer_start(other.is_at_fragmentainer_start), @@ -1055,6 +1065,22 @@ : LayoutUnit::Min(); } + absl::optional<MinMaxSizes> OverrideMinMaxBlockSizes() const { + if (has_override_min_max_block_sizes) + return override_min_max_block_sizes; + return absl::nullopt; + } + + void SetOverrideMinMaxBlockSizes(const MinMaxSizes& min_max_sizes) { + if (min_max_sizes.IsEmpty()) { + has_override_min_max_block_sizes = false; + return; + } + DCHECK_GE(min_max_sizes.max_size, min_max_sizes.min_size); + has_override_min_max_block_sizes = true; + override_min_max_block_sizes = min_max_sizes; + } + void SetClearanceOffset(LayoutUnit clearance_offset) { EnsureBlockData()->clearance_offset = clearance_offset; } @@ -1228,6 +1254,7 @@ LayoutUnit replaced_percentage_resolution_block_size; LayoutUnit block_start_annotation_space; NGBfcOffset bfc_offset; + MinMaxSizes override_min_max_block_sizes; LayoutUnit fragmentainer_block_size = kIndefiniteSize; LayoutUnit fragmentainer_offset_at_bfc; @@ -1245,6 +1272,7 @@ unsigned should_ignore_forced_breaks : 1; unsigned is_in_column_bfc : 1; unsigned min_block_size_should_encompass_intrinsic_size : 1; + unsigned has_override_min_max_block_sizes : 1; unsigned min_break_appeal : kNGBreakAppealBitsNeeded; unsigned propagate_child_break_values : 1; unsigned is_at_fragmentainer_start : 1;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h b/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h index 1d6ae795..e2b12c1 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h +++ b/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h
@@ -192,6 +192,11 @@ } } + void SetOverrideMinMaxBlockSizes(const MinMaxSizes& min_max_sizes) { + if (!min_max_sizes.IsEmpty() || space_.HasRareData()) + space_.EnsureRareData()->SetOverrideMinMaxBlockSizes(min_max_sizes); + } + void SetIsPaintedAtomically(bool b) { space_.bitfields_.is_painted_atomically = b; }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc b/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc index 85060c61..0487048 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc
@@ -596,6 +596,11 @@ const NGBoxStrut& border_padding, LayoutUnit override_available_size, const Length::AnchorEvaluator* anchor_evaluator) { + if (const absl::optional<MinMaxSizes> override_sizes = + space.OverrideMinMaxBlockSizes()) { + DCHECK_GE(override_sizes->max_size, override_sizes->min_size); + return *override_sizes; + } MinMaxSizes sizes = { ResolveMinBlockLength(space, style, border_padding, style.LogicalMinHeight(), override_available_size,
diff --git a/third_party/blink/renderer/core/loader/worker_fetch_context.cc b/third_party/blink/renderer/core/loader/worker_fetch_context.cc index 844c35fd5..1d3138f4 100644 --- a/third_party/blink/renderer/core/loader/worker_fetch_context.cc +++ b/third_party/blink/renderer/core/loader/worker_fetch_context.cc
@@ -220,10 +220,6 @@ } void WorkerFetchContext::AddResourceTiming(const ResourceTimingInfo& info) { - // TODO(nhiroki): Add ResourceTiming API support once it's spec'ed for - // worklets. - if (global_scope_->IsWorkletGlobalScope()) - return; const SecurityOrigin* security_origin = GetResourceFetcherProperties() .GetFetchClientSettingsObject() .GetSecurityOrigin();
diff --git a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc index 82e93a9..65a92618 100644 --- a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc +++ b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc
@@ -20,9 +20,6 @@ #include "third_party/blink/renderer/core/html/html_anchor_element.h" #include "third_party/blink/renderer/core/html/html_image_element.h" #include "third_party/blink/renderer/core/layout/adjust_for_absolute_zoom.h" -#include "third_party/blink/renderer/core/layout/geometry/physical_offset.h" -#include "third_party/blink/renderer/core/layout/geometry/physical_rect.h" -#include "third_party/blink/renderer/core/layout/geometry/physical_size.h" #include "third_party/blink/renderer/core/layout/layout_image.h" #include "third_party/blink/renderer/core/layout/layout_object.h" #include "third_party/blink/renderer/core/layout/layout_view.h" @@ -67,18 +64,9 @@ MobileFriendlinessChecker::~MobileFriendlinessChecker() = default; -void MobileFriendlinessChecker::NotifyPaintBegin() { +void MobileFriendlinessChecker::NotifyPaint() { DCHECK(frame_view_->GetFrame().Client()->IsLocalFrameClientImpl()); DCHECK(frame_view_->GetFrame().IsOutermostMainFrame()); - - ignore_beyond_viewport_scope_count_ = - frame_view_->LayoutViewport()->MaximumScrollOffset().x() == 0 && - frame_view_->GetPage() - ->GetVisualViewport() - .MaximumScrollOffsetAtScale(initial_scale_) - .x() == 0; - is_painting_ = true; - if (timer_.IsActive() || base::TimeTicks::Now() - last_evaluated_ < kEvaluationInterval) { return; @@ -87,13 +75,6 @@ timer_.StartOneShot(kEvaluationDelay, FROM_HERE); } -void MobileFriendlinessChecker::NotifyPaintEnd() { - DCHECK(frame_view_->GetFrame().Client()->IsLocalFrameClientImpl()); - DCHECK(frame_view_->GetFrame().IsOutermostMainFrame()); - ignore_beyond_viewport_scope_count_ = 0; - is_painting_ = false; -} - void MobileFriendlinessChecker::WillBeRemovedFromFrame() { timer_.Stop(); } @@ -399,24 +380,6 @@ } // namespace -MobileFriendlinessChecker* MobileFriendlinessChecker::From( - const Document& document) { - DCHECK(document.GetFrame()); - - auto* local_frame = DynamicTo<LocalFrame>(document.GetFrame()->Top()); - if (local_frame == nullptr) - return nullptr; - - MobileFriendlinessChecker* mfc = - local_frame->View()->GetMobileFriendlinessChecker(); - if (!mfc || !mfc->is_painting_) - return nullptr; - - DCHECK_EQ(DocumentLifecycle::kInPaint, document.Lifecycle().GetState()); - DCHECK(!document.IsPrintingOrPaintingPreview()); - return mfc; -} - // Counts and calculate ration of bad tap targets. The process is a surface scan // with region tracking by Fenwick tree. The detail of the algorithm is // go/bad-tap-target-ukm @@ -509,12 +472,10 @@ .viewport_initial_scale_x10 = viewport_initial_scale_x10_, .viewport_hardcoded_width = viewport_hardcoded_width_, .allow_user_zoom = allow_user_zoom_, - .small_text_ratio = area_sizes_.SmallTextRatio(), + .small_text_ratio = text_area_sizes_.SmallTextRatio(), .text_content_outside_viewport_percentage = - area_sizes_.TextContentsOutsideViewportPercentage( - frame_view_->GetPage()->GetVisualViewport().Size().GetArea()), + ComputeContentOutsideViewport(), .bad_tap_targets_ratio = ComputeBadTapTargetsRatio()}); - last_evaluated_ = base::TimeTicks::Now(); } @@ -552,68 +513,61 @@ } } -int MobileFriendlinessChecker::AreaSizes::SmallTextRatio() const { +int MobileFriendlinessChecker::TextAreaWithFontSize::SmallTextRatio() const { if (total_text_area == 0) return 0; return small_font_area * 100 / total_text_area; } -int MobileFriendlinessChecker::AreaSizes::TextContentsOutsideViewportPercentage( - int viewport_area) const { - return std::ceil(content_beyond_viewport_area * 100 / viewport_area); -} - -void MobileFriendlinessChecker::UpdateTextAreaSizes( - const PhysicalRect& text_rect, - int font_size) { - double actual_font_size = font_size * initial_scale_ / viewport_scalar_; - double area = text_rect.Width() * text_rect.Height(); - if (std::round(actual_font_size) < kSmallFontThresholdInDips) - area_sizes_.small_font_area += area; - - area_sizes_.total_text_area += area; -} - -void MobileFriendlinessChecker::UpdateBeyondViewportAreaSizes( - const PhysicalRect& paint_rect) { - DCHECK(is_painting_); - if (ignore_beyond_viewport_scope_count_ != 0) - return; - - int frame_width = frame_view_->GetPage()->GetVisualViewport().Size().width(); - - // TODO(kumagi): Map paint_rect from the local transform space to the viewport - // space. - PhysicalRect viewport_rect( - LayoutUnit(), LayoutUnit(), - LayoutUnit(frame_width * viewport_scalar_ / initial_scale_), - LayoutUnit(kIntMaxForLayoutUnit)); - int original_size = - ClampTo<int>((paint_rect.Width() * paint_rect.Height()).ToInt()); - viewport_rect.Intersect(paint_rect); - - area_sizes_.content_beyond_viewport_area += - original_size - - ClampTo<int>((viewport_rect.Width() * viewport_rect.Height()).ToInt()); -} - -void MobileFriendlinessChecker::NotifyPaintTextFragment( - const PhysicalRect& paint_rect, - int font_size) { +void MobileFriendlinessChecker::NotifyInvalidatePaint( + const LayoutObject& object) { DCHECK(frame_view_->GetFrame().Client()->IsLocalFrameClientImpl()); DCHECK(frame_view_->GetFrame().IsOutermostMainFrame()); - UpdateTextAreaSizes(paint_rect, font_size); - UpdateBeyondViewportAreaSizes(paint_rect); + // Compute small text ratio. + if (const auto* text = DynamicTo<LayoutText>(object)) { + const auto& style = text->StyleRef(); + + // Ignore elements that users cannot see. + if (style.Visibility() != EVisibility::kVisible) + return; + + // Ignore elements intended only for screen readers. + if (style.HasOutOfFlowPosition() && style.ClipLeft().IsZero() && + style.ClipRight().IsZero() && style.ClipTop().IsZero() && + style.ClipBottom().IsZero()) + return; + + double actual_font_size = + style.FontSize() * initial_scale_ / viewport_scalar_; + double area = text->PhysicalAreaSize(); + if (std::round(actual_font_size) < kSmallFontThresholdInDips) + text_area_sizes_.small_font_area += area; + + text_area_sizes_.total_text_area += area; + } } -void MobileFriendlinessChecker::NotifyPaintReplaced( - const PhysicalRect& paint_rect) { - DCHECK(frame_view_->GetFrame().Client()->IsLocalFrameClientImpl()); - DCHECK(frame_view_->GetFrame().IsLocalRoot()); +int MobileFriendlinessChecker::ComputeContentOutsideViewport() { + int frame_width = frame_view_->GetPage()->GetVisualViewport().Size().width(); + if (frame_width == 0) { + return 0; + } - UpdateBeyondViewportAreaSizes(paint_rect); + const auto* root_frame_viewport = frame_view_->GetRootFrameViewport(); + if (root_frame_viewport == nullptr) { + return 0; + } + + int content_width = + root_frame_viewport->LayoutViewport().ContentsSize().width() * + initial_scale_; + int max_scroll_offset = content_width - frame_width; + + // We use ceil function here because we want to treat 100.1% as 101 which + // requires a scroll bar. + return std::ceil(max_scroll_offset * 100.0 / frame_width); } void MobileFriendlinessChecker::Trace(Visitor* visitor) const {
diff --git a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h index dd03c576..a1a2921 100644 --- a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h +++ b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h
@@ -16,8 +16,9 @@ namespace blink { -class Document; class LocalFrameView; +class LayoutObject; + struct ViewportDescription; // Calculates the mobile usability of current page, especially friendliness on @@ -29,79 +30,46 @@ public: explicit MobileFriendlinessChecker(LocalFrameView& frame_view); virtual ~MobileFriendlinessChecker(); - static MobileFriendlinessChecker* From(const Document&); // LocalFrameView::LifecycleNotificationObserver implementation void DidFinishLifecycleUpdate(const LocalFrameView&) override; void NotifyInitialScaleUpdated(); - void NotifyPaintBegin(); - void NotifyPaintEnd(); + void NotifyPaint(); void WillBeRemovedFromFrame(); void NotifyViewportUpdated(const ViewportDescription&); - void NotifyPaintTextFragment(const PhysicalRect& paint_rect, int font_size); - void NotifyPaintReplaced(const PhysicalRect& paint_rect); + void NotifyInvalidatePaint(const LayoutObject& object); void Trace(Visitor* visitor) const override; - - struct AreaSizes { + struct TextAreaWithFontSize { double small_font_area = 0; double total_text_area = 0; - double content_beyond_viewport_area = 0; - int TextContentsOutsideViewportPercentage(int viewport_area) const; int SmallTextRatio() const; }; - class PaintScope final { - STACK_ALLOCATED(); - - public: - explicit PaintScope(MobileFriendlinessChecker& mfc) : mfc_(mfc) { - mfc_.NotifyPaintBegin(); - } - ~PaintScope() { mfc_.NotifyPaintEnd(); } - - private: - MobileFriendlinessChecker& mfc_; - }; - - class IgnoreBeyondViewportScope final { - STACK_ALLOCATED(); - - public: - explicit IgnoreBeyondViewportScope(MobileFriendlinessChecker& mfc) - : mfc_(mfc) { - mfc_.ignore_beyond_viewport_scope_count_++; - } - ~IgnoreBeyondViewportScope() { mfc_.ignore_beyond_viewport_scope_count_--; } - - private: - MobileFriendlinessChecker& mfc_; - }; - private: void Activate(TimerBase*); + // Returns the percentage of the width of the content that overflows the + // viewport. + // Returns 0 if all content fits in the viewport. + int ComputeContentOutsideViewport(); + // Returns percentage value [0-100] of bad tap targets in the area of the // first page. Returns kTimeBudgetExceeded if the time limit is exceeded. int ComputeBadTapTargetsRatio(); - void UpdateTextAreaSizes(const PhysicalRect& text_rect, int font_size); - void UpdateBeyondViewportAreaSizes(const PhysicalRect& paint_rect); - private: Member<LocalFrameView> frame_view_; HeapTaskRunnerTimer<MobileFriendlinessChecker> timer_; double viewport_scalar_; double initial_scale_ = 1.0; base::TimeTicks last_evaluated_; - AreaSizes area_sizes_; + TextAreaWithFontSize text_area_sizes_; bool viewport_device_width_ = false; bool allow_user_zoom_ = true; int viewport_initial_scale_x10_ = -1; int viewport_hardcoded_width_ = -1; - int ignore_beyond_viewport_scope_count_ = 0; - bool is_painting_ = false; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker_test.cc b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker_test.cc index 5fe3d46..35d338d 100644 --- a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker_test.cc +++ b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker_test.cc
@@ -110,7 +110,6 @@ .SetShrinksViewportContentToFit(true); helper->GetWebView()->GetPage()->GetSettings().SetViewportStyle( mojom::blink::ViewportStyle::kMobile); - helper->LoadAhem(); return helper; } @@ -548,28 +547,6 @@ )"); // Automatic zoom-out makes text small and image fits in display. EXPECT_EQ(actual_mf.small_text_ratio, 100); - EXPECT_GE(actual_mf.text_content_outside_viewport_percentage, 10); -} - -TEST_F(MobileFriendlinessCheckerTest, ZIndex) { - MobileFriendliness actual_mf = CalculateMetricsForHTMLString(R"( -<html> - <head> - <meta name="viewport" content="width=device-width,initial-scale=1.0"> - </head> - <body style="margin:240px;font-size: 12pt"> - <div style="z-index: 1"> - hello - <div style="z-index: 10"> - foo - <img style="width:5000px; height:380px"> - <p>Normal font text.</p> - </div> - </div> - </body> -</html> -)"); - EXPECT_EQ(actual_mf.small_text_ratio, 0); EXPECT_GE(actual_mf.text_content_outside_viewport_percentage, 50); } @@ -580,14 +557,14 @@ <head> <meta name="viewport" content="initial-scale=1.0"> </head> - <body style="margin: 0px"> - <img style="width:3000px; height:240px"> + <body> + <img style="width:3000px; height:50px"> <p style="font-size: 9pt">Normal font text.</p> </body> </html> )"); EXPECT_EQ(actual_mf.small_text_ratio, 0); - EXPECT_GE(actual_mf.text_content_outside_viewport_percentage, 50); + EXPECT_GE(actual_mf.text_content_outside_viewport_percentage, 100); } TEST_F(MobileFriendlinessCheckerTest, @@ -598,8 +575,8 @@ <head> <meta name="viewport" content="initial-scale=1.0"> </head> - <body style="margin: 0px"> - <img style="width:3000px; height:240px"> + <body> + <img style="width:3000px; height:50px"> <p style="font-size: 6pt">Illegible font text.</p> </body> </html> @@ -668,77 +645,31 @@ R"( <html> <head> - <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <meta name="viewport" content="initial-scale=1.0"> </head> <body> - <pre style="font: 30px Ahem; line-height: 1">)" + + <pre>)" + std::string(10000, 'a') + R"(</pre> </body> </html> )"); - EXPECT_GT(actual_mf.text_content_outside_viewport_percentage, 20); + EXPECT_NE(actual_mf.text_content_outside_viewport_percentage, 0); } -TEST_F(MobileFriendlinessCheckerTest, TextAbsolutePositioning) { +TEST_F(MobileFriendlinessCheckerTest, TextTooWideAbsolutePositioning) { MobileFriendliness actual_mf = CalculateMetricsForHTMLString( R"( <html> <head> <meta name="viewport" content="initial-scale=1.0"> </head> - <body style="font-size: 12px"> - <pre style="position:absolute; left:2000px">)" + - std::string(10000, 'a') + - R"(</pre> + <body> + <pre style="position:absolute; left:2000px">a</pre> </body> </html> )"); - EXPECT_GE(actual_mf.text_content_outside_viewport_percentage, 15); -} - -TEST_F(MobileFriendlinessCheckerTest, ImageAbsolutePositioning) { - MobileFriendliness actual_mf_full_out = CalculateMetricsForHTMLString( - R"( -<html> - <head> - <meta name="viewport" content="initial-scale=1.0"> - </head> - <body style="margin: 0px"> - <img style="width:480px; height:800px; position:absolute; left:480px"> - </body> -</html> -)"); - EXPECT_EQ(actual_mf_full_out.text_content_outside_viewport_percentage, 100); - - MobileFriendliness actual_mf_half_out = CalculateMetricsForHTMLString( - R"( -<html> - <head> - <meta name="viewport" content="initial-scale=1.0"> - </head> - <body style="margin: 0px"> - <img style="width:480px; height:800px; position:absolute; left:240px"> - </body> -</html> -)"); - EXPECT_EQ(actual_mf_half_out.text_content_outside_viewport_percentage, 50); -} - -TEST_F(MobileFriendlinessCheckerTest, SmallTextOutsideViewportCeiling) { - MobileFriendliness actual_mf = CalculateMetricsForHTMLString( - R"( -<html> - <head> - <meta name="viewport" content="initial-scale=1.0"> - </head> - <body style="font-size: 12px"> - <pre style="position:absolute; left:2000px">x</pre> - </body> -</html> -)"); - EXPECT_EQ(actual_mf.text_content_outside_viewport_percentage, 1); + EXPECT_EQ(actual_mf.text_content_outside_viewport_percentage, 317); } TEST_F(MobileFriendlinessCheckerTest, TextTooWideOverflowXHidden) { @@ -749,7 +680,7 @@ <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> - <pre style="overflow-x:hidden; font-size:12px">)" + + <pre style="overflow-x:hidden">)" + std::string(10000, 'a') + R"(</pre> </body> </html> @@ -782,7 +713,7 @@ <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> - <div style="overflow:hidden; font-size: 12px"> + <div style="overflow:hidden"> <pre>)" + std::string(10000, 'a') + R"( @@ -798,9 +729,6 @@ MobileFriendliness actual_mf = CalculateMetricsForHTMLString( R"( <html> - <head> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - </head> <body> <div style="overflow:hidden"> <div> @@ -838,37 +766,7 @@ </body> </html> )"); - EXPECT_EQ(actual_mf.text_content_outside_viewport_percentage, 20); -} - -TEST_F(MobileFriendlinessCheckerTest, ImageTooWide100) { - MobileFriendliness actual_mf = CalculateMetricsForHTMLString(R"( -<html> - <head> - <meta name="viewport" content="initial-scale=1.0"> - </head> - <body style="margin:0px;"> - <img style="width:960px; height:800px"> - </body> -</html> -)"); - EXPECT_EQ(actual_mf.text_content_outside_viewport_percentage, 100); -} - -TEST_F(MobileFriendlinessCheckerTest, WideImageClipped) { - MobileFriendliness actual_mf = CalculateMetricsForHTMLString(R"( -<html> - <head> - <meta name="viewport" content="initial-scale=1.0"> - </head> - <body> - <div style="overflow: hidden"> - <img style="width:2000px; height:50px"> - </div> - </body> -</html> -)"); - EXPECT_EQ(actual_mf.text_content_outside_viewport_percentage, 0); + EXPECT_EQ(actual_mf.text_content_outside_viewport_percentage, 319); } TEST_F(MobileFriendlinessCheckerTest, ImageTooWideTwoImages) { @@ -877,13 +775,13 @@ <head> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> - <body style="width:4036px"> + <body style="width:4000px"> <img style="width:2000px; height:50px"> <img style="width:2000px; height:50px"> </body> </html> )"); - EXPECT_EQ(actual_mf.text_content_outside_viewport_percentage, 46); + EXPECT_EQ(actual_mf.text_content_outside_viewport_percentage, 735); } TEST_F(MobileFriendlinessCheckerTest, ImageTooWideAbsolutePosition) { @@ -897,7 +795,7 @@ </body> </html> )"); - EXPECT_EQ(actual_mf.text_content_outside_viewport_percentage, 100); + EXPECT_EQ(actual_mf.text_content_outside_viewport_percentage, 417); } TEST_F(MobileFriendlinessCheckerTest, ImageTooWideDisplayNone) { @@ -915,10 +813,9 @@ MobileFriendliness actual_mf = CalculateMetricsForHTMLString(R"( <html> <head> - <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <meta name="viewport" content="minimum-scale=1, initial-scale=3"> </head> - <body style="font: 76px Ahem; width: 480"> + <body style="font-size: 76px; width: 480"> foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo @@ -933,20 +830,17 @@ </html> )"); EXPECT_EQ(actual_mf.viewport_initial_scale_x10, 30); - EXPECT_GT(actual_mf.text_content_outside_viewport_percentage, 90); + EXPECT_GE(actual_mf.text_content_outside_viewport_percentage, 100.0); } TEST_F(MobileFriendlinessCheckerTest, ScrollerOutsideViewport) { MobileFriendliness actual_mf = CalculateMetricsForHTMLString(R"( <html> <head> - <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style> - body { - margin: 0px; - } div.scrollmenu { background-color: #333; + overflow: auto; white-space: nowrap; } div.scrollmenu a { @@ -955,9 +849,9 @@ padding: 14px; } </style> - <meta name="viewport" content="width=480px, initial-scale=1.0 minimum-scale=1.0">f + <meta name="viewport" content="width=device-width, initial-scale=1.0 minimum-scale=1.0"> </head> - <body style="font: 40px/1 Ahem; line-height: 1"> + <body style="font-size: 18px"> <div class="scrollmenu"> <a href="#1">First text</a> <a href="#2">Second text</a> @@ -969,59 +863,12 @@ <a href="#8">Eighth text</a> <a href="#9">Ninth text</a> <a href="#10">Tenth text</a> - <a href="#11">Eleventh text</a> - <a href="#12">Twelveth text</a> </div> </body> </html> )"); // the viewport - EXPECT_GT(actual_mf.text_content_outside_viewport_percentage, 10); -} - -TEST_F(MobileFriendlinessCheckerTest, SubScroller) { - MobileFriendliness actual_mf = CalculateMetricsForHTMLString(R"( -<html> - <head> - <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> - <style> - body { - margin: 0px; - } - div.scrollmenu { - width: 480px; - background-color: #333; - overflow: scroll; - white-space: nowrap; - } - div.scrollmenu a { - display: inline-block; - color: white; - padding: 14px; - } - </style> - <meta name="viewport" content="width=480px, initial-scale=1.0 minimum-scale=1.0"> - </head> - <body style="font: 40px/1 Ahem; line-height: 1"> - <div class="scrollmenu"> - <a href="#1">First text</a> - <a href="#2">Second text</a> - <a href="#3">Third text</a> - <a href="#4">Fourth text</a> - <a href="#5">Fifth text</a> - <a href="#6">Sixth text</a> - <a href="#7">Seventh text</a> - <a href="#8">Eighth text</a> - <a href="#9">Ninth text</a> - <a href="#10">Tenth text</a> - <a href="#11">Eleventh text</a> - <a href="#12">Twelveth text</a> - </div> - </body> -</html> -)"); - // Fits within the viewport by scrollbar. - EXPECT_EQ(actual_mf.text_content_outside_viewport_percentage, 0); + EXPECT_EQ(actual_mf.text_content_outside_viewport_percentage, 0.0); } TEST_F(MobileFriendlinessCheckerTest, SingleTapTarget) { @@ -1650,7 +1497,7 @@ EXPECT_EQ(actual_mf.bad_tap_targets_ratio, 100); } -TEST_F(MobileFriendlinessCheckerTest, IFrame) { +TEST_F(MobileFriendlinessCheckerTest, IFrameTest) { url_test_helpers::RegisterMockedURLLoadFromBase( WebString::FromUTF8(kBaseUrl), blink::test::CoreTestDataPath(), WebString::FromUTF8("visible_iframe.html"));
diff --git a/third_party/blink/renderer/core/paint/inline_text_box_painter.cc b/third_party/blink/renderer/core/paint/inline_text_box_painter.cc index b1086ee..49260bc 100644 --- a/third_party/blink/renderer/core/paint/inline_text_box_painter.cc +++ b/third_party/blink/renderer/core/paint/inline_text_box_painter.cc
@@ -19,7 +19,6 @@ #include "third_party/blink/renderer/core/layout/layout_theme.h" #include "third_party/blink/renderer/core/layout/line/inline_text_box.h" #include "third_party/blink/renderer/core/layout/text_decoration_offset.h" -#include "third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h" #include "third_party/blink/renderer/core/paint/applied_decoration_painter.h" #include "third_party/blink/renderer/core/paint/document_marker_painter.h" #include "third_party/blink/renderer/core/paint/highlight_painting_utils.h" @@ -161,18 +160,6 @@ physical_overflow.Move(paint_offset); gfx::Rect visual_rect = ToEnclosingRect(physical_overflow); - if (paint_info.phase == PaintPhase::kForeground) { - if (auto* mf_checker = MobileFriendlinessChecker::From( - inline_text_box_.GetLineLayoutItem().GetDocument())) { - if (const auto* text = DynamicTo<LayoutText>(InlineLayoutObject())) { - PhysicalRect clipped_rect = PhysicalRect(visual_rect); - clipped_rect.Intersect(PhysicalRect(paint_info.GetCullRect().Rect())); - mf_checker->NotifyPaintTextFragment(clipped_rect, - text->StyleRef().FontSize()); - } - } - } - GraphicsContext& context = paint_info.context; PhysicalOffset box_origin = inline_text_box_.PhysicalLocation() + paint_offset;
diff --git a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc index 1178a3d..5c9eed7 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc +++ b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
@@ -218,7 +218,7 @@ // // TODO(kojii): This may become more complicated when we use // |NGBoxFragmentPainter| for all fragments, and we still want this -// optimization. +// oprimization. bool FragmentRequiresLegacyFallback(const NGPhysicalFragment& fragment) { // If |fragment| is |IsFormattingContextRoot|, it may be legacy. // Avoid falling back to |LayoutObject| if |CanTraverse|, because it
diff --git a/third_party/blink/renderer/core/paint/ng/ng_text_fragment_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_text_fragment_painter.cc index 1c179c60..9ae20f2 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_text_fragment_painter.cc +++ b/third_party/blink/renderer/core/paint/ng/ng_text_fragment_painter.cc
@@ -20,7 +20,6 @@ #include "third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h" #include "third_party/blink/renderer/core/layout/ng/ng_text_decoration_offset.h" #include "third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.h" -#include "third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h" #include "third_party/blink/renderer/core/paint/document_marker_painter.h" #include "third_party/blink/renderer/core/paint/highlight_painting_utils.h" #include "third_party/blink/renderer/core/paint/inline_text_box_painter.h" @@ -336,16 +335,6 @@ fragment_paint_info, text_painter, decoration_painter, paint_info, cursor_, *cursor_.CurrentItem(), rotation, rotated_box, physical_box.offset, style, text_style, selection, is_printing); - if (paint_info.phase == PaintPhase::kForeground) { - if (auto* mf_checker = MobileFriendlinessChecker::From(document)) { - if (auto* text = DynamicTo<LayoutText>(*layout_object)) { - PhysicalRect clipped_rect = PhysicalRect(visual_rect); - clipped_rect.Intersect(PhysicalRect(paint_info.GetCullRect().Rect())); - mf_checker->NotifyPaintTextFragment(clipped_rect, - text->StyleRef().FontSize()); - } - } - } if (svg_inline_text) { NGTextPainter::SvgTextPaintState& svg_state = text_painter.SetSvgState(
diff --git a/third_party/blink/renderer/core/paint/paint_invalidator.cc b/third_party/blink/renderer/core/paint/paint_invalidator.cc index 190ece2..7dece503 100644 --- a/third_party/blink/renderer/core/paint/paint_invalidator.cc +++ b/third_party/blink/renderer/core/paint/paint_invalidator.cc
@@ -319,6 +319,15 @@ reason == PaintInvalidationReason::kJustCreated)) pending_delayed_paint_invalidations_.push_back(&object); + if (auto* local_frame = DynamicTo<LocalFrame>(object.GetFrame()->Top())) { + if (auto* mf_checker = + local_frame->View()->GetMobileFriendlinessChecker()) { + if (tree_builder_context && + (!pre_paint_info || pre_paint_info->is_last_for_node)) + mf_checker->NotifyInvalidatePaint(object); + } + } + return reason != PaintInvalidationReason::kNone; }
diff --git a/third_party/blink/renderer/core/paint/paint_timing.cc b/third_party/blink/renderer/core/paint/paint_timing.cc index d900d127..7c819a9 100644 --- a/third_party/blink/renderer/core/paint/paint_timing.cc +++ b/third_party/blink/renderer/core/paint/paint_timing.cc
@@ -17,6 +17,7 @@ #include "third_party/blink/renderer/core/loader/document_loader.h" #include "third_party/blink/renderer/core/loader/interactive_detector.h" #include "third_party/blink/renderer/core/loader/progress_tracker.h" +#include "third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h" #include "third_party/blink/renderer/core/page/chrome_client.h" #include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/core/probe/core_probes.h" @@ -189,6 +190,10 @@ if (image_painted) MarkFirstImagePaint(); fmp_detector_->NotifyPaint(); + if (auto* local_frame = DynamicTo<LocalFrame>(GetFrame()->Top())) { + if (auto* mf_checker = local_frame->View()->GetMobileFriendlinessChecker()) + mf_checker->NotifyPaint(); + } if (is_first_paint) GetFrame()->OnFirstPaint(text_painted, image_painted);
diff --git a/third_party/blink/renderer/core/paint/replaced_painter.cc b/third_party/blink/renderer/core/paint/replaced_painter.cc index 33c0e0f..0f1cc456 100644 --- a/third_party/blink/renderer/core/paint/replaced_painter.cc +++ b/third_party/blink/renderer/core/paint/replaced_painter.cc
@@ -10,7 +10,6 @@ #include "third_party/blink/renderer/core/frame/web_feature.h" #include "third_party/blink/renderer/core/layout/layout_replaced.h" #include "third_party/blink/renderer/core/layout/svg/layout_svg_root.h" -#include "third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h" #include "third_party/blink/renderer/core/paint/box_painter.h" #include "third_party/blink/renderer/core/paint/highlight_painting_utils.h" #include "third_party/blink/renderer/core/paint/object_painter.h" @@ -36,10 +35,6 @@ public: ScopedReplacedContentPaintState(const ScopedPaintState& input, const LayoutReplaced& replaced); - - private: - absl::optional<MobileFriendlinessChecker::IgnoreBeyondViewportScope> - mf_ignore_scope_; }; ScopedReplacedContentPaintState::ScopedReplacedContentPaintState( @@ -75,18 +70,6 @@ new_properties, replaced, input_paint_info_.DisplayItemTypeForClipping()); } - - if (input_paint_info_.phase == PaintPhase::kForeground) { - if (auto* mf_checker = - MobileFriendlinessChecker::From(replaced.GetDocument())) { - PhysicalRect content_rect = replaced.ReplacedContentRect(); - content_rect.Move(paint_offset_); - content_rect.Intersect(PhysicalRect(GetPaintInfo().GetCullRect().Rect())); - mf_checker->NotifyPaintReplaced(content_rect); - - mf_ignore_scope_.emplace(*mf_checker); - } - } } } // anonymous namespace
diff --git a/third_party/blink/renderer/core/paint/scoped_paint_state.cc b/third_party/blink/renderer/core/paint/scoped_paint_state.cc index 8d151d8a..a6cc50d 100644 --- a/third_party/blink/renderer/core/paint/scoped_paint_state.cc +++ b/third_party/blink/renderer/core/paint/scoped_paint_state.cc
@@ -141,23 +141,6 @@ box.Layer()->SetPreviousPaintResult(kMayBeClippedByCullRect); } } - - if (input_paint_info_.phase == PaintPhase::kForeground) { - // We treat horizontal-scrollable scrollers like replaced objects. - if (auto* scrollable_area = box.GetScrollableArea()) { - if (scrollable_area->HasHorizontalScrollbar()) { - if (auto* mf_checker = - MobileFriendlinessChecker::From(box.GetDocument())) { - PhysicalRect content_rect = box.LocalVisualRect(); - content_rect.Move(paint_offset_); - content_rect.Intersect( - PhysicalRect(input_paint_info_.GetCullRect().Rect())); - mf_checker->NotifyPaintReplaced(content_rect); - mf_ignore_scope_.emplace(*mf_checker); - } - } - } - } } } // namespace blink
diff --git a/third_party/blink/renderer/core/paint/scoped_paint_state.h b/third_party/blink/renderer/core/paint/scoped_paint_state.h index d3a4df9..ac3ebb6b 100644 --- a/third_party/blink/renderer/core/paint/scoped_paint_state.h +++ b/third_party/blink/renderer/core/paint/scoped_paint_state.h
@@ -8,7 +8,6 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/renderer/core/layout/layout_box.h" #include "third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h" -#include "third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h" #include "third_party/blink/renderer/core/paint/paint_info.h" #include "third_party/blink/renderer/platform/graphics/paint/scoped_paint_chunk_properties.h" @@ -122,8 +121,6 @@ private: void AdjustForBoxContents(const LayoutBox&); - absl::optional<MobileFriendlinessChecker::IgnoreBeyondViewportScope> - mf_ignore_scope_; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/workers/worklet.cc b/third_party/blink/renderer/core/workers/worklet.cc index 0bd475c..1078c27 100644 --- a/third_party/blink/renderer/core/workers/worklet.cc +++ b/third_party/blink/renderer/core/workers/worklet.cc
@@ -138,9 +138,10 @@ ->Fetcher() ->GetProperties() .GetFetchClientSettingsObject()); - // Worklets don't support resource timing APIs yet. + auto* outside_resource_timing_notifier = - MakeGarbageCollected<NullWorkerResourceTimingNotifier>(); + WorkerResourceTimingNotifierImpl::CreateForInsideResourceFetcher( + *GetExecutionContext()); // Specify TaskType::kInternalLoading because it's commonly used for module // loading.
diff --git a/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc b/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc index 3607354..6cddc80 100644 --- a/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc +++ b/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc
@@ -1042,6 +1042,11 @@ while (!reachable.IsEmpty()) { AXObject* ax_object = reachable.back(); + if (ax_object->IsDetached() || + !ax_object->AccessibilityIsIncludedInTree()) { + reachable.pop_back(); + continue; + } ui::AXNodeData node_data; ax_object->Serialize(&node_data, ui::kAXModeComplete); reachable.pop_back();
diff --git a/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc b/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc index 90fd52fab..f554d1c 100644 --- a/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc +++ b/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc
@@ -1131,23 +1131,50 @@ }; void InspectorIndexedDBAgent::clearObjectStore( - const String& security_origin, + protocol::Maybe<String> security_origin, + protocol::Maybe<String> storage_key, const String& database_name, const String& object_store_name, std::unique_ptr<ClearObjectStoreCallback> request_callback) { + if (security_origin.isJust() == storage_key.isJust()) { + request_callback->sendFailure( + Response::InvalidParams("At least and at most one of security_origin, " + "storage_key must be specified.")); + return; + } scoped_refptr<ClearObjectStore> clear_object_store = ClearObjectStore::Create(object_store_name, std::move(request_callback)); - clear_object_store->Start( - inspected_frames_->FrameWithSecurityOrigin(security_origin), - database_name); + if (security_origin.isJust()) { + clear_object_store->Start( + inspected_frames_->FrameWithSecurityOrigin(security_origin.fromJust()), + database_name); + } else if (storage_key.isJust()) { + clear_object_store->Start( + inspected_frames_->FrameWithStorageKey(storage_key.fromJust()), + database_name); + } } void InspectorIndexedDBAgent::deleteDatabase( - const String& security_origin, + protocol::Maybe<String> security_origin, + protocol::Maybe<String> storage_key, const String& database_name, std::unique_ptr<DeleteDatabaseCallback> request_callback) { - LocalFrame* frame = - inspected_frames_->FrameWithSecurityOrigin(security_origin); + LocalFrame* frame = nullptr; + if (security_origin.isJust() == storage_key.isJust()) { + request_callback->sendFailure( + Response::InvalidParams("At least and at most one of security_origin, " + "storage_key must be specified.")); + return; + } + if (security_origin.isJust()) { + frame = + inspected_frames_->FrameWithSecurityOrigin(security_origin.fromJust()); + } else if (storage_key.isJust()) { + frame = inspected_frames_->FrameWithStorageKey(storage_key.fromJust()); + } else { + NOTREACHED(); + } if (!frame) { request_callback->sendFailure(Response::ServerError(kNoDocumentError)); return;
diff --git a/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.h b/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.h index c668ee62..f4905d33 100644 --- a/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.h +++ b/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.h
@@ -81,11 +81,13 @@ const String& object_store_name, std::unique_ptr<protocol::IndexedDB::KeyRange>, std::unique_ptr<DeleteObjectStoreEntriesCallback>) override; - void clearObjectStore(const String& security_origin, + void clearObjectStore(protocol::Maybe<String> security_origin, + protocol::Maybe<String> storage_key, const String& database_name, const String& object_store_name, std::unique_ptr<ClearObjectStoreCallback>) override; - void deleteDatabase(const String& security_origin, + void deleteDatabase(protocol::Maybe<String> security_origin, + protocol::Maybe<String> storage_key, const String& database_name, std::unique_ptr<DeleteDatabaseCallback>) override;
diff --git a/third_party/blink/renderer/platform/fonts/font_data_cache.cc b/third_party/blink/renderer/platform/fonts/font_data_cache.cc index 4426e6d6..dbb06ab 100644 --- a/third_party/blink/renderer/platform/fonts/font_data_cache.cc +++ b/third_party/blink/renderer/platform/fonts/font_data_cache.cc
@@ -30,6 +30,7 @@ #include "third_party/blink/renderer/platform/fonts/font_data_cache.h" +#include "base/auto_reset.h" #include "build/build_config.h" #include "third_party/blink/renderer/platform/fonts/simple_font_data.h" @@ -140,13 +141,12 @@ bool FontDataCache::PurgeLeastRecentlyUsed(int count) { // Guard against reentry when e.g. a deleted FontData releases its small caps // FontData. - static bool is_purging; - if (is_purging) + if (is_purging_) return false; lock_.AssertAcquired(); - is_purging = true; + base::AutoReset<bool> is_purging_auto_reset(&is_purging_, true); Vector<scoped_refptr<SimpleFontData>, 20> font_data_to_delete; auto end = inactive_font_data_.end(); @@ -171,8 +171,6 @@ font_data_to_delete.clear(); - is_purging = false; - return did_work; }
diff --git a/third_party/blink/renderer/platform/fonts/font_data_cache.h b/third_party/blink/renderer/platform/fonts/font_data_cache.h index f6b49f30..4465a037 100644 --- a/third_party/blink/renderer/platform/fonts/font_data_cache.h +++ b/third_party/blink/renderer/platform/fonts/font_data_cache.h
@@ -105,6 +105,7 @@ Cache cache_ GUARDED_BY(lock_); LinkedHashSet<scoped_refptr<SimpleFontData>> inactive_font_data_ GUARDED_BY(lock_); + bool is_purging_ = false; }; } // namespace blink
diff --git a/third_party/blink/renderer/platform/heap/heap_allocator_impl.h b/third_party/blink/renderer/platform/heap/heap_allocator_impl.h index 47a4c485..4afb96d5 100644 --- a/third_party/blink/renderer/platform/heap/heap_allocator_impl.h +++ b/third_party/blink/renderer/platform/heap/heap_allocator_impl.h
@@ -228,7 +228,8 @@ const T* const* backing_slot) { visitor->RegisterMovableReference(const_cast<const HeapVectorBacking<T>**>( reinterpret_cast<const HeapVectorBacking<T>* const*>(backing_slot))); - visitor->Trace(reinterpret_cast<const HeapVectorBacking<T>*>(backing)); + visitor->TraceStrongContainer( + reinterpret_cast<const HeapVectorBacking<T>*>(backing)); } template <typename T, typename HashTable> @@ -239,7 +240,7 @@ const_cast<const HeapHashTableBacking<HashTable>**>( reinterpret_cast<const HeapHashTableBacking<HashTable>* const*>( backing_slot))); - visitor->Trace( + visitor->TraceStrongContainer( reinterpret_cast<const HeapHashTableBacking<HashTable>*>(backing)); }
diff --git a/third_party/blink/renderer/platform/heap/member.h b/third_party/blink/renderer/platform/heap/member.h index f399c08e..a61a1133 100644 --- a/third_party/blink/renderer/platform/heap/member.h +++ b/third_party/blink/renderer/platform/heap/member.h
@@ -176,31 +176,26 @@ struct HashTraits<blink::UntracedMember<T>> : BaseMemberHashTraits<T, blink::UntracedMember<T>> {}; -template <typename T, typename Traits, typename Allocator> +template <typename T> class MemberConstructTraits { STATIC_ONLY(MemberConstructTraits); public: template <typename... Args> - static T* Construct(void* location, Args&&... args) { - return new (NotNullTag::kNotNull, location) T(std::forward<Args>(args)...); - } - - static void NotifyNewElement(T* element) { - blink::WriteBarrier::DispatchForObject(element); - } - - template <typename... Args> static T* ConstructAndNotifyElement(void* location, Args&&... args) { // ConstructAndNotifyElement updates an existing Member which might // also be comncurrently traced while we update it. The regular ctors // for Member don't use an atomic write which can lead to data races. - T* object = Construct(location, std::forward<Args>(args)..., - typename T::AtomicInitializerTag()); + T* object = new (NotNullTag::kNotNull, location) + T(std::forward<Args>(args)..., typename T::AtomicInitializerTag()); NotifyNewElement(object); return object; } + static void NotifyNewElement(T* element) { + blink::WriteBarrier::DispatchForObject(element); + } + static void NotifyNewElements(T* array, size_t len) { while (len-- > 0) { blink::WriteBarrier::DispatchForObject(array); @@ -210,12 +205,12 @@ }; template <typename T, typename Traits, typename Allocator> -class ConstructTraits<blink::Member<T>, Traits, Allocator> - : public MemberConstructTraits<blink::Member<T>, Traits, Allocator> {}; +class ConstructTraits<blink::Member<T>, Traits, Allocator> final + : public MemberConstructTraits<blink::Member<T>> {}; template <typename T, typename Traits, typename Allocator> -class ConstructTraits<blink::WeakMember<T>, Traits, Allocator> - : public MemberConstructTraits<blink::WeakMember<T>, Traits, Allocator> {}; +class ConstructTraits<blink::WeakMember<T>, Traits, Allocator> final + : public MemberConstructTraits<blink::WeakMember<T>> {}; } // namespace WTF
diff --git a/third_party/blink/renderer/platform/heap/write_barrier.h b/third_party/blink/renderer/platform/heap/write_barrier.h index 8a5697e6..7023e1a 100644 --- a/third_party/blink/renderer/platform/heap/write_barrier.h +++ b/third_party/blink/renderer/platform/heap/write_barrier.h
@@ -5,12 +5,16 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_WRITE_BARRIER_H_ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_WRITE_BARRIER_H_ +#include <type_traits> + #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" +#include "third_party/blink/renderer/platform/wtf/type_traits.h" #include "v8/include/cppgc/heap-consistency.h" +#include "v8/include/cppgc/member.h" namespace blink { -class WriteBarrier { +class WriteBarrier final { STATIC_ONLY(WriteBarrier); using HeapConsistency = cppgc::subtle::HeapConsistency; @@ -18,6 +22,8 @@ public: template <typename T> ALWAYS_INLINE static void DispatchForObject(T* element) { + static_assert(!WTF::IsMemberOrWeakMemberType<std::decay_t<T>>::value, + "Member and WeakMember should use the other overload."); HeapConsistency::WriteBarrierParams params; switch (HeapConsistency::GetWriteBarrierType(element, *element, params)) { case HeapConsistency::WriteBarrierType::kMarking: @@ -28,8 +34,28 @@ break; case HeapConsistency::WriteBarrierType::kNone: break; - default: - break; // TODO(1056170): Remove default case when API is stable. + } + } + + // Cannot refer to blink::Member and friends here due to cyclic includes. + template <typename T, + typename WeaknessTag, + typename WriteBarrierPolicy, + typename CheckingPolicy> + ALWAYS_INLINE static void DispatchForObject( + cppgc::internal:: + BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy>* + element) { + HeapConsistency::WriteBarrierParams params; + switch (HeapConsistency::GetWriteBarrierType(*element, params)) { + case HeapConsistency::WriteBarrierType::kMarking: + HeapConsistency::DijkstraWriteBarrier(params, *element); + break; + case HeapConsistency::WriteBarrierType::kGenerational: + HeapConsistency::GenerationalBarrier(params, element); + break; + case HeapConsistency::WriteBarrierType::kNone: + break; } } };
diff --git a/third_party/blink/renderer/platform/webrtc/webrtc_logging.cc b/third_party/blink/renderer/platform/webrtc/webrtc_logging.cc index 9d6858ae..bf92f11 100644 --- a/third_party/blink/renderer/platform/webrtc/webrtc_logging.cc +++ b/third_party/blink/renderer/platform/webrtc/webrtc_logging.cc
@@ -32,8 +32,6 @@ } void WebRtcLogMessage(const std::string& message) { - if (base::FeatureList::IsEnabled(blink::kSuppressAllWebRtcLogs)) - return; VLOG(1) << message; if (g_webrtc_logging_delegate) g_webrtc_logging_delegate->LogMessage(message);
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 8243587..908e153 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -850,9 +850,6 @@ crbug.com/1223377 external/wpt/css/css-images/object-fit-none-svg-004i.html [ Failure ] crbug.com/1223377 external/wpt/css/css-images/object-fit-none-svg-004p.html [ Failure ] -# Minor color differences but it fails on all browsers. Probably a test issue. -crbug.com/1345248 external/wpt/css/css-images/gradient/gradient-eval-001.html [ Failure ] - crbug.com/1042783 external/wpt/css/css-backgrounds/background-size/background-size-near-zero-png.html [ Failure ] crbug.com/1042783 external/wpt/css/css-backgrounds/background-size/background-size-near-zero-svg.html [ Failure ] crbug.com/935057 external/wpt/css/css-backgrounds/background-size-043.html [ Failure ] @@ -1024,6 +1021,7 @@ crbug.com/1299442 [ Mac12 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/paint2d-composite.https.html [ Failure ] crbug.com/1299442 [ Mac11 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/geometry-background-image-tiled-001.https.html [ Failure ] crbug.com/1299442 [ Mac11 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/registered-property-value-010.https.html [ Failure ] +crbug.com/1299442 [ Mac ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/registered-property-interpolation-004.https.html [ Failure ] # ====== Paint team owned tests to here ====== @@ -2732,6 +2730,8 @@ crbug.com/604875 external/wpt/css/css-images/tiled-gradients.html [ Failure ] +crbug.com/1347068 external/wpt/css/css-images/gradient/gradient-eval-004.html [ Failure ] + crbug.com/808834 [ Linux ] external/wpt/css/css-pseudo/first-letter-001.html [ Failure ] crbug.com/808834 [ Win ] external/wpt/css/css-pseudo/first-letter-001.html [ Failure ] @@ -3391,7 +3391,6 @@ crbug.com/626703 virtual/plz-dedicated-worker/external/wpt/service-workers/service-worker/worker-interception.https.html [ Pass ] # ====== Test expectations added to unblock wpt-importer ====== -crbug.com/626703 virtual/no-alloc-direct-call/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-video.html [ Failure ] crbug.com/626703 external/wpt/fetch/metadata/generated/worker-dedicated-constructor.sub.html [ Failure ] crbug.com/626703 virtual/plz-dedicated-worker/external/wpt/fetch/metadata/generated/worker-dedicated-constructor.sub.html [ Failure ] crbug.com/626703 [ Linux ] external/wpt/web-bundle/subresource-loading/script-reuse-web-bundle-resource.https.tentative.html [ Failure ] @@ -3406,9 +3405,6 @@ crbug.com/626703 [ Win ] virtual/partitioned-cookies/http/tests/inspector-protocol/network/disabled-cache-navigation.js [ Failure ] # ====== New tests from wpt-importer added here ====== -crbug.com/626703 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/parse-input-arguments-006.https.html [ Failure ] -crbug.com/626703 [ Mac11 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/registered-property-interpolation-001.https.html [ Failure ] -crbug.com/626703 external/wpt/css/css-images/gradient/gradient-eval-004.html [ Failure ] crbug.com/626703 [ Win11 ] virtual/conversions-debug-mode/wpt_internal/attribution-reporting/trigger-data-sanitization.sub.https.html?source-type=navigation [ Failure Timeout ] crbug.com/626703 external/wpt/css/cssom/caretPositionFromPoint-with-transformation.html [ Timeout ] crbug.com/626703 [ Mac11-arm64 ] virtual/fenced-frame-mparch/wpt_internal/fenced_frame/key-scrolling.https.html [ Failure Timeout ] @@ -6205,8 +6201,6 @@ crbug.com/1249176 [ Mac11-arm64 ] external/wpt/largest-contentful-paint/image-src-change.html [ Failure ] crbug.com/1249176 [ Mac11-arm64 ] http/tests/images/document-policy-oversized-images-forced-layout.php [ Failure ] crbug.com/1249176 [ Mac11-arm64 ] transforms/transformed-document-element.html [ Failure ] -crbug.com/1249176 [ Mac11-arm64 ] virtual/no-alloc-direct-call/external/wpt/html/canvas/element/manual/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html [ Failure ] -crbug.com/1249176 [ Mac12-arm64 ] virtual/no-alloc-direct-call/external/wpt/html/canvas/element/manual/drawing-images-to-the-canvas/image-orientation/drawImage-from-blob.tentative.html [ Failure ] crbug.com/1249176 [ Mac11-arm64 ] virtual/threaded/http/tests/devtools/tracing/timeline-paint/paint-profiler-update.js [ Failure ] crbug.com/1249176 [ Mac12-arm64 ] virtual/threaded/http/tests/devtools/tracing/timeline-paint/paint-profiler-update.js [ Failure Pass ] crbug.com/1249176 [ Mac11-arm64 ] virtual/threaded/http/tests/devtools/tracing/timeline-time/timeline-usertiming.js [ Failure ] @@ -6593,6 +6587,7 @@ crbug.com/1281782 [ Mac ] virtual/no-alloc-direct-call/external/wpt/html/canvas/element/text-styles/2d.text.font.parse.tiny.html [ Crash Pass ] crbug.com/1281782 [ Mac ] virtual/no-alloc-direct-call/external/wpt/html/canvas/element/transformations/2d.transformation.transform.multiply.html [ Crash Pass ] crbug.com/1281782 [ Mac ] virtual/no-alloc-direct-call/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-cloned.html [ Pass Timeout ] +crbug.com/1281782 virtual/no-alloc-direct-call/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-video.html [ Skip ] crbug.com/1281792 external/wpt/event-timing/min-duration-threshold.html [ Failure Pass ] crbug.com/1285857 plugins/plugin-destroyed-enumerate.html [ Failure Pass ] @@ -7122,7 +7117,6 @@ # Sheriff 2022-07-13 crbug.com/1204176 [ Linux ] fast/scrolling/overflow-scrollability.html [ Failure Pass ] -crbug.com/1344210 [ Debug Linux ] http/tests/devtools/elements/styles-2/page-reload-update-sidebar.js [ Failure Pass ] crbug.com/1344175 [ Mac12 ] external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-root.html [ Failure Pass ] # Flaking on WebKit Linux MSAN crbug.com/1344277 [ Linux ] wpt_internal/webxr/ar/ar_light_estimation.https.html [ Crash Failure Pass ] @@ -7145,3 +7139,12 @@ # Sheriff 2022-07-21 crbug.com/1346158 crbug.com/1346158 external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-window.html [ Failure Pass ] crbug.com/1310202 [ Mac11 ] wpt_internal/navigation-api/ordering-and-transition/navigate-cross-document-double.html [ Failure Pass ] +crbug.com/1310202 [ Linux ] wpt_internal/navigation-api/ordering-and-transition/navigate-cross-document-double.html [ Failure Pass ] + +# Sheriff 2022-07-25 +crbug.com/1346822 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/geometry-background-image-002.https.html [ Failure Pass ] +crbug.com/1346822 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/paint2d-composite.https.html [ Failure Pass ] +crbug.com/1346822 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/paint2d-reset.https.html [ Failure Pass ] +crbug.com/1346822 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/geometry-background-image-tiled-001.https.html [ Failure Pass ] +crbug.com/1346822 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/top-level-await.https.html [ Failure Pass ] +crbug.com/1346822 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/paint2d-roundRect.https.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/external/Version b/third_party/blink/web_tests/external/Version index 4cfc04a..32bfef5 100644 --- a/third_party/blink/web_tests/external/Version +++ b/third_party/blink/web_tests/external/Version
@@ -1 +1 @@ -Version: 4cdfa9f6f45f852cecee3deca751360586d0de08 +Version: 3aadc8d84891c1f5018a5684def72021a44ecea1
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json index ebd26cf..2a8db905 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -388435,6 +388435,13 @@ {} ] ], + "not-resnap-outside-proximity-threshold.html": [ + "b2c5720efb851a60786bbd2cfeb4ae02b9c787b3", + [ + null, + {} + ] + ], "remove-current-target.html": [ "82bddf8074882e03d9c2dd669815303fbdd2b039", [
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/at-container-parsing.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/at-container-parsing.html index 6278f88..6f1166a1 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/at-container-parsing.html +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/at-container-parsing.html
@@ -22,170 +22,181 @@ return style; } - function test_query_invalid(query) { + function test_rule_valid(query) { test(t => { t.add_cleanup(cleanup_main); - let style = set_style(`@container name ${query} {}`); - assert_equals(style.sheet.rules.length, 0); + let style = set_style(`@container ${query} {}`); + assert_equals(style.sheet.rules.length, 1); }, query); } - // Tests that 1) the query parses, and 2) is either "unknown" or not, as + function test_condition_invalid(condition) { + test(t => { + t.add_cleanup(cleanup_main); + let style = set_style(`@container name ${condition} {}`); + assert_equals(style.sheet.rules.length, 0); + }, condition); + } + + // Tests that 1) the condition parses, and 2) is either "unknown" or not, as // specified. - function test_query_valid(query, unknown) { + function test_condition_valid(condition, unknown) { test(t => { t.add_cleanup(cleanup_main); let style = set_style(` - @container name ${query} {} - @container name (${query} or (not ${query})) { main { --match:true; } } + @container name ${condition} {} + @container name (${condition}) or (not (${condition})) { main { --match:true; } } `); assert_equals(style.sheet.rules.length, 2); const expected = unknown ? '' : 'true'; assert_equals(getComputedStyle(main).getPropertyValue('--match'), expected); - }, query); + }, condition); } - function test_query_known(query) { - test_query_valid(query, false /* unknown */); + function test_condition_known(condition) { + test_condition_valid(condition, false /* unknown */); } - function test_query_unknown(query) { - test_query_valid(query, true /* unknown */); + function test_condition_unknown(condition) { + test_condition_valid(condition, true /* unknown */); } - function test_container_selector_invalid(container_selector) { + function test_container_name_invalid(container_name) { test(t => { t.add_cleanup(cleanup_main); - let style = set_style(`@container ${container_selector} (width) {}`); + let style = set_style(`@container ${container_name} not (width) {}`); assert_equals(style.sheet.rules.length, 0); - }, `Container selector: ${container_selector}`); + }, `Container name: ${container_name}`); } - function test_container_selector_valid(container_selector) { + function test_container_name_valid(container_name) { test(t => { t.add_cleanup(cleanup_main); - let style = set_style(`@container ${container_selector} (width) {}`); + let style = set_style(`@container ${container_name} not (width) {}`); assert_equals(style.sheet.rules.length, 1); - }, `Container selector: ${container_selector}`); + }, `Container name: ${container_name}`); } - test_query_known('(width)'); - test_query_known('(min-width: 0px)'); - test_query_known('(max-width: 0px)'); - test_query_known('(height)'); - test_query_known('(min-height: 0px)'); - test_query_known('(max-height: 0px)'); - test_query_known('(aspect-ratio)'); - test_query_known('(min-aspect-ratio: 1/2)'); - test_query_known('(max-aspect-ratio: 1/2)'); - test_query_known('(orientation: portrait)'); - test_query_known('(inline-size)'); - test_query_known('(min-inline-size: 0px)'); - test_query_known('(max-inline-size: 0px)'); - test_query_known('(block-size)'); - test_query_known('(min-block-size: 0px)'); - test_query_known('(max-block-size: 0px)'); + test_condition_known('(width)'); + test_condition_known('(min-width: 0px)'); + test_condition_known('(max-width: 0px)'); + test_condition_known('(height)'); + test_condition_known('(min-height: 0px)'); + test_condition_known('(max-height: 0px)'); + test_condition_known('(aspect-ratio)'); + test_condition_known('(min-aspect-ratio: 1/2)'); + test_condition_known('(max-aspect-ratio: 1/2)'); + test_condition_known('(orientation: portrait)'); + test_condition_known('(inline-size)'); + test_condition_known('(min-inline-size: 0px)'); + test_condition_known('(max-inline-size: 0px)'); + test_condition_known('(block-size)'); + test_condition_known('(min-block-size: 0px)'); + test_condition_known('(max-block-size: 0px)'); - test_query_known('(width: 100px)'); - test_query_known('((width: 100px))'); - test_query_known('(not (width: 100px))'); - test_query_known('((width: 100px) and (height: 100px))'); - test_query_known('(((width: 40px) or (width: 50px)) and (height: 100px))'); - test_query_known('((width: 100px) and ((height: 40px) or (height: 50px)))'); - test_query_known('(((width: 40x) and (height: 50px)) or (height: 100px))'); - test_query_known('((width: 50px) or ((width: 40px) and (height: 50px)))'); - test_query_known('((width: 100px) and (not (height: 100px)))'); - test_query_known('(width < 100px)'); - test_query_known('(width <= 100px)'); - test_query_known('(width = 100px)'); - test_query_known('(width > 100px)'); - test_query_known('(width >= 100px)'); - test_query_known('(100px < width)'); - test_query_known('(100px <= width)'); - test_query_known('(100px = width)'); - test_query_known('(100px > width)'); - test_query_known('(100px >= width)'); - test_query_known('(100px < width < 200px)'); - test_query_known('(100px < width <= 200px)'); - test_query_known('(100px <= width < 200px)'); - test_query_known('(100px > width > 200px)'); - test_query_known('(100px > width >= 200px)'); - test_query_known('(100px >= width > 200px)'); + test_condition_known('(width: 100px)'); + test_condition_known('((width: 100px))'); + test_condition_known('(not (width: 100px))'); + test_condition_known('((width: 100px) and (height: 100px))'); + test_condition_known('(((width: 40px) or (width: 50px)) and (height: 100px))'); + test_condition_known('((width: 100px) and ((height: 40px) or (height: 50px)))'); + test_condition_known('(((width: 40x) and (height: 50px)) or (height: 100px))'); + test_condition_known('((width: 50px) or ((width: 40px) and (height: 50px)))'); + test_condition_known('((width: 100px) and (not (height: 100px)))'); + test_condition_known('(width < 100px)'); + test_condition_known('(width <= 100px)'); + test_condition_known('(width = 100px)'); + test_condition_known('(width > 100px)'); + test_condition_known('(width >= 100px)'); + test_condition_known('(100px < width)'); + test_condition_known('(100px <= width)'); + test_condition_known('(100px = width)'); + test_condition_known('(100px > width)'); + test_condition_known('(100px >= width)'); + test_condition_known('(100px < width < 200px)'); + test_condition_known('(100px < width <= 200px)'); + test_condition_known('(100px <= width < 200px)'); + test_condition_known('(100px > width > 200px)'); + test_condition_known('(100px > width >= 200px)'); + test_condition_known('(100px >= width > 200px)'); - test_query_known('(width: calc(10px))'); - test_query_known('(width: calc(10em))'); - test_query_known('(width: calc(10px + 10em))'); - test_query_known('(width < calc(10px + 10em))'); - test_query_known('(width < max(10px, 10em))'); - test_query_known('(calc(10px + 10em) < width)'); - test_query_known('(calc(10px + 10em) < width < max(30px, 30em))'); + test_condition_known('(width: calc(10px))'); + test_condition_known('(width: calc(10em))'); + test_condition_known('(width: calc(10px + 10em))'); + test_condition_known('(width < calc(10px + 10em))'); + test_condition_known('(width < max(10px, 10em))'); + test_condition_known('(calc(10px + 10em) < width)'); + test_condition_known('(calc(10px + 10em) < width < max(30px, 30em))'); + test_condition_known('(width: 100px) and (height: 100px)'); + test_condition_known('(width: 100px) or (height: 100px)'); + test_condition_known('not (width: 100px)'); - test_query_unknown('foo(width)'); - test_query_unknown('size(width)'); - test_query_unknown('(asdf)'); - test_query_unknown('(resolution > 100dpi)'); - test_query_unknown('(resolution: 150dpi)'); - test_query_unknown('(color)'); - test_query_unknown('(min-color: 1)'); - test_query_unknown('(color-index >= 1)'); - test_query_unknown('size(grid)'); - test_query_unknown('(grid)'); - test_query_unknown('(width == 100px)'); - test_query_unknown('(100px == width)'); - test_query_unknown('(100px = width = 200px)'); - test_query_unknown('(100px < width > 200px)'); - test_query_unknown('(100px <= width >= 200px)'); - test_query_unknown('(100px <= width > 200px)'); - test_query_unknown('(100px < width >= 200px)'); - test_query_unknown('(100px : width : 200px)'); + test_condition_unknown('foo(width)'); + test_condition_unknown('size(width)'); + test_condition_unknown('(asdf)'); + test_condition_unknown('(resolution > 100dpi)'); + test_condition_unknown('(resolution: 150dpi)'); + test_condition_unknown('(color)'); + test_condition_unknown('(min-color: 1)'); + test_condition_unknown('(color-index >= 1)'); + test_condition_unknown('size(grid)'); + test_condition_unknown('(grid)'); + test_condition_unknown('(width == 100px)'); + test_condition_unknown('(100px == width)'); + test_condition_unknown('(100px = width = 200px)'); + test_condition_unknown('(100px < width > 200px)'); + test_condition_unknown('(100px <= width >= 200px)'); + test_condition_unknown('(100px <= width > 200px)'); + test_condition_unknown('(100px < width >= 200px)'); + test_condition_unknown('(100px : width : 200px)'); - test_query_invalid('screen'); - test_query_invalid('print'); - test_query_invalid('not print'); - test_query_invalid('only print'); - test_query_invalid('screen and (width: 100px)'); - test_query_invalid('screen or (width: 100px)'); - test_query_invalid('not screen and (width: 100px)'); - test_query_invalid('not screen or (width: 100px)'); - test_query_invalid('(width: 100px), (height: 100px)'); - test_query_invalid('(width: 100px) and (height: 100px)'); - test_query_invalid('(width: 100px) or (height: 100px)'); - test_query_invalid('not (width: 100px)'); - test_query_invalid('foo (width: 100px)'); + test_condition_invalid('screen'); + test_condition_invalid('print'); + test_condition_invalid('not print'); + test_condition_invalid('only print'); + test_condition_invalid('screen and (width: 100px)'); + test_condition_invalid('screen or (width: 100px)'); + test_condition_invalid('not screen and (width: 100px)'); + test_condition_invalid('not screen or (width: 100px)'); + test_condition_invalid('(width: 100px), (height: 100px)'); + test_condition_invalid('foo (width: 100px)'); - test_container_selector_valid('foo'); - test_container_selector_valid(' foo'); - test_container_selector_valid(' foo '); + test_rule_valid('name not (width <= 500px)'); + test_rule_valid('not (width <= 500px)'); - test_container_selector_invalid('foo foo'); - test_container_selector_invalid('1px'); - test_container_selector_invalid('50gil'); - test_container_selector_invalid('name(foo)'); - test_container_selector_invalid('type(inline-size)'); - test_container_selector_invalid('"foo"'); - test_container_selector_invalid('"inherit"'); - test_container_selector_invalid('none'); - test_container_selector_invalid('None'); - test_container_selector_invalid('normal'); - test_container_selector_invalid('Normal'); - test_container_selector_invalid('auto'); - test_container_selector_invalid('Auto'); - test_container_selector_invalid('and'); - test_container_selector_invalid('or'); - test_container_selector_invalid('not'); - test_container_selector_invalid('And'); - test_container_selector_invalid('oR'); - test_container_selector_invalid('nOt'); + test_container_name_valid('foo'); + test_container_name_valid(' foo'); + test_container_name_valid(' foo '); - test_query_known('style(--my-prop: foo)'); - test_query_known('style(--my-prop: foo - bar ())'); - test_query_known('style(not ((--foo: calc(10px + 2em)) and ((--foo: url(x)))))'); - test_query_known('style((--foo: bar) or (--bar: 10px))'); - test_query_known('style(--foo: bar !important)'); - test_query_known('style(--my-prop:)'); - test_query_known('style(--my-prop: )'); + test_container_name_invalid('foo foo'); + test_container_name_invalid('1px'); + test_container_name_invalid('50gil'); + test_container_name_invalid('name(foo)'); + test_container_name_invalid('type(inline-size)'); + test_container_name_invalid('"foo"'); + test_container_name_invalid('"inherit"'); + test_container_name_invalid('none'); + test_container_name_invalid('None'); + test_container_name_invalid('normal'); + test_container_name_invalid('Normal'); + test_container_name_invalid('auto'); + test_container_name_invalid('Auto'); + test_container_name_invalid('and'); + test_container_name_invalid('or'); + test_container_name_invalid('not'); + test_container_name_invalid('And'); + test_container_name_invalid('oR'); + test_container_name_invalid('nOt'); - test_query_unknown('style(--foo: bar;)'); - test_query_unknown('style(--foo)'); - test_query_unknown('style(style(--foo: bar))'); + test_condition_known('style(--my-prop: foo)'); + test_condition_known('style(--my-prop: foo - bar ())'); + test_condition_known('style(not ((--foo: calc(10px + 2em)) and ((--foo: url(x)))))'); + test_condition_known('style((--foo: bar) or (--bar: 10px))'); + test_condition_known('style(--foo: bar !important)'); + test_condition_known('style(--my-prop:)'); + test_condition_known('style(--my-prop: )'); + + test_condition_unknown('style(--foo: bar;)'); + test_condition_unknown('style(--foo)'); + test_condition_unknown('style(style(--foo: bar))'); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/chrome-remove-insert-evaluator-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/chrome-remove-insert-evaluator-crash.html new file mode 100644 index 0000000..986f6b0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/chrome-remove-insert-evaluator-crash.html
@@ -0,0 +1,15 @@ +<!doctype html> +<title>Removing and re-inserting a container should crash</title> +<link rel="help" href="https://crbug.com/1342750"> +<style> + #container { container-type: inline-size } +</style> +<div id="outer"> + <div id="container"></div> +</div> +<script> + container.offsetTop; + let removed = container; + container.remove(); + outer.appendChild(removed); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/snap-after-relayout/not-resnap-outside-proximity-threshold.html b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/snap-after-relayout/not-resnap-outside-proximity-threshold.html new file mode 100644 index 0000000..b2c5720e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/snap-after-relayout/not-resnap-outside-proximity-threshold.html
@@ -0,0 +1,66 @@ +<!DOCTYPE html> +<title> + Not re-snap once after a scroll operation has finished without snapping + because the scroll destination was outside of the snap proximity threshold. +</title> +<!-- This test assumes that all major browsers' default scroll-snap proximity + thresholds are greater than 200px. --> +<link rel="help" href="https://drafts.csswg.org/css-scroll-snap/#re-snap" /> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1780154"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> +div { + position: absolute; + margin: 0; +} + +#scroller { + height: 600px; + width: 600px; + overflow: hidden; + scroll-snap-type: y proximity; +} + +.snap { + width: 300px; + height: 300px; + background-color: green; + scroll-snap-align: start; +} + +.area { + width: 2000px; + height: 2000px; +} +</style> + +<div id="scroller"> + <div class="area"></div> + <div class="snap" style="top: 0px;"></div> + <div class="snap" style="top: 500px;"></div> +</div> + +<script> +test(() => { + // The initial snap position is at (0, 0). + assert_equals(scroller.scrollTop, 0); + assert_equals(scroller.scrollLeft, 0); + + // Scroll to a position where it's outside of the scroll-snap proximity + // threshold, so that it won't trigger snapping. + scroller.scrollTo(0, 250); + + assert_equals(scroller.scrollTop, 250); + assert_equals(scroller.scrollLeft, 0); + + // Changing the initial snap target position, but still it's outside of the + // threshold. + document.querySelectorAll(".snap")[0].style.top = "10px"; + + // Not re-snap to the last snap point. + assert_equals(scroller.scrollTop, 250); + assert_equals(scroller.scrollLeft, 0); +}, "Not re-snap once after a scroll operation has finished without snapping " + + "because the scroll destination was outside of the snap proximity threshold."); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/resource-timing/worklet-rt-entries.html b/third_party/blink/web_tests/external/wpt/resource-timing/worklet-rt-entries.https.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/resource-timing/worklet-rt-entries.html rename to third_party/blink/web_tests/external/wpt/resource-timing/worklet-rt-entries.https.html
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/page-reload-update-sidebar.js b/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/page-reload-update-sidebar.js deleted file mode 100644 index 7f6207c..0000000 --- a/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/page-reload-update-sidebar.js +++ /dev/null
@@ -1,65 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -(async function() { - TestRunner.addResult( - `Tests that reloading page during styles sidebar pane editing cancels editing and re-renders the sidebar pane.\n`); - await TestRunner.loadLegacyModule('elements'); await TestRunner.loadTestModule('elements_test_runner'); - await TestRunner.showPanel('elements'); - await TestRunner.loadHTML(` - <div id="inspected" style="color: blue">Text</div> - `); - await TestRunner.evaluateInPagePromise(` - function removeInspectedNode() - { - document.querySelector("#inspected").remove(); - } - `); - - var stylesSidebarPane = UI.panels.elements.stylesWidget; - TestRunner.runTestSuite([ - function selectInspectedNode(next) { - ElementsTestRunner.selectNodeAndWaitForStyles('inspected', next); - }, - - function startEditingAndReloadPage(next) { - var treeElement = ElementsTestRunner.getElementStylePropertyTreeItem('color'); - var currentDocumentId = stylesSidebarPane.node().ownerDocument.id; - treeElement.startEditing(treeElement.valueElement); - var nodeRebuiltHappened = false; - var pageReloadHappened = false; - TestRunner.addSniffer(Elements.StylesSidebarPane.prototype, 'nodeStylesUpdatedForTest', onNodeRebuilt); - TestRunner.reloadPage(reloadedCallback); - - function onNodeRebuilt(node, rebuild) { - if (!node || node.ownerDocument.id === currentDocumentId) { - TestRunner.addResult('ERROR: A rebuild update happened for the same node.'); - TestRunner.completeTest(); - return; - } - nodeRebuiltHappened = true; - maybeNext(); - } - - function reloadedCallback() { - pageReloadHappened = true; - maybeNext(); - } - - function maybeNext() { - if (nodeRebuiltHappened && pageReloadHappened) - next(); - } - }, - - function onPageReloaded(next) { - if (stylesSidebarPane.isEditingStyle) { - TestRunner.addResult('StylesSidebarPane should not be locked in editing on page reload.'); - TestRunner.completeTest(); - return; - } - next(); - }, - ]); -})();
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/storage/indexed-db-storage-key-clear.js b/third_party/blink/web_tests/http/tests/inspector-protocol/storage/indexed-db-storage-key-clear.js new file mode 100644 index 0000000..41a8dd06 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/storage/indexed-db-storage-key-clear.js
@@ -0,0 +1,57 @@ +(async function(testRunner) { + const {dp, session} = await testRunner.startBlank( + `Tests that clearing object store works for IndexedDB with storageKey\n`); + + await dp.IndexedDB.enable(); + await dp.Page.enable(); + + testRunner.log(`Open database, object store and set value`); + + // Create database, objectStore, add a key-value pair and read value. + const value = await session.evaluateAsync(` + new Promise(async resolve => { + const request = window.indexedDB.open("test-database"); + request.onerror = (event) => { + resolve('nothing'); + }; + request.onupgradeneeded = (event) => { + const db = event.target.result; + const objectStore = db.createObjectStore("test-store"); + objectStore.add("test-data", "test-key"); + const getReq = objectStore.get("test-key"); + getReq.onsuccess = (event) => { + resolve(getReq.result); + }; + }; + }) + `); + + testRunner.log(`data value equals: ${JSON.stringify(value)}\n`); + testRunner.log(`Clear object store for storage key`); + + const frameId = (await dp.Page.getResourceTree()).result.frameTree.frame.id; + const storageKey = (await dp.Storage.getStorageKeyForFrame({frameId: frameId})).result.storageKey; + await dp.IndexedDB.clearObjectStore({storageKey: storageKey, databaseName: "test-database", objectStoreName: "test-store"}); + + // Open database, objectStore and read value. + const valueAfterClear = await session.evaluateAsync(` + new Promise(async resolve => { + const openreq = window.indexedDB.open("test-database"); + openreq.onerror = (event) => { + resolve("not able to open database"); + } + openreq.onsuccess = (event) => { + const db = event.target.result; + const store = db.transaction(['test-store'],'readwrite').objectStore('test-store'); + const getReqAfterClear = store.get("test-key"); + getReqAfterClear.onsuccess = (event) => { + resolve(getReqAfterClear.result); + }; + }; + }) + `); + + testRunner.log(`data value after clear equals: ${JSON.stringify(valueAfterClear)}`); + + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/storage/indexed-db-storage-key-delete-db.js b/third_party/blink/web_tests/http/tests/inspector-protocol/storage/indexed-db-storage-key-delete-db.js new file mode 100644 index 0000000..f04654c --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/storage/indexed-db-storage-key-delete-db.js
@@ -0,0 +1,53 @@ +(async function(testRunner) { + const {dp, session} = await testRunner.startBlank( + `Tests that deleting database works for IndexedDB with storageKey\n`); + + await dp.IndexedDB.enable(); + await dp.Page.enable(); + + testRunner.log(`Open database`); + + // Create database and objectStore. + const open = await session.evaluateAsync(` + new Promise(async resolve => { + const request = window.indexedDB.open("test-database"); + request.onerror = (event) => { + resolve('failed to create database'); + }; + request.onupgradeneeded = (event) => { + const db = event.target.result; + const objectStore = db.createObjectStore("test-store"); + resolve('database created successfuly'); + }; + }) + `); + + testRunner.log(`${open}\n`); + testRunner.log(`Delete database`); + + const frameId = (await dp.Page.getResourceTree()).result.frameTree.frame.id; + const storageKey = (await dp.Storage.getStorageKeyForFrame({frameId: frameId})).result.storageKey; + await dp.IndexedDB.deleteDatabase({storageKey: storageKey, databaseName: "test-database"}); + + // Open database, try to access objectStore. + const accessAfterDelete = await session.evaluateAsync(` + new Promise(async resolve => { + const openreq = window.indexedDB.open("test-database"); + openreq.onerror = (event) => { + resolve("not able to open database"); + } + openreq.onsuccess = (event) => { + const db = event.target.result; + try { + db.transaction(['test-store'],'readwrite').objectStore('test-store'); + } catch (error) { + resolve("database deleted"); + } + }; + }) + `); + + testRunner.log(accessAfterDelete); + + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/css/css-contain/container-queries/at-container-parsing-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/css/css-contain/container-queries/at-container-parsing-expected.txt index 1198cc9..b15ee93 100644 --- a/third_party/blink/web_tests/platform/generic/external/wpt/css/css-contain/container-queries/at-container-parsing-expected.txt +++ b/third_party/blink/web_tests/platform/generic/external/wpt/css/css-contain/container-queries/at-container-parsing-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 111 tests; 110 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 113 tests; 112 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS (width) PASS (min-width: 0px) PASS (max-width: 0px) @@ -48,6 +48,9 @@ PASS (width < max(10px, 10em)) PASS (calc(10px + 10em) < width) PASS (calc(10px + 10em) < width < max(30px, 30em)) +PASS (width: 100px) and (height: 100px) +PASS (width: 100px) or (height: 100px) +PASS not (width: 100px) PASS foo(width) PASS size(width) PASS (asdf) @@ -75,32 +78,31 @@ PASS not screen and (width: 100px) PASS not screen or (width: 100px) PASS (width: 100px), (height: 100px) -PASS (width: 100px) and (height: 100px) -PASS (width: 100px) or (height: 100px) -PASS not (width: 100px) PASS foo (width: 100px) -PASS Container selector: foo -PASS Container selector: foo -PASS Container selector: foo -PASS Container selector: foo foo -PASS Container selector: 1px -PASS Container selector: 50gil -PASS Container selector: name(foo) -PASS Container selector: type(inline-size) -PASS Container selector: "foo" -PASS Container selector: "inherit" -PASS Container selector: none -PASS Container selector: None -PASS Container selector: normal -PASS Container selector: Normal -PASS Container selector: auto -PASS Container selector: Auto -PASS Container selector: and -PASS Container selector: or -PASS Container selector: not -PASS Container selector: And -PASS Container selector: oR -PASS Container selector: nOt +PASS name not (width <= 500px) +PASS not (width <= 500px) +PASS Container name: foo +PASS Container name: foo +PASS Container name: foo +PASS Container name: foo foo +PASS Container name: 1px +PASS Container name: 50gil +PASS Container name: name(foo) +PASS Container name: type(inline-size) +PASS Container name: "foo" +PASS Container name: "inherit" +PASS Container name: none +PASS Container name: None +PASS Container name: normal +PASS Container name: Normal +PASS Container name: auto +PASS Container name: Auto +PASS Container name: and +PASS Container name: or +PASS Container name: not +PASS Container name: And +PASS Container name: oR +PASS Container name: nOt PASS style(--my-prop: foo) PASS style(--my-prop: foo - bar ()) PASS style(not ((--foo: calc(10px + 2em)) and ((--foo: url(x)))))
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/resource-timing/worklet-rt-entries-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/resource-timing/worklet-rt-entries-expected.txt deleted file mode 100644 index 6943681e..0000000 --- a/third_party/blink/web_tests/platform/generic/external/wpt/resource-timing/worklet-rt-entries-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Worklets should generate Resource Timing Entries promise_test: Unhandled rejection with value: object "TypeError: Cannot read properties of undefined (reading 'addModule')" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/devtools/elements/styles-2/page-reload-update-sidebar-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/devtools/elements/styles-2/page-reload-update-sidebar-expected.txt deleted file mode 100644 index 3ab1a50..0000000 --- a/third_party/blink/web_tests/platform/generic/http/tests/devtools/elements/styles-2/page-reload-update-sidebar-expected.txt +++ /dev/null
@@ -1,10 +0,0 @@ -Tests that reloading page during styles sidebar pane editing cancels editing and re-renders the sidebar pane. - - -Running: selectInspectedNode - -Running: startEditingAndReloadPage -Page reloaded. - -Running: onPageReloaded -
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/disabled-permission-policy-attributionsrc-eligible-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/disabled-permission-policy-attributionsrc-eligible-expected.txt index 7b73d5c..e1d0bd7 100644 --- a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/disabled-permission-policy-attributionsrc-eligible-expected.txt +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/disabled-permission-policy-attributionsrc-eligible-expected.txt
@@ -3,7 +3,6 @@ code : AttributionReportingIssue details : { attributionReportingIssueDetails : { - frame : <object> violatingNodeId : <number> violationType : PermissionPolicyDisabled }
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/disabled-permission-policy-attributionsrc-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/disabled-permission-policy-attributionsrc-expected.txt index 824c6371b..03093b59 100644 --- a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/disabled-permission-policy-attributionsrc-expected.txt +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/disabled-permission-policy-attributionsrc-expected.txt
@@ -3,7 +3,6 @@ code : AttributionReportingIssue details : { attributionReportingIssueDetails : { - frame : <object> violatingNodeId : <number> violationType : PermissionPolicyDisabled }
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/disabled-permission-policy-subresource-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/disabled-permission-policy-subresource-expected.txt index e1fba9a..8d6826c 100644 --- a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/disabled-permission-policy-subresource-expected.txt +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/disabled-permission-policy-subresource-expected.txt
@@ -3,7 +3,6 @@ code : AttributionReportingIssue details : { attributionReportingIssueDetails : { - frame : <object> request : <object> violationType : PermissionPolicyDisabled }
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/insecure-anchor-attributionsrc-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/insecure-anchor-attributionsrc-expected.txt index 1e2fb805..278dd32d 100644 --- a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/insecure-anchor-attributionsrc-expected.txt +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/insecure-anchor-attributionsrc-expected.txt
@@ -3,10 +3,9 @@ code : AttributionReportingIssue details : { attributionReportingIssueDetails : { - frame : <object> invalidParameter : http://insecure.com violatingNodeId : <number> - violationType : AttributionSourceUntrustworthyOrigin + violationType : UntrustworthyReportingOrigin } } }
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/insecure-context-attributionsrc-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/insecure-context-attributionsrc-expected.txt index d873fdde..6703fc68 100644 --- a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/insecure-context-attributionsrc-expected.txt +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/insecure-context-attributionsrc-expected.txt
@@ -3,10 +3,9 @@ code : AttributionReportingIssue details : { attributionReportingIssueDetails : { - frame : <object> invalidParameter : http://devtools.test:8000 violatingNodeId : <number> - violationType : AttributionSourceUntrustworthyOrigin + violationType : InsecureContext } } }
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/insecure-context-subresource-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/insecure-context-subresource-expected.txt index ad62502..0ceee3c 100644 --- a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/insecure-context-subresource-expected.txt +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/insecure-context-subresource-expected.txt
@@ -3,10 +3,9 @@ code : AttributionReportingIssue details : { attributionReportingIssueDetails : { - frame : <object> invalidParameter : http://devtools.test:8000 request : <object> - violationType : AttributionUntrustworthyOrigin + violationType : InsecureContext } } }
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/insecure-subresource-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/insecure-subresource-expected.txt index 67160cc..8a498b5 100644 --- a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/insecure-subresource-expected.txt +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/insecure-subresource-expected.txt
@@ -3,10 +3,9 @@ code : AttributionReportingIssue details : { attributionReportingIssueDetails : { - frame : <object> invalidParameter : http://devtools.test:8000 request : <object> - violationType : AttributionUntrustworthyOrigin + violationType : UntrustworthyReportingOrigin } } }
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/invalid-source-header-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/invalid-source-header-expected.txt index 4f16762..2a8c96a 100644 --- a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/invalid-source-header-expected.txt +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/attribution-reporting/invalid-source-header-expected.txt
@@ -3,7 +3,6 @@ code : AttributionReportingIssue details : { attributionReportingIssueDetails : { - frame : <object> invalidParameter : ! request : <object> violationType : InvalidHeader
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/storage/indexed-db-storage-key-clear-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/storage/indexed-db-storage-key-clear-expected.txt new file mode 100644 index 0000000..8338b153 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/storage/indexed-db-storage-key-clear-expected.txt
@@ -0,0 +1,8 @@ +Tests that clearing object store works for IndexedDB with storageKey + +Open database, object store and set value +data value equals: "test-data" + +Clear object store for storage key +data value after clear equals: undefined +
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/storage/indexed-db-storage-key-delete-db-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/storage/indexed-db-storage-key-delete-db-expected.txt new file mode 100644 index 0000000..8a8b661 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/storage/indexed-db-storage-key-delete-db-expected.txt
@@ -0,0 +1,8 @@ +Tests that deleting database works for IndexedDB with storageKey + +Open database +database created successfuly + +Delete database +database deleted +
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-anchor-position/anchor-size-minmax-001.html b/third_party/blink/web_tests/wpt_internal/css/css-anchor-position/anchor-size-minmax-001.html index f84fc37..e1982b0 100644 --- a/third_party/blink/web_tests/wpt_internal/css/css-anchor-position/anchor-size-minmax-001.html +++ b/third_party/blink/web_tests/wpt_internal/css/css-anchor-position/anchor-size-minmax-001.html
@@ -26,11 +26,19 @@ <div class="target" style="min-width: anchor-size(--a1 width)" data-expected-width=5></div> + <div class="target" + style="min-height: anchor-size(--a1 width)" + data-expected-height=5></div> <div class="target" style="max-width: anchor-size(--a1 width)" data-expected-width=5> <div style="width: 100px"></div> </div> + <div class="target" + style="max-height: anchor-size(--a1 width)" + data-expected-height=5> + <div style="height: 100px"></div> + </div> </div> </body>
diff --git a/third_party/closure_compiler/externs/passwords_private.js b/third_party/closure_compiler/externs/passwords_private.js index 3a00ef87..470ec577 100644 --- a/third_party/closure_compiler/externs/passwords_private.js +++ b/third_party/closure_compiler/externs/passwords_private.js
@@ -72,11 +72,10 @@ chrome.passwordsPrivate.ImportResultsStatus = { SUCCESS: 'SUCCESS', IO_ERROR: 'IO_ERROR', - BAD_FILE_FORMAT: 'BAD_FILE_FORMAT', + BAD_FORMAT: 'BAD_FORMAT', DISMISSED: 'DISMISSED', }; - /** * @enum {string} */ @@ -92,28 +91,26 @@ /** * @typedef {{ - * status: chrome.passwordsPrivate.ImportEntryStatus, + * status: !chrome.passwordsPrivate.ImportEntryStatus, * url: string, * username: string * }} */ chrome.passwordsPrivate.ImportEntry; - /** * @typedef {{ - * status: chrome.passwordsPrivate.ImportResultsStatus, + * status: !chrome.passwordsPrivate.ImportResultsStatus, * numberImported: number, - * failedImports: (!Array<!chrome.passwordsPrivate.ImportEntry>), + * failedImports: !Array<!chrome.passwordsPrivate.ImportEntry>, * fileName: string * }} */ chrome.passwordsPrivate.ImportResults; - /** * @typedef {{ - * origin: string, + * signonRealm: string, * shown: string, * link: string * }} @@ -124,11 +121,12 @@ * @typedef {{ * urls: !chrome.passwordsPrivate.UrlCollection, * username: string, + * password: (string|undefined), * federationText: (string|undefined), * id: number, * storedIn: !chrome.passwordsPrivate.PasswordStoreSet, * isAndroidCredential: boolean, - * passwordNote: string + * note: string * }} */ chrome.passwordsPrivate.PasswordUiEntry; @@ -161,13 +159,11 @@ /** * @typedef {{ + * urls: !chrome.passwordsPrivate.UrlCollection, * id: number, - * formattedOrigin: string, - * detailedOrigin: string, * isAndroidCredential: boolean, * changePasswordUrl: (string|undefined), * hasStartableScript: boolean, - * signonRealm: string, * username: string, * password: (string|undefined), * compromisedInfo: (!chrome.passwordsPrivate.CompromisedInfo|undefined)
diff --git a/third_party/crashpad/README.chromium b/third_party/crashpad/README.chromium index bb3c0c4..3c5caf3 100644 --- a/third_party/crashpad/README.chromium +++ b/third_party/crashpad/README.chromium
@@ -2,7 +2,7 @@ Short Name: crashpad URL: https://crashpad.chromium.org/ Version: unknown -Revision: ae7d8a9ba461134ae8eb7f7a86dfc02bb41a85d6 +Revision: 1b47570f6f4192f3effa9976529c9b81f66b06f0 License: Apache 2.0 License File: crashpad/LICENSE Security Critical: yes
diff --git a/third_party/crashpad/crashpad/client/ios_handler/in_process_intermediate_dump_handler_test.cc b/third_party/crashpad/crashpad/client/ios_handler/in_process_intermediate_dump_handler_test.cc index f1d8a54..f89143a 100644 --- a/third_party/crashpad/crashpad/client/ios_handler/in_process_intermediate_dump_handler_test.cc +++ b/third_party/crashpad/crashpad/client/ios_handler/in_process_intermediate_dump_handler_test.cc
@@ -55,15 +55,18 @@ EXPECT_FALSE(IsRegularFile(path_)); } - void WriteReport() { - internal::IOSIntermediateDumpWriter::ScopedRootMap rootMap(writer_.get()); - InProcessIntermediateDumpHandler::WriteHeader(writer_.get()); - InProcessIntermediateDumpHandler::WriteProcessInfo( - writer_.get(), {{"before_dump", "pre"}}); - InProcessIntermediateDumpHandler::WriteSystemInfo(writer_.get(), - system_data_); - InProcessIntermediateDumpHandler::WriteThreadInfo(writer_.get(), 0, 0); - InProcessIntermediateDumpHandler::WriteModuleInfo(writer_.get()); + void WriteReportAndCloseWriter() { + { + internal::IOSIntermediateDumpWriter::ScopedRootMap rootMap(writer_.get()); + InProcessIntermediateDumpHandler::WriteHeader(writer_.get()); + InProcessIntermediateDumpHandler::WriteProcessInfo( + writer_.get(), {{"before_dump", "pre"}}); + InProcessIntermediateDumpHandler::WriteSystemInfo(writer_.get(), + system_data_); + InProcessIntermediateDumpHandler::WriteThreadInfo(writer_.get(), 0, 0); + InProcessIntermediateDumpHandler::WriteModuleInfo(writer_.get()); + } + EXPECT_TRUE(writer_->Close()); } void WriteMachException() { @@ -94,7 +97,7 @@ }; TEST_F(InProcessIntermediateDumpHandlerTest, TestSystem) { - WriteReport(); + WriteReportAndCloseWriter(); internal::ProcessSnapshotIOSIntermediateDump process_snapshot; ASSERT_TRUE(process_snapshot.InitializeWithFilePath(path(), {})); @@ -152,7 +155,7 @@ test_annotation_four.Set("same-name 4"); test_annotation_two.Clear(); - WriteReport(); + WriteReportAndCloseWriter(); internal::ProcessSnapshotIOSIntermediateDump process_snapshot; ASSERT_TRUE(process_snapshot.InitializeWithFilePath( path(), {{"after_dump", "post"}})); @@ -209,7 +212,7 @@ TEST_F(InProcessIntermediateDumpHandlerTest, TestThreads) { const ScopedSetThreadName scoped_set_thread_name("TestThreads"); - WriteReport(); + WriteReportAndCloseWriter(); internal::ProcessSnapshotIOSIntermediateDump process_snapshot; ASSERT_TRUE(process_snapshot.InitializeWithFilePath(path(), {})); @@ -228,26 +231,26 @@ } TEST_F(InProcessIntermediateDumpHandlerTest, TestProcess) { - WriteReport(); + WriteReportAndCloseWriter(); internal::ProcessSnapshotIOSIntermediateDump process_snapshot; ASSERT_TRUE(process_snapshot.InitializeWithFilePath(path(), {})); EXPECT_EQ(process_snapshot.ProcessID(), getpid()); } TEST_F(InProcessIntermediateDumpHandlerTest, TestMachException) { - WriteReport(); + WriteReportAndCloseWriter(); internal::ProcessSnapshotIOSIntermediateDump process_snapshot; ASSERT_TRUE(process_snapshot.InitializeWithFilePath(path(), {})); } TEST_F(InProcessIntermediateDumpHandlerTest, TestSignalException) { - WriteReport(); + WriteReportAndCloseWriter(); internal::ProcessSnapshotIOSIntermediateDump process_snapshot; ASSERT_TRUE(process_snapshot.InitializeWithFilePath(path(), {})); } TEST_F(InProcessIntermediateDumpHandlerTest, TestNSException) { - WriteReport(); + WriteReportAndCloseWriter(); internal::ProcessSnapshotIOSIntermediateDump process_snapshot; ASSERT_TRUE(process_snapshot.InitializeWithFilePath(path(), {})); }
diff --git a/third_party/crashpad/crashpad/minidump/minidump_thread_name_list_writer_test.cc b/third_party/crashpad/crashpad/minidump/minidump_thread_name_list_writer_test.cc index 265c12e..43ed527 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_thread_name_list_writer_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_thread_name_list_writer_test.cc
@@ -91,10 +91,19 @@ const MINIDUMP_THREAD_NAME* observed, const std::string& file_contents, const std::string& expected_thread_name) { + // Copy RvaOfThreadName into a local variable because + // |MINIDUMP_THREAD_NAME::RvaOfThreadName| requires 8-byte alignment but the + // struct itself is 4-byte algined. + const auto rva_of_thread_name = [&observed] { + RVA64 data = 0; + memcpy(&data, &observed->RvaOfThreadName, sizeof(RVA64)); + return data; + }(); + EXPECT_EQ(observed->ThreadId, expected->ThreadId); - EXPECT_NE(observed->RvaOfThreadName, 0u); + EXPECT_NE(rva_of_thread_name, 0u); const std::string observed_thread_name = base::UTF16ToUTF8( - MinidumpStringAtRVAAsString(file_contents, observed->RvaOfThreadName)); + MinidumpStringAtRVAAsString(file_contents, rva_of_thread_name)); EXPECT_EQ(observed_thread_name, expected_thread_name); }
diff --git a/third_party/crashpad/crashpad/minidump/minidump_writable_test.cc b/third_party/crashpad/crashpad/minidump/minidump_writable_test.cc index 2032b063..3d466d7 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_writable_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_writable_test.cc
@@ -698,16 +698,25 @@ template <typename MinidumpLocationDescriptorType> struct TLocationDescriptorAndData { MinidumpLocationDescriptorType location_descriptor; - char string[1]; + const char* string; }; template <typename MinidumpLocationDescriptorType> -const TLocationDescriptorAndData<MinidumpLocationDescriptorType>* TLDDAtIndex( - const std::string& string, +TLocationDescriptorAndData<MinidumpLocationDescriptorType> TLDDAtIndex( + const std::string& str, size_t index) { - return reinterpret_cast< - const TLocationDescriptorAndData<MinidumpLocationDescriptorType>*>( - &string[index]); + const MinidumpLocationDescriptorType* location_descriptor = + reinterpret_cast<const MinidumpLocationDescriptorType*>(&str[index]); + + const char* string = reinterpret_cast<const char*>( + &str[index] + + offsetof(TLocationDescriptorAndData<MinidumpLocationDescriptorType>, + string)); + + return TLocationDescriptorAndData<MinidumpLocationDescriptorType>{ + *location_descriptor, + string, + }; } template <typename MinidumpLocationDescriptorType> @@ -746,9 +755,9 @@ EXPECT_TRUE(location_descriptor_writable.WriteEverything(&string_file)); ASSERT_EQ(string_file.string().size(), kMinidumpLocationDescriptorSize + 1); - const LocationDescriptorAndData* ldd = LDDAtIndex(string_file.string(), 0); - EXPECT_EQ(ldd->location_descriptor.DataSize, 0u); - EXPECT_EQ(ldd->location_descriptor.Rva, 0u); + LocationDescriptorAndData ldd = LDDAtIndex(string_file.string(), 0); + EXPECT_EQ(ldd.location_descriptor.DataSize, 0u); + EXPECT_EQ(ldd.location_descriptor.Rva, 0u); location_descriptor_writable.Verify(); } @@ -761,10 +770,10 @@ EXPECT_TRUE(location_descriptor_writable.WriteEverything(&string_file)); ASSERT_EQ(string_file.string().size(), kMinidumpLocationDescriptorSize + 1); - const LocationDescriptorAndData* ldd = LDDAtIndex(string_file.string(), 0); - EXPECT_EQ(ldd->location_descriptor.DataSize, + LocationDescriptorAndData ldd = LDDAtIndex(string_file.string(), 0); + EXPECT_EQ(ldd.location_descriptor.DataSize, kMinidumpLocationDescriptorSize + 1); - EXPECT_EQ(ldd->location_descriptor.Rva, 0u); + EXPECT_EQ(ldd.location_descriptor.Rva, 0u); location_descriptor_writable.Verify(); } @@ -778,11 +787,11 @@ EXPECT_TRUE(location_descriptor_writable.WriteEverything(&string_file)); ASSERT_EQ(string_file.string().size(), kMinidumpLocationDescriptorSize + 3); - const LocationDescriptorAndData* ldd = LDDAtIndex(string_file.string(), 0); - EXPECT_EQ(ldd->location_descriptor.DataSize, + LocationDescriptorAndData ldd = LDDAtIndex(string_file.string(), 0); + EXPECT_EQ(ldd.location_descriptor.DataSize, kMinidumpLocationDescriptorSize + 3); - EXPECT_EQ(ldd->location_descriptor.Rva, 0u); - EXPECT_STREQ("zz", ldd->string); + EXPECT_EQ(ldd.location_descriptor.Rva, 0u); + EXPECT_STREQ("zz", ldd.string); location_descriptor_writable.Verify(); } @@ -800,17 +809,19 @@ ASSERT_EQ(string_file.string().size(), kMinidumpLocationDescriptorSize * 2 + 6); - const LocationDescriptorAndData* ldd = LDDAtIndex(string_file.string(), 0); - EXPECT_EQ(ldd->location_descriptor.DataSize, + LocationDescriptorAndData ldd = LDDAtIndex(string_file.string(), 0); + + EXPECT_EQ(ldd.location_descriptor.DataSize, kMinidumpLocationDescriptorSize + 3); - EXPECT_EQ(ldd->location_descriptor.Rva, 0u); - EXPECT_STREQ("yy", ldd->string); + EXPECT_EQ(ldd.location_descriptor.Rva, 0u); + EXPECT_STREQ("yy", ldd.string); ldd = LDDAtIndex(string_file.string(), kMinidumpLocationDescriptorSize + 4); - EXPECT_EQ(ldd->location_descriptor.DataSize, + + EXPECT_EQ(ldd.location_descriptor.DataSize, kMinidumpLocationDescriptorSize + 2); - EXPECT_EQ(ldd->location_descriptor.Rva, - kMinidumpLocationDescriptorSize + 4); - EXPECT_STREQ("x", ldd->string); + + EXPECT_EQ(ldd.location_descriptor.Rva, kMinidumpLocationDescriptorSize + 4); + EXPECT_STREQ("x", ldd.string); parent.Verify(); } @@ -827,16 +838,18 @@ ASSERT_EQ(string_file.string().size(), kMinidumpLocationDescriptorSize * 2 + 7); - const LocationDescriptorAndData* ldd = LDDAtIndex(string_file.string(), 0); - EXPECT_EQ(ldd->location_descriptor.DataSize, + LocationDescriptorAndData ldd = LDDAtIndex(string_file.string(), 0); + + EXPECT_EQ(ldd.location_descriptor.DataSize, kMinidumpLocationDescriptorSize + 3); - EXPECT_EQ(ldd->location_descriptor.Rva, - kMinidumpLocationDescriptorSize + 4); - EXPECT_STREQ("www", ldd->string); + + EXPECT_EQ(ldd.location_descriptor.Rva, kMinidumpLocationDescriptorSize + 4); + EXPECT_STREQ("www", ldd.string); ldd = LDDAtIndex(string_file.string(), kMinidumpLocationDescriptorSize + 4); - EXPECT_EQ(ldd->location_descriptor.DataSize, 0u); - EXPECT_EQ(ldd->location_descriptor.Rva, 0u); - EXPECT_STREQ("vv", ldd->string); + + EXPECT_EQ(ldd.location_descriptor.DataSize, 0u); + EXPECT_EQ(ldd.location_descriptor.Rva, 0u); + EXPECT_STREQ("vv", ldd.string); parent.Verify(); } @@ -854,17 +867,16 @@ ASSERT_EQ(string_file.string().size(), kMinidumpLocationDescriptorSize * 2 + 13); - const LocationDescriptorAndData* ldd = LDDAtIndex(string_file.string(), 0); - EXPECT_EQ(ldd->location_descriptor.DataSize, + LocationDescriptorAndData ldd = LDDAtIndex(string_file.string(), 0); + EXPECT_EQ(ldd.location_descriptor.DataSize, kMinidumpLocationDescriptorSize + 5); - EXPECT_EQ(ldd->location_descriptor.Rva, - kMinidumpLocationDescriptorSize + 8); - EXPECT_STREQ("uuuu", ldd->string); + EXPECT_EQ(ldd.location_descriptor.Rva, kMinidumpLocationDescriptorSize + 8); + EXPECT_STREQ("uuuu", ldd.string); ldd = LDDAtIndex(string_file.string(), kMinidumpLocationDescriptorSize + 8); - EXPECT_EQ(ldd->location_descriptor.DataSize, + EXPECT_EQ(ldd.location_descriptor.DataSize, kMinidumpLocationDescriptorSize + 5); - EXPECT_EQ(ldd->location_descriptor.Rva, 0u); - EXPECT_STREQ("tttt", ldd->string); + EXPECT_EQ(ldd.location_descriptor.Rva, 0u); + EXPECT_STREQ("tttt", ldd.string); parent.Verify(); } @@ -893,37 +905,33 @@ ASSERT_EQ(string_file.string().size(), kMinidumpLocationDescriptorSize * 5 + 18); - const LocationDescriptorAndData* ldd = LDDAtIndex(string_file.string(), 0); - EXPECT_EQ(ldd->location_descriptor.DataSize, + LocationDescriptorAndData ldd = LDDAtIndex(string_file.string(), 0); + EXPECT_EQ(ldd.location_descriptor.DataSize, kMinidumpLocationDescriptorSize + 2); - EXPECT_EQ(ldd->location_descriptor.Rva, - kMinidumpLocationDescriptorSize + 4); - EXPECT_STREQ("s", ldd->string); + EXPECT_EQ(ldd.location_descriptor.Rva, kMinidumpLocationDescriptorSize + 4); + EXPECT_STREQ("s", ldd.string); ldd = LDDAtIndex(string_file.string(), kMinidumpLocationDescriptorSize + 4); - EXPECT_EQ(ldd->location_descriptor.DataSize, 0u); - EXPECT_EQ(ldd->location_descriptor.Rva, 0u); - EXPECT_STREQ("r", ldd->string); + EXPECT_EQ(ldd.location_descriptor.DataSize, 0u); + EXPECT_EQ(ldd.location_descriptor.Rva, 0u); + EXPECT_STREQ("r", ldd.string); ldd = LDDAtIndex(string_file.string(), kMinidumpLocationDescriptorSize * 2 + 8); - EXPECT_EQ(ldd->location_descriptor.DataSize, + EXPECT_EQ(ldd.location_descriptor.DataSize, kMinidumpLocationDescriptorSize + 2); - EXPECT_EQ(ldd->location_descriptor.Rva, - kMinidumpLocationDescriptorSize + 4); - EXPECT_STREQ("q", ldd->string); + EXPECT_EQ(ldd.location_descriptor.Rva, kMinidumpLocationDescriptorSize + 4); + EXPECT_STREQ("q", ldd.string); ldd = LDDAtIndex(string_file.string(), kMinidumpLocationDescriptorSize * 3 + 12); - EXPECT_EQ(ldd->location_descriptor.DataSize, + EXPECT_EQ(ldd.location_descriptor.DataSize, kMinidumpLocationDescriptorSize + 2); - EXPECT_EQ(ldd->location_descriptor.Rva, - kMinidumpLocationDescriptorSize + 4); - EXPECT_STREQ("p", ldd->string); + EXPECT_EQ(ldd.location_descriptor.Rva, kMinidumpLocationDescriptorSize + 4); + EXPECT_STREQ("p", ldd.string); ldd = LDDAtIndex(string_file.string(), kMinidumpLocationDescriptorSize * 4 + 16); - EXPECT_EQ(ldd->location_descriptor.DataSize, + EXPECT_EQ(ldd.location_descriptor.DataSize, kMinidumpLocationDescriptorSize + 2); - EXPECT_EQ(ldd->location_descriptor.Rva, - kMinidumpLocationDescriptorSize + 4); - EXPECT_STREQ("o", ldd->string); + EXPECT_EQ(ldd.location_descriptor.Rva, kMinidumpLocationDescriptorSize + 4); + EXPECT_STREQ("o", ldd.string); parent.Verify(); } }
diff --git a/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump_test.cc b/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump_test.cc index 0a170e7..1ccb8b7 100644 --- a/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump_test.cc +++ b/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump_test.cc
@@ -63,7 +63,7 @@ } void TearDown() override { - EXPECT_TRUE(writer_->Close()); + CloseWriter(); writer_.reset(); EXPECT_FALSE(IsRegularFile(path_)); } @@ -492,6 +492,8 @@ ExpectMachException(*snapshot.Exception()); } + void CloseWriter() { EXPECT_TRUE(writer_->Close()); } + private: std::unique_ptr<internal::IOSIntermediateDumpWriter> writer_; ScopedTempDir temp_dir_; @@ -523,6 +525,7 @@ { IOSIntermediateDumpWriter::ScopedMap map(writer(), Key::kSystemInfo); } { IOSIntermediateDumpWriter::ScopedMap map(writer(), Key::kProcessInfo); } } + CloseWriter(); ProcessSnapshotIOSIntermediateDump process_snapshot; ASSERT_TRUE(process_snapshot.InitializeWithFilePath(path(), annotations())); EXPECT_FALSE(IsRegularFile(path())); @@ -536,6 +539,7 @@ EXPECT_TRUE(writer()->AddProperty(Key::kVersion, &version)); { IOSIntermediateDumpWriter::ScopedMap map(writer(), Key::kProcessInfo); } } + CloseWriter(); ProcessSnapshotIOSIntermediateDump process_snapshot; ASSERT_FALSE(process_snapshot.InitializeWithFilePath(path(), annotations())); EXPECT_FALSE(IsRegularFile(path())); @@ -548,6 +552,7 @@ EXPECT_TRUE(writer()->AddProperty(Key::kVersion, &version)); { IOSIntermediateDumpWriter::ScopedMap map(writer(), Key::kSystemInfo); } } + CloseWriter(); ProcessSnapshotIOSIntermediateDump process_snapshot; ASSERT_FALSE(process_snapshot.InitializeWithFilePath(path(), annotations())); EXPECT_FALSE(IsRegularFile(path())); @@ -573,6 +578,7 @@ writer()->AddProperty(Key::kThreadID, &thread_id); } } + CloseWriter(); ProcessSnapshotIOSIntermediateDump process_snapshot; ASSERT_TRUE(process_snapshot.InitializeWithFilePath(path(), annotations())); EXPECT_FALSE(IsRegularFile(path())); @@ -599,6 +605,7 @@ writer()->AddProperty(Key::kThreadID, &thread_id); } } + CloseWriter(); ProcessSnapshotIOSIntermediateDump process_snapshot; ASSERT_TRUE(process_snapshot.InitializeWithFilePath(path(), annotations())); EXPECT_FALSE(IsRegularFile(path())); @@ -625,6 +632,7 @@ writer()->AddProperty(Key::kThreadID, &thread_id); } } + CloseWriter(); ProcessSnapshotIOSIntermediateDump process_snapshot; ASSERT_TRUE(process_snapshot.InitializeWithFilePath(path(), annotations())); EXPECT_FALSE(IsRegularFile(path())); @@ -655,6 +663,7 @@ Key::kThreadUncaughtNSExceptionFrames, frames, num_frames); } } + CloseWriter(); ProcessSnapshotIOSIntermediateDump process_snapshot; ASSERT_TRUE(process_snapshot.InitializeWithFilePath(path(), annotations())); EXPECT_FALSE(IsRegularFile(path())); @@ -673,6 +682,8 @@ writer(), /*has_module_path=*/false, /*use_long_annotations=*/false); WriteMachException(writer(), true /* short_context=true*/); } + CloseWriter(); + ProcessSnapshotIOSIntermediateDump process_snapshot; ASSERT_TRUE(process_snapshot.InitializeWithFilePath(path(), annotations())); EXPECT_FALSE(IsRegularFile(path())); @@ -694,6 +705,7 @@ writer(), /*has_module_path=*/false, /*use_long_annotations=*/true); WriteMachException(writer()); } + CloseWriter(); ProcessSnapshotIOSIntermediateDump process_snapshot; ASSERT_TRUE(process_snapshot.InitializeWithFilePath(path(), annotations())); EXPECT_FALSE(IsRegularFile(path())); @@ -715,6 +727,7 @@ writer(), /*has_module_path=*/true, /*use_long_annotations=*/false); WriteMachException(writer()); } + CloseWriter(); ProcessSnapshotIOSIntermediateDump process_snapshot; ASSERT_TRUE(process_snapshot.InitializeWithFilePath(path(), annotations())); EXPECT_FALSE(IsRegularFile(path()));
diff --git a/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_writer.cc b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_writer.cc index bfbb596c..9eeb6263 100644 --- a/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_writer.cc +++ b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_writer.cc
@@ -16,6 +16,7 @@ #include <fcntl.h> #include <mach/mach.h> +#include <string.h> #include <unistd.h> #include <algorithm> @@ -31,16 +32,15 @@ namespace internal { // Similar to LoggingWriteFile but with CRASHPAD_RAW_LOG. -bool RawLoggingWriteFile(int fd, const void* buffer, size_t size) { - uintptr_t buffer_int = reinterpret_cast<uintptr_t>(buffer); +bool RawLoggingWriteFile(int fd, const void* data, size_t size) { + const char* data_char = static_cast<const char*>(data); while (size > 0) { - ssize_t bytes_written = HANDLE_EINTR( - write(fd, reinterpret_cast<const char*>(buffer_int), size)); + ssize_t bytes_written = HANDLE_EINTR(write(fd, data_char, size)); if (bytes_written < 0 || bytes_written == 0) { CRASHPAD_RAW_LOG_ERROR(bytes_written, "RawLoggingWriteFile"); return false; } - buffer_int += bytes_written; + data_char += bytes_written; size -= bytes_written; } return true; @@ -56,7 +56,7 @@ } IOSIntermediateDumpWriter::~IOSIntermediateDumpWriter() { - DCHECK_EQ(fd_, -1) << "Call Close() before this object is destroyed."; + CHECK_EQ(fd_, -1) << "Call Close() before this object is destroyed."; } bool IOSIntermediateDumpWriter::Open(const base::FilePath& path) { @@ -83,6 +83,9 @@ if (fd_ < 0) { return true; } + if (!FlushWriteBuffer()) { + return false; + } int fd = fd_; fd_ = -1; return RawLoggingCloseFile(fd); @@ -157,49 +160,100 @@ bool IOSIntermediateDumpWriter::ArrayMapStart() { const CommandType command_type = CommandType::kMapStart; - return RawLoggingWriteFile(fd_, &command_type, sizeof(command_type)); + return BufferedWrite(&command_type, sizeof(command_type)); } bool IOSIntermediateDumpWriter::MapStart(IntermediateDumpKey key) { const CommandType command_type = CommandType::kMapStart; - return RawLoggingWriteFile(fd_, &command_type, sizeof(command_type)) && - RawLoggingWriteFile(fd_, &key, sizeof(key)); + return BufferedWrite(&command_type, sizeof(command_type)) && + BufferedWrite(&key, sizeof(key)); } bool IOSIntermediateDumpWriter::ArrayStart(IntermediateDumpKey key) { const CommandType command_type = CommandType::kArrayStart; - return RawLoggingWriteFile(fd_, &command_type, sizeof(command_type)) && - RawLoggingWriteFile(fd_, &key, sizeof(key)); + return BufferedWrite(&command_type, sizeof(command_type)) && + BufferedWrite(&key, sizeof(key)); } bool IOSIntermediateDumpWriter::MapEnd() { const CommandType command_type = CommandType::kMapEnd; - return RawLoggingWriteFile(fd_, &command_type, sizeof(command_type)); + return BufferedWrite(&command_type, sizeof(command_type)); } bool IOSIntermediateDumpWriter::ArrayEnd() { const CommandType command_type = CommandType::kArrayEnd; - return RawLoggingWriteFile(fd_, &command_type, sizeof(command_type)); + return BufferedWrite(&command_type, sizeof(command_type)); } bool IOSIntermediateDumpWriter::RootMapStart() { const CommandType command_type = CommandType::kRootMapStart; - return RawLoggingWriteFile(fd_, &command_type, sizeof(command_type)); + return BufferedWrite(&command_type, sizeof(command_type)); } bool IOSIntermediateDumpWriter::RootMapEnd() { const CommandType command_type = CommandType::kRootMapEnd; - return RawLoggingWriteFile(fd_, &command_type, sizeof(command_type)); + return BufferedWrite(&command_type, sizeof(command_type)); } bool IOSIntermediateDumpWriter::Property(IntermediateDumpKey key, const void* value, size_t value_length) { const CommandType command_type = CommandType::kProperty; - return RawLoggingWriteFile(fd_, &command_type, sizeof(command_type)) && - RawLoggingWriteFile(fd_, &key, sizeof(key)) && - RawLoggingWriteFile(fd_, &value_length, sizeof(size_t)) && - RawLoggingWriteFile(fd_, value, value_length); + return BufferedWrite(&command_type, sizeof(command_type)) && + BufferedWrite(&key, sizeof(key)) && + BufferedWrite(&value_length, sizeof(size_t)) && + BufferedWrite(value, value_length); +} + +bool IOSIntermediateDumpWriter::FlushWriteBuffer() { + size_t size = buffer_occupied_; + buffer_occupied_ = 0; + return RawLoggingWriteFile(fd_, buffer_, size); +} + +bool IOSIntermediateDumpWriter::BufferedWrite(const void* data, + size_t data_size) { + const char* data_char = static_cast<const char*>(data); + // If `buffer_` is occupied, fill it up first, and flush if full. + if (buffer_occupied_ > 0) { + size_t data_size_to_copy = + std::min(kBufferSize - buffer_occupied_, data_size); + memcpy(buffer_ + buffer_occupied_, data_char, data_size_to_copy); + buffer_occupied_ += data_size_to_copy; + data_char += data_size_to_copy; + data_size -= data_size_to_copy; + + if (buffer_occupied_ == kBufferSize) { + if (!FlushWriteBuffer()) { + return false; + } + } + } + + // Either `data_size` is big enough that it could fill `buffer_`, trigger + // a FlushWriteBuffer, and reset `buffer_occuppied_` to zero, or there is no + // data left to process. + DCHECK(buffer_occupied_ == 0 || data_size == 0); + + // Write the rest of the `data` in an increment of kBufferSize. + if (data_size >= kBufferSize) { + DCHECK_EQ(buffer_occupied_, 0u); + size_t data_size_to_write = data_size - (data_size % kBufferSize); + if (!RawLoggingWriteFile(fd_, data_char, data_size_to_write)) { + return false; + } + data_char += data_size_to_write; + data_size -= data_size_to_write; + } + + // If there's any `data` left, put it in `buffer_`. + if (data_size > 0) { + DCHECK_EQ(buffer_occupied_, 0u); + memcpy(buffer_, data_char, data_size); + buffer_occupied_ = data_size; + } + + return true; } } // namespace internal
diff --git a/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_writer.h b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_writer.h index ea178353..a11a4eb 100644 --- a/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_writer.h +++ b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_writer.h
@@ -15,6 +15,8 @@ #ifndef CRASHPAD_UTIL_IOS_IOS_INTERMEDIATE_DUMP_WRITER_H_ #define CRASHPAD_UTIL_IOS_IOS_INTERMEDIATE_DUMP_WRITER_H_ +#include <sys/types.h> + #include "base/files/file_path.h" #include "util/ios/ios_intermediate_dump_format.h" @@ -39,7 +41,7 @@ //! Note: All methods are `RUNS-DURING-CRASH`. class IOSIntermediateDumpWriter final { public: - IOSIntermediateDumpWriter() : fd_(-1) { } + IOSIntermediateDumpWriter() : buffer_occupied_(0), fd_(-1) {} IOSIntermediateDumpWriter(const IOSIntermediateDumpWriter&) = delete; IOSIntermediateDumpWriter& operator=(const IOSIntermediateDumpWriter&) = @@ -175,8 +177,8 @@ key, reinterpret_cast<const char*>(value), value_length); } - //! \return Returns `true` if able to vm_read a string of \a value and write - //! a kProperty command with the \a key \a value up to a NUL byte. + //! \return `true` if able to vm_read a string of \a value and write a + //! kProperty command with the \a key \a value up to a NUL byte. //! The string cannot be longer than \a max_length with a maximum string //! length of 1024. bool AddPropertyCString(IntermediateDumpKey key, @@ -184,7 +186,7 @@ const char* value); private: - //! \return Returns `true` if able to vm_read_overwrite \a value into + //! \return `true` if able to vm_read_overwrite \a value into //! \a buffer while only reading one page at a time up to a NUL byte. //! Sets the final length of \a buffer to \a string_length. //! Returns `false` if unable to vm_read \a value or when no NUL byte can @@ -194,41 +196,56 @@ size_t max_length, size_t* string_length); - //! \return Returns `true` if able to vm_read \a value \a count and write a + //! \return `true` if able to vm_read \a value \a count and write a //! kProperty command with the \a key \a value \a count tuple. bool AddPropertyInternal(IntermediateDumpKey key, const char* value, size_t value_length); - //! \return Returns `true` if able to write a kArrayStart command with the - //! \a key. + //! \return `true` if able to write a kArrayStart command with the \a key. bool ArrayStart(IntermediateDumpKey key); - //! \return Returns `true` if able to write a kMapStart command with the - //! \a key. + //! \return `true` if able to write a kMapStart command with the \a key. bool MapStart(IntermediateDumpKey key); - //! \return Returns `true` if able to write a kMapStart command. + //! \return `true` if able to write a kMapStart command. bool ArrayMapStart(); - //! \return Returns `true` if able to write a kArrayEnd command. + //! \return `true` if able to write a kArrayEnd command. bool ArrayEnd(); - //! \return Returns `true` if able to write a kMapEnd command. + //! \return `true` if able to write a kMapEnd command. bool MapEnd(); - //! \return Returns `true` if able to write a kRootMapStart command. + //! \return `true` if able to write a kRootMapStart command. bool RootMapStart(); - //! \return Returns `true` if able to write a kRootMapEnd command. + //! \return `true` if able to write a kRootMapEnd command. bool RootMapEnd(); - //! \return Returns `true` if able to write a kProperty command with the - //! \a key \a value \a value_length tuple. + //! \return `true` if able to write a kProperty command with the \a key + //! \a value \a value_length tuple. bool Property(IntermediateDumpKey key, const void* value, size_t value_length); + //! \return `true` if able to write \a data up to \a size. The \a data might + //! not be written to fd_ until `buffer_` is full or the writer is + //! closed. All writes will be 4096 bytes (the size of your kBufferSize) + //! except for the final flush, which might be partial. + bool BufferedWrite(const void* data, size_t size); + + //! \return `true` if able to write `buffer_` up to `buffer_occupied_`. + bool FlushWriteBuffer(); + + //! \brief The maximum size of the write buffer. + static constexpr size_t kBufferSize = 4096; + + //! \brief The write data buffer and amount of that buffer occupied with data + //! to be written. + char buffer_[kBufferSize]; + size_t buffer_occupied_; + int fd_; };
diff --git a/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_writer_test.cc b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_writer_test.cc index 5e70899..0b56ed9e 100644 --- a/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_writer_test.cc +++ b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_writer_test.cc
@@ -74,6 +74,8 @@ Key::kThreads); IOSIntermediateDumpWriter::ScopedArrayMap threadMap(writer_.get()); } + EXPECT_TRUE(writer_->Close()); + std::string contents; ASSERT_TRUE(LoggingReadEntireFile(path(), &contents)); std::string result("\6\x3p\x17\1\2\4\a", 8); @@ -87,6 +89,7 @@ IOSIntermediateDumpWriter::ScopedMap map(writer_.get(), Key::kMachException); } + EXPECT_TRUE(writer_->Close()); std::string contents; ASSERT_TRUE(LoggingReadEntireFile(path(), &contents)); @@ -97,6 +100,7 @@ TEST_F(IOSIntermediateDumpWriterTest, Property) { EXPECT_TRUE(writer_->Open(path())); EXPECT_TRUE(writer_->AddProperty(Key::kVersion, "version", 7)); + EXPECT_TRUE(writer_->Close()); std::string contents; ASSERT_TRUE(LoggingReadEntireFile(path(), &contents)); @@ -107,6 +111,7 @@ TEST_F(IOSIntermediateDumpWriterTest, PropertyString) { EXPECT_TRUE(writer_->Open(path())); EXPECT_TRUE(writer_->AddPropertyCString(Key::kVersion, 64, "version")); + EXPECT_TRUE(writer_->Close()); std::string contents; ASSERT_TRUE(LoggingReadEntireFile(path(), &contents)); @@ -152,6 +157,7 @@ EXPECT_TRUE(writer_->Open(path())); EXPECT_TRUE( writer_->AddPropertyCString(Key::kVersion, 64, region + page_size - 5)); + EXPECT_TRUE(writer_->Close()); std::string contents; ASSERT_TRUE(LoggingReadEntireFile(path(), &contents)); std::string result("\x5\x1\0\xF\0\0\0\0\0\0\0AAAAABBBBBBBBBB", 26); @@ -171,6 +177,7 @@ EXPECT_TRUE(writer_->Open(path())); EXPECT_TRUE( writer_->AddPropertyCString(Key::kVersion, 64, region + page_size - 20)); + EXPECT_TRUE(writer_->Close()); ASSERT_TRUE(LoggingReadEntireFile(path(), &contents)); result.assign("\x5\x1\0\n\0\0\0\0\0\0\0AAAAAAAAAA", 21); ASSERT_EQ(contents, result); @@ -179,14 +186,7 @@ TEST_F(IOSIntermediateDumpWriterTest, BadProperty) { EXPECT_TRUE(writer_->Open(path())); ASSERT_FALSE(writer_->AddProperty(Key::kVersion, "version", -1)); - - std::string contents; - ASSERT_TRUE(LoggingReadEntireFile(path(), &contents)); - - // path() is now invalid, as type, key and value were written, but the - // value itself is not. - std::string results("\5\1\0\xff\xff\xff\xff\xff\xff\xff\xff", 11); - ASSERT_EQ(contents, results); + EXPECT_TRUE(writer_->Close()); } } // namespace
diff --git a/third_party/lottie/lottie_worker.js b/third_party/lottie/lottie_worker.js index 2d934b5..adb3ff47 100644 --- a/third_party/lottie/lottie_worker.js +++ b/third_party/lottie/lottie_worker.js
@@ -8603,225 +8603,6 @@ } initTime = nowTime; if(playingAnimationsNum && !_isFrozen) { - window.requestAnimationFrame(resume); - } else { - _stopped = true; - } - } - - function first(nowTime){ - initTime = nowTime; - window.requestAnimationFrame(resume); - } - - function pause(animation) { - var i; - for(i=0;i<len;i+=1){ - registeredAnimations[i].animation.pause(animation); - } - } - - function goToAndStop(value,isFrame,animation) { - var i; - for(i=0;i<len;i+=1){ - registeredAnimations[i].animation.goToAndStop(value,isFrame,animation); - } - } - - function stop(animation) { - var i; - for(i=0;i<len;i+=1){ - registeredAnimations[i].animation.stop(animation); - } - } - - function togglePause(animation) { - var i; - for(i=0;i<len;i+=1){ - registeredAnimations[i].animation.togglePause(animation); - } - } - - function destroy(animation) { - var i; - for(i=(len-1);i>=0;i-=1){ - registeredAnimations[i].animation.destroy(animation); - } - } - - function searchAnimations(animationData, standalone, renderer){ - var animElements = [].concat([].slice.call(document.getElementsByClassName('lottie')), - [].slice.call(document.getElementsByClassName('bodymovin'))); - var i, len = animElements.length; - for(i=0;i<len;i+=1){ - if(renderer){ - animElements[i].setAttribute('data-bm-type',renderer); - } - registerAnimation(animElements[i], animationData); - } - if(standalone && len === 0){ - if(!renderer){ - renderer = 'svg'; - } - var body = document.getElementsByTagName('body')[0]; - body.innerHTML = ''; - var div = createTag('div'); - div.style.width = '100%'; - div.style.height = '100%'; - div.setAttribute('data-bm-type',renderer); - body.appendChild(div); - registerAnimation(div, animationData); - } - } - - function resize(){ - var i; - for(i=0;i<len;i+=1){ - registeredAnimations[i].animation.resize(); - } - } - - function activate(){ - if(!_isFrozen && playingAnimationsNum){ - if(_stopped) { - window.requestAnimationFrame(first); - _stopped = false; - } - } - } - - function freeze() { - _isFrozen = true; - } - - function unfreeze() { - _isFrozen = false; - activate(); - } - - moduleOb.registerAnimation = registerAnimation; - moduleOb.loadAnimation = loadAnimation; - moduleOb.setSpeed = setSpeed; - moduleOb.setDirection = setDirection; - moduleOb.play = play; - moduleOb.pause = pause; - moduleOb.stop = stop; - moduleOb.togglePause = togglePause; - moduleOb.searchAnimations = searchAnimations; - moduleOb.resize = resize; - //moduleOb.start = start; - moduleOb.goToAndStop = goToAndStop; - moduleOb.destroy = destroy; - moduleOb.freeze = freeze; - moduleOb.unfreeze = unfreeze; - moduleOb.getRegisteredAnimations = getRegisteredAnimations; - return moduleOb; -}()); - -animationManager = (function(){ - var moduleOb = {}; - var registeredAnimations = []; - var initTime = 0; - var len = 0; - var playingAnimationsNum = 0; - var _stopped = true; - var _isFrozen = false; - - function removeElement(ev){ - var i = 0; - var animItem = ev.target; - while(i<len) { - if (registeredAnimations[i].animation === animItem) { - registeredAnimations.splice(i, 1); - i -= 1; - len -= 1; - if(!animItem.isPaused){ - subtractPlayingCount(); - } - } - i += 1; - } - } - - function registerAnimation(element, animationData){ - if(!element){ - return null; - } - var i=0; - while(i<len){ - if(registeredAnimations[i].elem == element && registeredAnimations[i].elem !== null ){ - return registeredAnimations[i].animation; - } - i+=1; - } - var animItem = new AnimationItem(); - setupAnimation(animItem, element); - animItem.setData(element, animationData); - return animItem; - } - - function getRegisteredAnimations() { - var i, len = registeredAnimations.length; - var animations = []; - for(i = 0; i < len; i += 1) { - animations.push(registeredAnimations[i].animation); - } - return animations; - } - - function addPlayingCount(){ - playingAnimationsNum += 1; - activate(); - } - - function subtractPlayingCount(){ - playingAnimationsNum -= 1; - } - - function setupAnimation(animItem, element){ - animItem.addEventListener('destroy',removeElement); - animItem.addEventListener('_active',addPlayingCount); - animItem.addEventListener('_idle',subtractPlayingCount); - registeredAnimations.push({elem: element,animation:animItem}); - len += 1; - } - - function loadAnimation(params){ - var animItem = new AnimationItem(); - setupAnimation(animItem, null); - animItem.setParams(params); - return animItem; - } - - - function setSpeed(val,animation){ - var i; - for(i=0;i<len;i+=1){ - registeredAnimations[i].animation.setSpeed(val, animation); - } - } - - function setDirection(val, animation){ - var i; - for(i=0;i<len;i+=1){ - registeredAnimations[i].animation.setDirection(val, animation); - } - } - - function play(animation){ - var i; - for(i=0;i<len;i+=1){ - registeredAnimations[i].animation.play(animation); - } - } - function resume(nowTime) { - var elapsedTime = nowTime - initTime; - var i; - for(i=0;i<len;i+=1){ - registeredAnimations[i].animation.advanceTime(elapsedTime); - } - initTime = nowTime; - if(playingAnimationsNum && !_isFrozen) { requestAnimationFrame(resume); } else { _stopped = true;
diff --git a/third_party/webrtc_overrides/rtc_base/logging.cc b/third_party/webrtc_overrides/rtc_base/logging.cc index 06a6498..87ae618 100644 --- a/third_party/webrtc_overrides/rtc_base/logging.cc +++ b/third_party/webrtc_overrides/rtc_base/logging.cc
@@ -47,13 +47,6 @@ LAZY_STREAM(logging::LogMessage(file_name, line_number, sev).stream(), \ WEBRTC_ENABLE_LOGGING) -namespace blink { - -const base::Feature kSuppressAllWebRtcLogs{"SuppressAllWebRtcLogs", - base::FEATURE_DISABLED_BY_DEFAULT}; - -} // namespace blink - namespace rtc { void (*g_logging_delegate_function)(const std::string&) = NULL; @@ -174,10 +167,6 @@ log_to_chrome_(CheckVlogIsOnHelper(severity, file, strlen(file) + 1)) {} DiagnosticLogMessage::~DiagnosticLogMessage() { - // Suppress RTC_LOG which are forwarded both to Chrome logs and WebRTC logs. - if (base::FeatureList::IsEnabled(blink::kSuppressAllWebRtcLogs)) - return; - const bool call_delegate = g_logging_delegate_function && severity_ <= LS_INFO;
diff --git a/third_party/webrtc_overrides/rtc_base/logging.h b/third_party/webrtc_overrides/rtc_base/logging.h index 23bbf2e5..ace4436b 100644 --- a/third_party/webrtc_overrides/rtc_base/logging.h +++ b/third_party/webrtc_overrides/rtc_base/logging.h
@@ -28,7 +28,6 @@ #include <string> #include <type_traits> -#include "base/feature_list.h" #include "third_party/webrtc_overrides/rtc_base/diagnostic_logging.h" ////////////////////////////////////////////////////////////////////// @@ -40,12 +39,6 @@ #include <errno.h> -namespace blink { - -RTC_EXPORT extern const base::Feature kSuppressAllWebRtcLogs; - -} // namespace blink - namespace rtc { // Note that |N| is the size *with* the null terminator.
diff --git a/tools/android/avd/3pp/fetch.py b/tools/android/avd/3pp/fetch.py index 1029829..1ba8baa 100755 --- a/tools/android/avd/3pp/fetch.py +++ b/tools/android/avd/3pp/fetch.py
@@ -30,7 +30,6 @@ # The src-relative files and dirs we would like to include in the CIPD. _BASE_DEPS = [ # vpython, binaries and avd configs used by //tools/android/avd/avd.py - '.vpython', '.vpython3', 'third_party/android_sdk/public/cmdline-tools/', 'third_party/android_sdk/public/platform-tools/',
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 685fc2d..ef2498d 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -6003,6 +6003,7 @@ <int value="20" label="FOOD_ORDERING_DELIVERY"/> <int value="22" label="UNLAUNCHED_VERTICAL_1"/> <int value="25" label="FIND_COUPONS"/> + <int value="32" label="CHROME_FAST_CHECKOUT"/> </enum> <enum name="AutofillAssistantJsFlowStartedEvent"> @@ -78513,6 +78514,8 @@ <int value="33" label="kEmbedderTriggeredAndSameOriginRedirected"/> <int value="34" label="kEmbedderTriggeredAndCrossOriginRedirected"/> <int value="35" label="kEmbedderTriggeredAndDestroyed"/> + <int value="36" label="kMemoryLimitExceeded"/> + <int value="37" label="kFailToGetMemoryUsage"/> </enum> <enum name="PrerenderHoverEvent"> @@ -89122,6 +89125,11 @@ <int value="2" label="Dismissed"/> </enum> +<enum name="SimPinLockType"> + <int value="0" label="PIN Locked"/> + <int value="1" label="PUK Locked"/> +</enum> + <enum name="SimPinOperationResult"> <int value="0" label="Success"/> <int value="1" label="Error Device Missing"/>
diff --git a/tools/metrics/histograms/metadata/enterprise/histograms.xml b/tools/metrics/histograms/metadata/enterprise/histograms.xml index 88a5c30..4fdddfa3 100644 --- a/tools/metrics/histograms/metadata/enterprise/histograms.xml +++ b/tools/metrics/histograms/metadata/enterprise/histograms.xml
@@ -1422,6 +1422,33 @@ </summary> </histogram> +<histogram name="Enterprise.EnrollmentRollbackAttestation" + enum="EnterpriseEnrollmentType" expires_after="2023-07-14"> + <owner>crisguerrero@google.com</owner> + <owner>mpolzer@google.com</owner> + <owner>chromeos-commercial-remote-management@google.com</owner> + <summary> + Events related to attestation based re-enrollment after enterprise rollback. + + Events are recorded during enrollment after rollback and types are listed in + the MetricEnrollment enum. + </summary> +</histogram> + +<histogram name="Enterprise.EnrollmentRollbackManualFallback" + enum="EnterpriseEnrollmentType" expires_after="2023-07-14"> + <owner>crisguerrero@google.com</owner> + <owner>mpolzer@google.com</owner> + <owner>chromeos-commercial-remote-management@google.com</owner> + <summary> + Events related to manual re-enrollment after enterprise rollback. This is + used when attestation based enrollment fails. + + Events are recorded during enrollment after rollback and types are listed in + the MetricEnrollment enum. + </summary> +</histogram> + <histogram name="Enterprise.EnrollmentTime.Cancel" units="ms" expires_after="2023-02-01"> <owner>raleksandrov@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/net/histograms.xml b/tools/metrics/histograms/metadata/net/histograms.xml index c5ce158..5eb8208 100644 --- a/tools/metrics/histograms/metadata/net/histograms.xml +++ b/tools/metrics/histograms/metadata/net/histograms.xml
@@ -439,9 +439,9 @@ </histogram> <histogram name="Net.Cors.AccessCheckResult" enum="CorsAccessCheckResult" - expires_after="2022-09-18"> + expires_after="2023-01-15"> <owner>toyoshim@chromium.org</owner> - <owner>yhirano@chromium.org</owner> + <owner>src/services/network/OWNERS</owner> <summary> The distribution of CORS access check results. This reports whenever CORS AccessCheck runs. This is recorded when a CORS enabled request receives a @@ -450,9 +450,10 @@ </histogram> <histogram name="Net.Cors.AccessCheckResult.NotSecureRequestor" - enum="CorsAccessCheckResult" expires_after="2022-11-27"> + enum="CorsAccessCheckResult" expires_after="2023-01-15"> <owner>carlosil@chromium.org</owner> <owner>estark@chromium.org</owner> + <owner>src/services/network/OWNERS</owner> <summary> The distribution of CORS access check results for not potentially trustworthy requestors. This reports whenever CORS AccessCheck runs and the @@ -461,9 +462,9 @@ </histogram> <histogram name="Net.Cors.PreflightCacheKeySize" units="bytes" - expires_after="2022-07-03"> + expires_after="2023-01-15"> <owner>toyoshim@chromium.org</owner> - <owner>yhirano@chromium.org</owner> + <owner>src/services/network/OWNERS</owner> <summary> The distribution of the key size in the CORS preflight cache. This counts each key size when a new entry is added to the cache. @@ -471,9 +472,9 @@ </histogram> <histogram name="Net.Cors.PreflightCacheResult" enum="CorsPreflightCacheResult" - expires_after="2022-08-28"> + expires_after="2023-01-15"> <owner>toyoshim@chromium.org</owner> - <owner>yhirano@chromium.org</owner> + <owner>src/services/network/OWNERS</owner> <summary> The distribution of the CORS preflight cache query results. This counts on each cache query. @@ -483,7 +484,7 @@ <histogram name="Net.Cors.PreflightCheckError2" enum="CorsAccessCheckError" expires_after="2023-01-15"> <owner>toyoshim@chromium.org</owner> - <owner>yhirano@chromium.org</owner> + <owner>src/services/network/OWNERS</owner> <summary> The distribution of CORS error types on preflight requests. This reports whenever CORS checks detect an error on a preflight request. The @@ -493,9 +494,10 @@ </histogram> <histogram name="Net.Cors.PreflightCheckWarning" enum="CorsAccessCheckError" - expires_after="2022-12-25"> + expires_after="2023-01-15"> <owner>titouan@chromium.org</owner> <owner>clamy@chromium.org</owner> + <owner>src/services/network/OWNERS</owner> <summary> The distribution of CORS error types on preflight requests which are treated as warnings. This reports whenever CORS checks detect an error on a
diff --git a/tools/metrics/histograms/metadata/network/histograms.xml b/tools/metrics/histograms/metadata/network/histograms.xml index 1cf9f53..4724f0a5 100644 --- a/tools/metrics/histograms/metadata/network/histograms.xml +++ b/tools/metrics/histograms/metadata/network/histograms.xml
@@ -71,6 +71,17 @@ </summary> </histogram> +<histogram name="Network.Ash.Cellular.SimLock.Policy.Notification.LockType" + enum="SimPinLockType" expires_after="2022-12-31"> + <owner>hsuregan@chromium.org</owner> + <owner>nikhilcn@chromium.org</owner> + <owner>cros-connectivity@google.com</owner> + <summary> + Records the type of SIM lock affecting a cellular network when a user is + notified that the cellular network is SIM locked. + </summary> +</histogram> + <histogram name="Network.Ash.VPN.{VPNProviderType}.ConfigurationSource" enum="VPNConfigurationSource" expires_after="2022-12-31"> <owner>chadduffin@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/page/histograms.xml b/tools/metrics/histograms/metadata/page/histograms.xml index 27e2a3b..5b17481 100644 --- a/tools/metrics/histograms/metadata/page/histograms.xml +++ b/tools/metrics/histograms/metadata/page/histograms.xml
@@ -2224,7 +2224,7 @@ </histogram> <histogram name="PageLoad.Internal.PageType" enum="PageLoadTrackerPageType" - expires_after="2022-09-01"> + expires_after="2022-12-01"> <owner>toyoshim@chromium.org</owner> <owner>mparch-dev@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/password/histograms.xml b/tools/metrics/histograms/metadata/password/histograms.xml index 56f5184..f3a343ab 100644 --- a/tools/metrics/histograms/metadata/password/histograms.xml +++ b/tools/metrics/histograms/metadata/password/histograms.xml
@@ -1492,6 +1492,16 @@ </summary> </histogram> +<histogram name="PasswordManager.FillingSuccessIOS" enum="BooleanSuccess" + expires_after="M111"> + <owner>theocristea@google.com</owner> + <owner>kazinova@google.com</owner> + <owner>vsemeniuk@google.com</owner> + <summary> + This metric records whether filling was successful or not on IOS. + </summary> +</histogram> + <histogram name="PasswordManager.FillSuggestionsIncludeAndroidAppCredentials" enum="PasswordManagerOfferedAndroidCredentials" expires_after="2022-09-18"> <owner>kazinova@google.com</owner> @@ -1905,8 +1915,8 @@ </histogram> <histogram name="PasswordManager.ModalLoadingDialog.{IntentType}.Outcome" - enum="PasswordManager.LoadingDialogOutcome" expires_after="M106"> - <owner>maxan@chromium.org</owner> + enum="PasswordManager.LoadingDialogOutcome" expires_after="M110"> + <owner>maxan@google.com</owner> <owner>fhorschig@chromium.org</owner> <summary> Records the outcome of the GMS Core UI loading dialog shown when the user @@ -2014,7 +2024,7 @@ </histogram> <histogram name="PasswordManager.PasswordCheckup.{Operation}.APIError" - enum="PasswordStoreAndroidBackendAPIError" expires_after="M108"> + enum="PasswordStoreAndroidBackendAPIError" expires_after="M110"> <owner>ioanap@chromium.org</owner> <owner>maxan@google.com</owner> <summary> @@ -2027,7 +2037,7 @@ </histogram> <histogram name="PasswordManager.PasswordCheckup.{Operation}.Error" - enum="CredentialManagerError" expires_after="M108"> + enum="CredentialManagerError" expires_after="M110"> <owner>ioanap@chromium.org</owner> <owner>maxan@google.com</owner> <owner>vsemeniuk@google.com</owner> @@ -2042,7 +2052,7 @@ </histogram> <histogram name="PasswordManager.PasswordCheckup.{Operation}.ErrorLatency" - units="ms" expires_after="M108"> + units="ms" expires_after="M110"> <owner>ioanap@chromium.org</owner> <owner>vsemeniuk@google.com</owner> <owner>maxan@google.com</owner> @@ -2057,7 +2067,7 @@ </histogram> <histogram name="PasswordManager.PasswordCheckup.{Operation}.Latency" - units="ms" expires_after="M108"> + units="ms" expires_after="M110"> <owner>ioanap@chromium.org</owner> <owner>vsemeniuk@google.com</owner> <owner>maxan@google.com</owner> @@ -2071,7 +2081,7 @@ </histogram> <histogram name="PasswordManager.PasswordCheckup.{Operation}.Success" - enum="BooleanSuccess" expires_after="M108"> + enum="BooleanSuccess" expires_after="M110"> <owner>ioanap@chromium.org</owner> <owner>vsemeniuk@google.com</owner> <owner>maxan@google.com</owner> @@ -2217,7 +2227,7 @@ <histogram name="PasswordManager.PasswordSettings.{Function}.{Setting}.APIError1" - enum="PasswordStoreAndroidBackendAPIError" expires_after="M108"> + enum="PasswordStoreAndroidBackendAPIError" expires_after="M110"> <owner>maxan@google.com</owner> <owner>ioanap@chromium.org</owner> <summary> @@ -2235,7 +2245,7 @@ <histogram name="PasswordManager.PasswordSettings.{Function}.{Setting}.ErrorCode" - enum="PasswordStoreAndroidBackendError" expires_after="M108"> + enum="PasswordStoreAndroidBackendError" expires_after="M110"> <owner>maxan@google.com</owner> <owner>ioanap@chromium.org</owner> <summary> @@ -2250,7 +2260,7 @@ <histogram name="PasswordManager.PasswordSettings.{Function}.{Setting}.ErrorLatency" - units="ms" expires_after="M108"> + units="ms" expires_after="M110"> <owner>maxan@google.com</owner> <owner>ioanap@chromium.org</owner> <summary> @@ -2263,7 +2273,7 @@ </histogram> <histogram name="PasswordManager.PasswordSettings.{Function}.{Setting}.Latency" - units="ms" expires_after="M108"> + units="ms" expires_after="M110"> <owner>maxan@google.com</owner> <owner>ioanap@chromium.org</owner> <summary> @@ -2276,7 +2286,7 @@ </histogram> <histogram name="PasswordManager.PasswordSettings.{Function}.{Setting}.Success" - enum="BooleanSuccess" expires_after="M108"> + enum="BooleanSuccess" expires_after="M110"> <owner>maxan@google.com</owner> <owner>ioanap@chromium.org</owner> <summary> @@ -2330,7 +2340,7 @@ <histogram name="PasswordManager.PasswordStoreAndroidBackend.APIError.{SyncErrorStatus}" - enum="PasswordStoreAndroidBackendAPIError" expires_after="M108"> + enum="PasswordStoreAndroidBackendAPIError" expires_after="M110"> <owner>vsemeniuk@chromium.org</owner> <owner>vasilii@chromium.org</owner> <summary> @@ -2347,7 +2357,7 @@ <histogram name="PasswordManager.PasswordStoreAndroidBackend.ClearAllLocalPasswords.LoginsToRemove" - units="count" expires_after="M108"> + units="count" expires_after="M110"> <owner>fhorschig@chromium.org</owner> <owner>vsemeniuk@google.com</owner> <summary> @@ -2357,7 +2367,7 @@ <histogram name="PasswordManager.PasswordStoreAndroidBackend.ClearAllLocalPasswords.SuccessRate" - units="%" expires_after="M108"> + units="%" expires_after="M110"> <owner>fhorschig@chromium.org</owner> <owner>vsemeniuk@google.com</owner> <summary> @@ -2370,7 +2380,7 @@ <histogram name="PasswordManager.PasswordStoreAndroidBackend{Function}{UnenrollmentFromUPM}.APIError" - enum="PasswordStoreAndroidBackendAPIError" expires_after="M108"> + enum="PasswordStoreAndroidBackendAPIError" expires_after="M110"> <owner>fhorschig@chromium.org</owner> <owner>vasilii@chromium.org</owner> <summary> @@ -2397,7 +2407,7 @@ <histogram name="PasswordManager.PasswordStoreAndroidBackend{Function}{UnenrollmentFromUPM}.ErrorCode" - enum="PasswordStoreAndroidBackendError" expires_after="M108"> + enum="PasswordStoreAndroidBackendError" expires_after="M110"> <owner>fhorschig@chromium.org</owner> <owner>vasilii@chromium.org</owner> <summary> @@ -2437,7 +2447,7 @@ <histogram name="PasswordManager.PasswordStoreProxyBackend.{Function}.{Metric}.{Measurement}" - units="count" expires_after="M108"> + units="count" expires_after="M110"> <owner>fhorschig@chromium.org</owner> <owner>vasilii@chromium.org</owner> <summary> @@ -2474,7 +2484,7 @@ <histogram name="PasswordManager.PasswordStoreProxyBackend.{ModifyingFunction}.{Metric}.{Measurement}" - units="count" expires_after="M108"> + units="count" expires_after="M110"> <owner>fhorschig@chromium.org</owner> <owner>vasilii@chromium.org</owner> <summary> @@ -2513,7 +2523,7 @@ </histogram> <histogram name="PasswordManager.PasswordStore{Backend}{Function}" - enum="PasswordStoreAndroidBackendRequestStatus" expires_after="M108"> + enum="PasswordStoreAndroidBackendRequestStatus" expires_after="M110"> <owner>fhorschig@chromium.org</owner> <owner>vasilii@chromium.org</owner> <summary> @@ -2548,7 +2558,7 @@ </histogram> <histogram name="PasswordManager.PasswordStore{Backend}{Function}.Latency" - units="ms" expires_after="M108"> + units="ms" expires_after="M110"> <owner>fhorschig@chromium.org</owner> <owner>vasilii@chromium.org</owner> <summary> @@ -2584,7 +2594,7 @@ <histogram name="PasswordManager.PasswordStore{Backend}{Function}{UnenrollmentFromUPM}.Success" - enum="BooleanSuccess" expires_after="M108"> + enum="BooleanSuccess" expires_after="M110"> <owner>fhorschig@chromium.org</owner> <owner>vasilii@chromium.org</owner> <summary>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index 454cb9f..f6e9e6a 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -21,8 +21,8 @@ "full_remote_path": "perfetto-luci-artifacts/v25.0/mac-arm64/trace_processor_shell" }, "linux": { - "hash": "5faecc89babc29a2f6475a37cb422d19854364b8", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/c9aa8a4ab3b84294b6a08705d07aa7b7c200b049/trace_processor_shell" + "hash": "e5fb41a71c96e4800a9c0dc7d8647b9dc56629fe", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/e8137e2b16874eec8cb0750baa58d4b429dde319/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/tools/typescript/definitions/passwords_private.d.ts b/tools/typescript/definitions/passwords_private.d.ts index eeebfe7..c1230fc 100644 --- a/tools/typescript/definitions/passwords_private.d.ts +++ b/tools/typescript/definitions/passwords_private.d.ts
@@ -78,7 +78,7 @@ } export interface UrlCollection { - origin: string; + signonRealm: string; shown: string; link: string; } @@ -86,11 +86,12 @@ export interface PasswordUiEntry { urls: UrlCollection; username: string; + password?: string; federationText?: string; id: number; storedIn: PasswordStoreSet; isAndroidCredential: boolean; - passwordNote: string; + note: string; } export interface ExceptionEntry { @@ -112,12 +113,10 @@ export interface InsecureCredential { id: number; - formattedOrigin: string; - detailedOrigin: string; + urls: UrlCollection; isAndroidCredential: boolean; changePasswordUrl?: string; hasStartableScript: boolean; - signonRealm: string; username: string; password?: string; compromisedInfo?: CompromisedInfo;
diff --git a/ui/base/ime/ash/input_method_ash.cc b/ui/base/ime/ash/input_method_ash.cc index 6f197d2..7ff2aa0a 100644 --- a/ui/base/ime/ash/input_method_ash.cc +++ b/ui/base/ime/ash/input_method_ash.cc
@@ -997,4 +997,28 @@ return this; } +std::vector<gfx::Rect> InputMethodAsh::GetCompositionBounds( + const TextInputClient* client) { + std::vector<gfx::Rect> bounds; + if (client->HasCompositionText()) { + uint32_t i = 0; + gfx::Rect rect; + while (client->GetCompositionCharacterBounds(i++, &rect)) + bounds.push_back(rect); + } else { + // For case of no composition at present, use caret bounds which is required + // by the IME extension for certain features (e.g. physical keyboard + // auto-correct). + bounds.push_back(client->GetCaretBounds()); + } + return bounds; +} + +bool InputMethodAsh::SendFakeProcessKeyEvent(bool pressed) const { + KeyEvent evt(pressed ? ET_KEY_PRESSED : ET_KEY_RELEASED, + pressed ? VKEY_PROCESSKEY : VKEY_UNKNOWN, EF_IME_FABRICATED_KEY); + std::ignore = DispatchKeyEventPostIME(&evt); + return evt.stopped_propagation(); +} + } // namespace ui
diff --git a/ui/base/ime/ash/input_method_ash.h b/ui/base/ime/ash/input_method_ash.h index 675b6582..9f20178 100644 --- a/ui/base/ime/ash/input_method_ash.h +++ b/ui/base/ime/ash/input_method_ash.h
@@ -178,6 +178,13 @@ // Gets the reason how the focused text input client was focused. TextInputClient::FocusReason GetClientFocusReason() const; + // Gets the bounds of the composition text or cursor in |client|. + std::vector<gfx::Rect> GetCompositionBounds(const TextInputClient* client); + + // Sends a fake key event for IME composing without physical key events. + // Returns true if the faked key event is stopped propagation. + bool SendFakeProcessKeyEvent(bool pressed) const; + // Pending composition text generated by the current pending key event. // It'll be sent to the focused text input client as soon as we receive the // processing result of the pending key event.
diff --git a/ui/base/ime/input_method_base.cc b/ui/base/ime/input_method_base.cc index 6941c4d3..e5fe30c 100644 --- a/ui/base/ime/input_method_base.cc +++ b/ui/base/ime/input_method_base.cc
@@ -171,28 +171,4 @@ text_input_client_->EnsureCaretNotInRect(keyboard_bounds_); } -std::vector<gfx::Rect> InputMethodBase::GetCompositionBounds( - const TextInputClient* client) { - std::vector<gfx::Rect> bounds; - if (client->HasCompositionText()) { - uint32_t i = 0; - gfx::Rect rect; - while (client->GetCompositionCharacterBounds(i++, &rect)) - bounds.push_back(rect); - } else { - // For case of no composition at present, use caret bounds which is required - // by the IME extension for certain features (e.g. physical keyboard - // auto-correct). - bounds.push_back(client->GetCaretBounds()); - } - return bounds; -} - -bool InputMethodBase::SendFakeProcessKeyEvent(bool pressed) const { - KeyEvent evt(pressed ? ET_KEY_PRESSED : ET_KEY_RELEASED, - pressed ? VKEY_PROCESSKEY : VKEY_UNKNOWN, EF_IME_FABRICATED_KEY); - std::ignore = DispatchKeyEventPostIME(&evt); - return evt.stopped_propagation(); -} - } // namespace ui
diff --git a/ui/base/ime/input_method_base.h b/ui/base/ime/input_method_base.h index 65aa5624..115cdc002 100644 --- a/ui/base/ime/input_method_base.h +++ b/ui/base/ime/input_method_base.h
@@ -79,10 +79,6 @@ virtual void OnDidChangeFocusedClient(TextInputClient* focused_before, TextInputClient* focused) {} - // Sends a fake key event for IME composing without physical key events. - // Returns true if the faked key event is stopped propagation. - bool SendFakeProcessKeyEvent(bool pressed) const; - // Returns true if |client| is currently focused. bool IsTextInputClientFocused(const TextInputClient* client); @@ -106,9 +102,6 @@ // |client| which is the text input client with focus. void NotifyTextInputCaretBoundsChanged(const TextInputClient* client); - // Gets the bounds of the composition text or cursor in |client|. - std::vector<gfx::Rect> GetCompositionBounds(const TextInputClient* client); - ImeKeyEventDispatcher* ime_key_event_dispatcher() { return ime_key_event_dispatcher_; }
diff --git a/ui/chromeos/translations/ui_chromeos_strings_nl.xtb b/ui/chromeos/translations/ui_chromeos_strings_nl.xtb index 2c9dc22b..28fda2ed 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_nl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_nl.xtb
@@ -685,7 +685,7 @@ <translation id="6876155724392614295">Fiets</translation> <translation id="6878261347041253038">Devanagari toetsenbord (fonetisch)</translation> <translation id="6885780034956018177">Slak</translation> -<translation id="6896758677409633944">Kopieer</translation> +<translation id="6896758677409633944">Kopiëren</translation> <translation id="6898028766943174120">Meer submappen…</translation> <translation id="6915678159055240887">Chromebox</translation> <translation id="6918340160281024199">Amerikaans Workman</translation>
diff --git a/ui/file_manager/file_manager/background/js/BUILD.gn b/ui/file_manager/file_manager/background/js/BUILD.gn index e5ce0219..cae7dd7e 100644 --- a/ui/file_manager/file_manager/background/js/BUILD.gn +++ b/ui/file_manager/file_manager/background/js/BUILD.gn
@@ -341,6 +341,7 @@ js_library("file_operation_handler") { deps = [ + "//ui/file_manager/file_manager/common/js:api", "//ui/file_manager/file_manager/common/js:file_operation_common", "//ui/file_manager/file_manager/common/js:progress_center_common", "//ui/file_manager/file_manager/common/js:util",
diff --git a/ui/file_manager/file_manager/background/js/file_operation_handler.js b/ui/file_manager/file_manager/background/js/file_operation_handler.js index 3b3493e0..5b9812c 100644 --- a/ui/file_manager/file_manager/background/js/file_operation_handler.js +++ b/ui/file_manager/file_manager/background/js/file_operation_handler.js
@@ -4,6 +4,7 @@ import {assert} from 'chrome://resources/js/assert.m.js'; +import {startIOTask} from '../../common/js/api.js'; import {FileOperationProgressEvent} from '../../common/js/file_operation_common.js'; import {ProgressCenterItem, ProgressItemState, ProgressItemType} from '../../common/js/progress_center_common.js'; import {str, strf, util} from '../../common/js/util.js'; @@ -34,6 +35,13 @@ this.progressCenter_ = progressCenter; /** + * Toast element to emit notifications. + * @type {Object|null} + * @private + */ + this.toast_ = null; + + /** * Pending items of delete operation. * * Delete operations are usually complete quickly. @@ -62,10 +70,18 @@ * @private */ async onIOTaskProgressStatus_(event) { - // The trash event will return progress, but this will be handled by a toast - // which shows an Undo button instead. Ignore the trash event here. if (event.type === chrome.fileManagerPrivate.IOTaskType.TRASH) { - return; + if (event.state === chrome.fileManagerPrivate.IOTaskState.SUCCESS) { + this.showRestoreTrashToast_(event); + return; + } + // Trash operations occur intra filesystem and so to avoid a flash on the + // UI with progress then the undo toast, do not show any visual signals + // for anything other than an error, cancelled and success. + if (event.state === chrome.fileManagerPrivate.IOTaskState.QUEUED || + event.state === chrome.fileManagerPrivate.IOTaskState.IN_PROGRESS) { + return; + } } const taskId = String(event.taskId); @@ -133,6 +149,43 @@ this.progressCenter_.updateItem(item); } + get toast() { + if (!this.toast_) { + // The background page does not contain the requisite types to include the + // FilesToast type without type checking the Polymer element. + this.toast_ = /** @type {!Object} */ (document.getElementById('toast')); + } + + return this.toast_; + } + + /** + * On a successful trash operation, show a toast notification on Files app + * with an undo action to restore the files that were just trashed. + * @param {!chrome.fileManagerPrivate.ProgressStatus} event + * @private + */ + showRestoreTrashToast_(event) { + if (event.type !== chrome.fileManagerPrivate.IOTaskType.TRASH || + event.state !== chrome.fileManagerPrivate.IOTaskState.SUCCESS) { + return; + } + + const message = (event.itemCount === 1) ? + strf('UNDO_DELETE_ONE', event.sourceName) : + strf('UNDO_DELETE_SOME', event.itemCount); + const infoEntries = + event.outputs.filter(o => o.name.endsWith('.trashinfo')); + this.toast.show(message, { + text: str('UNDO_DELETE_ACTION_LABEL'), + callback: () => { + startIOTask( + chrome.fileManagerPrivate.IOTaskType.RESTORE, infoEntries, + /*params=*/ {}); + }, + }); + } + /** * Handles the copy-progress event. * @param {Event} event The copy-progress event. @@ -455,6 +508,8 @@ return ProgressItemType.MOVE; case chrome.fileManagerPrivate.IOTaskType.RESTORE: return ProgressItemType.RESTORE; + case chrome.fileManagerPrivate.IOTaskType.TRASH: + return ProgressItemType.TRASH; case chrome.fileManagerPrivate.IOTaskType.ZIP: return ProgressItemType.ZIP; default: @@ -487,8 +542,8 @@ return strf('ZIP_FILESYSTEM_ERROR', detail); case chrome.fileManagerPrivate.IOTaskType.DELETE: return str('DELETE_ERROR'); - // case chrome.fileManagerPrivate.IOTaskType.RESTORE: - // return str('RESTORE_FROM_TRASH_ERROR'); + case chrome.fileManagerPrivate.IOTaskType.RESTORE: + return str('RESTORE_FROM_TRASH_ERROR'); default: console.warn( `Unexpected operation type: ${event.status.operationType}`);
diff --git a/ui/file_manager/file_manager/common/js/progress_center_common.js b/ui/file_manager/file_manager/common/js/progress_center_common.js index 43aad3c..c56ffdf 100644 --- a/ui/file_manager/file_manager/common/js/progress_center_common.js +++ b/ui/file_manager/file_manager/common/js/progress_center_common.js
@@ -38,6 +38,8 @@ // The item is general file transfer operation. // This is used for the mixed operation of summarized item. TRANSFER: 'transfer', + // The item is being trashed. + TRASH: 'trash', // The item is external drive format operation. FORMAT: 'format', // The item is archive operation.
diff --git a/ui/file_manager/file_manager/foreground/js/directory_model.js b/ui/file_manager/file_manager/foreground/js/directory_model.js index 8a448c4f..2ca6b93 100644 --- a/ui/file_manager/file_manager/foreground/js/directory_model.js +++ b/ui/file_manager/file_manager/foreground/js/directory_model.js
@@ -1704,6 +1704,7 @@ chrome.fileManagerPrivate.IOTaskType.DELETE, chrome.fileManagerPrivate.IOTaskType.EMPTY_TRASH, chrome.fileManagerPrivate.IOTaskType.MOVE, + chrome.fileManagerPrivate.IOTaskType.RESTORE, ]); /** @type {!Set<?VolumeManagerCommon.RootType>} */ const rootTypesRequireRefresh = new Set([
diff --git a/ui/file_manager/file_manager/foreground/js/file_manager_commands.js b/ui/file_manager/file_manager/foreground/js/file_manager_commands.js index fdbfbe16..ab017462 100644 --- a/ui/file_manager/file_manager/foreground/js/file_manager_commands.js +++ b/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
@@ -1180,6 +1180,12 @@ if (!permanentlyDelete && fileManager.fileOperationManager.willUseTrash( fileManager.volumeManager, entries)) { + if (window.isSWA) { + chrome.fileManagerPrivate.startIOTask( + chrome.fileManagerPrivate.IOTaskType.TRASH, entries, + /*params=*/ {}); + return; + } fileManager.fileOperationManager.deleteEntries(entries); return; } @@ -1292,8 +1298,10 @@ }); }; - util.addEventListenerToBackgroundComponent( - assert(fileManager.fileOperationManager), 'delete', onDeleted); + if (!window.isSWA) { + util.addEventListenerToBackgroundComponent( + assert(fileManager.fileOperationManager), 'delete', onDeleted); + } }; /** @@ -1307,6 +1315,18 @@ execute(event, fileManager) { const entries = CommandUtil.getCommandEntries(fileManager, event.target); + + if (window.isSWA) { + const infoEntries = entries.map(e => { + const entry = /** @type {!TrashEntry} */ (e); + return entry.infoEntry; + }); + startIOTask( + chrome.fileManagerPrivate.IOTaskType.RESTORE, infoEntries, + /*params=*/ {}); + return; + } + fileManager.fileOperationManager.restoreDeleted(entries.map(e => { return /** @type {!TrashEntry} */ (e); }));
diff --git a/ui/strings/translations/ui_strings_iw.xtb b/ui/strings/translations/ui_strings_iw.xtb index ff8b69df..6803f36 100644 --- a/ui/strings/translations/ui_strings_iw.xtb +++ b/ui/strings/translations/ui_strings_iw.xtb
@@ -111,6 +111,7 @@ <translation id="4746179598275229723">בוטלה ההצמדה של התוסף</translation> <translation id="4788285488841504513">{MONTHS,plural, =1{נותר חודש אחד}two{נותרו חודשיים}many{נותרו # חודשים}other{נותרו # חודשים}}</translation> <translation id="4888938634149558681">התקשרות</translation> +<translation id="4937657825850660613">חצי</translation> <translation id="4968171027979920686">{SECONDS,plural, =1{שנייה אחת}two{# שניות}many{# שניות}other{# שניות}}</translation> <translation id="4971687151119236543">טראק קודם במדיה</translation> <translation id="4971925105143343452">חלקי</translation>
diff --git a/ui/strings/translations/ui_strings_ne.xtb b/ui/strings/translations/ui_strings_ne.xtb index 38f7b38..2bca5ca 100644 --- a/ui/strings/translations/ui_strings_ne.xtb +++ b/ui/strings/translations/ui_strings_ne.xtb
@@ -103,6 +103,7 @@ <translation id="4289300219472526559">बोल्न सुरु गर्नुहोस्</translation> <translation id="4289540628985791613">समीक्षा</translation> <translation id="4306392492252714209">क्लिपबोर्डबाट हटाउनुहोस्।</translation> +<translation id="4311195029067684288">फुल स्क्रिन खोल्नुहोस्</translation> <translation id="4491109536499578614">छवि</translation> <translation id="4565377596337484307">पासवर्ड लुकाउनुहोस्</translation> <translation id="4588090240171750605">दायाँ तिर स्क्रोल गर्नुहोस्</translation> @@ -110,8 +111,10 @@ <translation id="4746179598275229723">एक्स्टेन्सन अनपिन गरियो</translation> <translation id="4788285488841504513">{MONTHS,plural, =1{१ महिना बाँकी}other{# महिना बाँकी}}</translation> <translation id="4888938634149558681">कल गर्नुहोस्</translation> +<translation id="4937657825850660613">स्क्रिन दुई भागमा स्प्लिट गर्नुहोस्</translation> <translation id="4968171027979920686">{SECONDS,plural, =1{ १ सेकेन्ड}other{ # सेकेन्ड}}</translation> <translation id="4971687151119236543">मिडिया अघिल्लो ट्र्याक</translation> +<translation id="4971925105143343452">स्क्रिनको केही भाग स्प्लिट गर्नुहोस्</translation> <translation id="5046499563572181734">यहाँ ट्याप गर्नुहोस्</translation> <translation id="5076340679995252485">&टाँस्नुहोस्</translation> <translation id="5123162024343028706">माथि पिन गर्नुहोस्</translation>
diff --git a/ui/webui/resources/cr_components/chromeos/network/onc_mojo.js b/ui/webui/resources/cr_components/chromeos/network/onc_mojo.js index 2aef272..f048244 100644 --- a/ui/webui/resources/cr_components/chromeos/network/onc_mojo.js +++ b/ui/webui/resources/cr_components/chromeos/network/onc_mojo.js
@@ -652,6 +652,7 @@ signalStrength: 0, simLockEnabled: false, simLocked: false, + simLockType: '', }; break; case mojom.NetworkType.kEthernet: